From 505a55c35622ab6949f76dc2b8dd7ab08e08812b Mon Sep 17 00:00:00 2001
From: Andrew Grieve
Date: Thu, 13 Feb 2025 19:26:18 -0800
Subject: [PATCH 001/111] Avoid NPE in Html.toHtml() when is missing a
face attribute
See b/395473939
Change-Id: I02b4b3487211fbc032d874560b749d0f454c6b91
---
core/java/android/text/Html.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/java/android/text/Html.java b/core/java/android/text/Html.java
index ae12132d49a1f..a42eece57eec9 100644
--- a/core/java/android/text/Html.java
+++ b/core/java/android/text/Html.java
@@ -614,7 +614,7 @@ public class Html {
if (style[j] instanceof TypefaceSpan) {
String s = ((TypefaceSpan) style[j]).getFamily();
- if (s.equals("monospace")) {
+ if ("monospace".equals(s)) {
out.append("");
}
}
--
GitLab
From 75177e8983c9f48f042cf75516dacdb21524618f Mon Sep 17 00:00:00 2001
From: Anton Ivanov
Date: Thu, 13 Feb 2025 22:37:35 -0800
Subject: [PATCH 002/111] Harden construction sites of android::StrongPointer.
Bug: 393217449
Test: presubmit
Flag: EXEMPT_refactor
Change-Id: I913683213590dc0702935c111c85fbea678671f2
---
libs/hostgraphics/Fence.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libs/hostgraphics/Fence.cpp b/libs/hostgraphics/Fence.cpp
index 4383bf02a00e5..938a9384768db 100644
--- a/libs/hostgraphics/Fence.cpp
+++ b/libs/hostgraphics/Fence.cpp
@@ -18,6 +18,6 @@
namespace android {
-const sp Fence::NO_FENCE = sp(new Fence);
+const sp Fence::NO_FENCE = sp::make();
} // namespace android
--
GitLab
From a1e84d0888dd976082e46129832ebdb2a234e83a Mon Sep 17 00:00:00 2001
From: Hawkwood Glazier
Date: Thu, 13 Feb 2025 17:21:17 +0000
Subject: [PATCH 003/111] Limit interpolated axis values to set of valid values
Rouding the axis values to the nearest valid step value should keep the
var cache from missing repeatedly due to functionally identical axis
values. Formerly this was not a problem because the progress float was
rounded to the nearest animation frame. However that is no longer
occuring as it caused issues w/ non-linear interpolation.
Since different axes have different min and max values, we manually
adjust the step size to roughly target the same number of valid values
within that range. This gives us a good target, but also allows us to
make specific adjustments to keep hit-rate high depending on which
axes are more important visually.
Bug: 394840414
Test: Ran animation on device
Flag: NONE TextAnimator Memory Fix
Change-Id: I1800b71601ef10e1c2b9fd083134f312c8dd6711
---
.../systemui/animation/FontInterpolator.kt | 93 ++++++------------
.../systemui/animation/FontVariationUtils.kt | 32 +++---
.../com/android/systemui/animation/GSFAxes.kt | 98 +++++++++++++++++++
.../shared/clocks/FlexClockController.kt | 30 ++----
.../shared/clocks/FlexClockFaceController.kt | 2 +-
.../systemui/shared/clocks/FontUtils.kt | 43 ++++++++
.../clocks/view/SimpleDigitalClockTextView.kt | 31 +++---
.../animation/FontVariationUtilsTest.kt | 5 +-
.../animation/FontInterpolatorTest.kt | 6 ++
9 files changed, 223 insertions(+), 117 deletions(-)
create mode 100644 packages/SystemUI/animation/src/com/android/systemui/animation/GSFAxes.kt
create mode 100644 packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FontUtils.kt
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt
index f8bcb81dc0735..bc75b1dad40cd 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt
@@ -22,19 +22,8 @@ import android.util.Log
import android.util.LruCache
import android.util.MathUtils
import androidx.annotation.VisibleForTesting
-import java.lang.Float.max
-import java.lang.Float.min
import kotlin.math.roundToInt
-private const val TAG_WGHT = "wght"
-private const val TAG_ITAL = "ital"
-
-private const val FONT_WEIGHT_DEFAULT_VALUE = 400f
-private const val FONT_ITALIC_MAX = 1f
-private const val FONT_ITALIC_MIN = 0f
-private const val FONT_ITALIC_ANIMATION_STEP = 0.1f
-private const val FONT_ITALIC_DEFAULT_VALUE = 0f
-
/** Caches for font interpolation */
interface FontCache {
val animationFrameCount: Int
@@ -91,11 +80,8 @@ class FontCacheImpl(override val animationFrameCount: Int = DEFAULT_FONT_CACHE_M
class FontInterpolator(val fontCache: FontCache = FontCacheImpl()) {
/** Linear interpolate the font variation settings. */
fun lerp(start: Font, end: Font, progress: Float, linearProgress: Float): Font {
- if (progress == 0f) {
- return start
- } else if (progress == 1f) {
- return end
- }
+ if (progress <= 0f) return start
+ if (progress >= 1f) return end
val startAxes = start.axes ?: EMPTY_AXES
val endAxes = end.axes ?: EMPTY_AXES
@@ -110,7 +96,7 @@ class FontInterpolator(val fontCache: FontCache = FontCacheImpl()) {
InterpKey(start, end, (linearProgress * fontCache.animationFrameCount).roundToInt())
fontCache.get(iKey)?.let {
if (DEBUG) {
- Log.d(LOG_TAG, "[$progress] Interp. cache hit for $iKey")
+ Log.d(LOG_TAG, "[$progress, $linearProgress] Interp. cache hit for $iKey")
}
return it
}
@@ -121,37 +107,16 @@ class FontInterpolator(val fontCache: FontCache = FontCacheImpl()) {
// and also pre-fill the missing axes value with default value from 'fvar' table.
val newAxes =
lerp(startAxes, endAxes) { tag, startValue, endValue ->
- when (tag) {
- TAG_WGHT ->
- MathUtils.lerp(
- startValue ?: FONT_WEIGHT_DEFAULT_VALUE,
- endValue ?: FONT_WEIGHT_DEFAULT_VALUE,
- progress,
- )
- TAG_ITAL ->
- adjustItalic(
- MathUtils.lerp(
- startValue ?: FONT_ITALIC_DEFAULT_VALUE,
- endValue ?: FONT_ITALIC_DEFAULT_VALUE,
- progress,
- )
- )
- else -> {
- require(startValue != null && endValue != null) {
- "Unable to interpolate due to unknown default axes value : $tag"
- }
- MathUtils.lerp(startValue, endValue, progress)
- }
- }
+ MathUtils.lerp(startValue, endValue, progress)
}
// Check if we already make font for this axes. This is typically happens if the animation
- // happens backward.
+ // happens backward and is being linearly interpolated.
val vKey = VarFontKey(start, newAxes)
fontCache.get(vKey)?.let {
fontCache.put(iKey, it)
if (DEBUG) {
- Log.d(LOG_TAG, "[$progress] Axis cache hit for $vKey")
+ Log.d(LOG_TAG, "[$progress, $linearProgress] Axis cache hit for $vKey")
}
return it
}
@@ -164,14 +129,14 @@ class FontInterpolator(val fontCache: FontCache = FontCacheImpl()) {
fontCache.put(vKey, newFont)
// Cache misses are likely to create memory leaks, so this is logged at error level.
- Log.e(LOG_TAG, "[$progress] Cache MISS for $iKey / $vKey")
+ Log.e(LOG_TAG, "[$progress, $linearProgress] Cache MISS for $iKey / $vKey")
return newFont
}
private fun lerp(
start: Array,
end: Array,
- filter: (tag: String, left: Float?, right: Float?) -> Float,
+ filter: (tag: String, left: Float, right: Float) -> Float,
): List {
// Safe to modify result of Font#getAxes since it returns cloned object.
start.sortBy { axis -> axis.tag }
@@ -191,39 +156,37 @@ class FontInterpolator(val fontCache: FontCache = FontCacheImpl()) {
else -> tagA.compareTo(tagB)
}
- val axis =
+ val tag =
+ when {
+ comp == 0 -> tagA!!
+ comp < 0 -> tagA!!
+ else -> tagB!!
+ }
+
+ val axisDefinition = GSFAxes.getAxis(tag)
+ require(comp == 0 || axisDefinition != null) {
+ "Unable to interpolate due to unknown default axes value: $tag"
+ }
+
+ val axisValue =
when {
- comp == 0 -> {
- val v = filter(tagA!!, start[i++].styleValue, end[j++].styleValue)
- FontVariationAxis(tagA, v)
- }
- comp < 0 -> {
- val v = filter(tagA!!, start[i++].styleValue, null)
- FontVariationAxis(tagA, v)
- }
- else -> { // comp > 0
- val v = filter(tagB!!, null, end[j++].styleValue)
- FontVariationAxis(tagB, v)
- }
+ comp == 0 -> filter(tag, start[i++].styleValue, end[j++].styleValue)
+ comp < 0 -> filter(tag, start[i++].styleValue, axisDefinition!!.defaultValue)
+ else -> filter(tag, axisDefinition!!.defaultValue, end[j++].styleValue)
}
- result.add(axis)
+ // Round axis value to valid intermediate steps. This improves the cache hit rate.
+ val step = axisDefinition?.animationStep ?: DEFAULT_ANIMATION_STEP
+ result.add(FontVariationAxis(tag, (axisValue / step).roundToInt() * step))
}
return result
}
- // For the performance reasons, we animate italic with FONT_ITALIC_ANIMATION_STEP. This helps
- // Cache hit ratio in the Skia glyph cache.
- private fun adjustItalic(value: Float) =
- coerceInWithStep(value, FONT_ITALIC_MIN, FONT_ITALIC_MAX, FONT_ITALIC_ANIMATION_STEP)
-
- private fun coerceInWithStep(v: Float, min: Float, max: Float, step: Float) =
- (v.coerceIn(min, max) / step).toInt() * step
-
companion object {
private const val LOG_TAG = "FontInterpolator"
private val DEBUG = Log.isLoggable(LOG_TAG, Log.DEBUG)
private val EMPTY_AXES = arrayOf()
+ private const val DEFAULT_ANIMATION_STEP = 1f
// Returns true if given two font instance can be interpolated.
fun canInterpolate(start: Font, end: Font) =
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/FontVariationUtils.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/FontVariationUtils.kt
index 9545bda80b2d9..9a746870c6ffc 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/FontVariationUtils.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/FontVariationUtils.kt
@@ -1,12 +1,20 @@
-package com.android.systemui.animation
+/*
+ * Copyright (C) 2024 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.
+ */
-object GSFAxes {
- const val WEIGHT = "wght"
- const val WIDTH = "wdth"
- const val SLANT = "slnt"
- const val ROUND = "ROND"
- const val OPTICAL_SIZE = "opsz"
-}
+package com.android.systemui.animation
class FontVariationUtils {
private var mWeight = -1
@@ -46,20 +54,20 @@ class FontVariationUtils {
}
var resultString = ""
if (mWeight >= 0) {
- resultString += "'${GSFAxes.WEIGHT}' $mWeight"
+ resultString += "'${GSFAxes.WEIGHT.tag}' $mWeight"
}
if (mWidth >= 0) {
resultString +=
- (if (resultString.isBlank()) "" else ", ") + "'${GSFAxes.WIDTH}' $mWidth"
+ (if (resultString.isBlank()) "" else ", ") + "'${GSFAxes.WIDTH.tag}' $mWidth"
}
if (mOpticalSize >= 0) {
resultString +=
(if (resultString.isBlank()) "" else ", ") +
- "'${GSFAxes.OPTICAL_SIZE}' $mOpticalSize"
+ "'${GSFAxes.OPTICAL_SIZE.tag}' $mOpticalSize"
}
if (mRoundness >= 0) {
resultString +=
- (if (resultString.isBlank()) "" else ", ") + "'${GSFAxes.ROUND}' $mRoundness"
+ (if (resultString.isBlank()) "" else ", ") + "'${GSFAxes.ROUND.tag}' $mRoundness"
}
return if (isUpdated) resultString else ""
}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/GSFAxes.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/GSFAxes.kt
new file mode 100644
index 0000000000000..f4e03613169a8
--- /dev/null
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/GSFAxes.kt
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2025 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.animation
+
+data class AxisDefinition(
+ val tag: String,
+ val minValue: Float,
+ val defaultValue: Float,
+ val maxValue: Float,
+ val animationStep: Float,
+)
+
+object GSFAxes {
+ val WEIGHT =
+ AxisDefinition(
+ tag = "wght",
+ minValue = 1f,
+ defaultValue = 400f,
+ maxValue = 1000f,
+ animationStep = 10f,
+ )
+
+ val WIDTH =
+ AxisDefinition(
+ tag = "wdth",
+ minValue = 25f,
+ defaultValue = 100f,
+ maxValue = 151f,
+ animationStep = 1f,
+ )
+
+ val SLANT =
+ AxisDefinition(
+ tag = "slnt",
+ minValue = 0f,
+ defaultValue = 0f,
+ maxValue = -10f,
+ animationStep = 0.1f,
+ )
+
+ val ROUND =
+ AxisDefinition(
+ tag = "ROND",
+ minValue = 0f,
+ defaultValue = 0f,
+ maxValue = 100f,
+ animationStep = 1f,
+ )
+
+ val GRADE =
+ AxisDefinition(
+ tag = "GRAD",
+ minValue = 0f,
+ defaultValue = 0f,
+ maxValue = 100f,
+ animationStep = 1f,
+ )
+
+ val OPTICAL_SIZE =
+ AxisDefinition(
+ tag = "opsz",
+ minValue = 6f,
+ defaultValue = 18f,
+ maxValue = 144f,
+ animationStep = 1f,
+ )
+
+ // Not a GSF Axis, but present for FontInterpolator compatibility
+ val ITALIC =
+ AxisDefinition(
+ tag = "ITAL",
+ minValue = 0f,
+ defaultValue = 0f,
+ maxValue = 1f,
+ animationStep = 0.1f,
+ )
+
+ private val AXIS_MAP =
+ listOf(WEIGHT, WIDTH, SLANT, ROUND, GRADE, OPTICAL_SIZE, ITALIC)
+ .map { def -> def.tag.toLowerCase() to def }
+ .toMap()
+
+ fun getAxis(axis: String): AxisDefinition? = AXIS_MAP[axis.toLowerCase()]
+}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockController.kt
index 004d1aa1fe93c..ac1c5a8dfaf30 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockController.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockController.kt
@@ -130,39 +130,25 @@ class FlexClockController(private val clockCtx: ClockContext) : ClockController
private val FONT_AXES =
listOf(
- ClockFontAxis(
- key = GSFAxes.WEIGHT,
+ GSFAxes.WEIGHT.toClockAxis(
type = AxisType.Float,
- minValue = 25f,
currentValue = 400f,
- maxValue = 1000f,
name = "Weight",
description = "Glyph Weight",
),
- ClockFontAxis(
- key = GSFAxes.WIDTH,
+ GSFAxes.WIDTH.toClockAxis(
type = AxisType.Float,
- minValue = 25f,
currentValue = 85f,
- maxValue = 151f,
name = "Width",
description = "Glyph Width",
),
- ClockFontAxis(
- key = GSFAxes.ROUND,
+ GSFAxes.ROUND.toClockAxis(
type = AxisType.Boolean,
- minValue = 0f,
- currentValue = 0f,
- maxValue = 100f,
name = "Round",
description = "Glyph Roundness",
),
- ClockFontAxis(
- key = GSFAxes.SLANT,
+ GSFAxes.SLANT.toClockAxis(
type = AxisType.Boolean,
- minValue = 0f,
- currentValue = 0f,
- maxValue = -10f,
name = "Slant",
description = "Glyph Slant",
),
@@ -170,10 +156,10 @@ class FlexClockController(private val clockCtx: ClockContext) : ClockController
private val LEGACY_FLEX_SETTINGS =
listOf(
- ClockFontAxisSetting(GSFAxes.WEIGHT, 600f),
- ClockFontAxisSetting(GSFAxes.WIDTH, 100f),
- ClockFontAxisSetting(GSFAxes.ROUND, 100f),
- ClockFontAxisSetting(GSFAxes.SLANT, 0f),
+ GSFAxes.WEIGHT.toClockAxisSetting(600f),
+ GSFAxes.WIDTH.toClockAxisSetting(100f),
+ GSFAxes.ROUND.toClockAxisSetting(100f),
+ GSFAxes.SLANT.toClockAxisSetting(0f),
)
}
}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockFaceController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockFaceController.kt
index b2dbd6552955e..b4c2f5de290f8 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockFaceController.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockFaceController.kt
@@ -132,7 +132,7 @@ class FlexClockFaceController(clockCtx: ClockContext, private val isLargeClock:
if (!isLargeClock) {
axes =
axes.map { axis ->
- if (axis.key == GSFAxes.WIDTH && axis.value > SMALL_CLOCK_MAX_WDTH) {
+ if (axis.key == GSFAxes.WIDTH.tag && axis.value > SMALL_CLOCK_MAX_WDTH) {
axis.copy(value = SMALL_CLOCK_MAX_WDTH)
} else {
axis
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FontUtils.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FontUtils.kt
new file mode 100644
index 0000000000000..212b1e29d1b8a
--- /dev/null
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FontUtils.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2025 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.clocks
+
+import com.android.systemui.animation.AxisDefinition
+import com.android.systemui.plugins.clocks.AxisType
+import com.android.systemui.plugins.clocks.ClockFontAxis
+import com.android.systemui.plugins.clocks.ClockFontAxisSetting
+
+fun AxisDefinition.toClockAxis(
+ type: AxisType,
+ currentValue: Float? = null,
+ name: String,
+ description: String,
+): ClockFontAxis {
+ return ClockFontAxis(
+ key = this.tag,
+ type = type,
+ maxValue = this.maxValue,
+ minValue = this.minValue,
+ currentValue = currentValue ?: this.defaultValue,
+ name = name,
+ description = description,
+ )
+}
+
+fun AxisDefinition.toClockAxisSetting(value: Float? = null): ClockFontAxisSetting {
+ return ClockFontAxisSetting(this.tag, value ?: this.defaultValue)
+}
diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
index 8317aa39ef2b7..5b0db225f9cd9 100644
--- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
+++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt
@@ -49,6 +49,7 @@ import com.android.systemui.shared.clocks.DigitTranslateAnimator
import com.android.systemui.shared.clocks.DimensionParser
import com.android.systemui.shared.clocks.FLEX_CLOCK_ID
import com.android.systemui.shared.clocks.FontTextStyle
+import com.android.systemui.shared.clocks.toClockAxisSetting
import java.lang.Thread
import kotlin.math.max
import kotlin.math.min
@@ -594,25 +595,25 @@ open class SimpleDigitalClockTextView(
val FIDGET_INTERPOLATOR = PathInterpolator(0.26873f, 0f, 0.45042f, 1f)
val FIDGET_DISTS =
mapOf(
- GSFAxes.WEIGHT to Pair(200f, 500f),
- GSFAxes.WIDTH to Pair(30f, 75f),
- GSFAxes.ROUND to Pair(0f, 50f),
- GSFAxes.SLANT to Pair(0f, -5f),
+ GSFAxes.WEIGHT.tag to Pair(200f, 500f),
+ GSFAxes.WIDTH.tag to Pair(30f, 75f),
+ GSFAxes.ROUND.tag to Pair(0f, 50f),
+ GSFAxes.SLANT.tag to Pair(0f, -5f),
)
val AOD_COLOR = Color.WHITE
- val LS_WEIGHT_AXIS = ClockFontAxisSetting(GSFAxes.WEIGHT, 400f)
- val AOD_WEIGHT_AXIS = ClockFontAxisSetting(GSFAxes.WEIGHT, 200f)
- val WIDTH_AXIS = ClockFontAxisSetting(GSFAxes.WIDTH, 85f)
- val ROUND_AXIS = ClockFontAxisSetting(GSFAxes.ROUND, 0f)
- val SLANT_AXIS = ClockFontAxisSetting(GSFAxes.SLANT, 0f)
+ val LS_WEIGHT_AXIS = GSFAxes.WEIGHT.toClockAxisSetting(400f)
+ val AOD_WEIGHT_AXIS = GSFAxes.WEIGHT.toClockAxisSetting(200f)
+ val WIDTH_AXIS = GSFAxes.WIDTH.toClockAxisSetting(85f)
+ val ROUND_AXIS = GSFAxes.ROUND.toClockAxisSetting(0f)
+ val SLANT_AXIS = GSFAxes.SLANT.toClockAxisSetting(0f)
// Axes for Legacy version of the Flex Clock
- val FLEX_LS_WEIGHT_AXIS = ClockFontAxisSetting(GSFAxes.WEIGHT, 600f)
- val FLEX_AOD_LARGE_WEIGHT_AXIS = ClockFontAxisSetting(GSFAxes.WEIGHT, 74f)
- val FLEX_AOD_SMALL_WEIGHT_AXIS = ClockFontAxisSetting(GSFAxes.WEIGHT, 133f)
- val FLEX_LS_WIDTH_AXIS = ClockFontAxisSetting(GSFAxes.WIDTH, 100f)
- val FLEX_AOD_WIDTH_AXIS = ClockFontAxisSetting(GSFAxes.WIDTH, 43f)
- val FLEX_ROUND_AXIS = ClockFontAxisSetting(GSFAxes.ROUND, 100f)
+ val FLEX_LS_WEIGHT_AXIS = GSFAxes.WEIGHT.toClockAxisSetting(600f)
+ val FLEX_AOD_LARGE_WEIGHT_AXIS = GSFAxes.WEIGHT.toClockAxisSetting(74f)
+ val FLEX_AOD_SMALL_WEIGHT_AXIS = GSFAxes.WEIGHT.toClockAxisSetting(133f)
+ val FLEX_LS_WIDTH_AXIS = GSFAxes.WIDTH.toClockAxisSetting(100f)
+ val FLEX_AOD_WIDTH_AXIS = GSFAxes.WIDTH.toClockAxisSetting(43f)
+ val FLEX_ROUND_AXIS = GSFAxes.ROUND.toClockAxisSetting(100f)
}
}
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/animation/FontVariationUtilsTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/animation/FontVariationUtilsTest.kt
index f44769d522eb2..8d3640d8d8090 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/animation/FontVariationUtilsTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/animation/FontVariationUtilsTest.kt
@@ -21,7 +21,7 @@ class FontVariationUtilsTest : SysuiTestCase() {
roundness = 100,
)
Assert.assertEquals(
- "'${GSFAxes.WEIGHT}' 100, '${GSFAxes.WIDTH}' 100, '${GSFAxes.ROUND}' 100",
+ "'${GSFAxes.WEIGHT.tag}' 100, '${GSFAxes.WIDTH.tag}' 100, '${GSFAxes.ROUND.tag}' 100",
initFvar,
)
val updatedFvar =
@@ -32,7 +32,8 @@ class FontVariationUtilsTest : SysuiTestCase() {
roundness = 100,
)
Assert.assertEquals(
- "'${GSFAxes.WEIGHT}' 200, '${GSFAxes.WIDTH}' 100, '${GSFAxes.OPTICAL_SIZE}' 0, '${GSFAxes.ROUND}' 100",
+ "'${GSFAxes.WEIGHT.tag}' 200, '${GSFAxes.WIDTH.tag}' 100," +
+ " '${GSFAxes.OPTICAL_SIZE.tag}' 0, '${GSFAxes.ROUND.tag}' 100",
updatedFvar,
)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt
index 2e634390679a7..c2a495d13c02d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt
@@ -64,6 +64,12 @@ class FontInterpolatorTest : SysuiTestCase() {
"'wght' 500, 'ital' 0.5, 'GRAD' 450",
interp.lerp(startFont, endFont, 0.5f, 0.5f),
)
+
+ // Ensure axes rounded correctly to nearest step
+ assertSameAxes(
+ "'wght' 490, 'ital' 0.5, 'GRAD' 446",
+ interp.lerp(startFont, endFont, 0.492f, 0.492f),
+ )
}
@Test
--
GitLab
From 2a466400ab2d857bb15d8dee405d68ff63d63656 Mon Sep 17 00:00:00 2001
From: Yiyi Shen
Date: Thu, 13 Feb 2025 17:17:21 +0800
Subject: [PATCH 004/111] [Audiosharing] Disable auto pick in ui when developer
preview on
Test: atest
Bug: 383469911
Flag: com.android.settingslib.flags.audio_sharing_developer_option
Change-Id: Id3da26924a18585c9aac9cf77b0310202d6c074e
---
.../settingslib/bluetooth/BluetoothUtils.java | 2 +-
.../bluetooth/LocalBluetoothLeBroadcast.java | 22 ++++++++-----------
2 files changed, 10 insertions(+), 14 deletions(-)
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
index a00484ac28ab7..ec76dd276ae1b 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
@@ -1064,7 +1064,7 @@ public class BluetoothUtils {
/** Get develop option value for audio sharing preview. */
@WorkerThread
- private static boolean getAudioSharingPreviewValue(@Nullable ContentResolver contentResolver) {
+ public static boolean getAudioSharingPreviewValue(@Nullable ContentResolver contentResolver) {
if (contentResolver == null) return false;
return Settings.Global.getInt(
contentResolver,
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java
index 84156429809bd..af5752605a879 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java
@@ -142,8 +142,8 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile {
private ContentResolver mContentResolver;
private ContentObserver mSettingsObserver;
// Cached broadcast callbacks being register before service is connected.
- private Map mCachedBroadcastCallbackExecutorMap =
- new ConcurrentHashMap<>();
+ private ConcurrentHashMap
+ mCachedBroadcastCallbackExecutorMap = new ConcurrentHashMap<>();
private final ServiceListener mServiceListener =
new ServiceListener() {
@@ -873,7 +873,7 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile {
@NonNull @CallbackExecutor Executor executor,
@NonNull BluetoothLeBroadcast.Callback callback) {
if (mServiceBroadcast == null) {
- Log.d(TAG, "registerServiceCallBack failed, the BluetoothLeBroadcast is null.");
+ Log.d(TAG, "registerServiceCallBack failed, proxy not attached.");
mCachedBroadcastCallbackExecutorMap.putIfAbsent(callback, executor);
return;
}
@@ -895,10 +895,7 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile {
@NonNull @CallbackExecutor Executor executor,
@NonNull BluetoothLeBroadcastAssistant.Callback callback) {
if (mServiceBroadcastAssistant == null) {
- Log.d(
- TAG,
- "registerBroadcastAssistantCallback failed, "
- + "the BluetoothLeBroadcastAssistant is null.");
+ Log.d(TAG, "registerBroadcastAssistantCallback failed, proxy not attached.");
return;
}
@@ -913,7 +910,7 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile {
public void unregisterServiceCallBack(@NonNull BluetoothLeBroadcast.Callback callback) {
mCachedBroadcastCallbackExecutorMap.remove(callback);
if (mServiceBroadcast == null) {
- Log.d(TAG, "unregisterServiceCallBack failed, the BluetoothLeBroadcast is null.");
+ Log.d(TAG, "unregisterServiceCallBack failed, proxy not attached.");
return;
}
@@ -932,10 +929,7 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile {
private void unregisterBroadcastAssistantCallback(
@NonNull BluetoothLeBroadcastAssistant.Callback callback) {
if (mServiceBroadcastAssistant == null) {
- Log.d(
- TAG,
- "unregisterBroadcastAssistantCallback, "
- + "the BluetoothLeBroadcastAssistant is null.");
+ Log.d(TAG, "unregisterBroadcastAssistantCallback, proxy not attched.");
return;
}
@@ -1128,7 +1122,9 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile {
/** Update fallback active device if needed. */
public void updateFallbackActiveDeviceIfNeeded() {
- if (Flags.disableAudioSharingAutoPickFallbackInUi()) {
+ if (Flags.disableAudioSharingAutoPickFallbackInUi() || (mContext != null
+ && Flags.audioSharingDeveloperOption()
+ && BluetoothUtils.getAudioSharingPreviewValue(mContext.getContentResolver()))) {
Log.d(TAG, "Skip updateFallbackActiveDeviceIfNeeded, disable flag is on");
return;
}
--
GitLab
From 8b53f4656c9760da39d5b55b86dde5b311ed131d Mon Sep 17 00:00:00 2001
From: John Wu
Date: Fri, 27 Dec 2024 00:50:15 +0000
Subject: [PATCH 005/111] [Ravenwood] Enable graphics support
Bug: 337110712
Flag: EXEMPT host side change only
Test: $ANDROID_BUILD_TOP/frameworks/base/ravenwood/scripts/run-ravenwood-tests.sh
Test: atest FrameworksCoreTestsRavenwood
Test: atest CtsGraphicsTestCasesRavenwood
Test: atest CtsResourcesTestCasesRavenwood
Test: atest CtsTextTestCasesRavenwood
Change-Id: I90a79a92987870d494ed927eb6ba02747e247929
---
core/java/android/app/Instrumentation.java | 13 +-
core/java/android/content/res/Resources.java | 2 -
.../android/content/res/ResourcesImpl.java | 1 -
core/java/android/content/res/TypedArray.java | 1 -
.../fonts/FontFamilyUpdateRequest.java | 1 +
.../graphics/fonts/FontFileUpdateRequest.java | 1 +
.../android/text/AlteredCharSequence.java | 1 +
core/java/android/text/AndroidBidi.java | 1 +
core/java/android/text/AndroidCharacter.java | 1 +
core/java/android/text/Annotation.java | 1 +
core/java/android/text/AutoGrowArray.java | 1 +
core/java/android/text/AutoText.java | 1 +
core/java/android/text/BidiFormatter.java | 1 +
core/java/android/text/BoringLayout.java | 1 +
.../text/CharSequenceCharacterIterator.java | 1 +
core/java/android/text/ClipboardManager.java | 1 +
core/java/android/text/DynamicLayout.java | 1 +
core/java/android/text/Editable.java | 1 +
core/java/android/text/Emoji.java | 1 +
core/java/android/text/EmojiConsistency.java | 1 +
core/java/android/text/FontConfig.java | 1 +
core/java/android/text/GetChars.java | 1 +
.../text/GraphemeClusterSegmentFinder.java | 1 +
.../java/android/text/GraphicsOperations.java | 1 +
core/java/android/text/Highlights.java | 1 +
core/java/android/text/Html.java | 41 ++--
core/java/android/text/Hyphenator.java | 1 +
core/java/android/text/InputFilter.java | 1 +
core/java/android/text/InputType.java | 1 +
core/java/android/text/Layout.java | 1 +
core/java/android/text/LoginFilter.java | 1 +
core/java/android/text/MeasuredParagraph.java | 1 +
core/java/android/text/NoCopySpan.java | 1 +
core/java/android/text/PackedIntVector.java | 1 +
.../java/android/text/PackedObjectVector.java | 1 +
core/java/android/text/ParcelableSpan.java | 1 +
core/java/android/text/PrecomputedText.java | 1 +
core/java/android/text/SegmentFinder.java | 1 +
core/java/android/text/Selection.java | 1 +
core/java/android/text/SpanColors.java | 1 +
core/java/android/text/SpanSet.java | 1 +
core/java/android/text/SpanWatcher.java | 1 +
core/java/android/text/Spannable.java | 1 +
core/java/android/text/SpannableString.java | 1 +
.../android/text/SpannableStringBuilder.java | 1 +
.../android/text/SpannableStringInternal.java | 1 +
core/java/android/text/Spanned.java | 1 +
core/java/android/text/SpannedString.java | 1 +
core/java/android/text/StaticLayout.java | 1 +
.../android/text/TextDirectionHeuristic.java | 1 +
.../android/text/TextDirectionHeuristics.java | 1 +
core/java/android/text/TextLine.java | 1 +
core/java/android/text/TextPaint.java | 1 +
core/java/android/text/TextShaper.java | 1 +
core/java/android/text/TextUtils.java | 44 +---
core/java/android/text/TextWatcher.java | 1 +
core/java/android/text/WordSegmentFinder.java | 1 +
core/java/android/text/format/DateFormat.java | 1 +
.../text/format/DateIntervalFormat.java | 1 +
.../android/text/format/DateTimeFormat.java | 1 +
core/java/android/text/format/DateUtils.java | 1 +
.../android/text/format/DateUtilsBridge.java | 1 +
core/java/android/text/format/Formatter.java | 1 +
.../format/RelativeDateTimeFormatter.java | 1 +
core/java/android/text/format/Time.java | 1 +
.../android/text/format/TimeFormatter.java | 1 +
.../text/format/TimeMigrationUtils.java | 1 +
.../method/AllCapsTransformationMethod.java | 1 +
.../text/method/ArrowKeyMovementMethod.java | 1 +
.../android/text/method/BaseKeyListener.java | 1 +
.../text/method/BaseMovementMethod.java | 1 +
.../text/method/CharacterPickerDialog.java | 1 +
.../android/text/method/DateKeyListener.java | 1 +
.../text/method/DateTimeKeyListener.java | 1 +
.../text/method/DialerKeyListener.java | 1 +
.../text/method/DigitsKeyListener.java | 1 +
.../HideReturnsTransformationMethod.java | 1 +
.../InsertModeTransformationMethod.java | 1 +
.../java/android/text/method/KeyListener.java | 1 +
.../text/method/LinkMovementMethod.java | 1 +
.../text/method/MetaKeyKeyListener.java | 1 +
.../android/text/method/MovementMethod.java | 1 +
.../text/method/MultiTapKeyListener.java | 1 +
.../text/method/NumberKeyListener.java | 1 +
.../android/text/method/OffsetMapping.java | 1 +
.../method/PasswordTransformationMethod.java | 1 +
.../text/method/QwertyKeyListener.java | 1 +
.../ReplacementTransformationMethod.java | 1 +
.../text/method/ScrollingMovementMethod.java | 1 +
.../SingleLineTransformationMethod.java | 1 +
.../android/text/method/TextKeyListener.java | 1 +
.../android/text/method/TimeKeyListener.java | 1 +
core/java/android/text/method/Touch.java | 1 +
.../text/method/TransformationMethod.java | 1 +
.../text/method/TransformationMethod2.java | 1 +
.../TranslationTransformationMethod.java | 1 +
.../android/text/method/WordIterator.java | 1 +
.../android/text/style/AbsoluteSizeSpan.java | 1 +
.../style/AccessibilityClickableSpan.java | 1 +
.../style/AccessibilityReplacementSpan.java | 1 +
.../text/style/AccessibilityURLSpan.java | 1 +
.../android/text/style/AlignmentSpan.java | 1 +
.../text/style/BackgroundColorSpan.java | 1 +
core/java/android/text/style/BulletSpan.java | 1 +
.../android/text/style/CharacterStyle.java | 1 +
.../android/text/style/ClickableSpan.java | 1 +
.../text/style/ForegroundColorSpan.java | 1 +
.../android/text/style/IconMarginSpan.java | 1 +
.../android/text/style/LeadingMarginSpan.java | 1 +
.../text/style/LineBackgroundSpan.java | 1 +
.../text/style/LineBreakConfigSpan.java | 1 +
.../android/text/style/LineHeightSpan.java | 1 +
core/java/android/text/style/LocaleSpan.java | 1 +
.../android/text/style/MaskFilterSpan.java | 1 +
.../text/style/MetricAffectingSpan.java | 1 +
.../text/style/NoWritingToolsSpan.java | 1 +
.../android/text/style/ParagraphStyle.java | 1 +
core/java/android/text/style/QuoteSpan.java | 1 +
.../android/text/style/RasterizerSpan.java | 1 +
.../android/text/style/RelativeSizeSpan.java | 1 +
.../android/text/style/ReplacementSpan.java | 1 +
core/java/android/text/style/ScaleXSpan.java | 1 +
core/java/android/text/style/SpanUtils.java | 1 +
.../android/text/style/SpellCheckSpan.java | 1 +
.../android/text/style/StrikethroughSpan.java | 1 +
core/java/android/text/style/StyleSpan.java | 1 +
.../android/text/style/SubscriptSpan.java | 1 +
.../text/style/SuggestionRangeSpan.java | 1 +
.../android/text/style/SuggestionSpan.java | 1 +
.../android/text/style/SuperscriptSpan.java | 1 +
core/java/android/text/style/TabStopSpan.java | 1 +
.../text/style/TextAppearanceSpan.java | 1 +
core/java/android/text/style/TtsSpan.java | 1 +
.../java/android/text/style/TypefaceSpan.java | 1 +
core/java/android/text/style/URLSpan.java | 1 +
.../android/text/style/UnderlineSpan.java | 1 +
.../android/text/style/UpdateAppearance.java | 1 +
.../java/android/text/style/UpdateLayout.java | 1 +
.../android/text/style/WrapTogetherSpan.java | 1 +
core/java/android/text/util/Rfc822Token.java | 1 +
.../android/text/util/Rfc822Tokenizer.java | 1 +
core/jni/Android.bp | 1 +
core/tests/coretests/Android.bp | 27 +-
.../content/res/FontScaleConverterTest.kt | 5 -
.../android/graphics/BitmapFactoryTest.java | 3 +
.../src/android/graphics/BitmapTest.java | 3 +
.../src/android/graphics/PaintTest.java | 3 +
.../graphics/TypefaceSystemFallbackTest.java | 10 +-
.../src/android/graphics/TypefaceTest.java | 2 +
.../android/text/AndroidCharacterTest.java | 2 +
.../src/android/text/SpanColorsTest.java | 2 +
.../src/android/text/SpannableTest.java | 10 +-
.../src/android/text/StaticLayoutTest.java | 2 +
.../src/android/text/TextUtilsTest.java | 4 +-
.../android/text/format/DateFormatTest.java | 5 +-
.../text/format/DateIntervalFormatTest.java | 2 +
.../android/text/format/DateUtilsTest.java | 2 +
.../text/format/TimeMigrationUtilsTest.java | 2 +
.../src/android/text/format/TimeTest.java | 2 +
.../android/text/method/BackspaceTest.java | 2 +
.../src/android/text/method/EditorState.java | 3 +-
.../text/method/ForwardDeleteTest.java | 2 +
.../InsertModeTransformationMethodTest.java | 2 +
.../src/android/text/util/LinkifyTest.java | 2 +
.../java/android/graphics/AvoidXfermode.java | 1 +
.../android/graphics/BLASTBufferQueue.java | 1 +
.../java/android/graphics/BaseCanvas.java | 1 +
.../android/graphics/BaseRecordingCanvas.java | 1 +
graphics/java/android/graphics/Bitmap.java | 1 +
.../java/android/graphics/BitmapFactory.java | 1 +
.../android/graphics/BitmapRegionDecoder.java | 1 +
.../java/android/graphics/BitmapShader.java | 1 +
graphics/java/android/graphics/BlendMode.java | 1 +
.../graphics/BlendModeColorFilter.java | 1 +
.../java/android/graphics/BlurMaskFilter.java | 1 +
graphics/java/android/graphics/Camera.java | 1 +
graphics/java/android/graphics/Canvas.java | 1 +
.../java/android/graphics/CanvasProperty.java | 1 +
.../java/android/graphics/ColorFilter.java | 1 +
.../graphics/ColorMatrixColorFilter.java | 1 +
.../java/android/graphics/Compatibility.java | 1 +
.../android/graphics/ComposePathEffect.java | 1 +
.../java/android/graphics/ComposeShader.java | 1 +
.../android/graphics/CornerPathEffect.java | 1 +
.../java/android/graphics/DashPathEffect.java | 1 +
.../android/graphics/DiscretePathEffect.java | 1 +
.../java/android/graphics/DrawFilter.java | 1 +
.../android/graphics/EmbossMaskFilter.java | 1 +
.../java/android/graphics/FontFamily.java | 1 +
.../java/android/graphics/FontListParser.java | 1 +
.../java/android/graphics/ForceDarkType.java | 1 +
graphics/java/android/graphics/FrameInfo.java | 1 +
graphics/java/android/graphics/Gainmap.java | 1 +
.../java/android/graphics/GraphicBuffer.java | 1 +
.../java/android/graphics/GraphicsProtos.java | 1 +
.../graphics/GraphicsStatsService.java | 1 +
.../graphics/HardwareBufferRenderer.java | 1 +
.../android/graphics/HardwareRenderer.java | 1 +
.../graphics/HardwareRendererObserver.java | 1 +
.../java/android/graphics/ImageDecoder.java | 5 +
.../java/android/graphics/ImageFormat.java | 1 +
.../android/graphics/LayerRasterizer.java | 1 +
.../graphics/LeakyTypefaceStorage.java | 1 +
.../android/graphics/LightingColorFilter.java | 1 +
.../java/android/graphics/LinearGradient.java | 1 +
.../java/android/graphics/MaskFilter.java | 1 +
graphics/java/android/graphics/Mesh.java | 1 +
.../android/graphics/MeshSpecification.java | 1 +
graphics/java/android/graphics/Movie.java | 1 +
graphics/java/android/graphics/NinePatch.java | 1 +
graphics/java/android/graphics/Paint.java | 1 +
.../graphics/PaintFlagsDrawFilter.java | 1 +
.../android/graphics/PathDashPathEffect.java | 1 +
.../java/android/graphics/PathEffect.java | 1 +
.../java/android/graphics/PathIterator.java | 16 +-
.../java/android/graphics/PathMeasure.java | 1 +
graphics/java/android/graphics/Picture.java | 1 +
.../android/graphics/PixelXorXfermode.java | 1 +
.../java/android/graphics/PorterDuff.java | 1 +
.../graphics/PorterDuffColorFilter.java | 1 +
.../android/graphics/PorterDuffXfermode.java | 1 +
.../java/android/graphics/PostProcessor.java | 1 +
.../java/android/graphics/RadialGradient.java | 1 +
.../java/android/graphics/Rasterizer.java | 1 +
.../android/graphics/RecordingCanvas.java | 1 +
graphics/java/android/graphics/Region.java | 1 +
.../java/android/graphics/RegionIterator.java | 1 +
.../java/android/graphics/RenderEffect.java | 1 +
.../java/android/graphics/RenderNode.java | 1 +
.../android/graphics/RuntimeColorFilter.java | 1 +
.../java/android/graphics/RuntimeShader.java | 1 +
.../android/graphics/RuntimeXfermode.java | 1 +
graphics/java/android/graphics/Shader.java | 1 +
.../java/android/graphics/SumPathEffect.java | 1 +
.../java/android/graphics/SurfaceTexture.java | 1 +
.../java/android/graphics/SweepGradient.java | 1 +
.../android/graphics/TableMaskFilter.java | 1 +
.../android/graphics/TemporaryBuffer.java | 1 +
.../java/android/graphics/TextureLayer.java | 1 +
graphics/java/android/graphics/Typeface.java | 45 +++-
graphics/java/android/graphics/Xfermode.java | 1 +
graphics/java/android/graphics/YuvImage.java | 1 +
.../java/android/graphics/fonts/Font.java | 11 +-
.../fonts/FontCustomizationParser.java | 1 +
.../android/graphics/fonts/FontFamily.java | 1 +
.../android/graphics/fonts/FontFileUtil.java | 1 +
.../android/graphics/fonts/FontStyle.java | 1 +
.../graphics/fonts/FontVariationAxis.java | 1 +
.../android/graphics/fonts/SystemFonts.java | 31 ++-
.../android/graphics/text/GraphemeBreak.java | 1 +
.../graphics/text/LineBreakConfig.java | 10 +-
.../android/graphics/text/LineBreaker.java | 1 +
.../android/graphics/text/MeasuredText.java | 1 +
.../graphics/text/PositionedGlyphs.java | 1 +
.../android/graphics/text/TextRunShaper.java | 1 +
libs/hwui/Android.bp | 12 +
.../framework-graphics-ravenwood-policies.txt | 1 +
libs/hwui/jni/Bitmap.cpp | 12 +-
libs/hwui/jni/Region.cpp | 6 +-
libs/hwui/jni/ScopedParcel.cpp | 4 +-
libs/hwui/jni/ScopedParcel.h | 4 +-
libs/hwui/jni/graphics_jni_helpers.h | 1 +
ravenwood/Android.bp | 10 +
ravenwood/Framework.bp | 4 +-
.../test/ravenwood/RavenwoodContext.java | 10 +
.../test/ravenwood/RavenwoodNativeLoader.java | 39 ++-
...RavenwoodRuntimeEnvironmentController.java | 13 +
.../android/ravenwood/RavenwoodJdkPatch.java | 19 ++
.../ravenwood/RavenwoodRuntimeNative.java | 2 +
.../dalvik/system/CloseGuard.java | 198 +++++++++++++++
.../libcore-fake/libcore/io/IoBridge.java | 63 +++++
.../util/NativeAllocationRegistry.java | 63 ++++-
ravenwood/runtime-jni/ravenwood_runtime.cpp | 6 +
.../ravenwood-annotation-allowed-classes.txt | 231 ++++++++++++++++++
ravenwood/texts/ravenwood-build.prop | 6 +-
ravenwood/texts/ravenwood-common-policies.txt | 4 +
.../texts/ravenwood-framework-policies.txt | 19 ++
277 files changed, 1132 insertions(+), 133 deletions(-)
create mode 100644 libs/hwui/framework-graphics-ravenwood-policies.txt
create mode 100644 ravenwood/runtime-helper-src/libcore-fake/dalvik/system/CloseGuard.java
create mode 100644 ravenwood/runtime-helper-src/libcore-fake/libcore/io/IoBridge.java
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index b611acf79bc31..eb9feb95bf3d3 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -50,6 +50,7 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.ravenwood.annotation.RavenwoodKeep;
import android.ravenwood.annotation.RavenwoodKeepPartialClass;
+import android.ravenwood.annotation.RavenwoodKeepWholeClass;
import android.ravenwood.annotation.RavenwoodReplace;
import android.util.AndroidRuntimeException;
import android.util.Log;
@@ -460,6 +461,7 @@ public class Instrumentation {
*
* @param runner The code to run on the main thread.
*/
+ @RavenwoodReplace(blockedBy = ActivityThread.class)
public void runOnMainSync(Runnable runner) {
validateNotAppThread();
SyncRunnable sr = new SyncRunnable(runner);
@@ -467,6 +469,13 @@ public class Instrumentation {
sr.waitForComplete();
}
+ private void runOnMainSync$ravenwood(Runnable runner) {
+ validateNotAppThread();
+ SyncRunnable sr = new SyncRunnable(runner);
+ mInstrContext.getMainExecutor().execute(sr);
+ sr.waitForComplete();
+ }
+
boolean isSdkSandboxAllowedToStartActivities() {
return Process.isSdkSandbox()
&& mThread != null
@@ -2442,7 +2451,8 @@ public class Instrumentation {
}
}
- private final void validateNotAppThread() {
+ @RavenwoodKeep
+ private void validateNotAppThread() {
if (Looper.myLooper() == Looper.getMainLooper()) {
throw new RuntimeException(
"This method can not be called from the main application thread");
@@ -2586,6 +2596,7 @@ public class Instrumentation {
}
}
+ @RavenwoodKeepWholeClass
private static final class SyncRunnable implements Runnable {
private final Runnable mTarget;
private boolean mComplete;
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index 05596318aef57..2658efab0e44f 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -482,7 +482,6 @@ public class Resources {
*
* @return Typeface The Typeface data associated with the resource.
*/
- @RavenwoodThrow(blockedBy = Typeface.class)
@NonNull public Typeface getFont(@FontRes int id) throws NotFoundException {
final TypedValue value = obtainTempTypedValue();
try {
@@ -507,7 +506,6 @@ public class Resources {
/**
* @hide
*/
- @RavenwoodThrow(blockedBy = Typeface.class)
public void preloadFonts(@ArrayRes int id) {
final TypedArray array = obtainTypedArray(id);
try {
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index 96c71765d1023..ddad54d94cc6c 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -1064,7 +1064,6 @@ public class ResourcesImpl {
* Loads a font from XML or resources stream.
*/
@Nullable
- @RavenwoodThrow(blockedBy = Typeface.class)
public Typeface loadFont(Resources wrapper, TypedValue value, int id) {
if (value.string == null) {
throw new NotFoundException("Resource \"" + getResourceName(id) + "\" ("
diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java
index 79185a10e156c..ee7d008cf3141 100644
--- a/core/java/android/content/res/TypedArray.java
+++ b/core/java/android/content/res/TypedArray.java
@@ -1043,7 +1043,6 @@ public class TypedArray implements AutoCloseable {
* not a font resource.
*/
@Nullable
- @RavenwoodThrow(blockedBy = Typeface.class)
public Typeface getFont(@StyleableRes int index) {
if (mRecycled) {
throw new RuntimeException("Cannot make calls to a recycled instance!");
diff --git a/core/java/android/graphics/fonts/FontFamilyUpdateRequest.java b/core/java/android/graphics/fonts/FontFamilyUpdateRequest.java
index bfbcfd828114a..1bf01f4beb1b7 100644
--- a/core/java/android/graphics/fonts/FontFamilyUpdateRequest.java
+++ b/core/java/android/graphics/fonts/FontFamilyUpdateRequest.java
@@ -68,6 +68,7 @@ import java.util.Objects;
* @hide
*/
@SystemApi
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class FontFamilyUpdateRequest {
/**
diff --git a/core/java/android/graphics/fonts/FontFileUpdateRequest.java b/core/java/android/graphics/fonts/FontFileUpdateRequest.java
index cf1dca9652167..1f2be6fa5050b 100644
--- a/core/java/android/graphics/fonts/FontFileUpdateRequest.java
+++ b/core/java/android/graphics/fonts/FontFileUpdateRequest.java
@@ -28,6 +28,7 @@ import java.util.Objects;
* @hide
*/
@SystemApi
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class FontFileUpdateRequest {
private final ParcelFileDescriptor mParcelFileDescriptor;
diff --git a/core/java/android/text/AlteredCharSequence.java b/core/java/android/text/AlteredCharSequence.java
index 971a47dba6e80..a05c690a9e30a 100644
--- a/core/java/android/text/AlteredCharSequence.java
+++ b/core/java/android/text/AlteredCharSequence.java
@@ -24,6 +24,7 @@ package android.text;
* @deprecated The functionality this class offers is easily implemented outside the framework.
*/
@Deprecated
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class AlteredCharSequence
implements CharSequence, GetChars
{
diff --git a/core/java/android/text/AndroidBidi.java b/core/java/android/text/AndroidBidi.java
index 31da799951720..fcdd50abc02ad 100644
--- a/core/java/android/text/AndroidBidi.java
+++ b/core/java/android/text/AndroidBidi.java
@@ -28,6 +28,7 @@ import com.android.internal.annotations.VisibleForTesting;
* @hide
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class AndroidBidi {
/**
diff --git a/core/java/android/text/AndroidCharacter.java b/core/java/android/text/AndroidCharacter.java
index c5f1a01f59271..37c4fdbef915a 100644
--- a/core/java/android/text/AndroidCharacter.java
+++ b/core/java/android/text/AndroidCharacter.java
@@ -22,6 +22,7 @@ package android.text;
* @deprecated Use various methods from {@link android.icu.lang.UCharacter}, instead.
*/
@Deprecated
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class AndroidCharacter
{
public static final int EAST_ASIAN_WIDTH_NEUTRAL = 0;
diff --git a/core/java/android/text/Annotation.java b/core/java/android/text/Annotation.java
index bb5d3ea7da4bc..ac3e5a964a33b 100644
--- a/core/java/android/text/Annotation.java
+++ b/core/java/android/text/Annotation.java
@@ -23,6 +23,7 @@ import android.os.Parcel;
* TextView save/restore cycles and can be used to keep application-specific
* data that needs to be maintained for regions of text.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Annotation implements ParcelableSpan {
private final String mKey;
private final String mValue;
diff --git a/core/java/android/text/AutoGrowArray.java b/core/java/android/text/AutoGrowArray.java
index e428377a0a313..06c74c3370c1d 100644
--- a/core/java/android/text/AutoGrowArray.java
+++ b/core/java/android/text/AutoGrowArray.java
@@ -30,6 +30,7 @@ import libcore.util.EmptyArray;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class AutoGrowArray {
private static final int MIN_CAPACITY_INCREMENT = 12;
private static final int MAX_CAPACITY_TO_BE_KEPT = 10000;
diff --git a/core/java/android/text/AutoText.java b/core/java/android/text/AutoText.java
index c5339a42cbd1f..d7b0547e6c4ce 100644
--- a/core/java/android/text/AutoText.java
+++ b/core/java/android/text/AutoText.java
@@ -31,6 +31,7 @@ import java.util.Locale;
/**
* This class accesses a dictionary of corrections to frequent misspellings.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class AutoText {
// struct trie {
// char c;
diff --git a/core/java/android/text/BidiFormatter.java b/core/java/android/text/BidiFormatter.java
index dfa172df72ea2..6d4103cee7a61 100644
--- a/core/java/android/text/BidiFormatter.java
+++ b/core/java/android/text/BidiFormatter.java
@@ -82,6 +82,7 @@ import java.util.Locale;
* first-strong estimation algorithm. It can also be configured to use a custom directionality
* estimation object.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class BidiFormatter {
/**
diff --git a/core/java/android/text/BoringLayout.java b/core/java/android/text/BoringLayout.java
index 4fdcecc4f782f..2b410e6284bf2 100644
--- a/core/java/android/text/BoringLayout.java
+++ b/core/java/android/text/BoringLayout.java
@@ -45,6 +45,7 @@ import com.android.text.flags.Flags;
* {@link android.graphics.Canvas#drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint)
* Canvas.drawText()} directly.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback {
/**
diff --git a/core/java/android/text/CharSequenceCharacterIterator.java b/core/java/android/text/CharSequenceCharacterIterator.java
index 9b07d29bd9dd5..1599be8237d44 100644
--- a/core/java/android/text/CharSequenceCharacterIterator.java
+++ b/core/java/android/text/CharSequenceCharacterIterator.java
@@ -24,6 +24,7 @@ import java.text.CharacterIterator;
* An implementation of {@link java.text.CharacterIterator} that iterates over a given CharSequence.
* {@hide}
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class CharSequenceCharacterIterator implements CharacterIterator {
private final int mBeginIndex, mEndIndex;
private int mIndex;
diff --git a/core/java/android/text/ClipboardManager.java b/core/java/android/text/ClipboardManager.java
index d0309100b0f2e..41990f0fc8dd3 100644
--- a/core/java/android/text/ClipboardManager.java
+++ b/core/java/android/text/ClipboardManager.java
@@ -21,6 +21,7 @@ package android.text;
* {@link android.content.ClipboardManager} for the modern API.
*/
@Deprecated
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class ClipboardManager {
/**
* Returns the text on the clipboard. It will eventually be possible
diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java
index 6b1aef710e504..3b66ce0167c49 100644
--- a/core/java/android/text/DynamicLayout.java
+++ b/core/java/android/text/DynamicLayout.java
@@ -53,6 +53,7 @@ import java.lang.ref.WeakReference;
* {@link android.graphics.Canvas#drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint)
* Canvas.drawText()} directly.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class DynamicLayout extends Layout {
private static final int PRIORITY = 128;
private static final int BLOCK_MINIMUM_CHARACTER_LENGTH = 400;
diff --git a/core/java/android/text/Editable.java b/core/java/android/text/Editable.java
index a942f6ce28793..53d819f52a5c8 100644
--- a/core/java/android/text/Editable.java
+++ b/core/java/android/text/Editable.java
@@ -22,6 +22,7 @@ package android.text;
* to immutable text like Strings). If you make a {@link DynamicLayout}
* of an Editable, the layout will be reflowed as the text is changed.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface Editable
extends CharSequence, GetChars, Spannable, Appendable
{
diff --git a/core/java/android/text/Emoji.java b/core/java/android/text/Emoji.java
index cf0e3c26daac2..28c37c00d66e8 100644
--- a/core/java/android/text/Emoji.java
+++ b/core/java/android/text/Emoji.java
@@ -23,6 +23,7 @@ import android.icu.lang.UProperty;
* An utility class for Emoji.
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Emoji {
public static int COMBINING_ENCLOSING_KEYCAP = 0x20E3;
diff --git a/core/java/android/text/EmojiConsistency.java b/core/java/android/text/EmojiConsistency.java
index dfaa217c0cca7..9823305ec72a2 100644
--- a/core/java/android/text/EmojiConsistency.java
+++ b/core/java/android/text/EmojiConsistency.java
@@ -48,6 +48,7 @@ import java.util.Set;
*
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class EmojiConsistency {
/* Cannot construct */
private EmojiConsistency() { }
diff --git a/core/java/android/text/FontConfig.java b/core/java/android/text/FontConfig.java
index 783f3b7aa64bf..5a4d3a8670327 100644
--- a/core/java/android/text/FontConfig.java
+++ b/core/java/android/text/FontConfig.java
@@ -55,6 +55,7 @@ import java.util.Objects;
*/
@SystemApi
@TestApi
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class FontConfig implements Parcelable {
private final @NonNull List mFamilies;
private final @NonNull List mAliases;
diff --git a/core/java/android/text/GetChars.java b/core/java/android/text/GetChars.java
index 348a911a442ff..229f5437e76bd 100644
--- a/core/java/android/text/GetChars.java
+++ b/core/java/android/text/GetChars.java
@@ -21,6 +21,7 @@ package android.text;
* getChars() method like the one in String that is faster than
* calling charAt() multiple times.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface GetChars
extends CharSequence
{
diff --git a/core/java/android/text/GraphemeClusterSegmentFinder.java b/core/java/android/text/GraphemeClusterSegmentFinder.java
index 0f6fdaf23c656..996223dd1a84f 100644
--- a/core/java/android/text/GraphemeClusterSegmentFinder.java
+++ b/core/java/android/text/GraphemeClusterSegmentFinder.java
@@ -31,6 +31,7 @@ import android.graphics.text.GraphemeBreak;
* @see Unicode Text
* Segmentation - Grapheme Cluster Boundaries
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class GraphemeClusterSegmentFinder extends SegmentFinder {
private static AutoGrowArray.FloatArray sTempAdvances = null;
private final boolean[] mIsGraphemeBreak;
diff --git a/core/java/android/text/GraphicsOperations.java b/core/java/android/text/GraphicsOperations.java
index 6c1544644eab0..f7fe805e53a4e 100644
--- a/core/java/android/text/GraphicsOperations.java
+++ b/core/java/android/text/GraphicsOperations.java
@@ -26,6 +26,7 @@ import android.graphics.Paint;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface GraphicsOperations extends CharSequence {
/**
* Just like {@link Canvas#drawText}.
diff --git a/core/java/android/text/Highlights.java b/core/java/android/text/Highlights.java
index 693dbcf84e84e..217a38b6edd5a 100644
--- a/core/java/android/text/Highlights.java
+++ b/core/java/android/text/Highlights.java
@@ -30,6 +30,7 @@ import java.util.Objects;
/**
* A class that represents of the highlight of the text.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Highlights {
private final List> mHighlights;
diff --git a/core/java/android/text/Html.java b/core/java/android/text/Html.java
index a42eece57eec9..d412071bf3b93 100644
--- a/core/java/android/text/Html.java
+++ b/core/java/android/text/Html.java
@@ -17,13 +17,13 @@
package android.text;
import android.app.ActivityThread;
-import android.app.Application;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Build;
+import android.ravenwood.annotation.RavenwoodReplace;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.AlignmentSpan;
import android.text.style.BackgroundColorSpan;
@@ -65,6 +65,7 @@ import java.util.regex.Pattern;
* This class processes HTML strings into displayable styled text.
* Not all HTML tags are supported.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Html {
/**
* Retrieves images for HTML <img> tags.
@@ -506,6 +507,15 @@ public class Html {
out.append("\n");
}
+ @RavenwoodReplace(blockedBy = ActivityThread.class)
+ private static float getDisplayMetricsDensity() {
+ return ActivityThread.currentApplication().getResources().getDisplayMetrics().density;
+ }
+
+ private static float getDisplayMetricsDensity$ravenwood() {
+ return Resources.getSystem().getDisplayMetrics().density;
+ }
+
private static void withinParagraph(StringBuilder out, Spanned text, int start, int end) {
int next;
for (int i = start; i < end; i = next) {
@@ -559,8 +569,7 @@ public class Html {
AbsoluteSizeSpan s = ((AbsoluteSizeSpan) style[j]);
float sizeDip = s.getSize();
if (!s.getDip()) {
- Application application = ActivityThread.currentApplication();
- sizeDip /= application.getResources().getDisplayMetrics().density;
+ sizeDip /= getDisplayMetricsDensity();
}
// px in CSS is the equivalance of dip in Android
@@ -669,6 +678,7 @@ public class Html {
}
}
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
class HtmlToSpannedConverter implements ContentHandler {
private static final float[] HEADING_SIZES = {
@@ -843,6 +853,16 @@ class HtmlToSpannedConverter implements ContentHandler {
}
}
+ @RavenwoodReplace(blockedBy = ActivityThread.class)
+ private static int getFontWeightAdjustment() {
+ return ActivityThread.currentApplication().getResources()
+ .getConfiguration().fontWeightAdjustment;
+ }
+
+ private static int getFontWeightAdjustment$ravenwood() {
+ return Resources.getSystem().getConfiguration().fontWeightAdjustment;
+ }
+
private void handleEndTag(String tag) {
if (tag.equalsIgnoreCase("br")) {
handleBr(mSpannableStringBuilder);
@@ -858,17 +878,11 @@ class HtmlToSpannedConverter implements ContentHandler {
} else if (tag.equalsIgnoreCase("span")) {
endCssStyle(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("strong")) {
- Application application = ActivityThread.currentApplication();
- int fontWeightAdjustment =
- application.getResources().getConfiguration().fontWeightAdjustment;
end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD,
- fontWeightAdjustment));
+ getFontWeightAdjustment()));
} else if (tag.equalsIgnoreCase("b")) {
- Application application = ActivityThread.currentApplication();
- int fontWeightAdjustment =
- application.getResources().getConfiguration().fontWeightAdjustment;
end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD,
- fontWeightAdjustment));
+ getFontWeightAdjustment()));
} else if (tag.equalsIgnoreCase("em")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("cite")) {
@@ -1036,11 +1050,8 @@ class HtmlToSpannedConverter implements ContentHandler {
// Their ranges should not include the newlines at the end
Heading h = getLast(text, Heading.class);
if (h != null) {
- Application application = ActivityThread.currentApplication();
- int fontWeightAdjustment =
- application.getResources().getConfiguration().fontWeightAdjustment;
setSpanFromMark(text, h, new RelativeSizeSpan(HEADING_SIZES[h.mLevel]),
- new StyleSpan(Typeface.BOLD, fontWeightAdjustment));
+ new StyleSpan(Typeface.BOLD, getFontWeightAdjustment()));
}
endBlockElement(text);
diff --git a/core/java/android/text/Hyphenator.java b/core/java/android/text/Hyphenator.java
index 6f0628ad38e6c..7f9a8a1c08067 100644
--- a/core/java/android/text/Hyphenator.java
+++ b/core/java/android/text/Hyphenator.java
@@ -21,6 +21,7 @@ package android.text;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Hyphenator {
private Hyphenator() {}
diff --git a/core/java/android/text/InputFilter.java b/core/java/android/text/InputFilter.java
index 96e7bd0fef4cb..ed5de03e5528e 100644
--- a/core/java/android/text/InputFilter.java
+++ b/core/java/android/text/InputFilter.java
@@ -27,6 +27,7 @@ import java.util.Locale;
* InputFilters can be attached to {@link Editable}s to constrain the
* changes that can be made to them.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface InputFilter
{
/**
diff --git a/core/java/android/text/InputType.java b/core/java/android/text/InputType.java
index 4ebecb7494fa2..03c9c023d9ce8 100644
--- a/core/java/android/text/InputType.java
+++ b/core/java/android/text/InputType.java
@@ -44,6 +44,7 @@ import java.util.List;
* TYPE_DATETIME_VARIATION_TIME
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface InputType {
/**
* Mask of bits that determine the overall class
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index 2fa56137a8a03..08453d09a1ffb 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -69,6 +69,7 @@ import java.util.Locale;
* which will be updated as the text changes.
* For text that will not change, use a {@link StaticLayout}.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class Layout {
// These should match the constants in framework/base/libs/hwui/hwui/DrawTextFunctor.h
diff --git a/core/java/android/text/LoginFilter.java b/core/java/android/text/LoginFilter.java
index 0e4eec4488ee6..94f196f7ef6bd 100644
--- a/core/java/android/text/LoginFilter.java
+++ b/core/java/android/text/LoginFilter.java
@@ -23,6 +23,7 @@ package android.text;
* handle non-BMP characters.
*/
@Deprecated
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class LoginFilter implements InputFilter {
private boolean mAppendInvalid; // whether to append or ignore invalid characters
/**
diff --git a/core/java/android/text/MeasuredParagraph.java b/core/java/android/text/MeasuredParagraph.java
index 31a226341907f..b2e44598a5486 100644
--- a/core/java/android/text/MeasuredParagraph.java
+++ b/core/java/android/text/MeasuredParagraph.java
@@ -68,6 +68,7 @@ import java.util.Arrays;
* @hide
*/
@TestApi
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class MeasuredParagraph {
private static final char OBJECT_REPLACEMENT_CHARACTER = '\uFFFC';
diff --git a/core/java/android/text/NoCopySpan.java b/core/java/android/text/NoCopySpan.java
index e754d765e14c0..4cd3d04dc4e64 100644
--- a/core/java/android/text/NoCopySpan.java
+++ b/core/java/android/text/NoCopySpan.java
@@ -21,6 +21,7 @@ package android.text;
* into a new Spanned when performing a slice or copy operation on the original
* Spanned it was placed in.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface NoCopySpan {
/**
* Convenience equivalent for when you would just want a new Object() for
diff --git a/core/java/android/text/PackedIntVector.java b/core/java/android/text/PackedIntVector.java
index 3e5bf56778539..11dd0c38182b4 100644
--- a/core/java/android/text/PackedIntVector.java
+++ b/core/java/android/text/PackedIntVector.java
@@ -29,6 +29,7 @@ import com.android.internal.util.GrowingArrayUtils;
* @hide
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PackedIntVector {
private final int mColumns;
private int mRows;
diff --git a/core/java/android/text/PackedObjectVector.java b/core/java/android/text/PackedObjectVector.java
index b777e16a153d3..beb5ea4ee28cc 100644
--- a/core/java/android/text/PackedObjectVector.java
+++ b/core/java/android/text/PackedObjectVector.java
@@ -21,6 +21,7 @@ import com.android.internal.util.GrowingArrayUtils;
import libcore.util.EmptyArray;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
class PackedObjectVector
{
private int mColumns;
diff --git a/core/java/android/text/ParcelableSpan.java b/core/java/android/text/ParcelableSpan.java
index d7c1a4bc26e8d..a9a4893d36928 100644
--- a/core/java/android/text/ParcelableSpan.java
+++ b/core/java/android/text/ParcelableSpan.java
@@ -24,6 +24,7 @@ import android.os.Parcelable;
* This can only be used by code in the framework; it is not intended for
* applications to implement their own Parcelable spans.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface ParcelableSpan extends Parcelable {
/**
* Return a special type identifier for this span class.
diff --git a/core/java/android/text/PrecomputedText.java b/core/java/android/text/PrecomputedText.java
index 5f6a9bd068c9c..71cacd9b199a1 100644
--- a/core/java/android/text/PrecomputedText.java
+++ b/core/java/android/text/PrecomputedText.java
@@ -75,6 +75,7 @@ import java.util.Objects;
* Note that any {@link android.text.NoCopySpan} attached to the original text won't be passed to
* PrecomputedText.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PrecomputedText implements Spannable {
private static final char LINE_FEED = '\n';
diff --git a/core/java/android/text/SegmentFinder.java b/core/java/android/text/SegmentFinder.java
index 047d07a2e3e01..b7ab0e62753a4 100644
--- a/core/java/android/text/SegmentFinder.java
+++ b/core/java/android/text/SegmentFinder.java
@@ -39,6 +39,7 @@ import java.util.Objects;
*
* @see Layout#getRangeForRect(RectF, SegmentFinder, Layout.TextInclusionStrategy)
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class SegmentFinder {
/**
* Return value of previousStartBoundary(int), previousEndBoundary(int), nextStartBoundary(int),
diff --git a/core/java/android/text/Selection.java b/core/java/android/text/Selection.java
index 711578c1482f7..674b473724829 100644
--- a/core/java/android/text/Selection.java
+++ b/core/java/android/text/Selection.java
@@ -27,6 +27,7 @@ import java.text.BreakIterator;
* Utility class for manipulating cursors and selections in CharSequences.
* A cursor is a selection where the start and end are at the same offset.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Selection {
private Selection() { /* cannot be instantiated */ }
diff --git a/core/java/android/text/SpanColors.java b/core/java/android/text/SpanColors.java
index fcd242b627008..3b6a0418dcb02 100644
--- a/core/java/android/text/SpanColors.java
+++ b/core/java/android/text/SpanColors.java
@@ -27,6 +27,7 @@ import android.text.style.CharacterStyle;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SpanColors {
public static final @ColorInt int NO_COLOR_FOUND = Color.TRANSPARENT;
diff --git a/core/java/android/text/SpanSet.java b/core/java/android/text/SpanSet.java
index d464278c714cc..4ad8106eb459a 100644
--- a/core/java/android/text/SpanSet.java
+++ b/core/java/android/text/SpanSet.java
@@ -31,6 +31,7 @@ import java.util.Arrays;
* Note that empty spans are ignored by this class.
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SpanSet {
private final Class extends E> classType;
diff --git a/core/java/android/text/SpanWatcher.java b/core/java/android/text/SpanWatcher.java
index 01e82c815ac82..31d63206a144b 100644
--- a/core/java/android/text/SpanWatcher.java
+++ b/core/java/android/text/SpanWatcher.java
@@ -21,6 +21,7 @@ package android.text;
* will be called to notify it that other markup objects have been
* added, changed, or removed.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface SpanWatcher extends NoCopySpan {
/**
* This method is called to notify you that the specified object
diff --git a/core/java/android/text/Spannable.java b/core/java/android/text/Spannable.java
index 8315b2aa52c65..fac5131c035a2 100644
--- a/core/java/android/text/Spannable.java
+++ b/core/java/android/text/Spannable.java
@@ -21,6 +21,7 @@ package android.text;
* attached and detached. Not all Spannable classes have mutable text;
* see {@link Editable} for that.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface Spannable
extends Spanned
{
diff --git a/core/java/android/text/SpannableString.java b/core/java/android/text/SpannableString.java
index afb5df809bc03..ee04a86a808f6 100644
--- a/core/java/android/text/SpannableString.java
+++ b/core/java/android/text/SpannableString.java
@@ -21,6 +21,7 @@ package android.text;
* markup objects can be attached and detached.
* For mutable text, see {@link SpannableStringBuilder}.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SpannableString
extends SpannableStringInternal
implements CharSequence, GetChars, Spannable
diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java
index 0e61eff86c2ba..f8d7283a94b3c 100644
--- a/core/java/android/text/SpannableStringBuilder.java
+++ b/core/java/android/text/SpannableStringBuilder.java
@@ -35,6 +35,7 @@ import java.util.IdentityHashMap;
/**
* This is the class for text whose content and markup can both be changed.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SpannableStringBuilder implements CharSequence, GetChars, Spannable, Editable,
Appendable, GraphicsOperations {
private final static String TAG = "SpannableStringBuilder";
diff --git a/core/java/android/text/SpannableStringInternal.java b/core/java/android/text/SpannableStringInternal.java
index f2ab1bb31fbc5..90d83d59eb656 100644
--- a/core/java/android/text/SpannableStringInternal.java
+++ b/core/java/android/text/SpannableStringInternal.java
@@ -27,6 +27,7 @@ import libcore.util.EmptyArray;
import java.lang.reflect.Array;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
/* package */ abstract class SpannableStringInternal
{
/* package */ SpannableStringInternal(CharSequence source,
diff --git a/core/java/android/text/Spanned.java b/core/java/android/text/Spanned.java
index a0d54c26c6d9d..6706ffd245c14 100644
--- a/core/java/android/text/Spanned.java
+++ b/core/java/android/text/Spanned.java
@@ -22,6 +22,7 @@ package android.text;
* see {@link Spannable} for mutable markup and {@link Editable} for
* mutable text.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface Spanned
extends CharSequence
{
diff --git a/core/java/android/text/SpannedString.java b/core/java/android/text/SpannedString.java
index acee3c5f1a41a..a3f1ee2e3f209 100644
--- a/core/java/android/text/SpannedString.java
+++ b/core/java/android/text/SpannedString.java
@@ -22,6 +22,7 @@ package android.text;
* For mutable markup, see {@link SpannableString}; for mutable text,
* see {@link SpannableStringBuilder}.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class SpannedString
extends SpannableStringInternal
implements CharSequence, GetChars, Spanned
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index a5d52957c40e1..8193cd2beb80b 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -55,6 +55,7 @@ import java.util.Arrays;
* float, float, android.graphics.Paint)
* Canvas.drawText()} directly.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class StaticLayout extends Layout {
/*
* The break iteration is done in native code. The protocol for using the native code is as
diff --git a/core/java/android/text/TextDirectionHeuristic.java b/core/java/android/text/TextDirectionHeuristic.java
index 8a4ba42bcc917..66cea853cda9c 100644
--- a/core/java/android/text/TextDirectionHeuristic.java
+++ b/core/java/android/text/TextDirectionHeuristic.java
@@ -19,6 +19,7 @@ package android.text;
/**
* Interface for objects that use a heuristic for guessing at the paragraph direction by examining text.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface TextDirectionHeuristic {
/**
* Guess if a chars array is in the RTL direction or not.
diff --git a/core/java/android/text/TextDirectionHeuristics.java b/core/java/android/text/TextDirectionHeuristics.java
index 85260f4af2c88..3af8fb7f489df 100644
--- a/core/java/android/text/TextDirectionHeuristics.java
+++ b/core/java/android/text/TextDirectionHeuristics.java
@@ -32,6 +32,7 @@ import java.nio.CharBuffer;
* class.
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TextDirectionHeuristics {
/**
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index 3015791ee0a9c..091eb60270020 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -53,6 +53,7 @@ import java.util.ArrayList;
* @hide
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TextLine {
private static final boolean DEBUG = false;
diff --git a/core/java/android/text/TextPaint.java b/core/java/android/text/TextPaint.java
index 73825b13cb6be..ff063f2ac2f49 100644
--- a/core/java/android/text/TextPaint.java
+++ b/core/java/android/text/TextPaint.java
@@ -25,6 +25,7 @@ import android.graphics.Paint;
* TextPaint is an extension of Paint that leaves room for some extra
* data used during text measuring and drawing.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TextPaint extends Paint {
// Special value 0 means no background paint
diff --git a/core/java/android/text/TextShaper.java b/core/java/android/text/TextShaper.java
index 6da0b63dbc1f3..6d17401847638 100644
--- a/core/java/android/text/TextShaper.java
+++ b/core/java/android/text/TextShaper.java
@@ -169,6 +169,7 @@ import android.graphics.text.TextRunShaper;
* @see TextShaper#shapeText(CharSequence, int, int, TextDirectionHeuristic, TextPaint,
* GlyphsConsumer)
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TextShaper {
private TextShaper() {}
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index 6dc82c40ddc51..042966b81b9af 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -34,6 +34,7 @@ import android.icu.text.Edits;
import android.icu.util.ULocale;
import android.os.Parcel;
import android.os.Parcelable;
+import android.ravenwood.annotation.RavenwoodKeepWholeClass;
import android.sysprop.DisplayProperties;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.AccessibilityClickableSpan;
@@ -85,8 +86,7 @@ import java.util.List;
import java.util.Locale;
import java.util.regex.Pattern;
-@android.ravenwood.annotation.RavenwoodKeepStaticInitializer
-@android.ravenwood.annotation.RavenwoodKeepPartialClass
+@RavenwoodKeepWholeClass
public class TextUtils {
private static final String TAG = "TextUtils";
@@ -147,7 +147,6 @@ public class TextUtils {
private TextUtils() { /* cannot be instantiated */ }
- @android.ravenwood.annotation.RavenwoodKeep
public static void getChars(CharSequence s, int start, int end,
char[] dest, int destoff) {
Class extends CharSequence> c = s.getClass();
@@ -166,12 +165,10 @@ public class TextUtils {
}
}
- @android.ravenwood.annotation.RavenwoodKeep
public static int indexOf(CharSequence s, char ch) {
return indexOf(s, ch, 0);
}
- @android.ravenwood.annotation.RavenwoodKeep
public static int indexOf(CharSequence s, char ch, int start) {
Class extends CharSequence> c = s.getClass();
@@ -181,7 +178,6 @@ public class TextUtils {
return indexOf(s, ch, start, s.length());
}
- @android.ravenwood.annotation.RavenwoodKeep
public static int indexOf(CharSequence s, char ch, int start, int end) {
Class extends CharSequence> c = s.getClass();
@@ -219,12 +215,10 @@ public class TextUtils {
return -1;
}
- @android.ravenwood.annotation.RavenwoodKeep
public static int lastIndexOf(CharSequence s, char ch) {
return lastIndexOf(s, ch, s.length() - 1);
}
- @android.ravenwood.annotation.RavenwoodKeep
public static int lastIndexOf(CharSequence s, char ch, int last) {
Class extends CharSequence> c = s.getClass();
@@ -234,7 +228,6 @@ public class TextUtils {
return lastIndexOf(s, ch, 0, last);
}
- @android.ravenwood.annotation.RavenwoodKeep
public static int lastIndexOf(CharSequence s, char ch,
int start, int last) {
if (last < 0)
@@ -280,17 +273,14 @@ public class TextUtils {
return -1;
}
- @android.ravenwood.annotation.RavenwoodKeep
public static int indexOf(CharSequence s, CharSequence needle) {
return indexOf(s, needle, 0, s.length());
}
- @android.ravenwood.annotation.RavenwoodKeep
public static int indexOf(CharSequence s, CharSequence needle, int start) {
return indexOf(s, needle, start, s.length());
}
- @android.ravenwood.annotation.RavenwoodKeep
public static int indexOf(CharSequence s, CharSequence needle,
int start, int end) {
int nlen = needle.length();
@@ -318,7 +308,6 @@ public class TextUtils {
return -1;
}
- @android.ravenwood.annotation.RavenwoodKeep
public static boolean regionMatches(CharSequence one, int toffset,
CharSequence two, int ooffset,
int len) {
@@ -351,7 +340,6 @@ public class TextUtils {
* in that it does not preserve any style runs in the source sequence,
* allowing a more efficient implementation.
*/
- @android.ravenwood.annotation.RavenwoodKeep
public static String substring(CharSequence source, int start, int end) {
if (source instanceof String)
return ((String) source).substring(start, end);
@@ -424,7 +412,6 @@ public class TextUtils {
* calling object.toString(). If tokens is null, a NullPointerException will be thrown. If
* tokens is an empty array, an empty string will be returned.
*/
- @android.ravenwood.annotation.RavenwoodKeep
public static String join(@NonNull CharSequence delimiter, @NonNull Object[] tokens) {
final int length = tokens.length;
if (length == 0) {
@@ -448,7 +435,6 @@ public class TextUtils {
* calling object.toString(). If tokens is null, a NullPointerException will be thrown. If
* tokens is empty, an empty string will be returned.
*/
- @android.ravenwood.annotation.RavenwoodKeep
public static String join(@NonNull CharSequence delimiter, @NonNull Iterable tokens) {
final Iterator> it = tokens.iterator();
if (!it.hasNext()) {
@@ -481,7 +467,6 @@ public class TextUtils {
*
* @throws NullPointerException if expression or text is null
*/
- @android.ravenwood.annotation.RavenwoodKeep
public static String[] split(String text, String expression) {
if (text.length() == 0) {
return EmptyArray.STRING;
@@ -507,7 +492,6 @@ public class TextUtils {
*
* @throws NullPointerException if expression or text is null
*/
- @android.ravenwood.annotation.RavenwoodKeep
public static String[] split(String text, Pattern pattern) {
if (text.length() == 0) {
return EmptyArray.STRING;
@@ -545,7 +529,6 @@ public class TextUtils {
* be returned for the empty string after that delimeter. That is, splitting "a,b," on
* comma will return "a", "b", not "a", "b", "".
*/
- @android.ravenwood.annotation.RavenwoodKeepWholeClass
public static class SimpleStringSplitter implements StringSplitter, Iterator {
private String mString;
private char mDelimiter;
@@ -609,31 +592,26 @@ public class TextUtils {
* @param str the string to be examined
* @return true if str is null or zero length
*/
- @android.ravenwood.annotation.RavenwoodKeep
public static boolean isEmpty(@Nullable CharSequence str) {
return str == null || str.length() == 0;
}
/** {@hide} */
- @android.ravenwood.annotation.RavenwoodKeep
public static String nullIfEmpty(@Nullable String str) {
return isEmpty(str) ? null : str;
}
/** {@hide} */
- @android.ravenwood.annotation.RavenwoodKeep
public static String emptyIfNull(@Nullable String str) {
return str == null ? "" : str;
}
/** {@hide} */
- @android.ravenwood.annotation.RavenwoodKeep
public static String firstNotEmpty(@Nullable String a, @NonNull String b) {
return !isEmpty(a) ? a : Preconditions.checkStringNotEmpty(b);
}
/** {@hide} */
- @android.ravenwood.annotation.RavenwoodKeep
public static int length(@Nullable String s) {
return s != null ? s.length() : 0;
}
@@ -642,7 +620,6 @@ public class TextUtils {
* @return interned string if it's null.
* @hide
*/
- @android.ravenwood.annotation.RavenwoodKeep
public static String safeIntern(String s) {
return (s != null) ? s.intern() : null;
}
@@ -652,7 +629,6 @@ public class TextUtils {
* spaces and ASCII control characters were trimmed from the start and end,
* as by {@link String#trim}.
*/
- @android.ravenwood.annotation.RavenwoodKeep
public static int getTrimmedLength(CharSequence s) {
int len = s.length();
@@ -677,7 +653,6 @@ public class TextUtils {
* @param b second CharSequence to check
* @return true if a and b are equal
*/
- @android.ravenwood.annotation.RavenwoodKeep
public static boolean equals(@Nullable CharSequence a, @Nullable CharSequence b) {
if (a == b) return true;
int length;
@@ -1713,7 +1688,6 @@ public class TextUtils {
return true;
}
- @android.ravenwood.annotation.RavenwoodKeep
/* package */ static char[] obtain(int len) {
char[] buf;
@@ -1728,7 +1702,6 @@ public class TextUtils {
return buf;
}
- @android.ravenwood.annotation.RavenwoodKeep
/* package */ static void recycle(char[] temp) {
if (temp.length > 1000)
return;
@@ -1743,7 +1716,6 @@ public class TextUtils {
* @param s the string to be encoded
* @return the encoded string
*/
- @android.ravenwood.annotation.RavenwoodKeep
public static String htmlEncode(String s) {
StringBuilder sb = new StringBuilder();
char c;
@@ -1830,7 +1802,6 @@ public class TextUtils {
/**
* Returns whether the given CharSequence contains any printable characters.
*/
- @android.ravenwood.annotation.RavenwoodKeep
public static boolean isGraphic(CharSequence str) {
final int len = str.length();
for (int cp, i=0; is,
diff --git a/core/java/android/text/WordSegmentFinder.java b/core/java/android/text/WordSegmentFinder.java
index b0a70eae902a3..b8702d72f29c9 100644
--- a/core/java/android/text/WordSegmentFinder.java
+++ b/core/java/android/text/WordSegmentFinder.java
@@ -33,6 +33,7 @@ import android.text.method.WordIterator;
* @see Unicode Text Segmentation - Word
* Boundaries
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class WordSegmentFinder extends SegmentFinder {
private final CharSequence mText;
private final WordIterator mWordIterator;
diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java
index e6dad27d595b9..ef60d3058c5c6 100644
--- a/core/java/android/text/format/DateFormat.java
+++ b/core/java/android/text/format/DateFormat.java
@@ -63,6 +63,7 @@ import java.util.TimeZone;
* Note that the non-{@code format} methods in this class are implemented by
* {@code SimpleDateFormat}.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class DateFormat {
/**
* @deprecated Use a literal {@code '} instead.
diff --git a/core/java/android/text/format/DateIntervalFormat.java b/core/java/android/text/format/DateIntervalFormat.java
index 8dea3228eb0c0..5ec9561b23157 100644
--- a/core/java/android/text/format/DateIntervalFormat.java
+++ b/core/java/android/text/format/DateIntervalFormat.java
@@ -37,6 +37,7 @@ import java.util.TimeZone;
* @hide
*/
@VisibleForTesting(visibility = PACKAGE)
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class DateIntervalFormat {
private static final LruCache CACHED_FORMATTERS =
diff --git a/core/java/android/text/format/DateTimeFormat.java b/core/java/android/text/format/DateTimeFormat.java
index 064d7172c44f8..c8dd61d0d75cb 100644
--- a/core/java/android/text/format/DateTimeFormat.java
+++ b/core/java/android/text/format/DateTimeFormat.java
@@ -29,6 +29,7 @@ import android.util.LruCache;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
class DateTimeFormat {
private static final FormatterCache CACHED_FORMATTERS = new FormatterCache();
diff --git a/core/java/android/text/format/DateUtils.java b/core/java/android/text/format/DateUtils.java
index 518a5498d6edb..12ad764548705 100644
--- a/core/java/android/text/format/DateUtils.java
+++ b/core/java/android/text/format/DateUtils.java
@@ -44,6 +44,7 @@ import java.util.TimeZone;
* This class contains various date-related utilities for creating text for things like
* elapsed time and date ranges, strings for days of the week and months, and AM/PM text etc.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class DateUtils
{
private static final Object sLock = new Object();
diff --git a/core/java/android/text/format/DateUtilsBridge.java b/core/java/android/text/format/DateUtilsBridge.java
index 92ec9cf6d7362..752a8c0ef40ac 100644
--- a/core/java/android/text/format/DateUtilsBridge.java
+++ b/core/java/android/text/format/DateUtilsBridge.java
@@ -46,6 +46,7 @@ import com.android.internal.annotations.VisibleForTesting;
* @hide
*/
@VisibleForTesting(visibility = PACKAGE)
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class DateUtilsBridge {
/**
diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java
index 7653bdb7b2d81..e7783dcb2630d 100644
--- a/core/java/android/text/format/Formatter.java
+++ b/core/java/android/text/format/Formatter.java
@@ -41,6 +41,7 @@ import java.util.Locale;
* Utility class to aid in formatting common values that are not covered
* by the {@link java.util.Formatter} class in {@link java.util}
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class Formatter {
/** {@hide} */
diff --git a/core/java/android/text/format/RelativeDateTimeFormatter.java b/core/java/android/text/format/RelativeDateTimeFormatter.java
index 9096469699c1b..6b940f8cb380e 100644
--- a/core/java/android/text/format/RelativeDateTimeFormatter.java
+++ b/core/java/android/text/format/RelativeDateTimeFormatter.java
@@ -42,6 +42,7 @@ import java.util.Locale;
* @hide
*/
@VisibleForTesting(visibility = PACKAGE)
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class RelativeDateTimeFormatter {
public static final long SECOND_IN_MILLIS = 1000;
diff --git a/core/java/android/text/format/Time.java b/core/java/android/text/format/Time.java
index bac7c6cf87d35..1beb57389ef5b 100644
--- a/core/java/android/text/format/Time.java
+++ b/core/java/android/text/format/Time.java
@@ -53,6 +53,7 @@ import java.util.TimeZone;
* @deprecated Use {@link java.util.GregorianCalendar} instead.
*/
@Deprecated
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Time {
private static final String Y_M_D_T_H_M_S_000 = "%Y-%m-%dT%H:%M:%S.000";
private static final String Y_M_D_T_H_M_S_000_Z = "%Y-%m-%dT%H:%M:%S.000Z";
diff --git a/core/java/android/text/format/TimeFormatter.java b/core/java/android/text/format/TimeFormatter.java
index e42ad63346491..dd703d85624f5 100644
--- a/core/java/android/text/format/TimeFormatter.java
+++ b/core/java/android/text/format/TimeFormatter.java
@@ -40,6 +40,7 @@ import java.util.TimeZone;
*
*
This class is not thread safe.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
class TimeFormatter {
// An arbitrary value outside the range representable by a char.
private static final int FORCE_LOWER_CASE = -1;
diff --git a/core/java/android/text/format/TimeMigrationUtils.java b/core/java/android/text/format/TimeMigrationUtils.java
index 17bac8d67b266..b2f5024c73b74 100644
--- a/core/java/android/text/format/TimeMigrationUtils.java
+++ b/core/java/android/text/format/TimeMigrationUtils.java
@@ -22,6 +22,7 @@ package android.text.format;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TimeMigrationUtils {
private TimeMigrationUtils() {}
diff --git a/core/java/android/text/method/AllCapsTransformationMethod.java b/core/java/android/text/method/AllCapsTransformationMethod.java
index 305b056aee728..70dcc52691cdf 100644
--- a/core/java/android/text/method/AllCapsTransformationMethod.java
+++ b/core/java/android/text/method/AllCapsTransformationMethod.java
@@ -33,6 +33,7 @@ import java.util.Locale;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class AllCapsTransformationMethod implements TransformationMethod2 {
private static final String TAG = "AllCapsTransformationMethod";
diff --git a/core/java/android/text/method/ArrowKeyMovementMethod.java b/core/java/android/text/method/ArrowKeyMovementMethod.java
index 37474e5645b05..609922073f53e 100644
--- a/core/java/android/text/method/ArrowKeyMovementMethod.java
+++ b/core/java/android/text/method/ArrowKeyMovementMethod.java
@@ -30,6 +30,7 @@ import android.widget.TextView;
* A movement method that provides cursor movement and selection.
* Supports displaying the context menu on DPad Center.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ArrowKeyMovementMethod extends BaseMovementMethod implements MovementMethod {
private static boolean isSelecting(Spannable buffer) {
return ((MetaKeyKeyListener.getMetaState(buffer, MetaKeyKeyListener.META_SHIFT_ON) == 1) ||
diff --git a/core/java/android/text/method/BaseKeyListener.java b/core/java/android/text/method/BaseKeyListener.java
index e427908541e54..5ebfd99c6f6eb 100644
--- a/core/java/android/text/method/BaseKeyListener.java
+++ b/core/java/android/text/method/BaseKeyListener.java
@@ -47,6 +47,7 @@ import java.text.BreakIterator;
* with hardware keyboards. Software input methods have no obligation to trigger
* the methods in this class.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class BaseKeyListener extends MetaKeyKeyListener
implements KeyListener {
/* package */ static final Object OLD_SEL_START = new NoCopySpan.Concrete();
diff --git a/core/java/android/text/method/BaseMovementMethod.java b/core/java/android/text/method/BaseMovementMethod.java
index 7a4b3a095ae98..0c2e52e04c1f2 100644
--- a/core/java/android/text/method/BaseMovementMethod.java
+++ b/core/java/android/text/method/BaseMovementMethod.java
@@ -27,6 +27,7 @@ import android.widget.TextView;
/**
* Base classes for movement methods.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class BaseMovementMethod implements MovementMethod {
@Override
public boolean canSelectArbitrarily() {
diff --git a/core/java/android/text/method/CharacterPickerDialog.java b/core/java/android/text/method/CharacterPickerDialog.java
index 7d838e06cd683..f084d03cf6dd8 100644
--- a/core/java/android/text/method/CharacterPickerDialog.java
+++ b/core/java/android/text/method/CharacterPickerDialog.java
@@ -38,6 +38,7 @@ import com.android.internal.R;
/**
* Dialog for choosing accented characters related to a base character.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class CharacterPickerDialog extends Dialog
implements OnItemClickListener, OnClickListener {
private View mView;
diff --git a/core/java/android/text/method/DateKeyListener.java b/core/java/android/text/method/DateKeyListener.java
index 0accbf6c74e5d..acf182263272e 100644
--- a/core/java/android/text/method/DateKeyListener.java
+++ b/core/java/android/text/method/DateKeyListener.java
@@ -35,6 +35,7 @@ import java.util.Locale;
* with hardware keyboards. Software input methods have no obligation to trigger
* the methods in this class.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class DateKeyListener extends NumberKeyListener
{
public int getInputType() {
diff --git a/core/java/android/text/method/DateTimeKeyListener.java b/core/java/android/text/method/DateTimeKeyListener.java
index 1593db5de6419..a46ae45433b98 100644
--- a/core/java/android/text/method/DateTimeKeyListener.java
+++ b/core/java/android/text/method/DateTimeKeyListener.java
@@ -35,6 +35,7 @@ import java.util.Locale;
* with hardware keyboards. Software input methods have no obligation to trigger
* the methods in this class.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class DateTimeKeyListener extends NumberKeyListener
{
public int getInputType() {
diff --git a/core/java/android/text/method/DialerKeyListener.java b/core/java/android/text/method/DialerKeyListener.java
index 17abed6c363a7..9eea51a07593c 100644
--- a/core/java/android/text/method/DialerKeyListener.java
+++ b/core/java/android/text/method/DialerKeyListener.java
@@ -28,6 +28,7 @@ import android.view.KeyEvent;
* with hardware keyboards. Software input methods have no obligation to trigger
* the methods in this class.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class DialerKeyListener extends NumberKeyListener
{
@Override
diff --git a/core/java/android/text/method/DigitsKeyListener.java b/core/java/android/text/method/DigitsKeyListener.java
index d9f2dcf2e8967..c97d4afef4fa5 100644
--- a/core/java/android/text/method/DigitsKeyListener.java
+++ b/core/java/android/text/method/DigitsKeyListener.java
@@ -40,6 +40,7 @@ import java.util.Locale;
* with hardware keyboards. Software input methods have no obligation to trigger
* the methods in this class.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class DigitsKeyListener extends NumberKeyListener
{
private char[] mAccepted;
diff --git a/core/java/android/text/method/HideReturnsTransformationMethod.java b/core/java/android/text/method/HideReturnsTransformationMethod.java
index 40ce8714cf383..8b93b3558f86e 100644
--- a/core/java/android/text/method/HideReturnsTransformationMethod.java
+++ b/core/java/android/text/method/HideReturnsTransformationMethod.java
@@ -24,6 +24,7 @@ import android.os.Build;
* to be hidden by displaying them as zero-width non-breaking space
* characters (\uFEFF).
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class HideReturnsTransformationMethod
extends ReplacementTransformationMethod {
private static char[] ORIGINAL = new char[] { '\r' };
diff --git a/core/java/android/text/method/InsertModeTransformationMethod.java b/core/java/android/text/method/InsertModeTransformationMethod.java
index 6c6576f8888ef..ace2d256f5b0e 100644
--- a/core/java/android/text/method/InsertModeTransformationMethod.java
+++ b/core/java/android/text/method/InsertModeTransformationMethod.java
@@ -58,6 +58,7 @@ import java.lang.reflect.Array;
* the new transformed text: "hello abc\n\n world", and the highlight range will be [5, 11).
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class InsertModeTransformationMethod implements TransformationMethod, TextWatcher {
/** The start offset of the highlight range in the original text, inclusive. */
private int mStart;
diff --git a/core/java/android/text/method/KeyListener.java b/core/java/android/text/method/KeyListener.java
index ce7054c40d01b..447c4d9432edc 100644
--- a/core/java/android/text/method/KeyListener.java
+++ b/core/java/android/text/method/KeyListener.java
@@ -34,6 +34,7 @@ import android.view.View;
* targetting Jelly Bean or later, and will only deliver it for some
* key presses to applications targetting Ice Cream Sandwich or earlier.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface KeyListener {
/**
* Return the type of text that this key listener is manipulating,
diff --git a/core/java/android/text/method/LinkMovementMethod.java b/core/java/android/text/method/LinkMovementMethod.java
index 9f4a0aea72078..484bc1ae1a854 100644
--- a/core/java/android/text/method/LinkMovementMethod.java
+++ b/core/java/android/text/method/LinkMovementMethod.java
@@ -33,6 +33,7 @@ import android.widget.TextView;
* A movement method that traverses links in the text buffer and scrolls if necessary.
* Supports clicking on links with DPad Center or Enter.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class LinkMovementMethod extends ScrollingMovementMethod {
private static final int CLICK = 1;
private static final int UP = 2;
diff --git a/core/java/android/text/method/MetaKeyKeyListener.java b/core/java/android/text/method/MetaKeyKeyListener.java
index d1d7c968411fe..7c9c2f1327931 100644
--- a/core/java/android/text/method/MetaKeyKeyListener.java
+++ b/core/java/android/text/method/MetaKeyKeyListener.java
@@ -71,6 +71,7 @@ import android.view.View;
* }
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class MetaKeyKeyListener {
/**
* Flag that indicates that the SHIFT key is on.
diff --git a/core/java/android/text/method/MovementMethod.java b/core/java/android/text/method/MovementMethod.java
index f6fe575a92650..5ea439d505615 100644
--- a/core/java/android/text/method/MovementMethod.java
+++ b/core/java/android/text/method/MovementMethod.java
@@ -32,6 +32,7 @@ import android.widget.TextView;
* directly by applications.
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface MovementMethod {
public void initialize(TextView widget, Spannable text);
public boolean onKeyDown(TextView widget, Spannable text, int keyCode, KeyEvent event);
diff --git a/core/java/android/text/method/MultiTapKeyListener.java b/core/java/android/text/method/MultiTapKeyListener.java
index 5770482b3feb0..022853abf4504 100644
--- a/core/java/android/text/method/MultiTapKeyListener.java
+++ b/core/java/android/text/method/MultiTapKeyListener.java
@@ -36,6 +36,7 @@ import android.view.View;
* with hardware keyboards. Software input methods have no obligation to trigger
* the methods in this class.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class MultiTapKeyListener extends BaseKeyListener
implements SpanWatcher {
private static MultiTapKeyListener[] sInstance =
diff --git a/core/java/android/text/method/NumberKeyListener.java b/core/java/android/text/method/NumberKeyListener.java
index 2b038dd113489..e32ccd48c7e35 100644
--- a/core/java/android/text/method/NumberKeyListener.java
+++ b/core/java/android/text/method/NumberKeyListener.java
@@ -39,6 +39,7 @@ import java.util.Locale;
* with hardware keyboards. Software input methods have no obligation to trigger
* the methods in this class.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class NumberKeyListener extends BaseKeyListener
implements InputFilter
{
diff --git a/core/java/android/text/method/OffsetMapping.java b/core/java/android/text/method/OffsetMapping.java
index fcf3de6784fbe..99613d3ae3004 100644
--- a/core/java/android/text/method/OffsetMapping.java
+++ b/core/java/android/text/method/OffsetMapping.java
@@ -27,6 +27,7 @@ import java.lang.annotation.RetentionPolicy;
* {@link TransformationMethod} that alters the text length.
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface OffsetMapping {
/**
* The mapping strategy for a character offset.
diff --git a/core/java/android/text/method/PasswordTransformationMethod.java b/core/java/android/text/method/PasswordTransformationMethod.java
index 53553be6e5a8b..4a61d9aa1bd06 100644
--- a/core/java/android/text/method/PasswordTransformationMethod.java
+++ b/core/java/android/text/method/PasswordTransformationMethod.java
@@ -33,6 +33,7 @@ import android.view.View;
import java.lang.ref.WeakReference;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PasswordTransformationMethod
implements TransformationMethod, TextWatcher
{
diff --git a/core/java/android/text/method/QwertyKeyListener.java b/core/java/android/text/method/QwertyKeyListener.java
index c43864d0f215e..27c58ea3a56e3 100644
--- a/core/java/android/text/method/QwertyKeyListener.java
+++ b/core/java/android/text/method/QwertyKeyListener.java
@@ -37,6 +37,7 @@ import android.view.View;
* with hardware keyboards. Software input methods have no obligation to trigger
* the methods in this class.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class QwertyKeyListener extends BaseKeyListener {
private static QwertyKeyListener[] sInstance =
new QwertyKeyListener[Capitalize.values().length * 2];
diff --git a/core/java/android/text/method/ReplacementTransformationMethod.java b/core/java/android/text/method/ReplacementTransformationMethod.java
index d6f879aa43538..05899d79b02e1 100644
--- a/core/java/android/text/method/ReplacementTransformationMethod.java
+++ b/core/java/android/text/method/ReplacementTransformationMethod.java
@@ -30,6 +30,7 @@ import android.view.View;
* array to be replaced by the corresponding characters in the
* {@link #getReplacement} array.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class ReplacementTransformationMethod
implements TransformationMethod
{
diff --git a/core/java/android/text/method/ScrollingMovementMethod.java b/core/java/android/text/method/ScrollingMovementMethod.java
index 4f422cbf51cb2..2e0eda96b7f60 100644
--- a/core/java/android/text/method/ScrollingMovementMethod.java
+++ b/core/java/android/text/method/ScrollingMovementMethod.java
@@ -25,6 +25,7 @@ import android.widget.TextView;
/**
* A movement method that interprets movement keys by scrolling the text buffer.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ScrollingMovementMethod extends BaseMovementMethod implements MovementMethod {
@Override
protected boolean left(TextView widget, Spannable buffer) {
diff --git a/core/java/android/text/method/SingleLineTransformationMethod.java b/core/java/android/text/method/SingleLineTransformationMethod.java
index 818526a7d795f..d6eff86920f87 100644
--- a/core/java/android/text/method/SingleLineTransformationMethod.java
+++ b/core/java/android/text/method/SingleLineTransformationMethod.java
@@ -21,6 +21,7 @@ package android.text.method;
* displayed as spaces instead of causing line breaks, and causes
* carriage return characters (\r) to have no appearance.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SingleLineTransformationMethod
extends ReplacementTransformationMethod {
private static char[] ORIGINAL = new char[] { '\n', '\r' };
diff --git a/core/java/android/text/method/TextKeyListener.java b/core/java/android/text/method/TextKeyListener.java
index 2eb917b6fd574..1b0ae61c62a4f 100644
--- a/core/java/android/text/method/TextKeyListener.java
+++ b/core/java/android/text/method/TextKeyListener.java
@@ -43,6 +43,7 @@ import java.lang.ref.WeakReference;
* with hardware keyboards. Software input methods have no obligation to trigger
* the methods in this class.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TextKeyListener extends BaseKeyListener implements SpanWatcher {
private static TextKeyListener[] sInstance =
new TextKeyListener[Capitalize.values().length * 2];
diff --git a/core/java/android/text/method/TimeKeyListener.java b/core/java/android/text/method/TimeKeyListener.java
index f11f40099d9c2..337611c79e3e8 100644
--- a/core/java/android/text/method/TimeKeyListener.java
+++ b/core/java/android/text/method/TimeKeyListener.java
@@ -35,6 +35,7 @@ import java.util.Locale;
* with hardware keyboards. Software input methods have no obligation to trigger
* the methods in this class.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TimeKeyListener extends NumberKeyListener
{
public int getInputType() {
diff --git a/core/java/android/text/method/Touch.java b/core/java/android/text/method/Touch.java
index 44811cb3ef8b9..85aadba5da2bc 100644
--- a/core/java/android/text/method/Touch.java
+++ b/core/java/android/text/method/Touch.java
@@ -25,6 +25,7 @@ import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.widget.TextView;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Touch {
private Touch() { }
diff --git a/core/java/android/text/method/TransformationMethod.java b/core/java/android/text/method/TransformationMethod.java
index 8f3b334abbbda..5246baa39d14c 100644
--- a/core/java/android/text/method/TransformationMethod.java
+++ b/core/java/android/text/method/TransformationMethod.java
@@ -24,6 +24,7 @@ import android.view.View;
* characters of passwords with dots, or keeping the newline characters
* from causing line breaks in single-line text fields.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface TransformationMethod
{
/**
diff --git a/core/java/android/text/method/TransformationMethod2.java b/core/java/android/text/method/TransformationMethod2.java
index 8d5ec246640e0..6e0feb419f008 100644
--- a/core/java/android/text/method/TransformationMethod2.java
+++ b/core/java/android/text/method/TransformationMethod2.java
@@ -23,6 +23,7 @@ import android.compat.annotation.UnsupportedAppUsage;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface TransformationMethod2 extends TransformationMethod {
/**
* Relax the contract of TransformationMethod to allow length changes,
diff --git a/core/java/android/text/method/TranslationTransformationMethod.java b/core/java/android/text/method/TranslationTransformationMethod.java
index 43d186ee9d218..8f43d3dd1f6f5 100644
--- a/core/java/android/text/method/TranslationTransformationMethod.java
+++ b/core/java/android/text/method/TranslationTransformationMethod.java
@@ -33,6 +33,7 @@ import java.util.regex.Pattern;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TranslationTransformationMethod implements TransformationMethod2 {
private static final String TAG = "TranslationTransformationMethod";
diff --git a/core/java/android/text/method/WordIterator.java b/core/java/android/text/method/WordIterator.java
index 2956f84613880..d57fa9b55312c 100644
--- a/core/java/android/text/method/WordIterator.java
+++ b/core/java/android/text/method/WordIterator.java
@@ -37,6 +37,7 @@ import java.util.Locale;
* Also provides methods to determine word boundaries.
* {@hide}
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class WordIterator implements Selection.PositionIterator {
// Size of the window for the word iterator, should be greater than the longest word's length
private static final int WINDOW_WIDTH = 50;
diff --git a/core/java/android/text/style/AbsoluteSizeSpan.java b/core/java/android/text/style/AbsoluteSizeSpan.java
index 6d4f05a84a037..1bc5d71fcd372 100644
--- a/core/java/android/text/style/AbsoluteSizeSpan.java
+++ b/core/java/android/text/style/AbsoluteSizeSpan.java
@@ -32,6 +32,7 @@ import android.text.TextUtils;
*
* Text with text size updated.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class AbsoluteSizeSpan extends MetricAffectingSpan implements ParcelableSpan {
private final int mSize;
diff --git a/core/java/android/text/style/AccessibilityClickableSpan.java b/core/java/android/text/style/AccessibilityClickableSpan.java
index ee8d156f9aac0..5741f2ae2864d 100644
--- a/core/java/android/text/style/AccessibilityClickableSpan.java
+++ b/core/java/android/text/style/AccessibilityClickableSpan.java
@@ -43,6 +43,7 @@ import com.android.internal.R;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class AccessibilityClickableSpan extends ClickableSpan
implements ParcelableSpan {
// The id of the span this one replaces
diff --git a/core/java/android/text/style/AccessibilityReplacementSpan.java b/core/java/android/text/style/AccessibilityReplacementSpan.java
index e4fc14790b534..af3a324668d02 100644
--- a/core/java/android/text/style/AccessibilityReplacementSpan.java
+++ b/core/java/android/text/style/AccessibilityReplacementSpan.java
@@ -31,6 +31,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class AccessibilityReplacementSpan extends ReplacementSpan
implements ParcelableSpan {
diff --git a/core/java/android/text/style/AccessibilityURLSpan.java b/core/java/android/text/style/AccessibilityURLSpan.java
index e280bdf8b3398..1fb76e776b56f 100644
--- a/core/java/android/text/style/AccessibilityURLSpan.java
+++ b/core/java/android/text/style/AccessibilityURLSpan.java
@@ -27,6 +27,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
* @hide
*/
@SuppressWarnings("ParcelableCreator")
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class AccessibilityURLSpan extends URLSpan implements Parcelable {
final AccessibilityClickableSpan mAccessibilityClickableSpan;
diff --git a/core/java/android/text/style/AlignmentSpan.java b/core/java/android/text/style/AlignmentSpan.java
index 31db78a51c75b..53cbd63a32c72 100644
--- a/core/java/android/text/style/AlignmentSpan.java
+++ b/core/java/android/text/style/AlignmentSpan.java
@@ -25,6 +25,7 @@ import android.text.TextUtils;
/**
* Span that allows defining the alignment of text at the paragraph level.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface AlignmentSpan extends ParagraphStyle {
/**
diff --git a/core/java/android/text/style/BackgroundColorSpan.java b/core/java/android/text/style/BackgroundColorSpan.java
index 13647d92a8975..bb04d0ff6178e 100644
--- a/core/java/android/text/style/BackgroundColorSpan.java
+++ b/core/java/android/text/style/BackgroundColorSpan.java
@@ -34,6 +34,7 @@ import android.text.TextUtils;
*
* Set a background color for the text.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class BackgroundColorSpan extends CharacterStyle
implements UpdateAppearance, ParcelableSpan {
diff --git a/core/java/android/text/style/BulletSpan.java b/core/java/android/text/style/BulletSpan.java
index f70e6c56b5c9e..24ae6e25fa59d 100644
--- a/core/java/android/text/style/BulletSpan.java
+++ b/core/java/android/text/style/BulletSpan.java
@@ -63,6 +63,7 @@ import android.text.TextUtils;
*
* Customized BulletSpan.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class BulletSpan implements LeadingMarginSpan, ParcelableSpan {
// Bullet is slightly bigger to avoid aliasing artifacts on mdpi devices.
private static final int STANDARD_BULLET_RADIUS = 4;
diff --git a/core/java/android/text/style/CharacterStyle.java b/core/java/android/text/style/CharacterStyle.java
index 5b95f1a7816a3..2ea05e6ecde03 100644
--- a/core/java/android/text/style/CharacterStyle.java
+++ b/core/java/android/text/style/CharacterStyle.java
@@ -23,6 +23,7 @@ import android.text.TextPaint;
* class. Most extend its subclass {@link MetricAffectingSpan}, but simple
* ones may just implement {@link UpdateAppearance}.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class CharacterStyle {
public abstract void updateDrawState(TextPaint tp);
diff --git a/core/java/android/text/style/ClickableSpan.java b/core/java/android/text/style/ClickableSpan.java
index 238da55526b0a..9e35d75c88335 100644
--- a/core/java/android/text/style/ClickableSpan.java
+++ b/core/java/android/text/style/ClickableSpan.java
@@ -36,6 +36,7 @@ import android.view.View;
*
* Text with ClickableSpan.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class ClickableSpan extends CharacterStyle implements UpdateAppearance {
private static int sIdCounter = 0;
diff --git a/core/java/android/text/style/ForegroundColorSpan.java b/core/java/android/text/style/ForegroundColorSpan.java
index 5c9742622549f..337c49fddf169 100644
--- a/core/java/android/text/style/ForegroundColorSpan.java
+++ b/core/java/android/text/style/ForegroundColorSpan.java
@@ -34,6 +34,7 @@ import android.text.TextUtils;
*
* Set a text color.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ForegroundColorSpan extends CharacterStyle
implements UpdateAppearance, ParcelableSpan {
diff --git a/core/java/android/text/style/IconMarginSpan.java b/core/java/android/text/style/IconMarginSpan.java
index a6c513971ffb9..cc946e98ece92 100644
--- a/core/java/android/text/style/IconMarginSpan.java
+++ b/core/java/android/text/style/IconMarginSpan.java
@@ -44,6 +44,7 @@ import android.text.Spanned;
* @see DrawableMarginSpan for working with a {@link android.graphics.drawable.Drawable} instead of
* a {@link Bitmap}.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class IconMarginSpan implements LeadingMarginSpan, LineHeightSpan {
@NonNull
diff --git a/core/java/android/text/style/LeadingMarginSpan.java b/core/java/android/text/style/LeadingMarginSpan.java
index 5bd2d60bb34f7..60c45784f6804 100644
--- a/core/java/android/text/style/LeadingMarginSpan.java
+++ b/core/java/android/text/style/LeadingMarginSpan.java
@@ -32,6 +32,7 @@ import android.text.TextUtils;
* LeadingMarginSpans should be attached from the first character to the last
* character of a single paragraph.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface LeadingMarginSpan
extends ParagraphStyle
{
diff --git a/core/java/android/text/style/LineBackgroundSpan.java b/core/java/android/text/style/LineBackgroundSpan.java
index 7cb91477738e6..c2d38ce92290a 100644
--- a/core/java/android/text/style/LineBackgroundSpan.java
+++ b/core/java/android/text/style/LineBackgroundSpan.java
@@ -28,6 +28,7 @@ import android.text.TextUtils;
/**
* Used to change the background of lines where the span is attached to.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface LineBackgroundSpan extends ParagraphStyle
{
/**
diff --git a/core/java/android/text/style/LineBreakConfigSpan.java b/core/java/android/text/style/LineBreakConfigSpan.java
index eeb6383892715..1af1eed86e1fc 100644
--- a/core/java/android/text/style/LineBreakConfigSpan.java
+++ b/core/java/android/text/style/LineBreakConfigSpan.java
@@ -31,6 +31,7 @@ import java.util.Objects;
* LineBreakSpan for changing line break style of the specific region of the text.
*/
@FlaggedApi(FLAG_NO_BREAK_NO_HYPHENATION_SPAN)
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class LineBreakConfigSpan implements ParcelableSpan {
private final LineBreakConfig mLineBreakConfig;
diff --git a/core/java/android/text/style/LineHeightSpan.java b/core/java/android/text/style/LineHeightSpan.java
index ae565d1c3317a..71e8932c4abae 100644
--- a/core/java/android/text/style/LineHeightSpan.java
+++ b/core/java/android/text/style/LineHeightSpan.java
@@ -30,6 +30,7 @@ import com.android.internal.util.Preconditions;
/**
* The classes that affect the line height of paragraph should implement this interface.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface LineHeightSpan extends ParagraphStyle, WrapTogetherSpan {
/**
* Classes that implement this should define how the height is being calculated.
diff --git a/core/java/android/text/style/LocaleSpan.java b/core/java/android/text/style/LocaleSpan.java
index 489ceeaa55429..be5525a2f41a6 100644
--- a/core/java/android/text/style/LocaleSpan.java
+++ b/core/java/android/text/style/LocaleSpan.java
@@ -32,6 +32,7 @@ import java.util.Locale;
/**
* Changes the {@link Locale} of the text to which the span is attached.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class LocaleSpan extends MetricAffectingSpan implements ParcelableSpan {
@NonNull
private final LocaleList mLocales;
diff --git a/core/java/android/text/style/MaskFilterSpan.java b/core/java/android/text/style/MaskFilterSpan.java
index 587d1b4497dc0..44db012953b3a 100644
--- a/core/java/android/text/style/MaskFilterSpan.java
+++ b/core/java/android/text/style/MaskFilterSpan.java
@@ -30,6 +30,7 @@ import android.text.TextPaint;
*
* Text blurred with the MaskFilterSpan.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class MaskFilterSpan extends CharacterStyle implements UpdateAppearance {
private MaskFilter mFilter;
diff --git a/core/java/android/text/style/MetricAffectingSpan.java b/core/java/android/text/style/MetricAffectingSpan.java
index 61b7947af6389..f30fdc15ae39e 100644
--- a/core/java/android/text/style/MetricAffectingSpan.java
+++ b/core/java/android/text/style/MetricAffectingSpan.java
@@ -23,6 +23,7 @@ import android.text.TextPaint;
* The classes that affect character-level text formatting in a way that
* changes the width or height of characters extend this class.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class MetricAffectingSpan
extends CharacterStyle
implements UpdateLayout {
diff --git a/core/java/android/text/style/NoWritingToolsSpan.java b/core/java/android/text/style/NoWritingToolsSpan.java
index 90f85aa69faa5..c7dfcfa6dc0b9 100644
--- a/core/java/android/text/style/NoWritingToolsSpan.java
+++ b/core/java/android/text/style/NoWritingToolsSpan.java
@@ -32,6 +32,7 @@ import android.text.TextUtils;
* tools should only rewrite the user input text, and not modify the quoted text.
*/
@FlaggedApi(FLAG_WRITING_TOOLS)
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class NoWritingToolsSpan implements ParcelableSpan {
/**
diff --git a/core/java/android/text/style/ParagraphStyle.java b/core/java/android/text/style/ParagraphStyle.java
index 423156eca3de3..27c1e261b116b 100644
--- a/core/java/android/text/style/ParagraphStyle.java
+++ b/core/java/android/text/style/ParagraphStyle.java
@@ -20,6 +20,7 @@ package android.text.style;
* The classes that affect paragraph-level text formatting implement
* this interface.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface ParagraphStyle
{
diff --git a/core/java/android/text/style/QuoteSpan.java b/core/java/android/text/style/QuoteSpan.java
index 393ede653cb1a..99c95749205a1 100644
--- a/core/java/android/text/style/QuoteSpan.java
+++ b/core/java/android/text/style/QuoteSpan.java
@@ -57,6 +57,7 @@ import android.text.TextUtils;
*
* Customized QuoteSpan.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class QuoteSpan implements LeadingMarginSpan, ParcelableSpan {
/**
* Default stripe width in pixels.
diff --git a/core/java/android/text/style/RasterizerSpan.java b/core/java/android/text/style/RasterizerSpan.java
index f0be50ab065cd..cf8599c4f1b1b 100644
--- a/core/java/android/text/style/RasterizerSpan.java
+++ b/core/java/android/text/style/RasterizerSpan.java
@@ -22,6 +22,7 @@ import android.text.TextPaint;
/**
* @removed Rasterizer is not supported for hw-accerlerated and PDF rendering
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class RasterizerSpan extends CharacterStyle implements UpdateAppearance {
private Rasterizer mRasterizer;
diff --git a/core/java/android/text/style/RelativeSizeSpan.java b/core/java/android/text/style/RelativeSizeSpan.java
index 5c91b201d28c3..38d5d38ae704d 100644
--- a/core/java/android/text/style/RelativeSizeSpan.java
+++ b/core/java/android/text/style/RelativeSizeSpan.java
@@ -34,6 +34,7 @@ import android.text.TextUtils;
*
* Text increased by 50% with RelativeSizeSpan.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class RelativeSizeSpan extends MetricAffectingSpan implements ParcelableSpan {
private final float mProportion;
diff --git a/core/java/android/text/style/ReplacementSpan.java b/core/java/android/text/style/ReplacementSpan.java
index 9430fd3a26c0e..a6fe1fe729371 100644
--- a/core/java/android/text/style/ReplacementSpan.java
+++ b/core/java/android/text/style/ReplacementSpan.java
@@ -23,6 +23,7 @@ import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.TextPaint;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class ReplacementSpan extends MetricAffectingSpan {
private CharSequence mContentDescription = null;
diff --git a/core/java/android/text/style/ScaleXSpan.java b/core/java/android/text/style/ScaleXSpan.java
index d022b071b4d7a..009973ee5306c 100644
--- a/core/java/android/text/style/ScaleXSpan.java
+++ b/core/java/android/text/style/ScaleXSpan.java
@@ -36,6 +36,7 @@ import android.text.TextUtils;
*
* Text scaled by 100% with ScaleXSpan.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ScaleXSpan extends MetricAffectingSpan implements ParcelableSpan {
private final float mProportion;
diff --git a/core/java/android/text/style/SpanUtils.java b/core/java/android/text/style/SpanUtils.java
index 6b4bd1a763583..21a96cdfe3b1b 100644
--- a/core/java/android/text/style/SpanUtils.java
+++ b/core/java/android/text/style/SpanUtils.java
@@ -30,6 +30,7 @@ import java.util.List;
/**
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SpanUtils {
private SpanUtils() {} // Do not instantiate
diff --git a/core/java/android/text/style/SpellCheckSpan.java b/core/java/android/text/style/SpellCheckSpan.java
index e8ec3c6fb55c6..39cd279d3d18c 100644
--- a/core/java/android/text/style/SpellCheckSpan.java
+++ b/core/java/android/text/style/SpellCheckSpan.java
@@ -28,6 +28,7 @@ import android.text.TextUtils;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SpellCheckSpan implements ParcelableSpan {
private boolean mSpellCheckInProgress;
diff --git a/core/java/android/text/style/StrikethroughSpan.java b/core/java/android/text/style/StrikethroughSpan.java
index 65ee34717232c..3654870ee0889 100644
--- a/core/java/android/text/style/StrikethroughSpan.java
+++ b/core/java/android/text/style/StrikethroughSpan.java
@@ -32,6 +32,7 @@ import android.text.TextUtils;
*
* Strikethrough text.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class StrikethroughSpan extends CharacterStyle
implements UpdateAppearance, ParcelableSpan {
diff --git a/core/java/android/text/style/StyleSpan.java b/core/java/android/text/style/StyleSpan.java
index 378682b9c8909..c01e13443ad1d 100644
--- a/core/java/android/text/style/StyleSpan.java
+++ b/core/java/android/text/style/StyleSpan.java
@@ -44,6 +44,7 @@ import android.text.TextUtils;
*
* Text styled bold and italic with the StyleSpan.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class StyleSpan extends MetricAffectingSpan implements ParcelableSpan {
private final int mStyle;
diff --git a/core/java/android/text/style/SubscriptSpan.java b/core/java/android/text/style/SubscriptSpan.java
index 729a9ad73e754..54c765d902a4d 100644
--- a/core/java/android/text/style/SubscriptSpan.java
+++ b/core/java/android/text/style/SubscriptSpan.java
@@ -37,6 +37,7 @@ import android.text.TextUtils;
* Note: Since the span affects the position of the text, if the text is on the last line of a
* TextView, it may appear cut.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SubscriptSpan extends MetricAffectingSpan implements ParcelableSpan {
/**
diff --git a/core/java/android/text/style/SuggestionRangeSpan.java b/core/java/android/text/style/SuggestionRangeSpan.java
index 1eee99aaac62e..640fae4d1a3ac 100644
--- a/core/java/android/text/style/SuggestionRangeSpan.java
+++ b/core/java/android/text/style/SuggestionRangeSpan.java
@@ -27,6 +27,7 @@ import android.text.TextUtils;
* A SuggestionRangeSpan is used to show which part of an EditText is affected by a suggestion
* popup window.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class SuggestionRangeSpan extends CharacterStyle implements ParcelableSpan {
private int mBackgroundColor;
diff --git a/core/java/android/text/style/SuggestionSpan.java b/core/java/android/text/style/SuggestionSpan.java
index 0cf96f617f4a8..d819062428f9c 100644
--- a/core/java/android/text/style/SuggestionSpan.java
+++ b/core/java/android/text/style/SuggestionSpan.java
@@ -48,6 +48,7 @@ import java.util.Locale;
*
* @see TextView#isSuggestionsEnabled()
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SuggestionSpan extends CharacterStyle implements ParcelableSpan {
private static final String TAG = "SuggestionSpan";
diff --git a/core/java/android/text/style/SuperscriptSpan.java b/core/java/android/text/style/SuperscriptSpan.java
index 561022352ffd7..d3b339c02e92b 100644
--- a/core/java/android/text/style/SuperscriptSpan.java
+++ b/core/java/android/text/style/SuperscriptSpan.java
@@ -35,6 +35,7 @@ import android.text.TextUtils;
* TextView, it may appear cut. This can be avoided by decreasing the text size with an {@link
* AbsoluteSizeSpan}
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SuperscriptSpan extends MetricAffectingSpan implements ParcelableSpan {
/**
* Creates a {@link SuperscriptSpan}.
diff --git a/core/java/android/text/style/TabStopSpan.java b/core/java/android/text/style/TabStopSpan.java
index 812847594ad89..e6733a2aac916 100644
--- a/core/java/android/text/style/TabStopSpan.java
+++ b/core/java/android/text/style/TabStopSpan.java
@@ -24,6 +24,7 @@ import android.annotation.Px;
* the leading margin of the line. TabStopSpan will only affect the first tab
* encountered on the first line of the text.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface TabStopSpan extends ParagraphStyle {
/**
diff --git a/core/java/android/text/style/TextAppearanceSpan.java b/core/java/android/text/style/TextAppearanceSpan.java
index 245a9dbc9f6c4..7ede3499dc4d9 100644
--- a/core/java/android/text/style/TextAppearanceSpan.java
+++ b/core/java/android/text/style/TextAppearanceSpan.java
@@ -58,6 +58,7 @@ import android.text.TextUtils;
* @attr ref android.R.styleable#TextAppearance_fontVariationSettings
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TextAppearanceSpan extends MetricAffectingSpan implements ParcelableSpan {
private final String mFamilyName;
private final int mStyle;
diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java
index e0d4ec1ca8268..6d776d14fb002 100644
--- a/core/java/android/text/style/TtsSpan.java
+++ b/core/java/android/text/style/TtsSpan.java
@@ -42,6 +42,7 @@ import java.util.Locale;
* The inner classes are there for convenience and provide builders for each
* TtsSpan type.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TtsSpan implements ParcelableSpan {
private final String mType;
private final PersistableBundle mArgs;
diff --git a/core/java/android/text/style/TypefaceSpan.java b/core/java/android/text/style/TypefaceSpan.java
index bdfc772c03281..86f7f76386290 100644
--- a/core/java/android/text/style/TypefaceSpan.java
+++ b/core/java/android/text/style/TypefaceSpan.java
@@ -50,6 +50,7 @@ import android.text.TextUtils;
* Text with TypefaceSpans constructed based on a font from resource and
* from a font family.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TypefaceSpan extends MetricAffectingSpan implements ParcelableSpan {
@Nullable
diff --git a/core/java/android/text/style/URLSpan.java b/core/java/android/text/style/URLSpan.java
index 9969d29a857d5..f06627d0cbe12 100644
--- a/core/java/android/text/style/URLSpan.java
+++ b/core/java/android/text/style/URLSpan.java
@@ -41,6 +41,7 @@ import android.view.View;
*
* Text with URLSpan.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class URLSpan extends ClickableSpan implements ParcelableSpan {
private final String mURL;
diff --git a/core/java/android/text/style/UnderlineSpan.java b/core/java/android/text/style/UnderlineSpan.java
index 075e70b7fbf5a..b3bb142d1dc89 100644
--- a/core/java/android/text/style/UnderlineSpan.java
+++ b/core/java/android/text/style/UnderlineSpan.java
@@ -32,6 +32,7 @@ import android.text.TextUtils;
*
* Underlined text.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class UnderlineSpan extends CharacterStyle
implements UpdateAppearance, ParcelableSpan {
diff --git a/core/java/android/text/style/UpdateAppearance.java b/core/java/android/text/style/UpdateAppearance.java
index 7112347fcfbf4..7b0a6d372122e 100644
--- a/core/java/android/text/style/UpdateAppearance.java
+++ b/core/java/android/text/style/UpdateAppearance.java
@@ -22,5 +22,6 @@ package android.text.style;
* that if the class also impacts size or other metrics, it should instead
* implement {@link UpdateLayout}.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface UpdateAppearance {
}
diff --git a/core/java/android/text/style/UpdateLayout.java b/core/java/android/text/style/UpdateLayout.java
index 591075ecb9726..5af4141cc8c2a 100644
--- a/core/java/android/text/style/UpdateLayout.java
+++ b/core/java/android/text/style/UpdateLayout.java
@@ -22,4 +22,5 @@ package android.text.style;
* this interface. This interface also includes {@link UpdateAppearance}
* since such a change implicitly also impacts the appearance.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface UpdateLayout extends UpdateAppearance { }
diff --git a/core/java/android/text/style/WrapTogetherSpan.java b/core/java/android/text/style/WrapTogetherSpan.java
index 11721a8c32534..cf74c1bae3b77 100644
--- a/core/java/android/text/style/WrapTogetherSpan.java
+++ b/core/java/android/text/style/WrapTogetherSpan.java
@@ -16,6 +16,7 @@
package android.text.style;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface WrapTogetherSpan
extends ParagraphStyle
{
diff --git a/core/java/android/text/util/Rfc822Token.java b/core/java/android/text/util/Rfc822Token.java
index 2f207db9d494e..d6e987b2952ec 100644
--- a/core/java/android/text/util/Rfc822Token.java
+++ b/core/java/android/text/util/Rfc822Token.java
@@ -22,6 +22,7 @@ import android.annotation.Nullable;
* This class stores an RFC 822-like name, address, and comment,
* and provides methods to convert them to quoted strings.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Rfc822Token {
@Nullable
private String mName, mAddress, mComment;
diff --git a/core/java/android/text/util/Rfc822Tokenizer.java b/core/java/android/text/util/Rfc822Tokenizer.java
index 68334e4d927c6..8a9252ac9506e 100644
--- a/core/java/android/text/util/Rfc822Tokenizer.java
+++ b/core/java/android/text/util/Rfc822Tokenizer.java
@@ -27,6 +27,7 @@ import java.util.Collection;
* a string of addresses (such as might be typed into such a field)
* into a series of Rfc822Tokens.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Rfc822Tokenizer implements MultiAutoCompleteTextView.Tokenizer {
/**
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 06702e2fa4bf9..0c18de92a3918 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -489,6 +489,7 @@ cc_library_shared_for_libandroid_runtime {
"libsqlite",
"libgui_window_info_static",
"libbinder",
+ "libbinder_ndk",
"libhidlbase", // libhwbinder is in here
],
version_script: "platform/linux/libandroid_runtime_export.txt",
diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp
index 4c49ff849d494..05fb5735972ee 100644
--- a/core/tests/coretests/Android.bp
+++ b/core/tests/coretests/Android.bp
@@ -249,8 +249,14 @@ android_library {
android_ravenwood_test {
name: "FrameworksCoreTestsRavenwood",
libs: [
- "android.test.base.stubs.system",
- "android.test.runner.stubs.system",
+ "android.test.base.stubs",
+ "android.test.mock.stubs",
+ "android.test.runner.stubs",
+ "android.view.flags-aconfig-java",
+ "ext",
+ "framework",
+ "framework-res",
+ "org.apache.http.legacy.stubs",
],
static_libs: [
"androidx.annotation_annotation",
@@ -264,6 +270,7 @@ android_ravenwood_test {
"flag-junit",
"flag-junit",
"perfetto_trace_java_protos",
+ "platform-compat-test-rules",
"platform-test-annotations",
"testng",
],
@@ -278,8 +285,12 @@ android_ravenwood_test {
"src/android/content/res/*.java",
"src/android/content/res/*.kt",
"src/android/database/CursorWindowTest.java",
+ "src/android/graphics/*.java",
+ "src/android/graphics/*.kt",
"src/android/os/**/*.java",
"src/android/telephony/PinResultTest.java",
+ "src/android/text/**/*.java",
+ "src/android/text/**/*.kt",
"src/android/util/**/*.java",
"src/android/view/DisplayAdjustmentsTests.java",
"src/android/view/DisplayInfoTest.java",
@@ -288,20 +299,21 @@ android_ravenwood_test {
"src/com/android/internal/os/**/*.java",
"src/com/android/internal/power/EnergyConsumerStatsTest.java",
"src/com/android/internal/ravenwood/**/*.java",
-
- // Pull in R.java from FrameworksCoreTests-resonly, not from FrameworksCoreTests,
- // to avoid having a dependency to FrameworksCoreTests.
- // This way, when updating source files and running this test, we don't need to
- // rebuild the entire FrameworksCoreTests, which would be slow.
"src/com/android/internal/util/**/*.java",
":FrameworksCoreTestDoubles-sources",
":FrameworksCoreTests-aidl",
":FrameworksCoreTests-helpers",
+
+ // Pull in R.java from FrameworksCoreTests-resonly, not from FrameworksCoreTests,
+ // to avoid having a dependency to FrameworksCoreTests.
+ // This way, when updating source files and running this test, we don't need to
+ // rebuild the entire FrameworksCoreTests, which would be slow.
":FrameworksCoreTests-resonly{.aapt.srcjar}",
],
exclude_srcs: [
"src/android/content/res/FontScaleConverterActivityTest.java",
+ "src/android/graphics/GraphicsPerformanceTests.java",
],
resource_apk: "FrameworksCoreTests-resonly",
aidl: {
@@ -313,6 +325,7 @@ android_ravenwood_test {
"res/xml/power_profile_test_cpu_legacy.xml",
"res/xml/power_profile_test_modem.xml",
],
+ sdk_version: "core_platform",
auto_gen_config: true,
team: "trendy_team_ravenwood",
}
diff --git a/core/tests/coretests/src/android/content/res/FontScaleConverterTest.kt b/core/tests/coretests/src/android/content/res/FontScaleConverterTest.kt
index 0e5d92688123b..2c614424a9a54 100644
--- a/core/tests/coretests/src/android/content/res/FontScaleConverterTest.kt
+++ b/core/tests/coretests/src/android/content/res/FontScaleConverterTest.kt
@@ -17,10 +17,8 @@
package android.content.res
import android.platform.test.annotations.Presubmit
-import android.platform.test.ravenwood.RavenwoodRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertWithMessage
-import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -28,9 +26,6 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class FontScaleConverterTest {
- @get:Rule
- val ravenwoodRule: RavenwoodRule = RavenwoodRule.Builder().build()
-
@Test
fun straightInterpolation() {
val table = createTable(8f to 8f, 10f to 10f, 20f to 20f)
diff --git a/core/tests/coretests/src/android/graphics/BitmapFactoryTest.java b/core/tests/coretests/src/android/graphics/BitmapFactoryTest.java
index 84bdbe03df134..263307ee3df72 100644
--- a/core/tests/coretests/src/android/graphics/BitmapFactoryTest.java
+++ b/core/tests/coretests/src/android/graphics/BitmapFactoryTest.java
@@ -20,7 +20,9 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import android.os.MemoryFile;
import android.os.ParcelFileDescriptor;
+import android.platform.test.annotations.DisabledOnRavenwood;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -37,6 +39,7 @@ public class BitmapFactoryTest {
// tests that we can decode bitmaps from MemoryFiles
@SmallTest
@Test
+ @DisabledOnRavenwood(blockedBy = MemoryFile.class)
public void testBitmapParcelFileDescriptor() throws Exception {
Bitmap bitmap1 = Bitmap.createBitmap(
new int[] { Color.BLUE }, 1, 1, Bitmap.Config.RGB_565);
diff --git a/core/tests/coretests/src/android/graphics/BitmapTest.java b/core/tests/coretests/src/android/graphics/BitmapTest.java
index 0126d367eb204..61c3d7813e889 100644
--- a/core/tests/coretests/src/android/graphics/BitmapTest.java
+++ b/core/tests/coretests/src/android/graphics/BitmapTest.java
@@ -22,6 +22,7 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.hardware.HardwareBuffer;
+import android.platform.test.annotations.DisabledOnRavenwood;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -252,6 +253,7 @@ public class BitmapTest {
| GraphicBuffer.USAGE_SW_WRITE_OFTEN;
@Test
+ @DisabledOnRavenwood(blockedBy = HardwareBuffer.class)
public void testWrapHardwareBufferWithSrgbColorSpace() {
GraphicBuffer buffer = GraphicBuffer.create(10, 10, PixelFormat.RGBA_8888, GRAPHICS_USAGE);
Canvas canvas = buffer.lockCanvas();
@@ -265,6 +267,7 @@ public class BitmapTest {
}
@Test
+ @DisabledOnRavenwood(blockedBy = HardwareBuffer.class)
public void testWrapHardwareBufferWithDisplayP3ColorSpace() {
GraphicBuffer buffer = GraphicBuffer.create(10, 10, PixelFormat.RGBA_8888, GRAPHICS_USAGE);
Canvas canvas = buffer.lockCanvas();
diff --git a/core/tests/coretests/src/android/graphics/PaintTest.java b/core/tests/coretests/src/android/graphics/PaintTest.java
index 56760d77e28b8..deb5157bb3392 100644
--- a/core/tests/coretests/src/android/graphics/PaintTest.java
+++ b/core/tests/coretests/src/android/graphics/PaintTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
@@ -97,6 +98,7 @@ public class PaintTest {
@SmallTest
@Test
+ @DisabledOnRavenwood(bug = 391381043)
public void testHintingWidth() {
final Typeface fontTypeface = Typeface.createFromAsset(
InstrumentationRegistry.getInstrumentation().getContext().getAssets(), FONT_PATH);
@@ -143,6 +145,7 @@ public class PaintTest {
}
@Test
+ @DisabledOnRavenwood(bug = 391381043)
public void testHasGlyph_variationSelectors() {
final Typeface fontTypeface = Typeface.createFromAsset(
InstrumentationRegistry.getInstrumentation().getContext().getAssets(),
diff --git a/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java b/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java
index 2b6eda8f09883..dc3376e09b156 100644
--- a/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java
+++ b/core/tests/coretests/src/android/graphics/TypefaceSystemFallbackTest.java
@@ -35,9 +35,9 @@ import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.text.FontConfig;
import android.util.ArrayMap;
-import androidx.test.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
import com.android.text.flags.Flags;
@@ -63,9 +63,6 @@ import java.util.Map;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class TypefaceSystemFallbackTest {
- private static final String SYSTEM_FONT_DIR = "/system/fonts/";
- private static final String SYSTEM_FONTS_XML = "/system/etc/fonts.xml";
-
private static final String[] TEST_FONT_FILES = {
"a3em.ttf", // Supports "a","b","c". The width of "a" is 3em, others are 1em.
"b3em.ttf", // Supports "a","b","c". The width of "b" is 3em, others are 1em.
@@ -118,8 +115,6 @@ public class TypefaceSystemFallbackTest {
@Before
public void setUp() {
- final AssetManager am =
- InstrumentationRegistry.getInstrumentation().getContext().getAssets();
for (final String fontFile : TEST_FONT_FILES) {
final String sourceInAsset = "fonts/" + fontFile;
copyAssetToFile(sourceInAsset, new File(TEST_FONT_DIR, fontFile));
@@ -216,7 +211,8 @@ public class TypefaceSystemFallbackTest {
FontConfig fontConfig;
try {
fontConfig = FontListParser.parse(
- SYSTEM_FONTS_XML, SYSTEM_FONT_DIR, null, TEST_OEM_DIR, null, 0, 0);
+ SystemFonts.LEGACY_FONTS_XML, SystemFonts.SYSTEM_FONT_DIR,
+ null, TEST_OEM_DIR, null, 0, 0);
} catch (IOException | XmlPullParserException e) {
throw new RuntimeException(e);
}
diff --git a/core/tests/coretests/src/android/graphics/TypefaceTest.java b/core/tests/coretests/src/android/graphics/TypefaceTest.java
index 80efa511d1630..0c8b5ab5f3f96 100644
--- a/core/tests/coretests/src/android/graphics/TypefaceTest.java
+++ b/core/tests/coretests/src/android/graphics/TypefaceTest.java
@@ -26,6 +26,7 @@ import android.content.res.Resources;
import android.graphics.fonts.FontFamily;
import android.graphics.fonts.SystemFonts;
import android.os.SharedMemory;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.text.FontConfig;
import android.util.ArrayMap;
@@ -196,6 +197,7 @@ public class TypefaceTest {
@SmallTest
@Test
+ @DisabledOnRavenwood(blockedBy = SharedMemory.class)
public void testSerialize() throws Exception {
FontConfig fontConfig = SystemFonts.getSystemPreinstalledFontConfig();
Map fallbackMap = SystemFonts.buildSystemFallback(fontConfig);
diff --git a/core/tests/coretests/src/android/text/AndroidCharacterTest.java b/core/tests/coretests/src/android/text/AndroidCharacterTest.java
index 1c5986a838fc3..819a5fb8fd402 100644
--- a/core/tests/coretests/src/android/text/AndroidCharacterTest.java
+++ b/core/tests/coretests/src/android/text/AndroidCharacterTest.java
@@ -18,6 +18,7 @@ package android.text;
import static org.junit.Assert.assertArrayEquals;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
@@ -26,6 +27,7 @@ import org.junit.Test;
@Presubmit
@SmallTest
+@DisabledOnRavenwood(reason = "No need to make j.l.Character match behavior of AndroidCharacter")
public class AndroidCharacterTest {
@Test
diff --git a/core/tests/coretests/src/android/text/SpanColorsTest.java b/core/tests/coretests/src/android/text/SpanColorsTest.java
index d2cb8c160d216..4cdbd08863102 100644
--- a/core/tests/coretests/src/android/text/SpanColorsTest.java
+++ b/core/tests/coretests/src/android/text/SpanColorsTest.java
@@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat;
import android.graphics.Color;
import android.graphics.drawable.ShapeDrawable;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.platform.test.annotations.Presubmit;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
@@ -35,6 +36,7 @@ import org.junit.runner.RunWith;
@Presubmit
@SmallTest
@RunWith(AndroidJUnit4.class)
+@DisabledOnRavenwood(blockedBy = ShapeDrawable.class)
public class SpanColorsTest {
private final TextPaint mWorkPaint = new TextPaint();
private SpanColors mSpanColors;
diff --git a/core/tests/coretests/src/android/text/SpannableTest.java b/core/tests/coretests/src/android/text/SpannableTest.java
index a3e6a78123247..710d1e2a3314e 100644
--- a/core/tests/coretests/src/android/text/SpannableTest.java
+++ b/core/tests/coretests/src/android/text/SpannableTest.java
@@ -16,10 +16,10 @@
package android.text;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import android.platform.test.annotations.Presubmit;
-import android.test.MoreAsserts;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -50,13 +50,13 @@ public abstract class SpannableTest {
// but other spans are not, unless the query region is empty, in
// in which case any abutting spans are returned.
spans = spannable.getSpans(0, 1, Object.class);
- MoreAsserts.assertEquals(new Object[]{emptySpan}, spans);
+ assertArrayEquals(new Object[]{emptySpan}, spans);
spans = spannable.getSpans(0, 2, Object.class);
- MoreAsserts.assertEquals(new Object[]{emptySpan, unemptySpan}, spans);
+ assertArrayEquals(new Object[]{emptySpan, unemptySpan}, spans);
spans = spannable.getSpans(1, 2, Object.class);
- MoreAsserts.assertEquals(new Object[]{emptySpan, unemptySpan}, spans);
+ assertArrayEquals(new Object[]{emptySpan, unemptySpan}, spans);
spans = spannable.getSpans(2, 2, Object.class);
- MoreAsserts.assertEquals(new Object[]{unemptySpan}, spans);
+ assertArrayEquals(new Object[]{unemptySpan}, spans);
}
@Test
diff --git a/core/tests/coretests/src/android/text/StaticLayoutTest.java b/core/tests/coretests/src/android/text/StaticLayoutTest.java
index 3541900dcacf5..55f38b2fc2bd5 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutTest.java
@@ -25,6 +25,7 @@ import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.FontMetricsInt;
import android.os.LocaleList;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.platform.test.annotations.Presubmit;
import android.text.Layout.Alignment;
import android.text.method.EditorState;
@@ -726,6 +727,7 @@ public class StaticLayoutTest {
}
@Test
+ @DisabledOnRavenwood(bug = 391342883)
public void testLocaleSpanAffectsHyphenation() {
TextPaint paint = new TextPaint();
paint.setTextLocale(Locale.US);
diff --git a/core/tests/coretests/src/android/text/TextUtilsTest.java b/core/tests/coretests/src/android/text/TextUtilsTest.java
index f552265cc5078..e38c8800169ac 100644
--- a/core/tests/coretests/src/android/text/TextUtilsTest.java
+++ b/core/tests/coretests/src/android/text/TextUtilsTest.java
@@ -18,6 +18,7 @@ package android.text;
import static android.text.TextUtils.formatSimple;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@@ -28,7 +29,6 @@ import static org.junit.Assert.fail;
import android.os.Parcel;
import android.platform.test.annotations.Presubmit;
-import android.test.MoreAsserts;
import android.text.style.StyleSpan;
import android.text.util.Rfc822Token;
import android.text.util.Rfc822Tokenizer;
@@ -237,7 +237,7 @@ public class TextUtilsTest {
for (String s : splitter) {
strings.add(s);
}
- MoreAsserts.assertEquals(expectedStrings, strings.toArray(new String[]{}));
+ assertArrayEquals(expectedStrings, strings.toArray(new String[]{}));
}
@Test
diff --git a/core/tests/coretests/src/android/text/format/DateFormatTest.java b/core/tests/coretests/src/android/text/format/DateFormatTest.java
index 59af6dd20478b..c16393c2643d7 100644
--- a/core/tests/coretests/src/android/text/format/DateFormatTest.java
+++ b/core/tests/coretests/src/android/text/format/DateFormatTest.java
@@ -74,8 +74,9 @@ public class DateFormatTest {
DateFormatSymbols dfs = DateFormat.getIcuDateFormatSymbols(Locale.US);
assertEquals("AM", dfs.getAmPmStrings()[0]);
assertEquals("PM", dfs.getAmPmStrings()[1]);
- assertEquals("a", dfs.getAmpmNarrowStrings()[0]);
- assertEquals("p", dfs.getAmpmNarrowStrings()[1]);
+ // getAmpmNarrowStrings() is a @CorePlatformApi that we should stop using in framework
+ // assertEquals("a", dfs.getAmpmNarrowStrings()[0]);
+ // assertEquals("p", dfs.getAmpmNarrowStrings()[1]);
}
@Test
diff --git a/core/tests/coretests/src/android/text/format/DateIntervalFormatTest.java b/core/tests/coretests/src/android/text/format/DateIntervalFormatTest.java
index a07d399218e30..e54273479b808 100644
--- a/core/tests/coretests/src/android/text/format/DateIntervalFormatTest.java
+++ b/core/tests/coretests/src/android/text/format/DateIntervalFormatTest.java
@@ -40,6 +40,7 @@ import static org.junit.Assert.assertTrue;
import android.icu.util.Calendar;
import android.icu.util.TimeZone;
import android.icu.util.ULocale;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.platform.test.annotations.Presubmit;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -686,6 +687,7 @@ public class DateIntervalFormatTest {
}
@Test
+ @DisabledOnRavenwood(bug = 391381043)
public void testIsLibcoreVFlagEnabled() {
// This flag has been fully ramped. It should never be false.
assertTrue(DateIntervalFormat.isLibcoreVFlagEnabled());
diff --git a/core/tests/coretests/src/android/text/format/DateUtilsTest.java b/core/tests/coretests/src/android/text/format/DateUtilsTest.java
index 47be893eb3e9b..a853d4a0c0512 100644
--- a/core/tests/coretests/src/android/text/format/DateUtilsTest.java
+++ b/core/tests/coretests/src/android/text/format/DateUtilsTest.java
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.LocaleList;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.platform.test.annotations.Presubmit;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -116,6 +117,7 @@ public class DateUtilsTest {
}
@Test
+ @DisabledOnRavenwood(reason = "DateFormat.set24HourTimePref is not available on host JVM")
public void testFormatSameDayTime() {
// This test assumes a default DateFormat.is24Hour setting.
DateFormat.set24HourTimePref(null);
diff --git a/core/tests/coretests/src/android/text/format/TimeMigrationUtilsTest.java b/core/tests/coretests/src/android/text/format/TimeMigrationUtilsTest.java
index c8cb5f38b1856..49f3373d06597 100644
--- a/core/tests/coretests/src/android/text/format/TimeMigrationUtilsTest.java
+++ b/core/tests/coretests/src/android/text/format/TimeMigrationUtilsTest.java
@@ -18,6 +18,7 @@ package android.text.format;
import static org.junit.Assert.assertEquals;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.platform.test.annotations.Presubmit;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -72,6 +73,7 @@ public class TimeMigrationUtilsTest {
* Compares TimeMigrationUtils.formatSimpleDateTime() with the code it is replacing.
*/
@Test
+ @DisabledOnRavenwood(blockedBy = Time.class)
public void formatMillisAsDateTime_matchesOldBehavior() {
// A selection of interesting locales.
Locale[] locales = new Locale[] {
diff --git a/core/tests/coretests/src/android/text/format/TimeTest.java b/core/tests/coretests/src/android/text/format/TimeTest.java
index 6138ea1926dd6..29c58998a635f 100644
--- a/core/tests/coretests/src/android/text/format/TimeTest.java
+++ b/core/tests/coretests/src/android/text/format/TimeTest.java
@@ -20,6 +20,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.platform.test.annotations.Presubmit;
import android.util.Log;
import android.util.TimeFormatException;
@@ -34,6 +35,7 @@ import org.junit.runner.RunWith;
@Presubmit
@SmallTest
@RunWith(AndroidJUnit4.class)
+@DisabledOnRavenwood(blockedBy = Time.class)
public class TimeTest {
@Test
diff --git a/core/tests/coretests/src/android/text/method/BackspaceTest.java b/core/tests/coretests/src/android/text/method/BackspaceTest.java
index a7ff244507cbf..646e8f92fbb3d 100644
--- a/core/tests/coretests/src/android/text/method/BackspaceTest.java
+++ b/core/tests/coretests/src/android/text/method/BackspaceTest.java
@@ -16,6 +16,7 @@
package android.text.method;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.platform.test.annotations.Presubmit;
import android.text.InputType;
import android.util.KeyUtils;
@@ -41,6 +42,7 @@ import org.junit.runner.RunWith;
@Presubmit
@SmallTest
@RunWith(AndroidJUnit4.class)
+@DisabledOnRavenwood(blockedBy = EditText.class)
public class BackspaceTest {
private EditText mTextView;
diff --git a/core/tests/coretests/src/android/text/method/EditorState.java b/core/tests/coretests/src/android/text/method/EditorState.java
index 4eff7a49ac7b9..633fa112c0163 100644
--- a/core/tests/coretests/src/android/text/method/EditorState.java
+++ b/core/tests/coretests/src/android/text/method/EditorState.java
@@ -16,7 +16,7 @@
package android.text.method;
-import static org.mockito.Matchers.any;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -181,4 +181,3 @@ public class EditorState {
Assert.assertEquals(expected.mSelectionEnd, mSelectionEnd);
}
}
-
diff --git a/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java b/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
index 1e4024d92f973..8044fd7a34323 100644
--- a/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
+++ b/core/tests/coretests/src/android/text/method/ForwardDeleteTest.java
@@ -16,6 +16,7 @@
package android.text.method;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.platform.test.annotations.Presubmit;
import android.text.InputType;
import android.util.KeyUtils;
@@ -40,6 +41,7 @@ import org.junit.runner.RunWith;
@Presubmit
@SmallTest
@RunWith(AndroidJUnit4.class)
+@DisabledOnRavenwood(blockedBy = EditText.class)
public class ForwardDeleteTest {
private EditText mTextView;
diff --git a/core/tests/coretests/src/android/text/method/InsertModeTransformationMethodTest.java b/core/tests/coretests/src/android/text/method/InsertModeTransformationMethodTest.java
index e2c19024a8408..37ad204ad64c0 100644
--- a/core/tests/coretests/src/android/text/method/InsertModeTransformationMethodTest.java
+++ b/core/tests/coretests/src/android/text/method/InsertModeTransformationMethodTest.java
@@ -19,6 +19,7 @@ package android.text.method;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
@@ -44,6 +45,7 @@ import org.junit.runner.RunWith;
@Presubmit
@SmallTest
@RunWith(AndroidJUnit4.class)
+@DisabledOnRavenwood(blockedBy = View.class)
public class InsertModeTransformationMethodTest {
private static View sView;
private static final String TEXT = "abc def";
diff --git a/core/tests/coretests/src/android/text/util/LinkifyTest.java b/core/tests/coretests/src/android/text/util/LinkifyTest.java
index 52f3b2e0534fe..98bdb0b53df61 100644
--- a/core/tests/coretests/src/android/text/util/LinkifyTest.java
+++ b/core/tests/coretests/src/android/text/util/LinkifyTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertTrue;
import android.content.Context;
import android.content.res.Configuration;
import android.os.LocaleList;
+import android.platform.test.annotations.DisabledOnRavenwood;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.method.LinkMovementMethod;
@@ -46,6 +47,7 @@ import java.util.Locale;
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
+@DisabledOnRavenwood(blockedBy = Linkify.class)
public class LinkifyTest {
private static final LocaleList LOCALE_LIST_US = new LocaleList(Locale.US);
diff --git a/graphics/java/android/graphics/AvoidXfermode.java b/graphics/java/android/graphics/AvoidXfermode.java
index 683c157024275..5296ee8488721 100644
--- a/graphics/java/android/graphics/AvoidXfermode.java
+++ b/graphics/java/android/graphics/AvoidXfermode.java
@@ -23,6 +23,7 @@ package android.graphics;
* @removed
*/
@Deprecated
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class AvoidXfermode extends Xfermode {
// these need to match the enum in AvoidXfermode.h on the native side
diff --git a/graphics/java/android/graphics/BLASTBufferQueue.java b/graphics/java/android/graphics/BLASTBufferQueue.java
index 9b9be244cf904..9f605342e378e 100644
--- a/graphics/java/android/graphics/BLASTBufferQueue.java
+++ b/graphics/java/android/graphics/BLASTBufferQueue.java
@@ -26,6 +26,7 @@ import java.util.function.Consumer;
/**
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class BLASTBufferQueue {
// Note: This field is accessed by native code.
public long mNativeObject; // BLASTBufferQueue*
diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java
index a2a0f49368885..0ca58cc07213e 100644
--- a/graphics/java/android/graphics/BaseCanvas.java
+++ b/graphics/java/android/graphics/BaseCanvas.java
@@ -48,6 +48,7 @@ import java.util.Objects;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public abstract class BaseCanvas {
/**
* Should only be assigned in constructors (or setBitmap if software canvas),
diff --git a/graphics/java/android/graphics/BaseRecordingCanvas.java b/graphics/java/android/graphics/BaseRecordingCanvas.java
index 5b1fa7b15e6d1..0511bd15dd134 100644
--- a/graphics/java/android/graphics/BaseRecordingCanvas.java
+++ b/graphics/java/android/graphics/BaseRecordingCanvas.java
@@ -44,6 +44,7 @@ import java.util.Objects;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class BaseRecordingCanvas extends Canvas {
public BaseRecordingCanvas(long nativeCanvas) {
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 0c4ea79dd5be3..cd5a54c2fd3f1 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -51,6 +51,7 @@ import java.nio.ShortBuffer;
import java.util.ArrayList;
import java.util.WeakHashMap;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class Bitmap implements Parcelable {
private static final String TAG = "Bitmap";
diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java
index 1c2014183bb76..a5535c8d8485a 100644
--- a/graphics/java/android/graphics/BitmapFactory.java
+++ b/graphics/java/android/graphics/BitmapFactory.java
@@ -41,6 +41,7 @@ import java.io.InputStream;
* Creates Bitmap objects from various sources, including files, streams,
* and byte-arrays.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class BitmapFactory {
private static final int DECODE_BUFFER_SIZE = 16 * 1024;
diff --git a/graphics/java/android/graphics/BitmapRegionDecoder.java b/graphics/java/android/graphics/BitmapRegionDecoder.java
index 29112af9516b4..9b3f7158a3e56 100644
--- a/graphics/java/android/graphics/BitmapRegionDecoder.java
+++ b/graphics/java/android/graphics/BitmapRegionDecoder.java
@@ -37,6 +37,7 @@ import java.io.InputStream;
* to get a decoded Bitmap of the specified region.
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class BitmapRegionDecoder {
private long mNativeBitmapRegionDecoder;
private boolean mRecycled;
diff --git a/graphics/java/android/graphics/BitmapShader.java b/graphics/java/android/graphics/BitmapShader.java
index dcfff62459abc..ac3543a403cc0 100644
--- a/graphics/java/android/graphics/BitmapShader.java
+++ b/graphics/java/android/graphics/BitmapShader.java
@@ -31,6 +31,7 @@ import java.lang.annotation.RetentionPolicy;
* Shader used to draw a bitmap as a texture. The bitmap can be repeated or
* mirrored by setting the tiling mode.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class BitmapShader extends Shader {
/**
* Prevent garbage collection.
diff --git a/graphics/java/android/graphics/BlendMode.java b/graphics/java/android/graphics/BlendMode.java
index c6ae680d01bfb..c07af4e23b6fe 100644
--- a/graphics/java/android/graphics/BlendMode.java
+++ b/graphics/java/android/graphics/BlendMode.java
@@ -19,6 +19,7 @@ package android.graphics;
import android.annotation.NonNull;
import android.annotation.Nullable;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public enum BlendMode {
/**
diff --git a/graphics/java/android/graphics/BlendModeColorFilter.java b/graphics/java/android/graphics/BlendModeColorFilter.java
index d4e23732bdc36..d5dd0d3c53304 100644
--- a/graphics/java/android/graphics/BlendModeColorFilter.java
+++ b/graphics/java/android/graphics/BlendModeColorFilter.java
@@ -23,6 +23,7 @@ import android.annotation.NonNull;
* A color filter that can be used to tint the source pixels using a single
* color and a specific {@link BlendMode}.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class BlendModeColorFilter extends ColorFilter {
@ColorInt final int mColor;
diff --git a/graphics/java/android/graphics/BlurMaskFilter.java b/graphics/java/android/graphics/BlurMaskFilter.java
index f3064f8720418..22ed524e8ec06 100644
--- a/graphics/java/android/graphics/BlurMaskFilter.java
+++ b/graphics/java/android/graphics/BlurMaskFilter.java
@@ -22,6 +22,7 @@ package android.graphics;
* inside, or straddles, the original mask's border, is controlled by the
* Blur enum.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class BlurMaskFilter extends MaskFilter {
public enum Blur {
diff --git a/graphics/java/android/graphics/Camera.java b/graphics/java/android/graphics/Camera.java
index 46640d7222ca6..27b695c8c77fa 100644
--- a/graphics/java/android/graphics/Camera.java
+++ b/graphics/java/android/graphics/Camera.java
@@ -21,6 +21,7 @@ package android.graphics;
* generate a matrix that can be applied, for instance, on a
* {@link Canvas}.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Camera {
/**
* Creates a new camera, with empty transformations.
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index 28c2ca36fd2e8..9137150b104c6 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -54,6 +54,7 @@ import java.lang.annotation.RetentionPolicy;
*
* Canvas and Drawables developer guide.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Canvas extends BaseCanvas {
private static int sCompatibilityVersion = 0;
private static boolean sCompatibilityRestore = false;
diff --git a/graphics/java/android/graphics/CanvasProperty.java b/graphics/java/android/graphics/CanvasProperty.java
index e949584b0659d..755161d387cc9 100644
--- a/graphics/java/android/graphics/CanvasProperty.java
+++ b/graphics/java/android/graphics/CanvasProperty.java
@@ -25,6 +25,7 @@ import com.android.internal.util.VirtualRefBasePtr;
* TODO: Make public?
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class CanvasProperty {
private VirtualRefBasePtr mProperty;
diff --git a/graphics/java/android/graphics/ColorFilter.java b/graphics/java/android/graphics/ColorFilter.java
index 7050325997b66..918f26dfe6401 100644
--- a/graphics/java/android/graphics/ColorFilter.java
+++ b/graphics/java/android/graphics/ColorFilter.java
@@ -23,6 +23,7 @@ import libcore.util.NativeAllocationRegistry;
* each pixel drawn with that paint. This is an abstract class that should
* never be used directly.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ColorFilter {
private static class NoImagePreloadHolder {
diff --git a/graphics/java/android/graphics/ColorMatrixColorFilter.java b/graphics/java/android/graphics/ColorMatrixColorFilter.java
index bfdf3187c5754..cb78a83849947 100644
--- a/graphics/java/android/graphics/ColorMatrixColorFilter.java
+++ b/graphics/java/android/graphics/ColorMatrixColorFilter.java
@@ -27,6 +27,7 @@ import android.os.Build;
*
* @see ColorMatrix
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ColorMatrixColorFilter extends ColorFilter {
@UnsupportedAppUsage
private final ColorMatrix mMatrix = new ColorMatrix();
diff --git a/graphics/java/android/graphics/Compatibility.java b/graphics/java/android/graphics/Compatibility.java
index 747fbf111b4b7..f89a4f7810c1a 100644
--- a/graphics/java/android/graphics/Compatibility.java
+++ b/graphics/java/android/graphics/Compatibility.java
@@ -21,6 +21,7 @@ package android.graphics;
* specified by the app.
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class Compatibility {
private Compatibility() {}
diff --git a/graphics/java/android/graphics/ComposePathEffect.java b/graphics/java/android/graphics/ComposePathEffect.java
index 7d59ecea948ec..b380d2e78d4c6 100644
--- a/graphics/java/android/graphics/ComposePathEffect.java
+++ b/graphics/java/android/graphics/ComposePathEffect.java
@@ -16,6 +16,7 @@
package android.graphics;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ComposePathEffect extends PathEffect {
/**
diff --git a/graphics/java/android/graphics/ComposeShader.java b/graphics/java/android/graphics/ComposeShader.java
index e7145686247e8..57a11d232ac56 100644
--- a/graphics/java/android/graphics/ComposeShader.java
+++ b/graphics/java/android/graphics/ComposeShader.java
@@ -22,6 +22,7 @@ import android.annotation.NonNull;
/** A subclass of shader that returns the composition of two other shaders, combined by
an {@link android.graphics.Xfermode} subclass.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ComposeShader extends Shader {
Shader mShaderA;
diff --git a/graphics/java/android/graphics/CornerPathEffect.java b/graphics/java/android/graphics/CornerPathEffect.java
index 8f4d7d9b1c49d..37f0d2979e5e5 100644
--- a/graphics/java/android/graphics/CornerPathEffect.java
+++ b/graphics/java/android/graphics/CornerPathEffect.java
@@ -16,6 +16,7 @@
package android.graphics;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class CornerPathEffect extends PathEffect {
/**
diff --git a/graphics/java/android/graphics/DashPathEffect.java b/graphics/java/android/graphics/DashPathEffect.java
index ef3ebe8089cab..ff3c376be29de 100644
--- a/graphics/java/android/graphics/DashPathEffect.java
+++ b/graphics/java/android/graphics/DashPathEffect.java
@@ -16,6 +16,7 @@
package android.graphics;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class DashPathEffect extends PathEffect {
/**
diff --git a/graphics/java/android/graphics/DiscretePathEffect.java b/graphics/java/android/graphics/DiscretePathEffect.java
index 3b3c9c9be6c26..77f984589896e 100644
--- a/graphics/java/android/graphics/DiscretePathEffect.java
+++ b/graphics/java/android/graphics/DiscretePathEffect.java
@@ -16,6 +16,7 @@
package android.graphics;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class DiscretePathEffect extends PathEffect {
/**
diff --git a/graphics/java/android/graphics/DrawFilter.java b/graphics/java/android/graphics/DrawFilter.java
index c7fdcb22c71d4..505a830d725b6 100644
--- a/graphics/java/android/graphics/DrawFilter.java
+++ b/graphics/java/android/graphics/DrawFilter.java
@@ -22,6 +22,7 @@ package android.graphics;
* can disable/enable antialiasing, or change the color for everything this is
* drawn.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class DrawFilter {
/**
diff --git a/graphics/java/android/graphics/EmbossMaskFilter.java b/graphics/java/android/graphics/EmbossMaskFilter.java
index 003678ae5a3cb..f0a661f57291a 100644
--- a/graphics/java/android/graphics/EmbossMaskFilter.java
+++ b/graphics/java/android/graphics/EmbossMaskFilter.java
@@ -16,6 +16,7 @@
package android.graphics;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class EmbossMaskFilter extends MaskFilter {
/**
* Create an emboss maskfilter
diff --git a/graphics/java/android/graphics/FontFamily.java b/graphics/java/android/graphics/FontFamily.java
index 88f0e8ef8a94d..09022ee35e649 100644
--- a/graphics/java/android/graphics/FontFamily.java
+++ b/graphics/java/android/graphics/FontFamily.java
@@ -41,6 +41,7 @@ import java.nio.channels.FileChannel;
* @deprecated Use {@link android.graphics.fonts.FontFamily} instead.
*/
@Deprecated
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class FontFamily {
private static String TAG = "FontFamily";
diff --git a/graphics/java/android/graphics/FontListParser.java b/graphics/java/android/graphics/FontListParser.java
index 13c4a94cb9b66..8d0f12866bcfd 100644
--- a/graphics/java/android/graphics/FontListParser.java
+++ b/graphics/java/android/graphics/FontListParser.java
@@ -48,6 +48,7 @@ import java.util.regex.Pattern;
* Parser for font config files.
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class FontListParser {
private static final String TAG = "FontListParser";
diff --git a/graphics/java/android/graphics/ForceDarkType.java b/graphics/java/android/graphics/ForceDarkType.java
index 396b03703bb98..d21aef30a45c0 100644
--- a/graphics/java/android/graphics/ForceDarkType.java
+++ b/graphics/java/android/graphics/ForceDarkType.java
@@ -29,6 +29,7 @@ import java.lang.annotation.RetentionPolicy;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ForceDarkType {
/**
* Force dark disabled: normal, default operation.
diff --git a/graphics/java/android/graphics/FrameInfo.java b/graphics/java/android/graphics/FrameInfo.java
index 3b8f466303442..520213892d014 100644
--- a/graphics/java/android/graphics/FrameInfo.java
+++ b/graphics/java/android/graphics/FrameInfo.java
@@ -38,6 +38,7 @@ import java.lang.annotation.RetentionPolicy;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class FrameInfo {
public long[] frameInfo = new long[FRAME_INFO_SIZE];
diff --git a/graphics/java/android/graphics/Gainmap.java b/graphics/java/android/graphics/Gainmap.java
index 63ca3b8313ce0..7fc13db85659f 100644
--- a/graphics/java/android/graphics/Gainmap.java
+++ b/graphics/java/android/graphics/Gainmap.java
@@ -86,6 +86,7 @@ import java.lang.annotation.RetentionPolicy;
* for these functions cancels out and does not affect the result, so other bases may be used
* if preferred.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class Gainmap implements Parcelable {
/** @hide */
diff --git a/graphics/java/android/graphics/GraphicBuffer.java b/graphics/java/android/graphics/GraphicBuffer.java
index 6705b25ab0ece..4982851c65de9 100644
--- a/graphics/java/android/graphics/GraphicBuffer.java
+++ b/graphics/java/android/graphics/GraphicBuffer.java
@@ -28,6 +28,7 @@ import android.os.Parcelable;
* @hide
*/
@SuppressWarnings("UnusedDeclaration")
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class GraphicBuffer implements Parcelable {
// Note: keep usage flags in sync with GraphicBuffer.h and gralloc.h
public static final int USAGE_SW_READ_NEVER = 0x0;
diff --git a/graphics/java/android/graphics/GraphicsProtos.java b/graphics/java/android/graphics/GraphicsProtos.java
index 6bc41d39ff98c..fa7eaf9468452 100644
--- a/graphics/java/android/graphics/GraphicsProtos.java
+++ b/graphics/java/android/graphics/GraphicsProtos.java
@@ -24,6 +24,7 @@ import android.util.proto.ProtoOutputStream;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class GraphicsProtos {
/** GraphicsProtos can never be an instance */
private GraphicsProtos() {}
diff --git a/graphics/java/android/graphics/GraphicsStatsService.java b/graphics/java/android/graphics/GraphicsStatsService.java
index 7a012bcde7995..d0b9998e18c8b 100644
--- a/graphics/java/android/graphics/GraphicsStatsService.java
+++ b/graphics/java/android/graphics/GraphicsStatsService.java
@@ -74,6 +74,7 @@ import java.util.TimeZone;
* for the process to use.
*
* @hide */
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class GraphicsStatsService extends IGraphicsStats.Stub {
public static final String GRAPHICS_STATS_SERVICE = "graphicsstats";
diff --git a/graphics/java/android/graphics/HardwareBufferRenderer.java b/graphics/java/android/graphics/HardwareBufferRenderer.java
index e04f13c9b9223..81798709b7c60 100644
--- a/graphics/java/android/graphics/HardwareBufferRenderer.java
+++ b/graphics/java/android/graphics/HardwareBufferRenderer.java
@@ -55,6 +55,7 @@ import java.util.function.Consumer;
* HardwareBufferRenderer will never clear contents before each draw invocation so previous contents
* in the {@link HardwareBuffer} target will be preserved across renders.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class HardwareBufferRenderer implements AutoCloseable {
private static final ColorSpace DEFAULT_COLORSPACE = ColorSpace.get(Named.SRGB);
diff --git a/graphics/java/android/graphics/HardwareRenderer.java b/graphics/java/android/graphics/HardwareRenderer.java
index 65854dd51a91c..79d559bf77b45 100644
--- a/graphics/java/android/graphics/HardwareRenderer.java
+++ b/graphics/java/android/graphics/HardwareRenderer.java
@@ -79,6 +79,7 @@ import sun.misc.Cleaner;
* Failure to do so will cause the render thread to stall on that surface, blocking all
* HardwareRenderer instances.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class HardwareRenderer {
private static final String LOG_TAG = "HardwareRenderer";
diff --git a/graphics/java/android/graphics/HardwareRendererObserver.java b/graphics/java/android/graphics/HardwareRendererObserver.java
index d5a6a2fe158ad..99263780f4070 100644
--- a/graphics/java/android/graphics/HardwareRendererObserver.java
+++ b/graphics/java/android/graphics/HardwareRendererObserver.java
@@ -28,6 +28,7 @@ import java.lang.ref.WeakReference;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class HardwareRendererObserver {
private final long[] mFrameMetrics;
private final Handler mHandler;
diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java
index 6395179967244..419929a390072 100644
--- a/graphics/java/android/graphics/ImageDecoder.java
+++ b/graphics/java/android/graphics/ImageDecoder.java
@@ -44,6 +44,7 @@ import android.media.MediaFormat;
import android.net.Uri;
import android.os.Build;
import android.os.Trace;
+import android.ravenwood.annotation.RavenwoodIgnore;
import android.system.ErrnoException;
import android.system.Os;
import android.util.DisplayMetrics;
@@ -173,6 +174,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
* });
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class ImageDecoder implements AutoCloseable {
/**
* Source of encoded image data.
@@ -1987,6 +1989,7 @@ public final class ImageDecoder implements AutoCloseable {
* Check if HEVC decoder is supported by the device.
*/
@SuppressWarnings("AndroidFrameworkCompatChange")
+ @RavenwoodIgnore(blockedBy = MediaCodecList.class)
private static boolean isHevcDecoderSupported() {
synchronized (sIsHevcDecoderSupportedLock) {
if (sIsHevcDecoderSupportedInitialized) {
@@ -2010,6 +2013,7 @@ public final class ImageDecoder implements AutoCloseable {
* Checks if the device supports decoding 10-bit AV1.
*/
@SuppressWarnings("AndroidFrameworkCompatChange") // This is not an app-visible API.
+ @RavenwoodIgnore(blockedBy = MediaCodecList.class)
private static boolean isP010SupportedForAV1() {
synchronized (sIsP010SupportedLock) {
if (sIsP010SupportedFlagsInitialized) {
@@ -2025,6 +2029,7 @@ public final class ImageDecoder implements AutoCloseable {
* This method is called by JNI.
*/
@SuppressWarnings("unused")
+ @RavenwoodIgnore(blockedBy = MediaCodecList.class)
private static boolean isP010SupportedForHEVC() {
synchronized (sIsP010SupportedLock) {
if (sIsP010SupportedFlagsInitialized) {
diff --git a/graphics/java/android/graphics/ImageFormat.java b/graphics/java/android/graphics/ImageFormat.java
index b4899f975f43f..4c9f5ac6ba923 100644
--- a/graphics/java/android/graphics/ImageFormat.java
+++ b/graphics/java/android/graphics/ImageFormat.java
@@ -24,6 +24,7 @@ import com.android.internal.camera.flags.Flags;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class ImageFormat {
/** @hide */
@Retention(RetentionPolicy.SOURCE)
diff --git a/graphics/java/android/graphics/LayerRasterizer.java b/graphics/java/android/graphics/LayerRasterizer.java
index 25155ab284fb0..1a44248d01b04 100644
--- a/graphics/java/android/graphics/LayerRasterizer.java
+++ b/graphics/java/android/graphics/LayerRasterizer.java
@@ -20,6 +20,7 @@ package android.graphics;
* @removed feature is not supported by hw-accerlerated or PDF backends
*/
@Deprecated
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class LayerRasterizer extends Rasterizer {
public LayerRasterizer() { }
diff --git a/graphics/java/android/graphics/LeakyTypefaceStorage.java b/graphics/java/android/graphics/LeakyTypefaceStorage.java
index 618e60d442d73..25a843696cc56 100644
--- a/graphics/java/android/graphics/LeakyTypefaceStorage.java
+++ b/graphics/java/android/graphics/LeakyTypefaceStorage.java
@@ -32,6 +32,7 @@ import java.util.ArrayList;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class LeakyTypefaceStorage {
private static final Object sLock = new Object();
diff --git a/graphics/java/android/graphics/LightingColorFilter.java b/graphics/java/android/graphics/LightingColorFilter.java
index fe73a1a70b9c7..1afdc7706396a 100644
--- a/graphics/java/android/graphics/LightingColorFilter.java
+++ b/graphics/java/android/graphics/LightingColorFilter.java
@@ -40,6 +40,7 @@ import android.os.Build;
*
* The result is pinned to the [0..255] range for each channel.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class LightingColorFilter extends ColorFilter {
@ColorInt
private int mMul;
diff --git a/graphics/java/android/graphics/LinearGradient.java b/graphics/java/android/graphics/LinearGradient.java
index 087937144b976..c6566c9b27fe2 100644
--- a/graphics/java/android/graphics/LinearGradient.java
+++ b/graphics/java/android/graphics/LinearGradient.java
@@ -24,6 +24,7 @@ import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class LinearGradient extends Shader {
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private float mX0;
diff --git a/graphics/java/android/graphics/MaskFilter.java b/graphics/java/android/graphics/MaskFilter.java
index d4743155729ea..b490650e4d0ca 100644
--- a/graphics/java/android/graphics/MaskFilter.java
+++ b/graphics/java/android/graphics/MaskFilter.java
@@ -21,6 +21,7 @@ package android.graphics;
* an alpha-channel mask before drawing it. A subclass of MaskFilter may be
* installed into a Paint. Blur and emboss are implemented as subclasses of MaskFilter.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class MaskFilter {
protected void finalize() throws Throwable {
diff --git a/graphics/java/android/graphics/Mesh.java b/graphics/java/android/graphics/Mesh.java
index 6be8332e784b3..f4d841b161fab 100644
--- a/graphics/java/android/graphics/Mesh.java
+++ b/graphics/java/android/graphics/Mesh.java
@@ -37,6 +37,7 @@ import java.nio.ShortBuffer;
* for the mesh. Once generated, a mesh object can be drawn through
* {@link Canvas#drawMesh(Mesh, BlendMode, Paint)}
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Mesh {
private long mNativeMeshWrapper;
private boolean mIsIndexed;
diff --git a/graphics/java/android/graphics/MeshSpecification.java b/graphics/java/android/graphics/MeshSpecification.java
index b1aae7f37c31b..9c7e948dfc1b9 100644
--- a/graphics/java/android/graphics/MeshSpecification.java
+++ b/graphics/java/android/graphics/MeshSpecification.java
@@ -72,6 +72,7 @@ import java.lang.annotation.RetentionPolicy;
* These should be kept in mind when generating a mesh specification, as exceeding them will
* lead to errors.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class MeshSpecification {
long mNativeMeshSpec;
diff --git a/graphics/java/android/graphics/Movie.java b/graphics/java/android/graphics/Movie.java
index 9c9535d16aabc..cefe391f2d2cc 100644
--- a/graphics/java/android/graphics/Movie.java
+++ b/graphics/java/android/graphics/Movie.java
@@ -27,6 +27,7 @@ import java.io.InputStream;
* @deprecated Prefer {@link android.graphics.drawable.AnimatedImageDrawable}.
*/
@Deprecated
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Movie {
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private long mNativeMovie;
diff --git a/graphics/java/android/graphics/NinePatch.java b/graphics/java/android/graphics/NinePatch.java
index 382269f74366e..00df23fe76bac 100644
--- a/graphics/java/android/graphics/NinePatch.java
+++ b/graphics/java/android/graphics/NinePatch.java
@@ -32,6 +32,7 @@ import android.compat.annotation.UnsupportedAppUsage;
* using a WYSIWYG graphics editor.
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class NinePatch {
/**
* Struct of inset information attached to a 9 patch bitmap.
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 3d4dccf095f52..a0ca0988e03c3 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -66,6 +66,7 @@ import java.util.Objects;
* The Paint class holds the style and color information about how to draw
* geometries, text and bitmaps.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Paint {
private static final String TAG = "Paint";
diff --git a/graphics/java/android/graphics/PaintFlagsDrawFilter.java b/graphics/java/android/graphics/PaintFlagsDrawFilter.java
index 232661113b5ac..f4c49b11ea960 100644
--- a/graphics/java/android/graphics/PaintFlagsDrawFilter.java
+++ b/graphics/java/android/graphics/PaintFlagsDrawFilter.java
@@ -16,6 +16,7 @@
package android.graphics;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PaintFlagsDrawFilter extends DrawFilter {
/**
* Subclass of DrawFilter that affects every paint by first clearing
diff --git a/graphics/java/android/graphics/PathDashPathEffect.java b/graphics/java/android/graphics/PathDashPathEffect.java
index 2b6a6edcc266f..dc92e6caabcd5 100644
--- a/graphics/java/android/graphics/PathDashPathEffect.java
+++ b/graphics/java/android/graphics/PathDashPathEffect.java
@@ -16,6 +16,7 @@
package android.graphics;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PathDashPathEffect extends PathEffect {
public enum Style {
diff --git a/graphics/java/android/graphics/PathEffect.java b/graphics/java/android/graphics/PathEffect.java
index 3292501e6324f..9bb71935cfd0d 100644
--- a/graphics/java/android/graphics/PathEffect.java
+++ b/graphics/java/android/graphics/PathEffect.java
@@ -21,6 +21,7 @@ package android.graphics;
* the geometry of a drawing primitive before it is transformed by the
* canvas' matrix and drawn.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PathEffect {
protected void finalize() throws Throwable {
diff --git a/graphics/java/android/graphics/PathIterator.java b/graphics/java/android/graphics/PathIterator.java
index d7caabf9f91bc..1ed70d02d140f 100644
--- a/graphics/java/android/graphics/PathIterator.java
+++ b/graphics/java/android/graphics/PathIterator.java
@@ -34,6 +34,7 @@ import java.util.Iterator;
* PathIterator can be used to query a given {@link Path} object, to discover its
* operations and point values.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PathIterator implements Iterator {
private final float[] mPointsArray;
@@ -47,9 +48,11 @@ public class PathIterator implements Iterator {
private static final boolean IS_DALVIK = "dalvik".equalsIgnoreCase(
System.getProperty("java.vm.name"));
- private static final NativeAllocationRegistry sRegistry =
- NativeAllocationRegistry.createMalloced(
- PathIterator.class.getClassLoader(), nGetFinalizer());
+ private static class NoImagePreloadHolder {
+ private static final NativeAllocationRegistry sRegistry =
+ NativeAllocationRegistry.createMalloced(
+ PathIterator.class.getClassLoader(), nGetFinalizer());
+ }
/**
* The Verb indicates the operation for a given segment of a path. These
@@ -69,6 +72,11 @@ public class PathIterator implements Iterator {
public static final int VERB_CLOSE = 5;
public static final int VERB_DONE = 6;
+
+ static {
+ // Keep exist in bytecode
+ }
+
/**
* Returns a {@link PathIterator} object for this path, which can be used to query the
* data (operations and points) in the path. Iterators can only be used on Path objects
@@ -90,7 +98,7 @@ public class PathIterator implements Iterator {
mPointsArray = new float[POINT_ARRAY_SIZE];
mPointsAddress = 0;
}
- sRegistry.registerNativeAllocation(this, mNativeIterator);
+ NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, mNativeIterator);
}
/**
diff --git a/graphics/java/android/graphics/PathMeasure.java b/graphics/java/android/graphics/PathMeasure.java
index 2c6cfa5c2e3d2..4d123db41ee74 100644
--- a/graphics/java/android/graphics/PathMeasure.java
+++ b/graphics/java/android/graphics/PathMeasure.java
@@ -16,6 +16,7 @@
package android.graphics;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PathMeasure {
private Path mPath;
diff --git a/graphics/java/android/graphics/Picture.java b/graphics/java/android/graphics/Picture.java
index ee4165b8da050..54eb2bc659bc2 100644
--- a/graphics/java/android/graphics/Picture.java
+++ b/graphics/java/android/graphics/Picture.java
@@ -33,6 +33,7 @@ import java.io.OutputStream;
*
Note: Prior to API level 23 a picture cannot
* be replayed on a hardware accelerated canvas.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Picture {
private PictureCanvas mRecordingCanvas;
// TODO: Figure out if this was a false-positive
diff --git a/graphics/java/android/graphics/PixelXorXfermode.java b/graphics/java/android/graphics/PixelXorXfermode.java
index 27884e07ecfb0..64278525bb1f6 100644
--- a/graphics/java/android/graphics/PixelXorXfermode.java
+++ b/graphics/java/android/graphics/PixelXorXfermode.java
@@ -20,6 +20,7 @@ package android.graphics;
* @removed
*/
@Deprecated
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PixelXorXfermode extends Xfermode {
public PixelXorXfermode(int opColor) {
diff --git a/graphics/java/android/graphics/PorterDuff.java b/graphics/java/android/graphics/PorterDuff.java
index eb940e2f90175..730a804e17c35 100644
--- a/graphics/java/android/graphics/PorterDuff.java
+++ b/graphics/java/android/graphics/PorterDuff.java
@@ -26,6 +26,7 @@ import android.compat.annotation.UnsupportedAppUsage;
*
* Consider using {@link BlendMode} instead as it provides a wider variety of tinting options
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PorterDuff {
/**
* {@usesMathJax}
diff --git a/graphics/java/android/graphics/PorterDuffColorFilter.java b/graphics/java/android/graphics/PorterDuffColorFilter.java
index 0700f217ecf04..777ef6ce906b9 100644
--- a/graphics/java/android/graphics/PorterDuffColorFilter.java
+++ b/graphics/java/android/graphics/PorterDuffColorFilter.java
@@ -25,6 +25,7 @@ import android.os.Build;
* A color filter that can be used to tint the source pixels using a single
* color and a specific {@link PorterDuff Porter-Duff composite mode}.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PorterDuffColorFilter extends ColorFilter {
@ColorInt
private int mColor;
diff --git a/graphics/java/android/graphics/PorterDuffXfermode.java b/graphics/java/android/graphics/PorterDuffXfermode.java
index 83d0507a50749..e10d7370d6f90 100644
--- a/graphics/java/android/graphics/PorterDuffXfermode.java
+++ b/graphics/java/android/graphics/PorterDuffXfermode.java
@@ -23,6 +23,7 @@ package android.graphics;
* information on the available alpha compositing and blending modes.
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class PorterDuffXfermode extends Xfermode {
/**
* Create an xfermode that uses the specified porter-duff mode.
diff --git a/graphics/java/android/graphics/PostProcessor.java b/graphics/java/android/graphics/PostProcessor.java
index 6fed39b9975d6..066214ac6cd60 100644
--- a/graphics/java/android/graphics/PostProcessor.java
+++ b/graphics/java/android/graphics/PostProcessor.java
@@ -37,6 +37,7 @@ import android.graphics.drawable.Drawable;
*
*
Supplied to ImageDecoder via {@link ImageDecoder#setPostProcessor setPostProcessor}.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public interface PostProcessor {
/**
* Do any processing after (for example) decoding.
diff --git a/graphics/java/android/graphics/RadialGradient.java b/graphics/java/android/graphics/RadialGradient.java
index e582e66e16278..06e92eae9c82b 100644
--- a/graphics/java/android/graphics/RadialGradient.java
+++ b/graphics/java/android/graphics/RadialGradient.java
@@ -24,6 +24,7 @@ import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class RadialGradient extends Shader {
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private float mX;
diff --git a/graphics/java/android/graphics/Rasterizer.java b/graphics/java/android/graphics/Rasterizer.java
index 575095426563b..5e67da50a40d9 100644
--- a/graphics/java/android/graphics/Rasterizer.java
+++ b/graphics/java/android/graphics/Rasterizer.java
@@ -24,6 +24,7 @@ package android.graphics;
/**
* @removed feature is not supported by hw-accerlerated or PDF backends
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Rasterizer {
protected void finalize() throws Throwable { }
diff --git a/graphics/java/android/graphics/RecordingCanvas.java b/graphics/java/android/graphics/RecordingCanvas.java
index cc5b3b94e0fa3..a56f461e511a8 100644
--- a/graphics/java/android/graphics/RecordingCanvas.java
+++ b/graphics/java/android/graphics/RecordingCanvas.java
@@ -33,6 +33,7 @@ import dalvik.annotation.optimization.CriticalNative;
* {@link RenderNode#endRecording()} is called. It must not be retained beyond that as it is
* internally reused.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class RecordingCanvas extends BaseRecordingCanvas {
// The recording canvas pool should be large enough to handle a deeply nested
// view hierarchy because display lists are generated recursively.
diff --git a/graphics/java/android/graphics/Region.java b/graphics/java/android/graphics/Region.java
index 29708738d2db6..e2215d4bf3006 100644
--- a/graphics/java/android/graphics/Region.java
+++ b/graphics/java/android/graphics/Region.java
@@ -23,6 +23,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.util.Pools.SynchronizedPool;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Region implements Parcelable {
private static final int MAX_POOL_SIZE = 10;
diff --git a/graphics/java/android/graphics/RegionIterator.java b/graphics/java/android/graphics/RegionIterator.java
index 443b23c1b5fc7..5d74487e5a8e4 100644
--- a/graphics/java/android/graphics/RegionIterator.java
+++ b/graphics/java/android/graphics/RegionIterator.java
@@ -16,6 +16,7 @@
package android.graphics;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class RegionIterator {
/**
diff --git a/graphics/java/android/graphics/RenderEffect.java b/graphics/java/android/graphics/RenderEffect.java
index b8a46856601e4..06bfb82ef6304 100644
--- a/graphics/java/android/graphics/RenderEffect.java
+++ b/graphics/java/android/graphics/RenderEffect.java
@@ -30,6 +30,7 @@ import libcore.util.NativeAllocationRegistry;
* Additionally a {@link RenderEffect} can be applied to a View's backing RenderNode through
* {@link android.view.View#setRenderEffect(RenderEffect)}
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class RenderEffect {
private static class RenderEffectHolder {
diff --git a/graphics/java/android/graphics/RenderNode.java b/graphics/java/android/graphics/RenderNode.java
index 03a8b306f99d6..fa41876187cf2 100644
--- a/graphics/java/android/graphics/RenderNode.java
+++ b/graphics/java/android/graphics/RenderNode.java
@@ -192,6 +192,7 @@ import java.lang.ref.WeakReference;
* top-level content is desired, and finally calling {@link Surface#unlockCanvasAndPost(Canvas)}.
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class RenderNode {
// Use a Holder to allow static initialization in the boot image.
diff --git a/graphics/java/android/graphics/RuntimeColorFilter.java b/graphics/java/android/graphics/RuntimeColorFilter.java
index a64acfe767a9f..06aecc3f2c49b 100644
--- a/graphics/java/android/graphics/RuntimeColorFilter.java
+++ b/graphics/java/android/graphics/RuntimeColorFilter.java
@@ -37,6 +37,7 @@ import com.android.graphics.hwui.flags.Flags;
*
*/
@FlaggedApi(Flags.FLAG_RUNTIME_COLOR_FILTERS_BLENDERS)
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class RuntimeColorFilter extends ColorFilter {
private String mAgsl;
diff --git a/graphics/java/android/graphics/RuntimeShader.java b/graphics/java/android/graphics/RuntimeShader.java
index db2376e008f57..6464f72490c42 100644
--- a/graphics/java/android/graphics/RuntimeShader.java
+++ b/graphics/java/android/graphics/RuntimeShader.java
@@ -248,6 +248,7 @@ import libcore.util.NativeAllocationRegistry;
* the bitmap), remember that the coordinates are local to the canvas.
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class RuntimeShader extends Shader {
private static class NoImagePreloadHolder {
diff --git a/graphics/java/android/graphics/RuntimeXfermode.java b/graphics/java/android/graphics/RuntimeXfermode.java
index c8a0b1a113399..1e20bd352244d 100644
--- a/graphics/java/android/graphics/RuntimeXfermode.java
+++ b/graphics/java/android/graphics/RuntimeXfermode.java
@@ -39,6 +39,7 @@ import libcore.util.NativeAllocationRegistry;
*
*/
@FlaggedApi(Flags.FLAG_RUNTIME_COLOR_FILTERS_BLENDERS)
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class RuntimeXfermode extends Xfermode {
private static class NoImagePreloadHolder {
diff --git a/graphics/java/android/graphics/Shader.java b/graphics/java/android/graphics/Shader.java
index 4d6beadc0fdda..369fab45bf69b 100644
--- a/graphics/java/android/graphics/Shader.java
+++ b/graphics/java/android/graphics/Shader.java
@@ -29,6 +29,7 @@ import libcore.util.NativeAllocationRegistry;
* paint.setShader(shader). After that any object (other than a bitmap) that is
* drawn with that paint will get its color(s) from the shader.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Shader {
private static class NoImagePreloadHolder {
diff --git a/graphics/java/android/graphics/SumPathEffect.java b/graphics/java/android/graphics/SumPathEffect.java
index 8fedc317c4283..3543e101fb38b 100644
--- a/graphics/java/android/graphics/SumPathEffect.java
+++ b/graphics/java/android/graphics/SumPathEffect.java
@@ -16,6 +16,7 @@
package android.graphics;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SumPathEffect extends PathEffect {
/**
diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java
index 5caedba364be7..df384ead58fb4 100644
--- a/graphics/java/android/graphics/SurfaceTexture.java
+++ b/graphics/java/android/graphics/SurfaceTexture.java
@@ -78,6 +78,7 @@ import java.lang.ref.WeakReference;
* frame-available callback is called on an arbitrary thread, so unless special care is taken {@link
* #updateTexImage} should not be called directly from the callback.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SurfaceTexture {
private final Looper mCreatorLooper;
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
diff --git a/graphics/java/android/graphics/SweepGradient.java b/graphics/java/android/graphics/SweepGradient.java
index 3a29395b1717c..94219259a69db 100644
--- a/graphics/java/android/graphics/SweepGradient.java
+++ b/graphics/java/android/graphics/SweepGradient.java
@@ -23,6 +23,7 @@ import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Build;
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class SweepGradient extends Shader {
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private float mCx;
diff --git a/graphics/java/android/graphics/TableMaskFilter.java b/graphics/java/android/graphics/TableMaskFilter.java
index 204f9705852a9..ca7627c400319 100644
--- a/graphics/java/android/graphics/TableMaskFilter.java
+++ b/graphics/java/android/graphics/TableMaskFilter.java
@@ -21,6 +21,7 @@ import android.compat.annotation.UnsupportedAppUsage;
/**
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TableMaskFilter extends MaskFilter {
public TableMaskFilter(byte[] table) {
diff --git a/graphics/java/android/graphics/TemporaryBuffer.java b/graphics/java/android/graphics/TemporaryBuffer.java
index ef3f7f704e0d3..681c48ea9f715 100644
--- a/graphics/java/android/graphics/TemporaryBuffer.java
+++ b/graphics/java/android/graphics/TemporaryBuffer.java
@@ -23,6 +23,7 @@ import com.android.internal.util.ArrayUtils;
/**
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TemporaryBuffer {
@UnsupportedAppUsage
public static char[] obtain(int len) {
diff --git a/graphics/java/android/graphics/TextureLayer.java b/graphics/java/android/graphics/TextureLayer.java
index ac1bd69020622..981b78a7b5b8a 100644
--- a/graphics/java/android/graphics/TextureLayer.java
+++ b/graphics/java/android/graphics/TextureLayer.java
@@ -29,6 +29,7 @@ import com.android.internal.util.VirtualRefBasePtr;
*
* @hide TODO: Make this a SystemApi for b/155905258
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class TextureLayer implements AutoCloseable {
private HardwareRenderer mRenderer;
private VirtualRefBasePtr mFinalizer;
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index 874b847c709c8..d1aca34c7b8d6 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -42,6 +42,7 @@ import android.os.SystemProperties;
import android.os.Trace;
import android.provider.FontRequest;
import android.provider.FontsContract;
+import android.ravenwood.annotation.RavenwoodReplace;
import android.system.ErrnoException;
import android.system.OsConstants;
import android.text.FontConfig;
@@ -86,6 +87,7 @@ import java.util.Objects;
* textSize, textSkewX, textScaleX to specify
* how text appears when drawn (and measured).
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Typeface {
private static String TAG = "Typeface";
@@ -93,9 +95,11 @@ public class Typeface {
/** @hide */
public static final boolean ENABLE_LAZY_TYPEFACE_INITIALIZATION = true;
- private static final NativeAllocationRegistry sRegistry =
- NativeAllocationRegistry.createMalloced(
- Typeface.class.getClassLoader(), nativeGetReleaseFunc());
+ private static class NoImagePreloadHolder {
+ static final NativeAllocationRegistry sRegistry =
+ NativeAllocationRegistry.createMalloced(
+ Typeface.class.getClassLoader(), nativeGetReleaseFunc());
+ }
/** The default NORMAL typeface object */
public static final Typeface DEFAULT = null;
@@ -1284,7 +1288,7 @@ public class Typeface {
}
native_instance = ni;
- mCleaner = sRegistry.registerNativeAllocation(this, native_instance);
+ mCleaner = NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, native_instance);
mStyle = nativeGetStyle(ni);
mWeight = nativeGetWeight(ni);
mIsVariationInstance = nativeIsVariationInstance(ni);
@@ -1560,9 +1564,23 @@ public class Typeface {
}
static {
+ staticInitializer();
+ }
+
+ @RavenwoodReplace(reason = "Prevent circular reference on host side JVM", bug = 337329128)
+ private static void staticInitializer() {
+ init();
+ }
+
+ private static void staticInitializer$ravenwood() {
+ /* no-op */
+ }
+
+ /** @hide */
+ public static void init() {
// Preload Roboto-Regular.ttf in Zygote for improving app launch performance.
- preloadFontFile("/system/fonts/Roboto-Regular.ttf");
- preloadFontFile("/system/fonts/RobotoStatic-Regular.ttf");
+ preloadFontFile(SystemFonts.SYSTEM_FONT_DIR + "Roboto-Regular.ttf");
+ preloadFontFile(SystemFonts.SYSTEM_FONT_DIR + "RobotoStatic-Regular.ttf");
String locale = SystemProperties.get("persist.sys.locale", "en-US");
String script = ULocale.addLikelySubtags(ULocale.forLanguageTag(locale)).getScript();
@@ -1642,6 +1660,21 @@ public class Typeface {
setSystemFontMap(typefaceMap);
}
+ /**
+ * {@link #loadPreinstalledSystemFontMap()} does not actually initialize the native
+ * system font APIs. Add a new method to actually load the font files without going
+ * through SharedMemory.
+ *
+ * @hide
+ */
+ public static void loadNativeSystemFonts() {
+ synchronized (SYSTEM_FONT_MAP_LOCK) {
+ for (var type : sSystemFontMap.values()) {
+ nativeAddFontCollections(type.native_instance);
+ }
+ }
+ }
+
static {
if (!ENABLE_LAZY_TYPEFACE_INITIALIZATION) {
loadPreinstalledSystemFontMap();
diff --git a/graphics/java/android/graphics/Xfermode.java b/graphics/java/android/graphics/Xfermode.java
index fb689e4cb9c29..eda9e3c1055df 100644
--- a/graphics/java/android/graphics/Xfermode.java
+++ b/graphics/java/android/graphics/Xfermode.java
@@ -28,4 +28,5 @@ package android.graphics;
* specified in the Modes enum. When an Xfermode is assigned to a Paint, then
* objects drawn with that paint have the xfermode applied.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class Xfermode {}
diff --git a/graphics/java/android/graphics/YuvImage.java b/graphics/java/android/graphics/YuvImage.java
index b0c7f202f23ae..2b7f40493e8d8 100644
--- a/graphics/java/android/graphics/YuvImage.java
+++ b/graphics/java/android/graphics/YuvImage.java
@@ -32,6 +32,7 @@ import java.io.OutputStream;
* To compress a rectangle region in the YUV data, users have to specify the
* region by left, top, width and height.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class YuvImage {
/**
diff --git a/graphics/java/android/graphics/fonts/Font.java b/graphics/java/android/graphics/fonts/Font.java
index 2893177aafc5d..8be340005543a 100644
--- a/graphics/java/android/graphics/fonts/Font.java
+++ b/graphics/java/android/graphics/fonts/Font.java
@@ -44,6 +44,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.util.Arrays;
import java.util.Collections;
@@ -54,6 +55,7 @@ import java.util.Set;
/**
* A font class can be used for creating FontFamily.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class Font {
private static final String TAG = "Font";
@@ -293,7 +295,14 @@ public final class Font {
int capacity = assetStream.available();
ByteBuffer buffer = ByteBuffer.allocateDirect(capacity);
buffer.order(ByteOrder.nativeOrder());
- assetStream.read(buffer.array(), buffer.arrayOffset(), assetStream.available());
+ if (buffer.hasArray()) {
+ assetStream.read(buffer.array(), buffer.arrayOffset(), assetStream.available());
+ } else {
+ // Direct buffer does not have a backing array on Ravenwood,
+ // wrap it with a channel and read from it
+ var ch = Channels.newChannel(assetStream);
+ ch.read(buffer.duplicate());
+ }
if (assetStream.read() != -1) {
throw new IOException("Unable to access full contents of " + path);
diff --git a/graphics/java/android/graphics/fonts/FontCustomizationParser.java b/graphics/java/android/graphics/fonts/FontCustomizationParser.java
index b7bf0553bcc6a..732a5f3bfce4c 100644
--- a/graphics/java/android/graphics/fonts/FontCustomizationParser.java
+++ b/graphics/java/android/graphics/fonts/FontCustomizationParser.java
@@ -43,6 +43,7 @@ import java.util.Map;
*
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class FontCustomizationParser {
private static final String TAG = "FontCustomizationParser";
diff --git a/graphics/java/android/graphics/fonts/FontFamily.java b/graphics/java/android/graphics/fonts/FontFamily.java
index 5a7b0bbca3998..0ab46398c9242 100644
--- a/graphics/java/android/graphics/fonts/FontFamily.java
+++ b/graphics/java/android/graphics/fonts/FontFamily.java
@@ -66,6 +66,7 @@ import java.util.Set;
*
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class FontFamily {
private static final String TAG = "FontFamily";
diff --git a/graphics/java/android/graphics/fonts/FontFileUtil.java b/graphics/java/android/graphics/fonts/FontFileUtil.java
index abcafb666576b..305ab3b39995c 100644
--- a/graphics/java/android/graphics/fonts/FontFileUtil.java
+++ b/graphics/java/android/graphics/fonts/FontFileUtil.java
@@ -32,6 +32,7 @@ import java.util.Set;
* Provides a utility for font file operations.
* @hide
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class FontFileUtil {
private FontFileUtil() {} // Do not instantiate
diff --git a/graphics/java/android/graphics/fonts/FontStyle.java b/graphics/java/android/graphics/fonts/FontStyle.java
index 48969aa710594..b3ddbed645ffa 100644
--- a/graphics/java/android/graphics/fonts/FontStyle.java
+++ b/graphics/java/android/graphics/fonts/FontStyle.java
@@ -44,6 +44,7 @@ import java.util.Objects;
*
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class FontStyle {
private static final String TAG = "FontStyle";
diff --git a/graphics/java/android/graphics/fonts/FontVariationAxis.java b/graphics/java/android/graphics/fonts/FontVariationAxis.java
index 30a248bb3e0e5..1d715940d6288 100644
--- a/graphics/java/android/graphics/fonts/FontVariationAxis.java
+++ b/graphics/java/android/graphics/fonts/FontVariationAxis.java
@@ -31,6 +31,7 @@ import java.util.regex.Pattern;
/**
* Class that holds information about single font variation axis.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class FontVariationAxis {
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
private final int mTag;
diff --git a/graphics/java/android/graphics/fonts/SystemFonts.java b/graphics/java/android/graphics/fonts/SystemFonts.java
index 0e25c346064c5..599c42659ece7 100644
--- a/graphics/java/android/graphics/fonts/SystemFonts.java
+++ b/graphics/java/android/graphics/fonts/SystemFonts.java
@@ -25,6 +25,7 @@ import android.annotation.Nullable;
import android.graphics.FontListParser;
import android.graphics.Typeface;
import android.os.LocaleList;
+import android.ravenwood.annotation.RavenwoodReplace;
import android.text.FontConfig;
import android.util.ArrayMap;
import android.util.Log;
@@ -32,6 +33,7 @@ import android.util.SparseIntArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.ravenwood.RavenwoodEnvironment;
import org.xmlpull.v1.XmlPullParserException;
@@ -50,23 +52,46 @@ import java.util.Set;
/**
* Provides the system font configurations.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class SystemFonts {
private static final String TAG = "SystemFonts";
- private static final String FONTS_XML = "/system/etc/font_fallback.xml";
- private static final String LEGACY_FONTS_XML = "/system/etc/fonts.xml";
+ private static final String FONTS_XML = getFontsXmlDir() + "font_fallback.xml";
+ /** @hide */
+ public static final String LEGACY_FONTS_XML = getFontsXmlDir() + "fonts.xml";
/** @hide */
- public static final String SYSTEM_FONT_DIR = "/system/fonts/";
+ public static final String SYSTEM_FONT_DIR = getSystemFontDir();
private static final String OEM_XML = "/product/etc/fonts_customization.xml";
/** @hide */
public static final String OEM_FONT_DIR = "/product/fonts/";
+ private static final String DEVICE_FONTS_XML_DIR = "/system/etc/";
+ private static final String DEVICE_FONT_DIR = "/system/fonts/";
+
private SystemFonts() {} // Do not instansiate.
private static final Object LOCK = new Object();
private static @GuardedBy("sLock") Set sAvailableFonts;
+ @RavenwoodReplace
+ private static String getFontsXmlDir() {
+ return DEVICE_FONTS_XML_DIR;
+ }
+
+ private static String getFontsXmlDir$ravenwood() {
+ return RavenwoodEnvironment.getInstance().getRavenwoodRuntimePath() + "fonts/";
+ }
+
+ @RavenwoodReplace
+ private static String getSystemFontDir() {
+ return DEVICE_FONT_DIR;
+ }
+
+ private static String getSystemFontDir$ravenwood() {
+ return RavenwoodEnvironment.getInstance().getRavenwoodRuntimePath() + "fonts/";
+ }
+
/**
* Returns all available font files in the system.
*
diff --git a/graphics/java/android/graphics/text/GraphemeBreak.java b/graphics/java/android/graphics/text/GraphemeBreak.java
index f82b2fd659ccb..0bc1e3b0cae34 100644
--- a/graphics/java/android/graphics/text/GraphemeBreak.java
+++ b/graphics/java/android/graphics/text/GraphemeBreak.java
@@ -17,6 +17,7 @@
package android.graphics.text;
/** @hide */
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class GraphemeBreak {
private GraphemeBreak() { }
diff --git a/graphics/java/android/graphics/text/LineBreakConfig.java b/graphics/java/android/graphics/text/LineBreakConfig.java
index 5a1086cef4072..fa3cfbdd4e970 100644
--- a/graphics/java/android/graphics/text/LineBreakConfig.java
+++ b/graphics/java/android/graphics/text/LineBreakConfig.java
@@ -24,12 +24,13 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
-import android.app.ActivityThread;
import android.os.Build;
import android.os.LocaleList;
import android.os.Parcel;
import android.os.Parcelable;
+import dalvik.system.VMRuntime;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects;
@@ -41,6 +42,7 @@ import java.util.Objects;
*
* line-break property for more information.
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class LineBreakConfig implements Parcelable {
/**
* No hyphenation preference is specified.
@@ -484,8 +486,7 @@ public final class LineBreakConfig implements Parcelable {
* @hide
*/
public static @LineBreakStyle int getResolvedLineBreakStyle(@Nullable LineBreakConfig config) {
- final int targetSdkVersion = ActivityThread.currentApplication().getApplicationInfo()
- .targetSdkVersion;
+ final int targetSdkVersion = VMRuntime.getRuntime().getTargetSdkVersion();
final int defaultStyle;
final int vicVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM;
if (targetSdkVersion >= vicVersion) {
@@ -519,8 +520,7 @@ public final class LineBreakConfig implements Parcelable {
*/
public static @LineBreakWordStyle int getResolvedLineBreakWordStyle(
@Nullable LineBreakConfig config) {
- final int targetSdkVersion = ActivityThread.currentApplication().getApplicationInfo()
- .targetSdkVersion;
+ final int targetSdkVersion = VMRuntime.getRuntime().getTargetSdkVersion();
final int defaultWordStyle;
final int vicVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM;
if (targetSdkVersion >= vicVersion) {
diff --git a/graphics/java/android/graphics/text/LineBreaker.java b/graphics/java/android/graphics/text/LineBreaker.java
index 94de066c91826..29135b8373526 100644
--- a/graphics/java/android/graphics/text/LineBreaker.java
+++ b/graphics/java/android/graphics/text/LineBreaker.java
@@ -91,6 +91,7 @@ import java.lang.annotation.RetentionPolicy;
*
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class LineBreaker {
/** @hide */
@IntDef(prefix = { "BREAK_STRATEGY_" }, value = {
diff --git a/graphics/java/android/graphics/text/MeasuredText.java b/graphics/java/android/graphics/text/MeasuredText.java
index 884268a4b85cf..f58d5311fa30e 100644
--- a/graphics/java/android/graphics/text/MeasuredText.java
+++ b/graphics/java/android/graphics/text/MeasuredText.java
@@ -56,6 +56,7 @@ import java.util.Objects;
*
*
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class MeasuredText {
private static final String TAG = "MeasuredText";
diff --git a/graphics/java/android/graphics/text/PositionedGlyphs.java b/graphics/java/android/graphics/text/PositionedGlyphs.java
index 43216ba6e0873..31125ffa7bd43 100644
--- a/graphics/java/android/graphics/text/PositionedGlyphs.java
+++ b/graphics/java/android/graphics/text/PositionedGlyphs.java
@@ -46,6 +46,7 @@ import java.util.Objects;
* @see TextRunShaper#shapeTextRun(char[], int, int, int, int, float, float, boolean, Paint)
* @see TextRunShaper#shapeTextRun(CharSequence, int, int, int, int, float, float, boolean, Paint)
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public final class PositionedGlyphs {
private static class NoImagePreloadHolder {
private static final NativeAllocationRegistry REGISTRY =
diff --git a/graphics/java/android/graphics/text/TextRunShaper.java b/graphics/java/android/graphics/text/TextRunShaper.java
index 19ea04a480460..f1e3d67e99254 100644
--- a/graphics/java/android/graphics/text/TextRunShaper.java
+++ b/graphics/java/android/graphics/text/TextRunShaper.java
@@ -40,6 +40,7 @@ import com.android.internal.util.Preconditions;
* @see android.text.TextShaper#shapeText(CharSequence, int, int, TextDirectionHeuristic, TextPaint,
* TextShaper.GlyphsConsumer)
*/
+@android.ravenwood.annotation.RavenwoodKeepWholeClass
public class TextRunShaper {
private TextRunShaper() {} // Do not instantiate
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index bb2a53bc04d6b..38ac8ab7135e3 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -232,6 +232,14 @@ java_sdk_library {
unsafe_ignore_missing_latest_api: true,
}
+filegroup {
+ name: "framework-graphics-ravenwood-policies",
+ srcs: [
+ "framework-graphics-ravenwood-policies.txt",
+ ],
+ visibility: ["//frameworks/base/ravenwood"],
+}
+
filegroup {
name: "framework-graphics-srcs",
srcs: [
@@ -461,6 +469,10 @@ cc_defaults {
},
linux: {
srcs: ["platform/linux/utils/SharedLib.cpp"],
+ shared_libs: [
+ "libbinder",
+ "libbinder_ndk",
+ ],
},
darwin: {
srcs: ["platform/darwin/utils/SharedLib.cpp"],
diff --git a/libs/hwui/framework-graphics-ravenwood-policies.txt b/libs/hwui/framework-graphics-ravenwood-policies.txt
new file mode 100644
index 0000000000000..7296225ccfe8b
--- /dev/null
+++ b/libs/hwui/framework-graphics-ravenwood-policies.txt
@@ -0,0 +1 @@
+class android.graphics.ColorMatrix keepclass
diff --git a/libs/hwui/jni/Bitmap.cpp b/libs/hwui/jni/Bitmap.cpp
index cfde0b28c0d58..27d4ac7cef4b2 100644
--- a/libs/hwui/jni/Bitmap.cpp
+++ b/libs/hwui/jni/Bitmap.cpp
@@ -613,7 +613,7 @@ static void Bitmap_setHasMipMap(JNIEnv* env, jobject, jlong bitmapHandle,
///////////////////////////////////////////////////////////////////////////////
// TODO: Move somewhere else
-#ifdef __ANDROID__ // Layoutlib does not support parcel
+#ifdef __linux__ // Only Linux support parcel
#define ON_ERROR_RETURN(X) \
if ((error = (X)) != STATUS_OK) return error
@@ -717,7 +717,7 @@ static binder_status_t writeBlob(AParcel* parcel, uint64_t bitmapId, const SkBit
#undef ON_ERROR_RETURN
-#endif // __ANDROID__ // Layoutlib does not support parcel
+#endif // __linux__ // Only Linux support parcel
// This is the maximum possible size because the SkColorSpace must be
// representable (and therefore serializable) using a matrix and numerical
@@ -733,7 +733,7 @@ static bool validateImageInfo(const SkImageInfo& info, int32_t rowBytes) {
}
static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
-#ifdef __ANDROID__ // Layoutlib does not support parcel
+#ifdef __linux__ // Only Linux support parcel
if (parcel == NULL) {
jniThrowNullPointerException(env, "parcel cannot be null");
return NULL;
@@ -836,14 +836,14 @@ static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
return createBitmap(env, nativeBitmap.release(), getPremulBitmapCreateFlags(isMutable), nullptr,
nullptr, density, sourceId);
#else
- jniThrowRuntimeException(env, "Cannot use parcels outside of Android");
+ jniThrowRuntimeException(env, "Cannot use parcels outside of Linux");
return NULL;
#endif
}
static jboolean Bitmap_writeToParcel(JNIEnv* env, jobject, jlong bitmapHandle, jint density,
jobject parcel) {
-#ifdef __ANDROID__ // Layoutlib does not support parcel
+#ifdef __linux__ // Only Linux support parcel
if (parcel == NULL) {
ALOGD("------- writeToParcel null parcel\n");
return JNI_FALSE;
@@ -901,7 +901,7 @@ static jboolean Bitmap_writeToParcel(JNIEnv* env, jobject, jlong bitmapHandle, j
}
return JNI_TRUE;
#else
- doThrowRE(env, "Cannot use parcels outside of Android");
+ doThrowRE(env, "Cannot use parcels outside of Linux");
return JNI_FALSE;
#endif
}
diff --git a/libs/hwui/jni/Region.cpp b/libs/hwui/jni/Region.cpp
index 1e064b8205916..76986eeb079dd 100644
--- a/libs/hwui/jni/Region.cpp
+++ b/libs/hwui/jni/Region.cpp
@@ -18,7 +18,7 @@
#include "SkPath.h"
#include "GraphicsJNI.h"
-#ifdef __ANDROID__ // Layoutlib does not support parcel
+#ifdef __linux__ // Only Linux support parcel
#include
#include
#include
@@ -202,7 +202,7 @@ static jstring Region_toString(JNIEnv* env, jobject clazz, jlong regionHandle) {
static jlong Region_createFromParcel(JNIEnv* env, jobject clazz, jobject parcel)
{
-#ifdef __ANDROID__ // Layoutlib does not support parcel
+#ifdef __linux__ // Only Linux support parcel
if (parcel == nullptr) {
return 0;
}
@@ -230,7 +230,7 @@ static jlong Region_createFromParcel(JNIEnv* env, jobject clazz, jobject parcel)
static jboolean Region_writeToParcel(JNIEnv* env, jobject clazz, jlong regionHandle, jobject parcel)
{
-#ifdef __ANDROID__ // Layoutlib does not support parcel
+#ifdef __linux__ // Only Linux support parcel
const SkRegion* region = reinterpret_cast(regionHandle);
if (parcel == nullptr) {
return JNI_FALSE;
diff --git a/libs/hwui/jni/ScopedParcel.cpp b/libs/hwui/jni/ScopedParcel.cpp
index 95e4e01d8df85..52cd988344b0e 100644
--- a/libs/hwui/jni/ScopedParcel.cpp
+++ b/libs/hwui/jni/ScopedParcel.cpp
@@ -15,7 +15,7 @@
*/
#include "ScopedParcel.h"
-#ifdef __ANDROID__ // Layoutlib does not support parcel
+#ifdef __linux__ // Only Linux support parcel
using namespace android;
@@ -92,4 +92,4 @@ void ScopedParcel::writeData(const std::optional>& optData) {
AParcel_writeByteArray(mParcel, nullptr, -1);
}
}
-#endif // __ANDROID__ // Layoutlib does not support parcel
+#endif // __linux__ // Only Linux support parcel
diff --git a/libs/hwui/jni/ScopedParcel.h b/libs/hwui/jni/ScopedParcel.h
index f2f138fda43cb..f2b793a354d75 100644
--- a/libs/hwui/jni/ScopedParcel.h
+++ b/libs/hwui/jni/ScopedParcel.h
@@ -15,7 +15,7 @@
*/
#include "SkData.h"
-#ifdef __ANDROID__ // Layoutlib does not support parcel
+#ifdef __linux__ // Only Linux support parcel
#include
#include
#include
@@ -64,4 +64,4 @@ enum class BlobType : int32_t {
ASHMEM,
};
-#endif // __ANDROID__ // Layoutlib does not support parcel
\ No newline at end of file
+#endif // __linux__ // Only Linux support parcel
diff --git a/libs/hwui/jni/graphics_jni_helpers.h b/libs/hwui/jni/graphics_jni_helpers.h
index 91db134af18f9..ff26ec1771bd0 100644
--- a/libs/hwui/jni/graphics_jni_helpers.h
+++ b/libs/hwui/jni/graphics_jni_helpers.h
@@ -21,6 +21,7 @@
#include
#include
#include
+#include
#include
// Host targets (layoutlib) do not differentiate between regular and critical native methods,
diff --git a/ravenwood/Android.bp b/ravenwood/Android.bp
index 65550f2b42736..ccbc46fdb03b4 100644
--- a/ravenwood/Android.bp
+++ b/ravenwood/Android.bp
@@ -121,6 +121,7 @@ java_library {
name: "ravenwood-helper-framework-runtime",
srcs: [
"runtime-helper-src/framework/**/*.java",
+ ":framework-graphics-srcs",
],
static_libs: [
"ravenwood-runtime-common",
@@ -278,6 +279,7 @@ cc_library_host_shared {
cc_library_host_shared {
name: "libravenwood_runtime",
defaults: ["ravenwood_jni_defaults"],
+ header_libs: ["libicuuc_headers"],
srcs: [
"runtime-jni/ravenwood_runtime.cpp",
"runtime-jni/ravenwood_os_constants.cpp",
@@ -372,6 +374,13 @@ platform_compat_config {
visibility: ["//visibility:private"],
}
+java_library {
+ name: "ext-ravenwood",
+ installable: false,
+ static_libs: ["ext"],
+ visibility: ["//visibility:private"],
+}
+
filegroup {
name: "ravenwood-data",
device_common_srcs: [
@@ -637,6 +646,7 @@ android_ravenwood_libgroup {
libs: [
"100-framework-minus-apex.ravenwood",
"200-kxml2-android",
+ "ext-ravenwood",
"ravenwood-runtime-common-ravenwood",
diff --git a/ravenwood/Framework.bp b/ravenwood/Framework.bp
index 71496b0d57666..e36677189e02e 100644
--- a/ravenwood/Framework.bp
+++ b/ravenwood/Framework.bp
@@ -419,11 +419,13 @@ java_genrule {
"--out-impl-jar $(location ravenwood.jar) " +
"--in-jar $(location :framework-graphics.impl{.jar}) " +
- "--policy-override-file $(location :ravenwood-common-policies) ",
+ "--policy-override-file $(location :ravenwood-common-policies) " +
+ "--policy-override-file $(location :framework-graphics-ravenwood-policies) ",
srcs: [
":framework-graphics.impl{.jar}",
":ravenwood-common-policies",
+ ":framework-graphics-ravenwood-policies",
":ravenwood-standard-options",
],
out: [
diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodContext.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodContext.java
index a3326337d4857..9e6b12f60add2 100644
--- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodContext.java
+++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodContext.java
@@ -230,6 +230,16 @@ public class RavenwoodContext extends RavenwoodBaseContext {
return mAppContext;
}
+ @Override
+ public boolean isRestricted() {
+ return false;
+ }
+
+ @Override
+ public boolean canLoadUnsafeResources() {
+ return true;
+ }
+
/**
* Wrap the given {@link Supplier} to become memoized.
*
diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodNativeLoader.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodNativeLoader.java
index a208d6dce2ce1..7e935d0451aee 100644
--- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodNativeLoader.java
+++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodNativeLoader.java
@@ -48,6 +48,7 @@ public final class RavenwoodNativeLoader {
android.content.res.AssetManager.class,
android.content.res.StringBlock.class,
android.content.res.XmlBlock.class,
+ android.text.AndroidCharacter.class,
};
/**
@@ -61,15 +62,49 @@ public final class RavenwoodNativeLoader {
android.graphics.Path.class,
android.graphics.Color.class,
android.graphics.ColorSpace.class,
+ android.graphics.Bitmap.class,
+ android.graphics.BitmapFactory.class,
+ android.graphics.BitmapRegionDecoder.class,
+ android.graphics.Camera.class,
+ android.graphics.Canvas.class,
+ android.graphics.CanvasProperty.class,
+ android.graphics.ColorFilter.class,
+ android.graphics.DrawFilter.class,
+ android.graphics.FontFamily.class,
+ android.graphics.Gainmap.class,
+ android.graphics.ImageDecoder.class,
+ android.graphics.MaskFilter.class,
+ android.graphics.NinePatch.class,
+ android.graphics.Paint.class,
+ android.graphics.PathEffect.class,
+ android.graphics.PathIterator.class,
+ android.graphics.PathMeasure.class,
+ android.graphics.Picture.class,
+ android.graphics.RecordingCanvas.class,
+ android.graphics.Region.class,
+ android.graphics.RenderNode.class,
+ android.graphics.Shader.class,
+ android.graphics.RenderEffect.class,
+ android.graphics.Typeface.class,
+ android.graphics.YuvImage.class,
+ android.graphics.fonts.Font.class,
+ android.graphics.fonts.FontFamily.class,
+ android.graphics.text.LineBreaker.class,
+ android.graphics.text.MeasuredText.class,
+ android.graphics.text.TextRunShaper.class,
+ android.graphics.text.GraphemeBreak.class,
+ android.util.PathParser.class,
};
/**
* Extra strings needed to pass to register_android_graphics_classes().
*
- * `android.graphics.Graphics` is not actually a class, so we just hardcode it here.
+ * Several entries are not actually a class, so we just hardcode them here.
*/
public final static String[] GRAPHICS_EXTRA_INIT_PARAMS = new String[] {
- "android.graphics.Graphics"
+ "android.graphics.Graphics",
+ "android.graphics.ByteBufferStreamAdaptor",
+ "android.graphics.CreateJavaOutputStreamAdaptor"
};
private RavenwoodNativeLoader() {
diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java
index ae88bb234e9d6..f205d238c6934 100644
--- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java
+++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java
@@ -43,6 +43,7 @@ import android.app.UiAutomation;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.res.Resources;
+import android.graphics.Typeface;
import android.icu.util.ULocale;
import android.os.Binder;
import android.os.Build;
@@ -246,6 +247,13 @@ public class RavenwoodRuntimeEnvironmentController {
// Do the basic set up for the android sysprops.
RavenwoodSystemProperties.initialize();
+ // Set ICU data file
+ String icuData = RavenwoodCommonUtils.getRavenwoodRuntimePath()
+ + "ravenwood-data/"
+ + RavenwoodRuntimeNative.getIcuDataName()
+ + ".dat";
+ RavenwoodRuntimeNative.setSystemProperty("ro.icu.data.path", icuData);
+
// Enable all log levels for native logging, until we'll have a way to change the native
// side log level at runtime.
// Do this after loading RAVENWOOD_NATIVE_RUNTIME_NAME (which backs Os.setenv()),
@@ -268,6 +276,11 @@ public class RavenwoodRuntimeEnvironmentController {
Objects.requireNonNull(Build.TYPE);
Objects.requireNonNull(Build.VERSION.SDK);
+ // Fonts can only be initialized once
+ Typeface.init();
+ Typeface.loadPreinstalledSystemFontMap();
+ Typeface.loadNativeSystemFonts();
+
System.setProperty(RAVENWOOD_VERSION_JAVA_SYSPROP, "1");
// This will let AndroidJUnit4 use the original runner.
System.setProperty("android.junit.runner",
diff --git a/ravenwood/runtime-helper-src/libcore-fake/com/android/ravenwood/RavenwoodJdkPatch.java b/ravenwood/runtime-helper-src/libcore-fake/com/android/ravenwood/RavenwoodJdkPatch.java
index 96aed4b3401de..d5a96ddc3a981 100644
--- a/ravenwood/runtime-helper-src/libcore-fake/com/android/ravenwood/RavenwoodJdkPatch.java
+++ b/ravenwood/runtime-helper-src/libcore-fake/com/android/ravenwood/RavenwoodJdkPatch.java
@@ -20,6 +20,7 @@ import com.android.ravenwood.common.JvmWorkaround;
import java.io.FileDescriptor;
import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.regex.Pattern;
/**
* Class to host APIs that exist in libcore, but not in standard JRE.
@@ -46,4 +47,22 @@ public class RavenwoodJdkPatch {
final var it = map.entrySet().iterator();
return it.hasNext() ? it.next() : null;
}
+
+ /**
+ * Implements Pattern.compile(String)
+ *
+ * ART always assumes UNICODE_CHARACTER_CLASS is set.
+ */
+ public static Pattern compilePattern(String regex) {
+ return Pattern.compile(regex, Pattern.UNICODE_CHARACTER_CLASS);
+ }
+
+ /**
+ * Implements Pattern.compile(String, int)
+ *
+ * ART always assumes UNICODE_CHARACTER_CLASS is set.
+ */
+ public static Pattern compilePattern(String regex, int flag) {
+ return Pattern.compile(regex, flag | Pattern.UNICODE_CHARACTER_CLASS);
+ }
}
diff --git a/ravenwood/runtime-helper-src/libcore-fake/com/android/ravenwood/RavenwoodRuntimeNative.java b/ravenwood/runtime-helper-src/libcore-fake/com/android/ravenwood/RavenwoodRuntimeNative.java
index acbcdf1926dbd..0d82a8691881c 100644
--- a/ravenwood/runtime-helper-src/libcore-fake/com/android/ravenwood/RavenwoodRuntimeNative.java
+++ b/ravenwood/runtime-helper-src/libcore-fake/com/android/ravenwood/RavenwoodRuntimeNative.java
@@ -66,6 +66,8 @@ public class RavenwoodRuntimeNative {
public static native int gettid();
+ public static native String getIcuDataName();
+
public static long lseek(FileDescriptor fd, long offset, int whence) throws ErrnoException {
return nLseek(JvmWorkaround.getInstance().getFdInt(fd), offset, whence);
}
diff --git a/ravenwood/runtime-helper-src/libcore-fake/dalvik/system/CloseGuard.java b/ravenwood/runtime-helper-src/libcore-fake/dalvik/system/CloseGuard.java
new file mode 100644
index 0000000000000..82bab64f22f38
--- /dev/null
+++ b/ravenwood/runtime-helper-src/libcore-fake/dalvik/system/CloseGuard.java
@@ -0,0 +1,198 @@
+/*
+ * 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.
+ */
+
+package dalvik.system;
+
+/**
+ * A no-op copy of libcore/dalvik/src/main/java/dalvik/system/CloseGuard.java
+ */
+public final class CloseGuard {
+
+ /**
+ * Returns a CloseGuard instance. {@code #open(String)} can be used to set
+ * up the instance to warn on failure to close.
+ *
+ * @return {@link CloseGuard} instance.
+ *
+ * @hide
+ */
+ public static CloseGuard get() {
+ return new CloseGuard();
+ }
+
+ /**
+ * Enables/disables stack capture and tracking. A call stack is captured
+ * during open(), and open/close events are reported to the Tracker, only
+ * if enabled is true. If a stack trace was captured, the {@link
+ * #getReporter() reporter} is informed of unclosed resources; otherwise a
+ * one-line warning is logged.
+ *
+ * @param enabled whether stack capture and tracking is enabled.
+ *
+ * @hide
+ */
+ public static void setEnabled(boolean enabled) {
+ }
+
+ /**
+ * True if CloseGuard stack capture and tracking are enabled.
+ *
+ * @hide
+ */
+ public static boolean isEnabled() {
+ return false;
+ }
+
+ /**
+ * Used to replace default Reporter used to warn of CloseGuard
+ * violations when stack tracking is enabled. Must be non-null.
+ *
+ * @param rep replacement for default Reporter.
+ *
+ * @hide
+ */
+ public static void setReporter(Reporter rep) {
+ if (rep == null) {
+ throw new NullPointerException("reporter == null");
+ }
+ }
+
+ /**
+ * Returns non-null CloseGuard.Reporter.
+ *
+ * @return CloseGuard's Reporter.
+ *
+ * @hide
+ */
+ public static Reporter getReporter() {
+ return null;
+ }
+
+ /**
+ * Sets the {@link Tracker} that is notified when resources are allocated and released.
+ * The Tracker is invoked only if CloseGuard {@link #isEnabled()} held when {@link #open()}
+ * was called. A null argument disables tracking.
+ *
+ *
This is only intended for use by {@code dalvik.system.CloseGuardSupport} class and so
+ * MUST NOT be used for any other purposes.
+ *
+ * @hide
+ */
+ public static void setTracker(Tracker tracker) {
+ }
+
+ /**
+ * Returns {@link #setTracker(Tracker) last Tracker that was set}, or null to indicate
+ * there is none.
+ *
+ *
This is only intended for use by {@code dalvik.system.CloseGuardSupport} class and so
+ * MUST NOT be used for any other purposes.
+ *
+ * @hide
+ */
+ public static Tracker getTracker() {
+ return null;
+ }
+
+ private CloseGuard() {}
+
+ /**
+ * {@code open} initializes the instance with a warning that the caller
+ * should have explicitly called the {@code closer} method instead of
+ * relying on finalization.
+ *
+ * @param closer non-null name of explicit termination method. Printed by warnIfOpen.
+ * @throws NullPointerException if closer is null.
+ *
+ * @hide
+ */
+ public void open(String closer) {
+ openWithCallSite(closer, null /* callsite */);
+ }
+
+ /**
+ * Like {@link #open(String)}, but with explicit callsite string being passed in for better
+ * performance.
+ *
+ * This only has better performance than {@link #open(String)} if {@link #isEnabled()} returns {@code true}, which
+ * usually shouldn't happen on release builds.
+ *
+ * @param closer Non-null name of explicit termination method. Printed by warnIfOpen.
+ * @param callsite Non-null string uniquely identifying the callsite.
+ *
+ * @hide
+ */
+ public void openWithCallSite(String closer, String callsite) {
+ }
+
+ // We keep either an allocation stack containing the closer String or, when
+ // in disabled state, just the closer String.
+ // We keep them in a single field only to minimize overhead.
+ private Object /* String or Throwable */ closerNameOrAllocationInfo;
+
+ /**
+ * Marks this CloseGuard instance as closed to avoid warnings on
+ * finalization.
+ *
+ * @hide
+ */
+ public void close() {
+ }
+
+ /**
+ * Logs a warning if the caller did not properly cleanup by calling an
+ * explicit close method before finalization. If CloseGuard was enabled
+ * when the CloseGuard was created, passes the stacktrace associated with
+ * the allocation to the current reporter. If it was not enabled, it just
+ * directly logs a brief message.
+ *
+ * @hide
+ */
+ public void warnIfOpen() {
+ }
+
+
+ /**
+ * Interface to allow customization of tracking behaviour.
+ *
+ *
This is only intended for use by {@code dalvik.system.CloseGuardSupport} class and so
+ * MUST NOT be used for any other purposes.
+ *
+ * @hide
+ */
+ public interface Tracker {
+ void open(Throwable allocationSite);
+ void close(Throwable allocationSite);
+ }
+
+ /**
+ * Interface to allow customization of reporting behavior.
+ * @hide
+ */
+ public interface Reporter {
+ /**
+ *
+ * @hide
+ */
+ void report(String message, Throwable allocationSite);
+
+ /**
+ *
+ * @hide
+ */
+ default void report(String message) {}
+ }
+}
diff --git a/ravenwood/runtime-helper-src/libcore-fake/libcore/io/IoBridge.java b/ravenwood/runtime-helper-src/libcore-fake/libcore/io/IoBridge.java
new file mode 100644
index 0000000000000..2a1ee2542982c
--- /dev/null
+++ b/ravenwood/runtime-helper-src/libcore-fake/libcore/io/IoBridge.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2025 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 libcore.io;
+
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
+
+import java.io.FileDescriptor;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+public class IoBridge {
+
+ public static void closeAndSignalBlockedThreads(FileDescriptor fd) throws IOException {
+ if (fd == null) {
+ return;
+ }
+ try {
+ Os.close(fd);
+ } catch (ErrnoException errnoException) {
+ throw errnoException.rethrowAsIOException();
+ }
+ }
+
+ public static FileDescriptor open(String path, int flags) throws FileNotFoundException {
+ FileDescriptor fd = null;
+ try {
+ fd = Os.open(path, flags, 0666);
+ // Posix open(2) fails with EISDIR only if you ask for write permission.
+ // Java disallows reading directories too.f
+ if (OsConstants.S_ISDIR(Os.fstat(fd).st_mode)) {
+ throw new ErrnoException("open", OsConstants.EISDIR);
+ }
+ return fd;
+ } catch (ErrnoException errnoException) {
+ try {
+ if (fd != null) {
+ closeAndSignalBlockedThreads(fd);
+ }
+ } catch (IOException ignored) {
+ }
+ FileNotFoundException ex = new FileNotFoundException(path + ": "
+ + errnoException.getMessage());
+ ex.initCause(errnoException);
+ throw ex;
+ }
+ }
+}
diff --git a/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java b/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java
index ad86135de32ef..cf1a5138cbc65 100644
--- a/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java
+++ b/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NativeAllocationRegistry.java
@@ -35,6 +35,11 @@ public class NativeAllocationRegistry {
return new NativeAllocationRegistry(classLoader, freeFunction, size);
}
+ public static NativeAllocationRegistry createNonmalloced(
+ Class clazz, long freeFunction, long size) {
+ return new NativeAllocationRegistry(clazz.getClassLoader(), freeFunction, size);
+ }
+
public static NativeAllocationRegistry createMalloced(
ClassLoader classLoader, long freeFunction, long size) {
return new NativeAllocationRegistry(classLoader, freeFunction, size);
@@ -45,6 +50,11 @@ public class NativeAllocationRegistry {
return new NativeAllocationRegistry(classLoader, freeFunction, 0);
}
+ public static NativeAllocationRegistry createMalloced(
+ Class clazz, long freeFunction, long size) {
+ return new NativeAllocationRegistry(clazz.getClassLoader(), freeFunction, size);
+ }
+
public NativeAllocationRegistry(ClassLoader classLoader, long freeFunction, long size) {
if (size < 0) {
throw new IllegalArgumentException("Invalid native allocation size: " + size);
@@ -52,6 +62,37 @@ public class NativeAllocationRegistry {
mFreeFunction = freeFunction;
}
+ private class CleanerThunk implements Runnable {
+ private long nativePtr;
+
+ public CleanerThunk() {
+ nativePtr = 0;
+ }
+
+ public void setNativePtr(long ptr) {
+ nativePtr = ptr;
+ }
+
+ @Override
+ public void run() {
+ if (nativePtr != 0) {
+ applyFreeFunction(mFreeFunction, nativePtr);
+ }
+ }
+ }
+
+ private static class CleanableRunner implements Runnable {
+ private final Cleaner.Cleanable mCleanable;
+
+ public CleanableRunner(Cleaner.Cleanable cleanable) {
+ mCleanable = cleanable;
+ }
+
+ public void run() {
+ mCleanable.clean();
+ }
+ }
+
public Runnable registerNativeAllocation(Object referent, long nativePtr) {
if (referent == null) {
throw new IllegalArgumentException("referent is null");
@@ -60,13 +101,25 @@ public class NativeAllocationRegistry {
throw new IllegalArgumentException("nativePtr is null");
}
- final Runnable releaser = () -> {
- RavenwoodRuntimeNative.applyFreeFunction(mFreeFunction, nativePtr);
- };
- sCleaner.register(referent, releaser);
+ final CleanerThunk thunk;
+ final CleanableRunner result;
+ try {
+ thunk = new CleanerThunk();
+ final var cleanable = sCleaner.register(referent, thunk);
+ result = new CleanableRunner(cleanable);
+ } catch (VirtualMachineError vme /* probably OutOfMemoryError */) {
+ applyFreeFunction(mFreeFunction, nativePtr);
+ throw vme;
+ }
+ // Enable the cleaner only after we can no longer throw anything, including OOME.
+ thunk.setNativePtr(nativePtr);
// Ensure that cleaner doesn't get invoked before we enable it.
Reference.reachabilityFence(referent);
- return releaser;
+ return result;
+ }
+
+ public static void applyFreeFunction(long freeFunction, long nativePtr) {
+ RavenwoodRuntimeNative.applyFreeFunction(freeFunction, nativePtr);
}
}
diff --git a/ravenwood/runtime-jni/ravenwood_runtime.cpp b/ravenwood/runtime-jni/ravenwood_runtime.cpp
index 8d8ed7119e848..01ebdc9535390 100644
--- a/ravenwood/runtime-jni/ravenwood_runtime.cpp
+++ b/ravenwood/runtime-jni/ravenwood_runtime.cpp
@@ -20,6 +20,7 @@
#include
#include
#include
+#include
#include
@@ -183,6 +184,10 @@ static jint Linux_gettid(JNIEnv* env, jobject) {
return syscall(__NR_gettid);
}
+static jstring getIcuDataName(JNIEnv* env, jclass clazz) {
+ return env->NewStringUTF(U_ICUDATA_NAME);
+}
+
// ---- Registration ----
extern void register_android_system_OsConstants(JNIEnv* env);
@@ -201,6 +206,7 @@ static const JNINativeMethod sMethods[] =
{ "setenv", "(Ljava/lang/String;Ljava/lang/String;Z)V", (void*)Linux_setenv },
{ "getpid", "()I", (void*)Linux_getpid },
{ "gettid", "()I", (void*)Linux_gettid },
+ { "getIcuDataName", "()Ljava/lang/String;", (void*)getIcuDataName },
};
extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) {
diff --git a/ravenwood/texts/ravenwood-annotation-allowed-classes.txt b/ravenwood/texts/ravenwood-annotation-allowed-classes.txt
index e202d0ecfa232..7462cc2f384a1 100644
--- a/ravenwood/texts/ravenwood-annotation-allowed-classes.txt
+++ b/ravenwood/texts/ravenwood-annotation-allowed-classes.txt
@@ -259,6 +259,8 @@ android.database.sqlite.SQLiteClosable
android.database.sqlite.SQLiteException
android.text.TextUtils
+android.text.Html
+android.text.HtmlToSpannedConverter
android.accounts.Account
@@ -278,6 +280,10 @@ android.graphics.PointF
android.graphics.Rect
android.graphics.RectF
+android.graphics.fonts.SystemFonts
+
+android.graphics.text.LineBreakConfig
+
android.content.ContentProvider
android.app.ActivityManager
@@ -383,3 +389,228 @@ android.app.compat.*
com.android.server.compat.*
com.android.internal.compat.*
android.app.AppCompatCallbacks
+android.graphics.AvoidXfermode
+android.graphics.BLASTBufferQueue
+android.graphics.BaseCanvas
+android.graphics.BaseRecordingCanvas
+android.graphics.Bitmap
+android.graphics.BitmapFactory
+android.graphics.BitmapRegionDecoder
+android.graphics.BitmapShader
+android.graphics.BlendMode
+android.graphics.BlendModeColorFilter
+android.graphics.BlurMaskFilter
+android.graphics.Camera
+android.graphics.Canvas
+android.graphics.CanvasProperty
+android.graphics.ColorFilter
+android.graphics.ColorMatrix
+android.graphics.ColorMatrixColorFilter
+android.graphics.Compatibility
+android.graphics.ComposePathEffect
+android.graphics.ComposeShader
+android.graphics.CornerPathEffect
+android.graphics.DashPathEffect
+android.graphics.DiscretePathEffect
+android.graphics.DrawFilter
+android.graphics.EmbossMaskFilter
+android.graphics.FontFamily
+android.graphics.FontListParser
+android.graphics.ForceDarkType
+android.graphics.FrameInfo
+android.graphics.Gainmap
+android.graphics.GraphicBuffer
+android.graphics.GraphicsProtos
+android.graphics.GraphicsStatsService
+android.graphics.HardwareBufferRenderer
+android.graphics.HardwareRenderer
+android.graphics.HardwareRendererObserver
+android.graphics.ImageDecoder
+android.graphics.ImageFormat
+android.graphics.LayerRasterizer
+android.graphics.LeakyTypefaceStorage
+android.graphics.LightingColorFilter
+android.graphics.LinearGradient
+android.graphics.MaskFilter
+android.graphics.Mesh
+android.graphics.MeshSpecification
+android.graphics.Movie
+android.graphics.NinePatch
+android.graphics.Paint
+android.graphics.PaintFlagsDrawFilter
+android.graphics.PathDashPathEffect
+android.graphics.PathEffect
+android.graphics.PathIterator
+android.graphics.PathMeasure
+android.graphics.Picture
+android.graphics.PixelXorXfermode
+android.graphics.PorterDuff
+android.graphics.PorterDuffColorFilter
+android.graphics.PorterDuffXfermode
+android.graphics.PostProcessor
+android.graphics.RadialGradient
+android.graphics.Rasterizer
+android.graphics.RecordingCanvas
+android.graphics.Region
+android.graphics.RegionIterator
+android.graphics.RenderEffect
+android.graphics.RenderNode
+android.graphics.RuntimeColorFilter
+android.graphics.RuntimeShader
+android.graphics.RuntimeXfermode
+android.graphics.Shader
+android.graphics.SumPathEffect
+android.graphics.SurfaceTexture
+android.graphics.SweepGradient
+android.graphics.TableMaskFilter
+android.graphics.TemporaryBuffer
+android.graphics.TextureLayer
+android.graphics.Typeface
+android.graphics.Xfermode
+android.graphics.YuvImage
+android.graphics.fonts.Font
+android.graphics.fonts.FontCustomizationParser
+android.graphics.fonts.FontFamily
+android.graphics.fonts.FontFamilyUpdateRequest
+android.graphics.fonts.FontFileUpdateRequest
+android.graphics.fonts.FontFileUtil
+android.graphics.fonts.FontStyle
+android.graphics.fonts.FontVariationAxis
+android.graphics.text.GraphemeBreak
+android.graphics.text.LineBreaker
+android.graphics.text.MeasuredText
+android.graphics.text.PositionedGlyphs
+android.graphics.text.TextRunShaper
+android.text.AlteredCharSequence
+android.text.AndroidBidi
+android.text.AndroidCharacter
+android.text.Annotation
+android.text.AutoGrowArray
+android.text.AutoText
+android.text.BidiFormatter
+android.text.BoringLayout
+android.text.CharSequenceCharacterIterator
+android.text.ClipboardManager
+android.text.DynamicLayout
+android.text.Editable
+android.text.Emoji
+android.text.EmojiConsistency
+android.text.FontConfig
+android.text.GetChars
+android.text.GraphemeClusterSegmentFinder
+android.text.GraphicsOperations
+android.text.Highlights
+android.text.Hyphenator
+android.text.InputFilter
+android.text.InputType
+android.text.Layout
+android.text.LoginFilter
+android.text.MeasuredParagraph
+android.text.NoCopySpan
+android.text.PackedIntVector
+android.text.PackedObjectVector
+android.text.ParcelableSpan
+android.text.PrecomputedText
+android.text.SegmentFinder
+android.text.Selection
+android.text.SpanColors
+android.text.SpanSet
+android.text.SpanWatcher
+android.text.Spannable
+android.text.SpannableString
+android.text.SpannableStringBuilder
+android.text.SpannableStringInternal
+android.text.Spanned
+android.text.SpannedString
+android.text.StaticLayout
+android.text.TextDirectionHeuristic
+android.text.TextDirectionHeuristics
+android.text.TextLine
+android.text.TextPaint
+android.text.TextShaper
+android.text.TextWatcher
+android.text.WordSegmentFinder
+android.text.format.DateFormat
+android.text.format.DateIntervalFormat
+android.text.format.DateTimeFormat
+android.text.format.DateUtils
+android.text.format.DateUtilsBridge
+android.text.format.Formatter
+android.text.format.RelativeDateTimeFormatter
+android.text.format.Time
+android.text.format.TimeFormatter
+android.text.format.TimeMigrationUtils
+android.text.method.AllCapsTransformationMethod
+android.text.method.ArrowKeyMovementMethod
+android.text.method.BaseKeyListener
+android.text.method.BaseMovementMethod
+android.text.method.CharacterPickerDialog
+android.text.method.DateKeyListener
+android.text.method.DateTimeKeyListener
+android.text.method.DialerKeyListener
+android.text.method.DigitsKeyListener
+android.text.method.HideReturnsTransformationMethod
+android.text.method.InsertModeTransformationMethod
+android.text.method.KeyListener
+android.text.method.LinkMovementMethod
+android.text.method.MetaKeyKeyListener
+android.text.method.MovementMethod
+android.text.method.MultiTapKeyListener
+android.text.method.NumberKeyListener
+android.text.method.OffsetMapping
+android.text.method.PasswordTransformationMethod
+android.text.method.QwertyKeyListener
+android.text.method.ReplacementTransformationMethod
+android.text.method.ScrollingMovementMethod
+android.text.method.SingleLineTransformationMethod
+android.text.method.TextKeyListener
+android.text.method.TimeKeyListener
+android.text.method.Touch
+android.text.method.TransformationMethod
+android.text.method.TransformationMethod2
+android.text.method.TranslationTransformationMethod
+android.text.method.WordIterator
+android.text.style.AbsoluteSizeSpan
+android.text.style.AccessibilityClickableSpan
+android.text.style.AccessibilityReplacementSpan
+android.text.style.AccessibilityURLSpan
+android.text.style.AlignmentSpan
+android.text.style.BackgroundColorSpan
+android.text.style.BulletSpan
+android.text.style.CharacterStyle
+android.text.style.ClickableSpan
+android.text.style.ForegroundColorSpan
+android.text.style.IconMarginSpan
+android.text.style.LeadingMarginSpan
+android.text.style.LineBackgroundSpan
+android.text.style.LineBreakConfigSpan
+android.text.style.LineHeightSpan
+android.text.style.LocaleSpan
+android.text.style.MaskFilterSpan
+android.text.style.MetricAffectingSpan
+android.text.style.NoWritingToolsSpan
+android.text.style.ParagraphStyle
+android.text.style.QuoteSpan
+android.text.style.RasterizerSpan
+android.text.style.RelativeSizeSpan
+android.text.style.ReplacementSpan
+android.text.style.ScaleXSpan
+android.text.style.SpanUtils
+android.text.style.SpellCheckSpan
+android.text.style.StrikethroughSpan
+android.text.style.StyleSpan
+android.text.style.SubscriptSpan
+android.text.style.SuggestionRangeSpan
+android.text.style.SuggestionSpan
+android.text.style.SuperscriptSpan
+android.text.style.TabStopSpan
+android.text.style.TextAppearanceSpan
+android.text.style.TtsSpan
+android.text.style.TypefaceSpan
+android.text.style.URLSpan
+android.text.style.UnderlineSpan
+android.text.style.UpdateAppearance
+android.text.style.UpdateLayout
+android.text.style.WrapTogetherSpan
+android.text.util.Rfc822Token
+android.text.util.Rfc822Tokenizer
diff --git a/ravenwood/texts/ravenwood-build.prop b/ravenwood/texts/ravenwood-build.prop
index 7cc4454a6e567..37c50f11f73f9 100644
--- a/ravenwood/texts/ravenwood-build.prop
+++ b/ravenwood/texts/ravenwood-build.prop
@@ -8,7 +8,11 @@ ro.soc.manufacturer=Android
ro.soc.model=Ravenwood
ro.debuggable=1
-# The ones starting with "ro.product" or "ro.bild" will be copied to all "partitions" too.
+# For the graphics stack
+ro.hwui.max_texture_allocation_size=104857600
+persist.sys.locale=en-US
+
+# The ones starting with "ro.product" or "ro.build" will be copied to all "partitions" too.
# See RavenwoodSystemProperties.
ro.product.brand=Android
ro.product.device=Ravenwood
diff --git a/ravenwood/texts/ravenwood-common-policies.txt b/ravenwood/texts/ravenwood-common-policies.txt
index fd4ea6cf40c2f..f0f4b8580f7df 100644
--- a/ravenwood/texts/ravenwood-common-policies.txt
+++ b/ravenwood/texts/ravenwood-common-policies.txt
@@ -21,3 +21,7 @@ class java.io.FileDescriptor # no-pta
method setInt$ @com.android.ravenwood.RavenwoodJdkPatch.setInt$
class java.util.LinkedHashMap # no-pta
method eldest @com.android.ravenwood.RavenwoodJdkPatch.eldest
+
+# Always set flag UNICODE_CHARACTER_CLASS when compiling regex
+class java.util.regex.Pattern keep
+ method compile @com.android.ravenwood.RavenwoodJdkPatch.compilePattern
diff --git a/ravenwood/texts/ravenwood-framework-policies.txt b/ravenwood/texts/ravenwood-framework-policies.txt
index fff9e6ad41d5b..0695316543aec 100644
--- a/ravenwood/texts/ravenwood-framework-policies.txt
+++ b/ravenwood/texts/ravenwood-framework-policies.txt
@@ -63,3 +63,22 @@ class android.text.ClipboardManager keep # no-pta
# Just enough to allow ResourcesManager to run
class android.hardware.display.DisplayManagerGlobal keep # no-pta
method getInstance ()Landroid/hardware/display/DisplayManagerGlobal; ignore # no-pta
+
+# Bare minimum to support running ImageDecoderTest
+class android.graphics.drawable.Drawable$ConstantState keepclass # no-pta
+class android.graphics.drawable.BitmapDrawable$BitmapState keepclass # no-pta
+class android.graphics.drawable.BitmapDrawable keep # no-pta
+ method (Landroid/content/res/Resources;Landroid/graphics/Bitmap;)V keep
+ method init * keep
+ method updateLocalState * keep
+ method computeBitmapSize * keep
+ method getIntrinsicWidth * keep
+ method getIntrinsicHeight * keep
+ method getBitmap * keep
+class android.graphics.drawable.Drawable keep # no-pta
+ method ()V keep
+ method resolveDensity * keep
+ method updateBlendModeFilter * ignore
+
+class android.os.StrictMode keep # no-pta
+ method noteSlowCall (Ljava/lang/String;)V ignore
--
GitLab
From 6a91d1399e1185f7eb9c31c6aca498b31bf916e7 Mon Sep 17 00:00:00 2001
From: Jack Yu
Date: Tue, 18 Feb 2025 13:12:48 -0800
Subject: [PATCH 006/111] Cleaned up the flag enforce_telephony_feature_mapping
Cleaned up the 24Q3 flag enforce_telephony_feature_mapping
Test: Basic telephony functionality tests
Test: atest EuiccProfileInfoTest
Bug: 297989574
Flag: EXEMPT flag cleanup
Change-Id: I16f344dcfc8bd588e56b2a20b792dd5039f2375d
---
.../injector/SystemEmergencyHelper.java | 32 +++++++----------
.../soundtrigger/PhoneCallStateHandler.java | 35 +++++++------------
2 files changed, 24 insertions(+), 43 deletions(-)
diff --git a/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java b/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java
index 177eefb2ef2a3..3f75b11befc23 100644
--- a/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java
+++ b/services/core/java/com/android/server/location/injector/SystemEmergencyHelper.java
@@ -29,7 +29,6 @@ import android.telephony.TelephonyManager;
import android.util.Log;
import com.android.internal.telephony.TelephonyIntents;
-import com.android.internal.telephony.flags.Flags;
import com.android.server.FgThread;
import java.util.Objects;
@@ -107,26 +106,19 @@ public class SystemEmergencyHelper extends EmergencyHelper {
boolean isInExtensionTime = mEmergencyCallEndRealtimeMs != Long.MIN_VALUE
&& (SystemClock.elapsedRealtime() - mEmergencyCallEndRealtimeMs) < extensionTimeMs;
- if (!Flags.enforceTelephonyFeatureMapping()) {
- return mIsInEmergencyCall
- || isInExtensionTime
- || mTelephonyManager.getEmergencyCallbackMode()
- || mTelephonyManager.isInEmergencySmsMode();
- } else {
- boolean emergencyCallbackMode = false;
- boolean emergencySmsMode = false;
- PackageManager pm = mContext.getPackageManager();
- if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) {
- emergencyCallbackMode = mTelephonyManager.getEmergencyCallbackMode();
- }
- if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_MESSAGING)) {
- emergencySmsMode = mTelephonyManager.isInEmergencySmsMode();
- }
- return mIsInEmergencyCall
- || isInExtensionTime
- || emergencyCallbackMode
- || emergencySmsMode;
+ boolean emergencyCallbackMode = false;
+ boolean emergencySmsMode = false;
+ PackageManager pm = mContext.getPackageManager();
+ if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_CALLING)) {
+ emergencyCallbackMode = mTelephonyManager.getEmergencyCallbackMode();
+ }
+ if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY_MESSAGING)) {
+ emergencySmsMode = mTelephonyManager.isInEmergencySmsMode();
}
+ return mIsInEmergencyCall
+ || isInExtensionTime
+ || emergencyCallbackMode
+ || emergencySmsMode;
}
private class EmergencyCallTelephonyCallback extends TelephonyCallback implements
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/PhoneCallStateHandler.java b/services/voiceinteraction/java/com/android/server/soundtrigger/PhoneCallStateHandler.java
index 49ad46131b0dd..df43ed973fe7b 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/PhoneCallStateHandler.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/PhoneCallStateHandler.java
@@ -24,7 +24,6 @@ import android.telephony.TelephonyManager;
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.telephony.flags.Flags;
import java.util.ArrayList;
import java.util.List;
@@ -119,28 +118,18 @@ public class PhoneCallStateHandler {
private boolean checkCallStatus() {
List infoList = mSubscriptionManager.getActiveSubscriptionInfoList();
if (infoList == null) return false;
- if (!Flags.enforceTelephonyFeatureMapping()) {
- return infoList.stream()
- .filter(s -> (s.getSubscriptionId()
- != SubscriptionManager.INVALID_SUBSCRIPTION_ID))
- .anyMatch(s -> isCallOngoingFromState(
- mTelephonyManager
- .createForSubscriptionId(s.getSubscriptionId())
- .getCallStateForSubscription()));
- } else {
- return infoList.stream()
- .filter(s -> (s.getSubscriptionId()
- != SubscriptionManager.INVALID_SUBSCRIPTION_ID))
- .anyMatch(s -> {
- try {
- return isCallOngoingFromState(mTelephonyManager
- .createForSubscriptionId(s.getSubscriptionId())
- .getCallStateForSubscription());
- } catch (UnsupportedOperationException e) {
- return false;
- }
- });
- }
+ return infoList.stream()
+ .filter(s -> (s.getSubscriptionId()
+ != SubscriptionManager.INVALID_SUBSCRIPTION_ID))
+ .anyMatch(s -> {
+ try {
+ return isCallOngoingFromState(mTelephonyManager
+ .createForSubscriptionId(s.getSubscriptionId())
+ .getCallStateForSubscription());
+ } catch (UnsupportedOperationException e) {
+ return false;
+ }
+ });
}
private void updateTelephonyListeners() {
--
GitLab
From 30bb277163fd24de3fab6fd9a3566a25c57f1a0e Mon Sep 17 00:00:00 2001
From: Owner Cleanup Bot
Date: Tue, 18 Feb 2025 15:13:24 -0800
Subject: [PATCH 007/111] [owners] Remove mns@google.com from
core/java/android/view/textclassifier/intent/OWNERS
This suggested change is automatically generated based on group
memberships and affiliations.
Please approve this change and vote the highest CR. This will keep the OWNERs
file tidy. We ask that you do not ignore this change and approve it
unless you know a reason the OWNER should remain. It can always be
reverted if needed.
If this change is in error, vote the lowest CR value (i.e. reject the CL)
and the bot will abandon it.
See the owner's recent review activity for context:
https://android-review.googlesource.com/q/mns@google.com
To report an issue, file a bug in the Infra>Codereview component.
Change-Id: Ide39736558874e4ef86ae0bbcc009366dfac880c
---
core/java/android/view/textclassifier/intent/OWNERS | 1 -
1 file changed, 1 deletion(-)
diff --git a/core/java/android/view/textclassifier/intent/OWNERS b/core/java/android/view/textclassifier/intent/OWNERS
index 3465fe62784f1..dc18514ce949c 100644
--- a/core/java/android/view/textclassifier/intent/OWNERS
+++ b/core/java/android/view/textclassifier/intent/OWNERS
@@ -1,6 +1,5 @@
# Bug component: 709498
-mns@google.com
toki@google.com
svetoslavganov@android.com
svetoslavganov@google.com
--
GitLab
From 8472ff33822e51858708ef781bedcddb25276e17 Mon Sep 17 00:00:00 2001
From: Owner Cleanup Bot
Date: Tue, 18 Feb 2025 15:13:41 -0800
Subject: [PATCH 008/111] [owners] Remove bonianchen@google.com from
packages/SettingsLib/src/com/android/settingslib/qrcode/OWNERS
This suggested change is automatically generated based on group
memberships and affiliations.
Please approve this change and vote the highest CR. This will keep the OWNERs
file tidy. We ask that you do not ignore this change and approve it
unless you know a reason the OWNER should remain. It can always be
reverted if needed.
If this change is in error, vote the lowest CR value (i.e. reject the CL)
and the bot will abandon it.
See the owner's recent review activity for context:
https://android-review.googlesource.com/q/bonianchen@google.com
To report an issue, file a bug in the Infra>Codereview component.
Change-Id: Id2e1d6ae355220f21afd1c3129f37cd5ae0a4f61
---
packages/SettingsLib/src/com/android/settingslib/qrcode/OWNERS | 1 -
1 file changed, 1 deletion(-)
diff --git a/packages/SettingsLib/src/com/android/settingslib/qrcode/OWNERS b/packages/SettingsLib/src/com/android/settingslib/qrcode/OWNERS
index 372eb81fdee28..921ffedb337c2 100644
--- a/packages/SettingsLib/src/com/android/settingslib/qrcode/OWNERS
+++ b/packages/SettingsLib/src/com/android/settingslib/qrcode/OWNERS
@@ -1,5 +1,4 @@
# Default reviewers for this and subdirectories.
-bonianchen@google.com
changbetty@google.com
wengsu@google.com
zoeychen@google.com
--
GitLab
From 5a3fde5c6fedca6f5803ab751ef7273a3bf46fe3 Mon Sep 17 00:00:00 2001
From: Anton Potapov
Date: Wed, 5 Feb 2025 14:56:19 +0000
Subject: [PATCH 009/111] Migrate Volume Dialog UI events to the new infra
Flag: com.android.systemui.volume_redesign
Bug: 369993959
Test: manual on the phone
Change-Id: Id1ea268377b72fa9eb34d76995e922dd9963b2db
---
.../com/android/systemui/volume/Events.java | 14 ++---
.../VolumeDialogRingerDrawerViewModel.kt | 14 +++++
.../VolumeDialogSettingsButtonViewModel.kt | 4 ++
.../ui/VolumeDialogSliderViewBinder.kt | 13 +++-
.../viewmodel/VolumeDialogSliderViewModel.kt | 23 ++++++-
.../volume/dialog/ui/VolumeDialogUiEvent.kt | 60 +++++++++++++++++++
.../viewmodel/VolumeDialogPluginViewModel.kt | 33 +++++++++-
...VolumeDialogRingerDrawerViewModelKosmos.kt | 2 +
...lumeDialogSettingsButtonViewModelKosmos.kt | 2 +
.../VolumeDialogSliderViewModelKosmos.kt | 2 +
10 files changed, 154 insertions(+), 13 deletions(-)
create mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ui/VolumeDialogUiEvent.kt
diff --git a/packages/SystemUI/src/com/android/systemui/volume/Events.java b/packages/SystemUI/src/com/android/systemui/volume/Events.java
index e10d1cb833fac..b8eb5189408e2 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/Events.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/Events.java
@@ -37,16 +37,16 @@ import java.util.Arrays;
public class Events {
private static final String TAG = Util.logTag(Events.class);
- public static final int EVENT_SHOW_DIALOG = 0; // (reason|int) (keyguard|bool)
- public static final int EVENT_DISMISS_DIALOG = 1; // (reason|int)
+ @Deprecated public static final int EVENT_SHOW_DIALOG = 0; // (reason|int) (keyguard|bool)
+ @Deprecated public static final int EVENT_DISMISS_DIALOG = 1; // (reason|int)
public static final int EVENT_ACTIVE_STREAM_CHANGED = 2; // (stream|int)
public static final int EVENT_EXPAND = 3; // (expand|bool)
public static final int EVENT_KEY = 4; // (stream|int) (lastAudibleStreamVolume)
public static final int EVENT_COLLECTION_STARTED = 5;
public static final int EVENT_COLLECTION_STOPPED = 6;
- public static final int EVENT_ICON_CLICK = 7; // (stream|int) (icon_state|int)
- public static final int EVENT_SETTINGS_CLICK = 8;
- public static final int EVENT_TOUCH_LEVEL_CHANGED = 9; // (stream|int) (level|int)
+ @Deprecated public static final int EVENT_ICON_CLICK = 7; // (stream|int) (icon_state|int)
+ @Deprecated public static final int EVENT_SETTINGS_CLICK = 8;
+ @Deprecated public static final int EVENT_TOUCH_LEVEL_CHANGED = 9; // (stream|int) (level|int)
public static final int EVENT_LEVEL_CHANGED = 10; // (stream|int) (level|int)
public static final int EVENT_INTERNAL_RINGER_MODE_CHANGED = 11; // (mode|int)
public static final int EVENT_EXTERNAL_RINGER_MODE_CHANGED = 12; // (mode|int)
@@ -55,12 +55,12 @@ public class Events {
public static final int EVENT_MUTE_CHANGED = 15; // (stream|int) (muted|bool)
public static final int EVENT_TOUCH_LEVEL_DONE = 16; // (stream|int) (level|int)
public static final int EVENT_ZEN_CONFIG_CHANGED = 17; // (allow/disallow|string)
- public static final int EVENT_RINGER_TOGGLE = 18; // (ringer_mode)
+ @Deprecated public static final int EVENT_RINGER_TOGGLE = 18; // (ringer_mode)
public static final int EVENT_SHOW_USB_OVERHEAT_ALARM = 19; // (reason|int) (keyguard|bool)
public static final int EVENT_DISMISS_USB_OVERHEAT_ALARM = 20; // (reason|int) (keyguard|bool)
public static final int EVENT_ODI_CAPTIONS_CLICK = 21;
public static final int EVENT_ODI_CAPTIONS_TOOLTIP_CLICK = 22;
- public static final int EVENT_SLIDER_TOUCH_TRACKING = 23; // (tracking|bool)
+ @Deprecated public static final int EVENT_SLIDER_TOUCH_TRACKING = 23; // (tracking|bool)
private static final String[] EVENT_TAGS = {
"show_dialog",
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt
index b0d6d62289c7c..69a939ae078e0 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt
@@ -25,6 +25,7 @@ import android.media.AudioManager.STREAM_RING
import android.os.VibrationEffect
import android.widget.Toast
import com.android.internal.R as internalR
+import com.android.internal.logging.UiEventLogger
import com.android.settingslib.Utils
import com.android.settingslib.notification.domain.interactor.NotificationsSoundPolicyInteractor
import com.android.settingslib.volume.shared.model.AudioStream
@@ -43,6 +44,7 @@ import com.android.systemui.volume.dialog.domain.interactor.VolumeDialogVisibili
import com.android.systemui.volume.dialog.ringer.domain.VolumeDialogRingerInteractor
import com.android.systemui.volume.dialog.ringer.shared.model.VolumeDialogRingerModel
import com.android.systemui.volume.dialog.shared.VolumeDialogLogger
+import com.android.systemui.volume.dialog.ui.VolumeDialogUiEvent
import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
@@ -73,6 +75,7 @@ constructor(
private val volumeDialogLogger: VolumeDialogLogger,
private val visibilityInteractor: VolumeDialogVisibilityInteractor,
configurationController: ConfigurationController,
+ private val uiEventLogger: UiEventLogger,
private val systemClock: SystemClock,
) {
@@ -112,6 +115,7 @@ constructor(
.build()
private var lastClickTime = 0L
+
init {
ringerViewModel
.onEach { viewModelState ->
@@ -137,6 +141,7 @@ constructor(
provideTouchFeedback(ringerMode)
maybeShowToast(ringerMode)
ringerInteractor.setRingerMode(ringerMode)
+ ringerMode.toVolumeDialogUiEvent()?.let(uiEventLogger::log)
}
visibilityInteractor.resetDismissTimeout()
drawerState.value =
@@ -312,3 +317,12 @@ constructor(
}
}
}
+
+private fun RingerMode.toVolumeDialogUiEvent(): VolumeDialogUiEvent? {
+ return when (value) {
+ RINGER_MODE_NORMAL -> VolumeDialogUiEvent.RINGER_MODE_NORMAL
+ RINGER_MODE_VIBRATE -> VolumeDialogUiEvent.RINGER_MODE_VIBRATE
+ RINGER_MODE_SILENT -> VolumeDialogUiEvent.RINGER_MODE_SILENT
+ else -> null
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/viewmodel/VolumeDialogSettingsButtonViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/viewmodel/VolumeDialogSettingsButtonViewModel.kt
index 0e4e707df923a..94c66cccbc592 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/viewmodel/VolumeDialogSettingsButtonViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/settings/ui/viewmodel/VolumeDialogSettingsButtonViewModel.kt
@@ -32,12 +32,14 @@ import com.airbnb.lottie.SimpleColorFilter
import com.airbnb.lottie.model.KeyPath
import com.airbnb.lottie.value.LottieValueCallback
import com.android.internal.R as internalR
+import com.android.internal.logging.UiEventLogger
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.UiBackground
import com.android.systemui.lottie.await
import com.android.systemui.res.R
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog
import com.android.systemui.volume.dialog.settings.domain.VolumeDialogSettingsButtonInteractor
+import com.android.systemui.volume.dialog.ui.VolumeDialogUiEvent
import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaDeviceSessionInteractor
import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaOutputInteractor
import com.android.systemui.volume.panel.shared.model.filterData
@@ -71,6 +73,7 @@ constructor(
mediaOutputInteractor: MediaOutputInteractor,
private val mediaDeviceSessionInteractor: MediaDeviceSessionInteractor,
private val interactor: VolumeDialogSettingsButtonInteractor,
+ private val uiEventLogger: UiEventLogger,
) {
@SuppressLint("UseCompatLoadingForDrawables")
@@ -160,6 +163,7 @@ constructor(
fun onButtonClicked() {
interactor.onButtonClicked()
+ uiEventLogger.log(VolumeDialogUiEvent.VOLUME_DIALOG_SETTINGS_CLICK)
}
private data class PlaybackStates(val isPreviousActive: Boolean?, val isCurrentActive: Boolean)
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt
index 2c9ee54878e55..17387e76aa159 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt
@@ -23,6 +23,7 @@ import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.interaction.DragInteraction
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.padding
@@ -59,7 +60,6 @@ import com.android.systemui.volume.dialog.sliders.ui.viewmodel.VolumeDialogSlide
import com.android.systemui.volume.haptics.ui.VolumeHapticsConfigsProvider
import javax.inject.Inject
import kotlin.math.round
-import kotlin.math.roundToInt
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.isActive
@@ -138,7 +138,7 @@ private fun VolumeDialogSlider(
)
.also { sliderState ->
sliderState.onValueChangeFinished = {
- viewModel.onStreamChangeFinished(sliderState.value.roundToInt())
+ viewModel.onSliderChangeFinished(sliderState.value)
hapticsViewModel?.onValueChangeEnded()
}
sliderState.onValueChange = { newValue ->
@@ -163,6 +163,15 @@ private fun VolumeDialogSlider(
hapticsViewModel?.onValueChange(value)
}
}
+ LaunchedEffect(interactionSource) {
+ interactionSource.interactions.collect {
+ when (it) {
+ is DragInteraction.Start -> viewModel.onSliderDragStarted()
+ is DragInteraction.Cancel -> viewModel.onSliderDragFinished()
+ is DragInteraction.Stop -> viewModel.onSliderDragFinished()
+ }
+ }
+ }
VerticalSlider(
state = sliderState,
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModel.kt
index 9ac052af95d9c..19b2880b9496d 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModel.kt
@@ -19,6 +19,7 @@ package com.android.systemui.volume.dialog.sliders.ui.viewmodel
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.pointer.PointerEvent
import androidx.compose.ui.input.pointer.PointerEventType
+import com.android.internal.logging.UiEventLogger
import com.android.systemui.util.time.SystemClock
import com.android.systemui.volume.Events
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog
@@ -30,6 +31,7 @@ import com.android.systemui.volume.dialog.sliders.domain.interactor.VolumeDialog
import com.android.systemui.volume.dialog.sliders.domain.interactor.VolumeDialogSliderInteractor
import com.android.systemui.volume.dialog.sliders.domain.model.VolumeDialogSliderType
import com.android.systemui.volume.dialog.sliders.shared.model.SliderInputEvent
+import com.android.systemui.volume.dialog.ui.VolumeDialogUiEvent
import javax.inject.Inject
import kotlin.math.roundToInt
import kotlinx.coroutines.CoroutineScope
@@ -69,6 +71,7 @@ constructor(
private val inputEventsInteractor: VolumeDialogSliderInputEventsInteractor,
private val systemClock: SystemClock,
private val logger: VolumeDialogLogger,
+ private val uiEventLogger: UiEventLogger,
) {
private val userVolumeUpdates = MutableStateFlow(null)
@@ -99,9 +102,11 @@ constructor(
isMuted = isMuted,
isRoutedToBluetooth = routedToBluetooth,
)
+
is VolumeDialogSliderType.RemoteMediaStream -> {
volumeDialogSliderIconProvider.getCastIcon(isMuted)
}
+
is VolumeDialogSliderType.AudioSharingStream -> {
volumeDialogSliderIconProvider.getAudioSharingIcon(isMuted)
}
@@ -135,8 +140,19 @@ constructor(
}
}
- fun onStreamChangeFinished(volume: Int) {
- logger.onVolumeSliderAdjustmentFinished(volume = volume, stream = sliderType.audioStream)
+ fun onSliderDragStarted() {
+ uiEventLogger.log(VolumeDialogUiEvent.VOLUME_DIALOG_SLIDER_STARTED_TRACKING_TOUCH)
+ }
+
+ fun onSliderDragFinished() {
+ uiEventLogger.log(VolumeDialogUiEvent.VOLUME_DIALOG_SLIDER_STOPPED_TRACKING_TOUCH)
+ }
+
+ fun onSliderChangeFinished(volume: Float) {
+ logger.onVolumeSliderAdjustmentFinished(
+ volume = volume.roundToInt(),
+ stream = sliderType.audioStream,
+ )
}
fun onTouchEvent(pointerEvent: PointerEvent) {
@@ -146,14 +162,17 @@ constructor(
inputEventsInteractor.onTouchEvent(
SliderInputEvent.Touch.Start(position.x, position.y)
)
+
PointerEventType.Move ->
inputEventsInteractor.onTouchEvent(
SliderInputEvent.Touch.Move(position.x, position.y)
)
+
PointerEventType.Scroll ->
inputEventsInteractor.onTouchEvent(
SliderInputEvent.Touch.Move(position.x, position.y)
)
+
PointerEventType.Release ->
inputEventsInteractor.onTouchEvent(
SliderInputEvent.Touch.End(position.x, position.y)
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/VolumeDialogUiEvent.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/VolumeDialogUiEvent.kt
new file mode 100644
index 0000000000000..cf1b69ed6cba9
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/VolumeDialogUiEvent.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2025 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.dialog.ui
+
+import com.android.internal.logging.UiEvent
+import com.android.internal.logging.UiEventLogger
+
+/** UI events for Volume Dialog. */
+enum class VolumeDialogUiEvent(val metricId: Int) : UiEventLogger.UiEventEnum {
+ @UiEvent(doc = "The ringer mode was toggled to silent") RINGER_MODE_SILENT(154),
+ @UiEvent(doc = "The ringer mode was toggled to vibrate") RINGER_MODE_VIBRATE(155),
+ @UiEvent(doc = "The ringer mode was toggled to normal") RINGER_MODE_NORMAL(334),
+ @UiEvent(doc = "The volume dialog settings icon was clicked") VOLUME_DIALOG_SETTINGS_CLICK(143),
+ @UiEvent(doc = "The volume dialog was shown because the volume changed")
+ VOLUME_DIALOG_SHOW_VOLUME_CHANGED(128),
+ @UiEvent(doc = "The volume dialog was shown because the volume changed remotely")
+ VOLUME_DIALOG_SHOW_REMOTE_VOLUME_CHANGED(129),
+ @UiEvent(doc = "The volume dialog was shown because the usb high temperature alarm changed")
+ VOLUME_DIALOG_SHOW_USB_TEMP_ALARM_CHANGED(130),
+ @UiEvent(doc = "The volume dialog was dismissed because of a touch outside the dialog")
+ VOLUME_DIALOG_DISMISS_TOUCH_OUTSIDE(134),
+ @UiEvent(
+ doc =
+ "The system asked the volume dialog to close, e.g. for a navigation bar " +
+ "touch, or ActivityManager ACTION_CLOSE_SYSTEM_DIALOGS broadcast."
+ )
+ VOLUME_DIALOG_DISMISS_SYSTEM(135),
+ @UiEvent(doc = "The volume dialog was dismissed because it timed out")
+ VOLUME_DIALOG_DISMISS_TIMEOUT(136),
+ @UiEvent(doc = "The volume dialog was dismissed because the screen turned off")
+ VOLUME_DIALOG_DISMISS_SCREEN_OFF(137),
+ @UiEvent(doc = "The volume dialog was dismissed because the settings icon was clicked")
+ VOLUME_DIALOG_DISMISS_SETTINGS(138),
+ @UiEvent(doc = "The volume dialog was dismissed because the stream no longer exists")
+ VOLUME_DIALOG_DISMISS_STREAM_GONE(140),
+ @UiEvent(
+ doc = "The volume dialog was dismissed because the usb high temperature alarm " + "changed"
+ )
+ VOLUME_DIALOG_DISMISS_USB_TEMP_ALARM_CHANGED(142),
+ @UiEvent(doc = "The right-most slider started tracking touch")
+ VOLUME_DIALOG_SLIDER_STARTED_TRACKING_TOUCH(1620),
+ @UiEvent(doc = "The right-most slider stopped tracking touch")
+ VOLUME_DIALOG_SLIDER_STOPPED_TRACKING_TOUCH(1621);
+
+ override fun getId() = metricId
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogPluginViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogPluginViewModel.kt
index 1765f0111e082..6d16300bf56e3 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogPluginViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/viewmodel/VolumeDialogPluginViewModel.kt
@@ -16,6 +16,7 @@
package com.android.systemui.volume.dialog.ui.viewmodel
+import com.android.internal.logging.UiEventLogger
import com.android.systemui.volume.Events
import com.android.systemui.volume.dialog.VolumeDialog
import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogPlugin
@@ -26,6 +27,7 @@ import com.android.systemui.volume.dialog.domain.interactor.VolumeDialogVisibili
import com.android.systemui.volume.dialog.shared.VolumeDialogLogger
import com.android.systemui.volume.dialog.shared.model.CsdWarningConfigModel
import com.android.systemui.volume.dialog.shared.model.VolumeDialogVisibilityModel
+import com.android.systemui.volume.dialog.ui.VolumeDialogUiEvent
import javax.inject.Inject
import javax.inject.Provider
import kotlinx.coroutines.CoroutineScope
@@ -44,6 +46,7 @@ constructor(
private val volumeDialogProvider: Provider,
private val logger: VolumeDialogLogger,
val csdWarningConfigModel: CsdWarningConfigModel,
+ private val uiEventLogger: UiEventLogger,
) {
fun launchVolumeDialog() {
@@ -52,11 +55,11 @@ constructor(
with(visibilityModel) {
if (this is VolumeDialogVisibilityModel.Visible) {
showDialog()
- Events.writeEvent(Events.EVENT_SHOW_DIALOG, reason, keyguardLocked)
+ toVolumeDialogUiEvent()?.let(uiEventLogger::log)
logger.onShow(reason)
}
if (this is VolumeDialogVisibilityModel.Dismissed) {
- Events.writeEvent(Events.EVENT_DISMISS_DIALOG, reason)
+ toVolumeDialogUiEvent()?.let(uiEventLogger::log)
logger.onDismiss(reason)
}
}
@@ -86,3 +89,29 @@ constructor(
.show()
}
}
+
+private fun VolumeDialogVisibilityModel.Dismissed.toVolumeDialogUiEvent(): VolumeDialogUiEvent? {
+ return when (reason) {
+ Events.DISMISS_REASON_TOUCH_OUTSIDE ->
+ VolumeDialogUiEvent.VOLUME_DIALOG_DISMISS_TOUCH_OUTSIDE
+ Events.DISMISS_REASON_VOLUME_CONTROLLER -> VolumeDialogUiEvent.VOLUME_DIALOG_DISMISS_SYSTEM
+ Events.DISMISS_REASON_TIMEOUT -> VolumeDialogUiEvent.VOLUME_DIALOG_DISMISS_TIMEOUT
+ Events.DISMISS_REASON_SCREEN_OFF -> VolumeDialogUiEvent.VOLUME_DIALOG_DISMISS_SCREEN_OFF
+ Events.DISMISS_REASON_SETTINGS_CLICKED -> VolumeDialogUiEvent.VOLUME_DIALOG_DISMISS_SETTINGS
+ Events.DISMISS_STREAM_GONE -> VolumeDialogUiEvent.VOLUME_DIALOG_DISMISS_STREAM_GONE
+ Events.DISMISS_REASON_USB_OVERHEAD_ALARM_CHANGED ->
+ VolumeDialogUiEvent.VOLUME_DIALOG_DISMISS_USB_TEMP_ALARM_CHANGED
+ else -> null
+ }
+}
+
+private fun VolumeDialogVisibilityModel.Visible.toVolumeDialogUiEvent(): VolumeDialogUiEvent? {
+ return when (reason) {
+ Events.SHOW_REASON_VOLUME_CHANGED -> VolumeDialogUiEvent.VOLUME_DIALOG_SHOW_VOLUME_CHANGED
+ Events.SHOW_REASON_REMOTE_VOLUME_CHANGED ->
+ VolumeDialogUiEvent.VOLUME_DIALOG_SHOW_REMOTE_VOLUME_CHANGED
+ Events.SHOW_REASON_USB_OVERHEAD_ALARM_CHANGED ->
+ VolumeDialogUiEvent.VOLUME_DIALOG_SHOW_USB_TEMP_ALARM_CHANGED
+ else -> null
+ }
+}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt
index 9f3150f7366a0..919d36b3dec17 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt
@@ -17,6 +17,7 @@
package com.android.systemui.volume.dialog.ringer.ui.viewmodel
import android.content.applicationContext
+import com.android.internal.logging.uiEventLogger
import com.android.systemui.haptics.vibratorHelper
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.applicationCoroutineScope
@@ -41,6 +42,7 @@ val Kosmos.volumeDialogRingerDrawerViewModel by
volumeDialogLogger = volumeDialogLogger,
visibilityInteractor = volumeDialogVisibilityInteractor,
configurationController = configurationController,
+ uiEventLogger = uiEventLogger,
systemClock = fakeSystemClock,
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/settings/ui/viewmodel/VolumeDialogSettingsButtonViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/settings/ui/viewmodel/VolumeDialogSettingsButtonViewModelKosmos.kt
index 0ae3b037b50a0..a17611b998c09 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/settings/ui/viewmodel/VolumeDialogSettingsButtonViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/settings/ui/viewmodel/VolumeDialogSettingsButtonViewModelKosmos.kt
@@ -17,6 +17,7 @@
package com.android.systemui.volume.dialog.settings.ui.viewmodel
import android.content.applicationContext
+import com.android.internal.logging.uiEventLogger
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.testScope
@@ -33,5 +34,6 @@ val Kosmos.volumeDialogSettingsButtonViewModel by
mediaOutputInteractor,
mediaDeviceSessionInteractor,
volumeDialogSettingsButtonInteractor,
+ uiEventLogger,
)
}
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModelKosmos.kt
index 90bbb28ff5197..c9396f5ccde98 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderViewModelKosmos.kt
@@ -16,6 +16,7 @@
package com.android.systemui.volume.dialog.sliders.ui.viewmodel
+import com.android.internal.logging.uiEventLogger
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.util.time.systemClock
@@ -35,6 +36,7 @@ val Kosmos.volumeDialogSliderViewModel by
coroutineScope = applicationCoroutineScope,
volumeDialogSliderIconProvider = volumeDialogSliderIconProvider,
systemClock = systemClock,
+ uiEventLogger = uiEventLogger,
logger = volumeDialogLogger,
)
}
--
GitLab
From 5c6fd9b60ca0aa5314c7009130af587e01766759 Mon Sep 17 00:00:00 2001
From: Gustav Sennton
Date: Tue, 4 Feb 2025 17:27:24 +0000
Subject: [PATCH 010/111] Desktop-Minimize: move CUJ handling to
MinimizeAnimator
- Move CUJ handling for the Desktop window minimize animation from
DesktopTasksLimiter to MinimizeAnimator.
- Also add ShellAnimationThread Handler to be able to pass such a Handler
to InteractionJankMonitor for the minimize-window animation in
FreeformTaskTransitionHandler.
Flag: NONE jank/logging only change
Test: manual (perfetto)
Bug: 374206096
Bug: 385051575
Change-Id: Id2bb7fa223ebdafb301c853941282f9c8a533b57
---
.../shell/shared/animation/Interpolators.java | 6 +
.../shared/animation/MinimizeAnimator.kt | 50 ++++++--
.../dagger/WMShellConcurrencyModule.java | 29 +++--
.../wm/shell/dagger/WMShellModule.java | 10 +-
.../DesktopMinimizationTransitionHandler.kt | 36 +++++-
.../shell/desktopmode/DesktopTasksLimiter.kt | 25 +---
.../FreeformTaskTransitionHandler.java | 48 ++++---
...esktopMinimizationTransitionHandlerTest.kt | 8 +-
.../desktopmode/DesktopTasksLimiterTest.kt | 82 ------------
.../shared/animation/MinimizeAnimatorTest.kt | 118 ++++++++++++++++++
10 files changed, 255 insertions(+), 157 deletions(-)
create mode 100644 libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/animation/MinimizeAnimatorTest.kt
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/Interpolators.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/Interpolators.java
index e92c1eb81e895..43dd9b73b352d 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/Interpolators.java
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/Interpolators.java
@@ -73,6 +73,12 @@ public class Interpolators {
public static final Interpolator EMPHASIZED_DECELERATE = new PathInterpolator(
0.05f, 0.7f, 0.1f, 1f);
+ /**
+ * The standard accelerating interpolator that should be used on every regular movement of
+ * content that is disappearing e.g. when moving off screen.
+ */
+ public static final Interpolator STANDARD_ACCELERATE = new PathInterpolator(0.3f, 0f, 1f, 1f);
+
/**
* The standard decelerating interpolator that should be used on every regular movement of
* content that is appearing e.g. when coming from off screen.
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/MinimizeAnimator.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/MinimizeAnimator.kt
index 0586e265ecedf..4ecace0292cfa 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/MinimizeAnimator.kt
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/animation/MinimizeAnimator.kt
@@ -19,52 +19,76 @@ package com.android.wm.shell.shared.animation
import android.animation.Animator
import android.animation.AnimatorSet
import android.animation.ValueAnimator
-import android.util.DisplayMetrics
+import android.content.Context
+import android.os.Handler
+import android.view.Choreographer
import android.view.SurfaceControl.Transaction
-import android.view.animation.LinearInterpolator
-import android.view.animation.PathInterpolator
import android.window.TransitionInfo.Change
+import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_MINIMIZE_WINDOW
+import com.android.internal.jank.InteractionJankMonitor
/** Creates minimization animation */
object MinimizeAnimator {
private const val MINIMIZE_ANIM_ALPHA_DURATION_MS = 100L
- private val STANDARD_ACCELERATE = PathInterpolator(0.3f, 0f, 1f, 1f)
-
private val minimizeBoundsAnimationDef =
WindowAnimator.BoundsAnimationParams(
durationMs = 200,
endOffsetYDp = 12f,
endScale = 0.97f,
- interpolator = STANDARD_ACCELERATE,
+ interpolator = Interpolators.STANDARD_ACCELERATE,
)
+ /**
+ * Creates a minimize animator for given task [Change].
+ *
+ * @param onAnimFinish finish-callback for the animation, note that this is called on the same
+ * thread as the animation itself.
+ * @param animationHandler the Handler that the animation is running on.
+ */
@JvmStatic
fun create(
- displayMetrics: DisplayMetrics,
+ context: Context,
change: Change,
transaction: Transaction,
onAnimFinish: (Animator) -> Unit,
+ interactionJankMonitor: InteractionJankMonitor,
+ animationHandler: Handler,
): Animator {
val boundsAnimator = WindowAnimator.createBoundsAnimator(
- displayMetrics,
+ context.resources.displayMetrics,
minimizeBoundsAnimationDef,
change,
transaction,
)
val alphaAnimator = ValueAnimator.ofFloat(1f, 0f).apply {
duration = MINIMIZE_ANIM_ALPHA_DURATION_MS
- interpolator = LinearInterpolator()
+ interpolator = Interpolators.LINEAR
addUpdateListener { animation ->
- transaction.setAlpha(change.leash, animation.animatedValue as Float).apply()
+ transaction
+ .setAlpha(change.leash, animation.animatedValue as Float)
+ .setFrameTimeline(Choreographer.getInstance().vsyncId)
+ .apply()
}
}
val listener = object : Animator.AnimatorListener {
- override fun onAnimationEnd(animator: Animator) = onAnimFinish(animator)
- override fun onAnimationCancel(animator: Animator) = Unit
+ override fun onAnimationStart(animator: Animator) {
+ interactionJankMonitor.begin(
+ change.leash,
+ context,
+ animationHandler,
+ CUJ_DESKTOP_MODE_MINIMIZE_WINDOW,
+ )
+ }
+ override fun onAnimationCancel(animator: Animator) {
+ interactionJankMonitor.cancel(CUJ_DESKTOP_MODE_MINIMIZE_WINDOW)
+ }
override fun onAnimationRepeat(animator: Animator) = Unit
- override fun onAnimationStart(animator: Animator) = Unit
+ override fun onAnimationEnd(animator: Animator) {
+ interactionJankMonitor.end(CUJ_DESKTOP_MODE_MINIMIZE_WINDOW)
+ onAnimFinish(animator)
+ }
}
return AnimatorSet().apply {
playTogether(boundsAnimator, alphaAnimator)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellConcurrencyModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellConcurrencyModule.java
index ee3e39e715587..e9dc6132f5f41 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellConcurrencyModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellConcurrencyModule.java
@@ -162,22 +162,31 @@ public abstract class WMShellConcurrencyModule {
}
}
- /**
- * Provide a Shell animation-thread Executor.
- */
+ /** Provide a Shell animation-thread Handler. */
@WMSingleton
@Provides
@ShellAnimationThread
- public static ShellExecutor provideShellAnimationExecutor() {
- HandlerThread shellAnimationThread = new HandlerThread("wmshell.anim",
- THREAD_PRIORITY_DISPLAY);
- shellAnimationThread.start();
+ public static Handler provideShellAnimationHandler() {
+ HandlerThread animThread = new HandlerThread("wmshell.anim", THREAD_PRIORITY_DISPLAY);
+ animThread.start();
if (Build.IS_DEBUGGABLE) {
- shellAnimationThread.getLooper().setTraceTag(Trace.TRACE_TAG_WINDOW_MANAGER);
- shellAnimationThread.getLooper().setSlowLogThresholdMs(MSGQ_SLOW_DISPATCH_THRESHOLD_MS,
+ animThread.getLooper().setTraceTag(Trace.TRACE_TAG_WINDOW_MANAGER);
+ animThread.getLooper().setSlowLogThresholdMs(MSGQ_SLOW_DISPATCH_THRESHOLD_MS,
MSGQ_SLOW_DELIVERY_THRESHOLD_MS);
}
- return new HandlerExecutor(Handler.createAsync(shellAnimationThread.getLooper()));
+ return Handler.createAsync(animThread.getLooper());
+ }
+
+ /**
+ * Provide a Shell animation-thread Executor.
+ */
+ @WMSingleton
+ @Provides
+ @ShellAnimationThread
+ public static ShellExecutor provideShellAnimationExecutor(
+ @ShellAnimationThread Handler animHandler
+ ) {
+ return new HandlerExecutor(animHandler);
}
/**
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
index 2fd8c27d5970c..79adea6749aa5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
@@ -428,9 +428,10 @@ public abstract class WMShellModule {
Transitions transitions,
DisplayController displayController,
@ShellMainThread ShellExecutor mainExecutor,
- @ShellAnimationThread ShellExecutor animExecutor) {
+ @ShellAnimationThread ShellExecutor animExecutor,
+ @ShellAnimationThread Handler animHandler) {
return new FreeformTaskTransitionHandler(
- transitions, displayController, mainExecutor, animExecutor);
+ transitions, displayController, mainExecutor, animExecutor, animHandler);
}
@WMSingleton
@@ -1083,9 +1084,10 @@ public abstract class WMShellModule {
static DesktopMinimizationTransitionHandler provideDesktopMinimizationTransitionHandler(
@ShellMainThread ShellExecutor mainExecutor,
@ShellAnimationThread ShellExecutor animExecutor,
- DisplayController displayController) {
+ DisplayController displayController,
+ @ShellAnimationThread Handler mainHandler) {
return new DesktopMinimizationTransitionHandler(mainExecutor, animExecutor,
- displayController);
+ displayController, mainHandler);
}
@WMSingleton
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMinimizationTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMinimizationTransitionHandler.kt
index 728638d9bbd30..7074e8bc9cce1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMinimizationTransitionHandler.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMinimizationTransitionHandler.kt
@@ -18,14 +18,17 @@ package com.android.wm.shell.desktopmode
import android.animation.Animator
import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
+import android.os.Handler
import android.os.IBinder
-import android.util.DisplayMetrics
import android.view.SurfaceControl.Transaction
import android.window.TransitionInfo
import android.window.TransitionRequestInfo
import android.window.WindowContainerTransaction
+import com.android.internal.jank.InteractionJankMonitor
+import com.android.internal.protolog.ProtoLog
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.ShellExecutor
+import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE
import com.android.wm.shell.shared.TransitionUtil
import com.android.wm.shell.shared.animation.MinimizeAnimator.create
import com.android.wm.shell.transition.Transitions
@@ -41,6 +44,7 @@ class DesktopMinimizationTransitionHandler(
private val mainExecutor: ShellExecutor,
private val animExecutor: ShellExecutor,
private val displayController: DisplayController,
+ private val animHandler: Handler,
) : Transitions.TransitionHandler {
/** Shouldn't handle anything */
@@ -90,10 +94,30 @@ class DesktopMinimizationTransitionHandler(
val t = Transaction()
val sc = change.leash
finishTransaction.hide(sc)
- val displayMetrics: DisplayMetrics? =
- change.taskInfo?.let {
- displayController.getDisplayContext(it.displayId)?.getResources()?.displayMetrics
- }
- return displayMetrics?.let { create(it, change, t, onAnimFinish) }
+ val displayContext =
+ change.taskInfo?.let { displayController.getDisplayContext(it.displayId) }
+ if (displayContext == null) {
+ logW(
+ "displayContext is null for taskId=${change.taskInfo?.taskId}, " +
+ "displayId=${change.taskInfo?.displayId}"
+ )
+ return null
+ }
+ return create(
+ displayContext,
+ change,
+ t,
+ onAnimFinish,
+ InteractionJankMonitor.getInstance(),
+ animHandler,
+ )
+ }
+
+ private companion object {
+ private fun logW(msg: String, vararg arguments: Any?) {
+ ProtoLog.w(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments)
+ }
+
+ const val TAG = "DesktopMinimizationTransitionHandler"
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt
index 81b136dd1569c..f9ab359e952d0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt
@@ -26,7 +26,6 @@ import android.window.DesktopModeFlags
import android.window.TransitionInfo
import android.window.WindowContainerTransaction
import androidx.annotation.VisibleForTesting
-import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_MINIMIZE_WINDOW
import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.protolog.ProtoLog
import com.android.wm.shell.ShellTaskOrganizer
@@ -176,28 +175,13 @@ class DesktopTasksLimiter(
return taskChange.mode == TRANSIT_TO_BACK
}
- override fun onTransitionStarting(transition: IBinder) {
- val mActiveTaskDetails = activeTransitionTokensAndTasks[transition]
- val info = mActiveTaskDetails?.transitionInfo ?: return
- val minimizeChange = getMinimizeChange(info, mActiveTaskDetails.taskId) ?: return
- // Begin minimize window CUJ instrumentation.
- interactionJankMonitor.begin(
- minimizeChange.leash,
- context,
- handler,
- CUJ_DESKTOP_MODE_MINIMIZE_WINDOW,
- )
- }
-
private fun getMinimizeChange(info: TransitionInfo, taskId: Int): TransitionInfo.Change? =
info.changes.find { change ->
change.taskInfo?.taskId == taskId && change.mode == TRANSIT_TO_BACK
}
override fun onTransitionMerged(merged: IBinder, playing: IBinder) {
- if (activeTransitionTokensAndTasks.remove(merged) != null) {
- interactionJankMonitor.end(CUJ_DESKTOP_MODE_MINIMIZE_WINDOW)
- }
+ activeTransitionTokensAndTasks.remove(merged)
pendingTransitionTokensAndTasks.remove(merged)?.let { taskToTransfer ->
pendingTransitionTokensAndTasks[playing] = taskToTransfer
}
@@ -209,13 +193,6 @@ class DesktopTasksLimiter(
}
override fun onTransitionFinished(transition: IBinder, aborted: Boolean) {
- if (activeTransitionTokensAndTasks.remove(transition) != null) {
- if (aborted) {
- interactionJankMonitor.cancel(CUJ_DESKTOP_MODE_MINIMIZE_WINDOW)
- } else {
- interactionJankMonitor.end(CUJ_DESKTOP_MODE_MINIMIZE_WINDOW)
- }
- }
pendingTransitionTokensAndTasks.remove(transition)
activeUnminimizeTransitionTokensAndTasks.remove(transition)
pendingUnminimizeTransitionTokensAndTasks.remove(transition)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java
index b60fb5e7bfdd3..16e411e1fc074 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java
@@ -25,10 +25,12 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.app.ActivityManager;
import android.app.WindowConfiguration;
+import android.content.Context;
import android.graphics.Rect;
+import android.os.Handler;
import android.os.IBinder;
import android.util.ArrayMap;
-import android.util.DisplayMetrics;
+import android.util.Log;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.window.TransitionInfo;
@@ -38,6 +40,7 @@ import android.window.WindowContainerTransaction;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.android.internal.jank.InteractionJankMonitor;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.shared.animation.MinimizeAnimator;
@@ -52,11 +55,13 @@ import java.util.List;
*/
public class FreeformTaskTransitionHandler
implements Transitions.TransitionHandler, FreeformTaskTransitionStarter {
+ private static final String TAG = "FreeformTaskTransitionHandler";
private static final int CLOSE_ANIM_DURATION = 400;
private final Transitions mTransitions;
private final DisplayController mDisplayController;
private final ShellExecutor mMainExecutor;
private final ShellExecutor mAnimExecutor;
+ private final Handler mAnimHandler;
private final List mPendingTransitionTokens = new ArrayList<>();
@@ -66,11 +71,13 @@ public class FreeformTaskTransitionHandler
Transitions transitions,
DisplayController displayController,
ShellExecutor mainExecutor,
- ShellExecutor animExecutor) {
+ ShellExecutor animExecutor,
+ Handler animHandler) {
mTransitions = transitions;
mDisplayController = displayController;
mMainExecutor = mainExecutor;
mAnimExecutor = animExecutor;
+ mAnimHandler = animHandler;
}
@Override
@@ -123,13 +130,11 @@ public class FreeformTaskTransitionHandler
@NonNull Transitions.TransitionFinishCallback finishCallback) {
boolean transitionHandled = false;
final ArrayList animations = new ArrayList<>();
- final Runnable onAnimFinish = () -> {
+ final Runnable onAnimFinish = () -> mMainExecutor.execute(() -> {
if (!animations.isEmpty()) return;
- mMainExecutor.execute(() -> {
- mAnimations.remove(transition);
- finishCallback.onTransitionFinished(null /* wct */);
- });
- };
+ mAnimations.remove(transition);
+ finishCallback.onTransitionFinished(null /* wct */);
+ });
for (TransitionInfo.Change change : info.getChanges()) {
if ((change.getFlags() & TransitionInfo.FLAG_IS_WALLPAPER) != 0) {
continue;
@@ -234,18 +239,25 @@ public class FreeformTaskTransitionHandler
SurfaceControl.Transaction t = new SurfaceControl.Transaction();
SurfaceControl sc = change.getLeash();
finishT.hide(sc);
- final DisplayMetrics displayMetrics =
- mDisplayController
- .getDisplayContext(taskInfo.displayId).getResources().getDisplayMetrics();
+ final Context displayContext =
+ mDisplayController.getDisplayContext(taskInfo.displayId);
+ if (displayContext == null) {
+ Log.w(TAG, "No displayContext for displayId=" + taskInfo.displayId);
+ return false;
+ }
final Animator animator = MinimizeAnimator.create(
- displayMetrics,
+ displayContext,
change,
t,
(anim) -> {
- animations.remove(anim);
- onAnimFinish.run();
+ mMainExecutor.execute(() -> {
+ animations.remove(anim);
+ onAnimFinish.run();
+ });
return null;
- });
+ },
+ InteractionJankMonitor.getInstance(),
+ mAnimHandler);
animations.add(animator);
return true;
}
@@ -277,8 +289,10 @@ public class FreeformTaskTransitionHandler
new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
- animations.remove(animator);
- onAnimFinish.run();
+ mMainExecutor.execute(() -> {
+ animations.remove(animator);
+ onAnimFinish.run();
+ });
}
});
animations.add(animator);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMinimizationTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMinimizationTransitionHandlerTest.kt
index 4c3325d4d1de4..0d1c57221fb9c 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMinimizationTransitionHandlerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMinimizationTransitionHandlerTest.kt
@@ -21,6 +21,7 @@ import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD
import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN
import android.app.WindowConfiguration.WindowingMode
+import android.os.Handler
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper.RunWithLooper
import android.view.SurfaceControl
@@ -56,7 +57,12 @@ class DesktopMinimizationTransitionHandlerTest : ShellTestCase() {
@Before
fun setUp() {
handler =
- DesktopMinimizationTransitionHandler(testExecutor, testExecutor, displayController)
+ DesktopMinimizationTransitionHandler(
+ testExecutor,
+ testExecutor,
+ displayController,
+ mock(),
+ )
whenever(displayController.getDisplayContext(any())).thenReturn(mContext)
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt
index d33209dbc30e4..62e3c544e3907 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt
@@ -37,7 +37,6 @@ import androidx.test.filters.SmallTest
import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn
import com.android.dx.mockito.inline.extended.StaticMockitoSession
-import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_MINIMIZE_WINDOW
import com.android.internal.jank.InteractionJankMonitor
import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION
import com.android.wm.shell.ShellTaskOrganizer
@@ -72,8 +71,6 @@ import org.mockito.Mockito.any
import org.mockito.Mockito.mock
import org.mockito.Mockito.spy
import org.mockito.Mockito.`when`
-import org.mockito.kotlin.eq
-import org.mockito.kotlin.verify
import org.mockito.quality.Strictness
/**
@@ -520,85 +517,6 @@ class DesktopTasksLimiterTest : ShellTestCase() {
assertThat(minimizedTask).isEqualTo(tasks.last().taskId)
}
- @Test
- fun minimizeTransitionReadyAndFinished_logsJankInstrumentationBeginAndEnd() {
- desktopTaskRepo.addDesk(displayId = DEFAULT_DISPLAY, deskId = 0)
- desktopTaskRepo.setActiveDesk(displayId = DEFAULT_DISPLAY, deskId = 0)
- (1.. setUpFreeformTask() }
- val transition = Binder()
- val task = setUpFreeformTask()
- addPendingMinimizeChange(transition, taskId = task.taskId)
-
- callOnTransitionReady(
- transition,
- TransitionInfoBuilder(TRANSIT_OPEN).addChange(TRANSIT_TO_BACK, task).build(),
- )
-
- desktopTasksLimiter.getTransitionObserver().onTransitionStarting(transition)
-
- verify(interactionJankMonitor)
- .begin(any(), eq(mContext), eq(handler), eq(CUJ_DESKTOP_MODE_MINIMIZE_WINDOW))
-
- desktopTasksLimiter
- .getTransitionObserver()
- .onTransitionFinished(transition, /* aborted= */ false)
-
- verify(interactionJankMonitor).end(eq(CUJ_DESKTOP_MODE_MINIMIZE_WINDOW))
- }
-
- @Test
- fun minimizeTransitionReadyAndAborted_logsJankInstrumentationBeginAndCancel() {
- desktopTaskRepo.addDesk(displayId = DEFAULT_DISPLAY, deskId = 0)
- desktopTaskRepo.setActiveDesk(displayId = DEFAULT_DISPLAY, deskId = 0)
- (1.. setUpFreeformTask() }
- val transition = Binder()
- val task = setUpFreeformTask()
- addPendingMinimizeChange(transition, taskId = task.taskId)
-
- callOnTransitionReady(
- transition,
- TransitionInfoBuilder(TRANSIT_OPEN).addChange(TRANSIT_TO_BACK, task).build(),
- )
-
- desktopTasksLimiter.getTransitionObserver().onTransitionStarting(transition)
-
- verify(interactionJankMonitor)
- .begin(any(), eq(mContext), eq(handler), eq(CUJ_DESKTOP_MODE_MINIMIZE_WINDOW))
-
- desktopTasksLimiter
- .getTransitionObserver()
- .onTransitionFinished(transition, /* aborted= */ true)
-
- verify(interactionJankMonitor).cancel(eq(CUJ_DESKTOP_MODE_MINIMIZE_WINDOW))
- }
-
- @Test
- fun minimizeTransitionReadyAndMerged_logsJankInstrumentationBeginAndEnd() {
- desktopTaskRepo.addDesk(displayId = DEFAULT_DISPLAY, deskId = 0)
- desktopTaskRepo.setActiveDesk(displayId = DEFAULT_DISPLAY, deskId = 0)
- (1.. setUpFreeformTask() }
- val mergedTransition = Binder()
- val newTransition = Binder()
- val task = setUpFreeformTask()
- addPendingMinimizeChange(mergedTransition, taskId = task.taskId)
-
- callOnTransitionReady(
- mergedTransition,
- TransitionInfoBuilder(TRANSIT_OPEN).addChange(TRANSIT_TO_BACK, task).build(),
- )
-
- desktopTasksLimiter.getTransitionObserver().onTransitionStarting(mergedTransition)
-
- verify(interactionJankMonitor)
- .begin(any(), eq(mContext), eq(handler), eq(CUJ_DESKTOP_MODE_MINIMIZE_WINDOW))
-
- desktopTasksLimiter
- .getTransitionObserver()
- .onTransitionMerged(mergedTransition, newTransition)
-
- verify(interactionJankMonitor).end(eq(CUJ_DESKTOP_MODE_MINIMIZE_WINDOW))
- }
-
@Test
fun getMinimizingTask_noPendingTransition_returnsNull() {
val transition = Binder()
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/animation/MinimizeAnimatorTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/animation/MinimizeAnimatorTest.kt
new file mode 100644
index 0000000000000..ba609d4322fc6
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/shared/animation/MinimizeAnimatorTest.kt
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2025 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.wm.shell.shared.animation
+
+import android.animation.Animator
+import android.animation.AnimatorSet
+import android.animation.ValueAnimator
+import android.content.Context
+import android.content.res.Resources
+import android.os.Handler
+import android.util.DisplayMetrics
+import android.view.SurfaceControl
+import android.view.SurfaceControl.Transaction
+import android.window.TransitionInfo
+import android.window.WindowContainerToken
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread
+import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_MINIMIZE_WINDOW
+import com.android.internal.jank.InteractionJankMonitor
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.anyFloat
+import org.mockito.ArgumentMatchers.anyLong
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.never
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class MinimizeAnimatorTest {
+ private val context = mock()
+ private val resources = mock()
+ private val transaction = mock()
+ private val leash = mock()
+ private val interactionJankMonitor = mock()
+ private val animationHandler = mock()
+
+ private val displayMetrics = DisplayMetrics().apply { density = 1f }
+
+ @Before
+ fun setup() {
+ whenever(context.resources).thenReturn(resources)
+ whenever(resources.displayMetrics).thenReturn(displayMetrics)
+ whenever(transaction.setAlpha(any(), anyFloat())).thenReturn(transaction)
+ whenever(transaction.setPosition(any(), anyFloat(), anyFloat())).thenReturn(transaction)
+ whenever(transaction.setScale(any(), anyFloat(), anyFloat())).thenReturn(transaction)
+ whenever(transaction.setFrameTimeline(anyLong())).thenReturn(transaction)
+ }
+
+ @Test
+ fun create_returnsBoundsAndAlphaAnimators() {
+ val change = TransitionInfo.Change(mock(), leash)
+
+ val animator = createAnimator(change)
+
+ assertThat(animator).isInstanceOf(AnimatorSet::class.java)
+ val animatorSet = animator as AnimatorSet
+ assertThat(animatorSet.childAnimations).hasSize(2)
+ assertIsBoundsAnimator(animatorSet.childAnimations[0])
+ assertIsAlphaAnimator(animatorSet.childAnimations[1])
+ }
+
+ @Test
+ fun create_doesNotlogJankInstrumentation() = runOnUiThread {
+ val change = TransitionInfo.Change(mock(), leash)
+
+ createAnimator(change)
+
+ verify(interactionJankMonitor, never()).begin(
+ leash, context, animationHandler, CUJ_DESKTOP_MODE_MINIMIZE_WINDOW)
+ }
+
+ @Test
+ fun onAnimationStart_logsJankInstrumentation() = runOnUiThread {
+ val change = TransitionInfo.Change(mock(), leash)
+
+ createAnimator(change).start()
+
+ verify(interactionJankMonitor).begin(
+ leash, context, animationHandler, CUJ_DESKTOP_MODE_MINIMIZE_WINDOW)
+ }
+
+ private fun createAnimator(change: TransitionInfo.Change): Animator =
+ MinimizeAnimator.create(context, change, transaction, {}, interactionJankMonitor,
+ animationHandler)
+
+ private fun assertIsBoundsAnimator(animator: Animator) {
+ assertThat(animator).isInstanceOf(ValueAnimator::class.java)
+ assertThat(animator.duration).isEqualTo(200)
+ assertThat(animator.interpolator).isEqualTo(Interpolators.STANDARD_ACCELERATE)
+ }
+
+ private fun assertIsAlphaAnimator(animator: Animator) {
+ assertThat(animator).isInstanceOf(ValueAnimator::class.java)
+ assertThat(animator.duration).isEqualTo(100)
+ assertThat(animator.interpolator).isEqualTo(Interpolators.LINEAR)
+ }
+}
+
--
GitLab
From 4d3dfb14937619c260a1adfce4bf6db7e90a7935 Mon Sep 17 00:00:00 2001
From: Gustav Sennton
Date: Tue, 18 Feb 2025 13:31:50 +0000
Subject: [PATCH 011/111] Use animHandler for CUJ_DESKTOP_MODE_CLOSE_TASK
The close-animation runs on the animation thread, so we should pass the
animation handler to InteractionJankMonitor.
Bug: 357811393
Test: manual (perfetto)
Flag: NONE jank/logging change
Change-Id: I3882338ce5fa9f94a3c9b40a3dbcff5b82507c88
---
.../Shell/src/com/android/wm/shell/dagger/WMShellModule.java | 5 +++--
.../shell/desktopmode/CloseDesktopTaskTransitionHandler.kt | 5 ++---
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
index 79adea6749aa5..02a080017fa6b 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java
@@ -1075,8 +1075,9 @@ public abstract class WMShellModule {
Context context,
@ShellMainThread ShellExecutor mainExecutor,
@ShellAnimationThread ShellExecutor animExecutor,
- @ShellMainThread Handler handler) {
- return new CloseDesktopTaskTransitionHandler(context, mainExecutor, animExecutor, handler);
+ @ShellAnimationThread Handler animHandler) {
+ return new CloseDesktopTaskTransitionHandler(context, mainExecutor, animExecutor,
+ animHandler);
}
@WMSingleton
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandler.kt
index 1ce093e02a4ab..b22a46edbf3ac 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandler.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/CloseDesktopTaskTransitionHandler.kt
@@ -37,7 +37,6 @@ import com.android.app.animation.Interpolators
import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_CLOSE_TASK
import com.android.internal.jank.InteractionJankMonitor
import com.android.wm.shell.common.ShellExecutor
-import com.android.wm.shell.shared.annotations.ShellMainThread
import com.android.wm.shell.transition.Transitions
import java.util.function.Supplier
@@ -49,7 +48,7 @@ constructor(
private val mainExecutor: ShellExecutor,
private val animExecutor: ShellExecutor,
private val transactionSupplier: Supplier = Supplier { Transaction() },
- @ShellMainThread private val handler: Handler,
+ private val animHandler: Handler,
) : Transitions.TransitionHandler {
private val runningAnimations = mutableMapOf>()
@@ -95,7 +94,7 @@ constructor(
interactionJankMonitor.begin(
lastChangeLeash,
context,
- handler,
+ animHandler,
CUJ_DESKTOP_MODE_CLOSE_TASK,
)
}
--
GitLab
From e710c85e01f9d994c24c92ca0c3b14e718e917b8 Mon Sep 17 00:00:00 2001
From: Shai Barack
Date: Wed, 19 Feb 2025 09:16:47 -0800
Subject: [PATCH 012/111] Reland "Don't fall back to legacy MessageQueue when
Instrumenting"
This reverts commit af846352b51895a270240fbace6e7845b4cf7646.
Reason for revert: fixed underlying issue, see b/397595841
Change-Id: Ie2d6f8b9628e066affbf0a5980173231de191418
Flag: android.os.message_queue_testability
Bug: 112000181
---
.../android/os/CombinedMessageQueue/MessageQueue.java | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/core/java/android/os/CombinedMessageQueue/MessageQueue.java b/core/java/android/os/CombinedMessageQueue/MessageQueue.java
index 8471fcea701d2..4ec2887a96d30 100644
--- a/core/java/android/os/CombinedMessageQueue/MessageQueue.java
+++ b/core/java/android/os/CombinedMessageQueue/MessageQueue.java
@@ -126,7 +126,7 @@ public final class MessageQueue {
MessageQueue(boolean quitAllowed) {
initIsProcessAllowedToUseConcurrent();
- mUseConcurrent = sIsProcessAllowedToUseConcurrent && !isInstrumenting();
+ mUseConcurrent = sIsProcessAllowedToUseConcurrent;
mQuitAllowed = quitAllowed;
mPtr = nativeInit();
}
@@ -201,15 +201,6 @@ public final class MessageQueue {
return;
}
- private static boolean isInstrumenting() {
- final ActivityThread activityThread = ActivityThread.currentActivityThread();
- if (activityThread == null) {
- return false;
- }
- final Instrumentation instrumentation = activityThread.getInstrumentation();
- return instrumentation != null && instrumentation.isInstrumenting();
- }
-
@Override
protected void finalize() throws Throwable {
try {
--
GitLab
From 4c017ba6b682946ba1eeb7f86fe1aeedf4ada884 Mon Sep 17 00:00:00 2001
From: Ahmad Khalil
Date: Wed, 19 Feb 2025 18:07:16 +0000
Subject: [PATCH 013/111] Adding config library with host support
Bug: 397344593
Flag: android.os.vibrator.primitive_composition_absolute_delay
Test: N/A
Change-Id: I8f41cab82978fda15e8828482b219bd48b940bb8
---
AconfigFlags.bp | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index 8b95679f318f5..8bfac03060b54 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -610,6 +610,13 @@ cc_aconfig_library {
vendor_available: true,
}
+java_aconfig_library {
+ name: "android.os.vibrator.flags-aconfig-java-host",
+ aconfig_declarations: "android.os.vibrator.flags-aconfig",
+ host_supported: true,
+ defaults: ["framework-minus-apex-aconfig-java-defaults"],
+}
+
// View
aconfig_declarations {
name: "android.view.flags-aconfig",
--
GitLab
From 14416f7365dbe780812204337bf62c74963dea57 Mon Sep 17 00:00:00 2001
From: Hongwei Wang
Date: Wed, 19 Feb 2025 11:16:34 -0800
Subject: [PATCH 014/111] Switch to PictureInPictureParams#isSameAspectRatio
Switch to PictureInPictureParams#isSameAspectRatio on Shell side, the
same check has been applied in CTS tests.
Flag: EXEMPT bugfix
Bug: 352118806
Test: atest PinnedStackTests
Change-Id: Ie40d69945414e0e9462cb2310b70492a2e7137b4
---
.../android/wm/shell/common/pip/PipBoundsAlgorithm.java | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsAlgorithm.java
index 8e026f04ac311..04e8d8dee520f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsAlgorithm.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipBoundsAlgorithm.java
@@ -24,6 +24,7 @@ import android.content.pm.ActivityInfo;
import android.content.res.Resources;
import android.graphics.Rect;
import android.util.DisplayMetrics;
+import android.util.Rational;
import android.util.Size;
import android.view.Gravity;
@@ -41,9 +42,6 @@ public class PipBoundsAlgorithm {
private static final String TAG = PipBoundsAlgorithm.class.getSimpleName();
private static final float INVALID_SNAP_FRACTION = -1f;
- // The same value (with the same name) is used in Launcher.
- private static final float PIP_ASPECT_RATIO_MISMATCH_THRESHOLD = 0.01f;
-
@NonNull private final PipBoundsState mPipBoundsState;
@NonNull protected final PipDisplayLayoutState mPipDisplayLayoutState;
@NonNull protected final SizeSpecSource mSizeSpecSource;
@@ -223,9 +221,8 @@ public class PipBoundsAlgorithm {
+ " than destination(%s)", sourceRectHint, destinationBounds);
return false;
}
- final float reportedRatio = destinationBounds.width() / (float) destinationBounds.height();
- final float inferredRatio = sourceRectHint.width() / (float) sourceRectHint.height();
- if (Math.abs(reportedRatio - inferredRatio) > PIP_ASPECT_RATIO_MISMATCH_THRESHOLD) {
+ if (!PictureInPictureParams.isSameAspectRatio(sourceRectHint,
+ new Rational(destinationBounds.width(), destinationBounds.height()))) {
ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE,
"isSourceRectHintValidForEnterPip=false, hint(%s) does not match"
+ " destination(%s) aspect ratio", sourceRectHint, destinationBounds);
--
GitLab
From a6374ea45d5252c47a97452e2b9a4d3784558eac Mon Sep 17 00:00:00 2001
From: Yuhan Yang
Date: Fri, 14 Feb 2025 18:26:10 +0000
Subject: [PATCH 015/111] Add autoclick to shortcut features map
Bug: 390460480
Test: verified manually on test devices.
Flag: com.android.server.accessibility.enable_autoclick_indicator
Change-Id: If6710459946ee5db13afd238378c5a38e84811c8
---
.../AccessibilityShortcutController.java | 9 ++++++++-
.../dialog/AccessibilityTargetHelper.java | 14 ++++++++++++++
core/res/res/values/strings.xml | 3 +++
core/res/res/values/symbols.xml | 1 +
4 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
index a27eeb8fdd634..1281a78d4fa23 100644
--- a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
+++ b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java
@@ -97,6 +97,8 @@ public class AccessibilityShortcutController {
new ComponentName("com.android.server.accessibility", "ReduceBrightColors");
public static final ComponentName FONT_SIZE_COMPONENT_NAME =
new ComponentName("com.android.server.accessibility", "FontSize");
+ public static final ComponentName AUTOCLICK_COMPONENT_NAME =
+ new ComponentName("com.android.server.accessibility", "Autoclick");
// The component name for the sub setting of Accessibility button in Accessibility settings
public static final ComponentName ACCESSIBILITY_BUTTON_COMPONENT_NAME =
@@ -163,7 +165,7 @@ public class AccessibilityShortcutController {
getFrameworkShortcutFeaturesMap() {
if (sFrameworkShortcutFeaturesMap == null) {
- Map featuresMap = new ArrayMap<>(4);
+ Map featuresMap = new ArrayMap<>(8);
featuresMap.put(COLOR_INVERSION_COMPONENT_NAME,
new ToggleableFrameworkFeatureInfo(
Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED,
@@ -174,6 +176,11 @@ public class AccessibilityShortcutController {
Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
"1" /* Value to enable */, "0" /* Value to disable */,
R.string.color_correction_feature_name));
+ featuresMap.put(AUTOCLICK_COMPONENT_NAME,
+ new ToggleableFrameworkFeatureInfo(
+ Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED,
+ "1" /* Value to enable */, "0" /* Value to disable */,
+ R.string.autoclick_feature_name));
if (SUPPORT_ONE_HANDED_MODE) {
featuresMap.put(ONE_HANDED_COMPONENT_NAME,
new ToggleableFrameworkFeatureInfo(
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
index b187eb42366f5..6498c53a63e23 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
@@ -17,6 +17,7 @@
package com.android.internal.accessibility.dialog;
import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME;
+import static com.android.internal.accessibility.AccessibilityShortcutController.AUTOCLICK_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.COLOR_INVERSION_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
@@ -214,6 +215,19 @@ public final class AccessibilityTargetHelper {
Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED);
targets.add(colorInversion);
+ // TODO(b/394683600): Update Icon with the autoclick asset.
+ final ToggleAllowListingFeatureTarget autoclick =
+ new ToggleAllowListingFeatureTarget(context,
+ shortcutType,
+ isShortcutContained(context, shortcutType,
+ AUTOCLICK_COMPONENT_NAME.flattenToString()),
+ AUTOCLICK_COMPONENT_NAME.flattenToString(),
+ uid,
+ context.getString(R.string.autoclick_feature_name),
+ context.getDrawable(R.drawable.ic_accessibility_generic),
+ Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED);
+ targets.add(autoclick);
+
if (SUPPORT_ONE_HANDED_MODE) {
final ToggleAllowListingFeatureTarget oneHandedMode =
new ToggleAllowListingFeatureTarget(context,
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index abbba9d1bffad..d4f0e69ad0d46 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4960,6 +4960,9 @@
Hearing devices
+
+ Autoclick
+
Disconnected
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index cc2897a2779e2..ca47587bfe9cd 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3787,6 +3787,7 @@
+
--
GitLab
From 05b077d21a9a7200eb3fe48362cf317f3577d7b6 Mon Sep 17 00:00:00 2001
From: Yifei Zhang
Date: Tue, 11 Feb 2025 09:46:00 +0000
Subject: [PATCH 016/111] HubEndpoint: reject session if no lifecycle cb
- Fix typo
Test: N/A
Flag: EXEMPT bug fix
Bug: 388331996
Change-Id: I6b0aa64e81fd61faca233d57d73d8447d9eae844
---
.../java/android/hardware/contexthub/HubEndpoint.java | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/core/java/android/hardware/contexthub/HubEndpoint.java b/core/java/android/hardware/contexthub/HubEndpoint.java
index b7edef619a675..47ba51d98323f 100644
--- a/core/java/android/hardware/contexthub/HubEndpoint.java
+++ b/core/java/android/hardware/contexthub/HubEndpoint.java
@@ -126,7 +126,16 @@ public class HubEndpoint {
if (sessionExists) {
Log.w(
TAG,
- "onSessionOpenComplete: session already exists, id=" + sessionId);
+ "onSessionOpenRequest: session already exists, id=" + sessionId);
+ }
+
+ if (mLifecycleCallback == null) {
+ Log.w(
+ TAG,
+ "onSessionOpenRequest: "
+ + "failed to open session, no lifecycle callback attached",
+ new Exception());
+ rejectSession(sessionId);
}
if (!sessionExists && mLifecycleCallback != null) {
--
GitLab
From 812d5ec9d59999aecced029451c9a54397c811b8 Mon Sep 17 00:00:00 2001
From: Yifei Zhang
Date: Tue, 11 Feb 2025 10:44:51 +0000
Subject: [PATCH 017/111] contexthub: reject endpoint registration with null cb
- Throw IllegalArgumentException when this happens
- Add @NonNull annotations for IContextHubEndpointCallback usages
Test: build
Flag: EXEMPT bug fix
Bug: 385223561
Change-Id: I5db7666188f576d5f33dada6b7fe836feb7e5427
---
.../contexthub/ContextHubEndpointBroker.java | 27 +++++++++----------
.../contexthub/ContextHubEndpointManager.java | 3 ++-
.../contexthub/ContextHubService.java | 4 +++
3 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java
index 1a29150cd40c4..940bcb4c6ba16 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointBroker.java
@@ -16,6 +16,7 @@
package com.android.server.location.contexthub;
+import android.annotation.NonNull;
import android.app.AppOpsManager;
import android.content.Context;
import android.hardware.contexthub.EndpointInfo;
@@ -64,7 +65,7 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
* Internal interface used to invoke client callbacks.
*/
interface CallbackConsumer {
- void accept(IContextHubEndpointCallback callback) throws RemoteException;
+ void accept(@NonNull IContextHubEndpointCallback callback) throws RemoteException;
}
/** The context of the service. */
@@ -86,7 +87,7 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
private final EndpointInfo mHalEndpointInfo;
/** The remote callback interface for this endpoint. */
- private final IContextHubEndpointCallback mContextHubEndpointCallback;
+ @NonNull private final IContextHubEndpointCallback mContextHubEndpointCallback;
/** True if this endpoint is registered with the service/HAL. */
@GuardedBy("mRegistrationLock")
@@ -158,7 +159,7 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
IEndpointCommunication hubInterface,
ContextHubEndpointManager endpointManager,
EndpointInfo halEndpointInfo,
- IContextHubEndpointCallback callback,
+ @NonNull IContextHubEndpointCallback callback,
String packageName,
String attributionTag,
ContextHubTransactionManager transactionManager) {
@@ -419,9 +420,7 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
}
/* package */ void attachDeathRecipient() throws RemoteException {
- if (mContextHubEndpointCallback != null) {
- mContextHubEndpointCallback.asBinder().linkToDeath(this, 0 /* flags */);
- }
+ mContextHubEndpointCallback.asBinder().linkToDeath(this, 0 /* flags */);
}
/* package */ void onEndpointSessionOpenRequest(
@@ -664,15 +663,13 @@ public class ContextHubEndpointBroker extends IContextHubEndpoint.Stub
* @return false if the callback threw a RemoteException
*/
private boolean invokeCallback(CallbackConsumer consumer) {
- if (mContextHubEndpointCallback != null) {
- acquireWakeLock();
- try {
- consumer.accept(mContextHubEndpointCallback);
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException while calling endpoint callback", e);
- releaseWakeLock();
- return false;
- }
+ acquireWakeLock();
+ try {
+ consumer.accept(mContextHubEndpointCallback);
+ } catch (RemoteException e) {
+ Log.e(TAG, "RemoteException while calling endpoint callback", e);
+ releaseWakeLock();
+ return false;
}
return true;
}
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java
index 30bb8f3fa188a..8ab581e1fb7ae 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java
@@ -17,6 +17,7 @@
package com.android.server.location.contexthub;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.content.Context;
import android.hardware.contexthub.ContextHubInfo;
import android.hardware.contexthub.EndpointInfo;
@@ -240,7 +241,7 @@ import java.util.function.Consumer;
*/
/* package */ IContextHubEndpoint registerEndpoint(
HubEndpointInfo pendingEndpointInfo,
- IContextHubEndpointCallback callback,
+ @NonNull IContextHubEndpointCallback callback,
String packageName,
String attributionTag)
throws RemoteException {
diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubService.java b/services/core/java/com/android/server/location/contexthub/ContextHubService.java
index bf7351cb11dba..2c0c55bd8df4f 100644
--- a/services/core/java/com/android/server/location/contexthub/ContextHubService.java
+++ b/services/core/java/com/android/server/location/contexthub/ContextHubService.java
@@ -792,6 +792,10 @@ public class ContextHubService extends IContextHubService.Stub {
Log.e(TAG, "Endpoint manager failed to initialize");
throw new UnsupportedOperationException("Endpoint registration is not supported");
}
+ if (callback == null) {
+ Log.e(TAG, "Endpoint callback is invalid");
+ throw new IllegalArgumentException("registerEndpoint must have a non-null callback");
+ }
return mEndpointManager.registerEndpoint(
pendingHubEndpointInfo, callback, packageName, attributionTag);
}
--
GitLab
From 53f64acf1d48abda0326d382672615fb34c5679e Mon Sep 17 00:00:00 2001
From: Mady Mellor
Date: Fri, 7 Feb 2025 14:19:54 -0800
Subject: [PATCH 018/111] Add a flag for unifying taskview listener
Flag: com.android.wm.shell.enable_bubble_task_view_listener
Test: treehugger
Bug: 272102927
Change-Id: Iacb6150cb57c998e9f8583d1a128713dec4e3ec9
---
libs/WindowManager/Shell/aconfig/multitasking.aconfig | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/libs/WindowManager/Shell/aconfig/multitasking.aconfig b/libs/WindowManager/Shell/aconfig/multitasking.aconfig
index a08f88a5b937d..1e72d64397d73 100644
--- a/libs/WindowManager/Shell/aconfig/multitasking.aconfig
+++ b/libs/WindowManager/Shell/aconfig/multitasking.aconfig
@@ -184,3 +184,13 @@ flag {
description: "Try out bubble bar on phones"
bug: "394869612"
}
+
+flag {
+ name: "enable_bubble_task_view_listener"
+ namespace: "multitasking"
+ description: "Use the same taskview listener for bubble bar and floating"
+ bug: "272102927"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
--
GitLab
From 95ae381d08bf603d2f6b89df723f23da97aa0de2 Mon Sep 17 00:00:00 2001
From: Adam Bookatz
Date: Wed, 19 Feb 2025 15:08:20 -0800
Subject: [PATCH 019/111] Fix canAddPrivateProfile @RequiresPermission
The @RequiresPermission is marked as conditional, but it isn't conditional.
Change-Id: Icd2bb44f19176c935e86c6f43c21d7a808810a7d
Test: N/A, just documentation
Flag: EXEMPT documentation only
---
core/api/test-current.txt | 2 +-
core/java/android/os/UserManager.java | 3 +--
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 89b377314887b..4ad6befd396e3 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -2585,7 +2585,7 @@ package android.os {
}
public class UserManager {
- method @FlaggedApi("android.os.allow_private_profile") @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}, conditional=true) public boolean canAddPrivateProfile();
+ method @FlaggedApi("android.os.allow_private_profile") @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean canAddPrivateProfile();
method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public android.content.pm.UserInfo createProfileForUser(@Nullable String, @NonNull String, int, int, @Nullable String[]);
method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public android.content.pm.UserInfo createRestrictedProfile(@Nullable String);
method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public android.content.pm.UserInfo createUser(@Nullable String, @NonNull String, int);
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 33bf4a29ecc6c..767019d977582 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -3324,8 +3324,7 @@ public class UserManager {
@FlaggedApi(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE)
@RequiresPermission(anyOf = {
Manifest.permission.MANAGE_USERS,
- Manifest.permission.CREATE_USERS},
- conditional = true)
+ Manifest.permission.CREATE_USERS})
@UserHandleAware
public boolean canAddPrivateProfile() {
if (!android.multiuser.Flags.enablePrivateSpaceFeatures()) return false;
--
GitLab
From 907dd476de2a80cddbc30c6d98ca6d77d482ae33 Mon Sep 17 00:00:00 2001
From: Ats Jenk
Date: Wed, 19 Feb 2025 13:48:58 -0800
Subject: [PATCH 020/111] Fix hotseat visibility after dragging task to bubble
Desktop drag handler sends a transition at the beginning to transiently
launch home task. This transition is ignored by the home transition
observer and we do not update home visibility in this case. As this
would otherwise cause flickers with launcher UI elements during drag.
When the desktop drag ends in a bubble drag zone, we send a new
transition to convert the task to a bubble. If the task was the only
task running on home, we now will have home showing and the bubbled task
showing. But since home was made visible by the drag start transition,
home task is not part of the second transition changes. It is already
considered visible.
This broke the existing logic with handling home visibility as we were
expecting the second transition to include information about the home
task.
As a fix, keep track of the desired home visibility state when desktop
drag starts. And if the subsequent transition to convert the task to
bubble does not contain information about home, apply the home
visibility that was calculated at the start of drag.
If the convert to bubble transition does include home task and it
triggers a change to home visibility, apply this instead and discard the
home visibility pending update from the start of the drag.
This second case is required in case there are two tasks running on top
of home. When desktop drag starts, home will be brought to front
transiently. And when drag ends with a transition to convert the dragged
task to bubble, the transition changes will include a change to move the
home task behind the second fullscreen task. We need to honor this case
and send an update that home is not visible.
Bug: 396475362
Flag: com.android.wm.shell.enable_bubble_to_fullscreen
Test: atest HomeTransitionObserver
Test: manual, open an app, drag it to a bubble, check that hotseat is
shown in launcher
Change-Id: I197ac9b96c4312f3da12bdad21b5844b414847c2
---
.../transition/HomeTransitionObserver.java | 78 ++++++++++++++---
.../HomeTransitionObserverTest.java | 84 +++++++++++++++++++
2 files changed, 150 insertions(+), 12 deletions(-)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/HomeTransitionObserver.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/HomeTransitionObserver.java
index 1917996d48fb7..938885cc1684d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/HomeTransitionObserver.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/HomeTransitionObserver.java
@@ -21,6 +21,7 @@ import static android.view.Display.DEFAULT_DISPLAY;
import static android.window.TransitionInfo.FLAG_BACK_GESTURE_ANIMATED;
import static com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP;
+import static com.android.wm.shell.transition.Transitions.TRANSIT_CONVERT_TO_BUBBLE;
import static com.android.wm.shell.transition.Transitions.TransitionObserver;
import android.annotation.NonNull;
@@ -35,6 +36,7 @@ import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SingleInstanceRemoteListener;
import com.android.wm.shell.shared.IHomeTransitionListener;
import com.android.wm.shell.shared.TransitionUtil;
+import com.android.wm.shell.shared.bubbles.BubbleAnythingFlagHelper;
/**
* The {@link TransitionObserver} that observes for transitions involving the home
@@ -48,6 +50,8 @@ public class HomeTransitionObserver implements TransitionObserver,
private @NonNull final Context mContext;
private @NonNull final ShellExecutor mMainExecutor;
+ private Boolean mPendingHomeVisibilityUpdate;
+
public HomeTransitionObserver(@NonNull Context context,
@NonNull ShellExecutor mainExecutor) {
mContext = context;
@@ -59,28 +63,78 @@ public class HomeTransitionObserver implements TransitionObserver,
@NonNull TransitionInfo info,
@NonNull SurfaceControl.Transaction startTransaction,
@NonNull SurfaceControl.Transaction finishTransaction) {
+ if (BubbleAnythingFlagHelper.enableBubbleToFullscreen()) {
+ handleTransitionReadyWithBubbleAnything(info);
+ } else {
+ handleTransitionReady(info);
+ }
+ }
+
+ private void handleTransitionReady(@NonNull TransitionInfo info) {
for (TransitionInfo.Change change : info.getChanges()) {
final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
- if (info.getType() == TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP
- || taskInfo == null
+ if (taskInfo == null
+ || info.getType() == TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP
|| taskInfo.displayId != DEFAULT_DISPLAY
|| taskInfo.taskId == -1
|| !taskInfo.isRunning) {
continue;
}
+ Boolean homeVisibilityUpdate = getHomeVisibilityUpdate(info, change, taskInfo);
+ if (homeVisibilityUpdate != null) {
+ notifyHomeVisibilityChanged(homeVisibilityUpdate);
+ }
+ }
+ }
+
+ private void handleTransitionReadyWithBubbleAnything(@NonNull TransitionInfo info) {
+ Boolean homeVisibilityUpdate = null;
+ for (TransitionInfo.Change change : info.getChanges()) {
+ final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
+ if (taskInfo == null
+ || taskInfo.displayId != DEFAULT_DISPLAY
+ || taskInfo.taskId == -1
+ || !taskInfo.isRunning) {
+ continue;
+ }
+
+ Boolean update = getHomeVisibilityUpdate(info, change, taskInfo);
+ if (update != null) {
+ homeVisibilityUpdate = update;
+ }
+ }
+
+ if (info.getType() == TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP) {
+ // Do not apply at the start of desktop drag as that updates launcher UI visibility.
+ // Store the value and apply with a next transition if needed.
+ mPendingHomeVisibilityUpdate = homeVisibilityUpdate;
+ return;
+ }
+
+ if (info.getType() == TRANSIT_CONVERT_TO_BUBBLE && homeVisibilityUpdate == null) {
+ // We are converting to bubble and we did not get a change to home visibility in this
+ // transition. Apply the value from start of drag.
+ homeVisibilityUpdate = mPendingHomeVisibilityUpdate;
+ }
+ if (homeVisibilityUpdate != null) {
+ mPendingHomeVisibilityUpdate = null;
+ notifyHomeVisibilityChanged(homeVisibilityUpdate);
+ }
+ }
- final int mode = change.getMode();
- final boolean isBackGesture = change.hasFlags(FLAG_BACK_GESTURE_ANIMATED);
- if (taskInfo.getActivityType() == ACTIVITY_TYPE_HOME) {
- final boolean gestureToHomeTransition = isBackGesture
- && TransitionUtil.isClosingType(info.getType());
- if (gestureToHomeTransition || TransitionUtil.isClosingMode(mode)
- || (!isBackGesture && TransitionUtil.isOpeningMode(mode))) {
- notifyHomeVisibilityChanged(gestureToHomeTransition
- || TransitionUtil.isOpeningType(mode));
- }
+ private Boolean getHomeVisibilityUpdate(TransitionInfo info,
+ TransitionInfo.Change change, ActivityManager.RunningTaskInfo taskInfo) {
+ final int mode = change.getMode();
+ final boolean isBackGesture = change.hasFlags(FLAG_BACK_GESTURE_ANIMATED);
+ if (taskInfo.getActivityType() == ACTIVITY_TYPE_HOME) {
+ final boolean gestureToHomeTransition = isBackGesture
+ && TransitionUtil.isClosingType(info.getType());
+ if (gestureToHomeTransition || TransitionUtil.isClosingMode(mode)
+ || (!isBackGesture && TransitionUtil.isOpeningMode(mode))) {
+ return gestureToHomeTransition || TransitionUtil.isOpeningType(mode);
}
}
+ return null;
}
@Override
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/HomeTransitionObserverTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/HomeTransitionObserverTest.java
index 6f28e656d060d..3099b0f5cf66e 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/HomeTransitionObserverTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/HomeTransitionObserverTest.java
@@ -17,36 +17,44 @@
package com.android.wm.shell.transition;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.view.WindowManager.TRANSIT_CHANGE;
import static android.view.WindowManager.TRANSIT_OPEN;
import static android.view.WindowManager.TRANSIT_PREPARE_BACK_NAVIGATION;
import static android.view.WindowManager.TRANSIT_TO_BACK;
+import static android.view.WindowManager.TRANSIT_TO_FRONT;
import static android.window.TransitionInfo.FLAG_BACK_GESTURE_ANIMATED;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.wm.shell.desktopmode.DesktopModeTransitionTypes.TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP;
+import static com.android.wm.shell.transition.Transitions.TRANSIT_CONVERT_TO_BUBBLE;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.when;
import android.app.ActivityManager;
import android.app.WindowConfiguration.ActivityType;
import android.content.Context;
+import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
+import android.platform.test.annotations.EnableFlags;
import android.view.SurfaceControl;
import android.window.TransitionInfo;
import android.window.TransitionInfo.TransitionMode;
+import android.window.WindowContainerToken;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
+import com.android.wm.shell.Flags;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestShellExecutor;
@@ -187,6 +195,72 @@ public class HomeTransitionObserverTest extends ShellTestCase {
verify(mListener, times(0)).onHomeVisibilityChanged(anyBoolean());
}
+ @Test
+ @EnableFlags({Flags.FLAG_ENABLE_BUBBLE_TO_FULLSCREEN, Flags.FLAG_ENABLE_CREATE_ANY_BUBBLE})
+ public void testDragTaskToBubbleOverHome_notifiesHomeIsVisible() throws RemoteException {
+ ActivityManager.RunningTaskInfo homeTask = createTaskInfo(1, ACTIVITY_TYPE_HOME);
+ ActivityManager.RunningTaskInfo bubbleTask = createTaskInfo(2, ACTIVITY_TYPE_STANDARD);
+
+ TransitionInfo startDragTransition =
+ new TransitionInfoBuilder(TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP)
+ .addChange(TRANSIT_TO_FRONT, homeTask)
+ .addChange(TRANSIT_TO_BACK, bubbleTask)
+ .build();
+
+ // Start drag to desktop which brings home to front
+ mHomeTransitionObserver.onTransitionReady(new Binder(), startDragTransition,
+ MockTransactionPool.create(), MockTransactionPool.create());
+ // Does not notify home visibility yet
+ verify(mListener, never()).onHomeVisibilityChanged(anyBoolean());
+
+ TransitionInfo convertToBubbleTransition =
+ new TransitionInfoBuilder(TRANSIT_CONVERT_TO_BUBBLE)
+ .addChange(TRANSIT_TO_FRONT, bubbleTask)
+ .build();
+
+ // Convert to bubble. Transition does not include changes for home task
+ mHomeTransitionObserver.onTransitionReady(new Binder(), convertToBubbleTransition,
+ MockTransactionPool.create(), MockTransactionPool.create());
+
+ // Notifies home visibility change that was pending from the start of drag
+ verify(mListener).onHomeVisibilityChanged(true);
+ }
+
+ @Test
+ @EnableFlags({Flags.FLAG_ENABLE_BUBBLE_TO_FULLSCREEN, Flags.FLAG_ENABLE_CREATE_ANY_BUBBLE})
+ public void testDragTaskToBubbleOverOtherTask_notifiesHomeIsNotVisible()
+ throws RemoteException {
+ ActivityManager.RunningTaskInfo homeTask = createTaskInfo(1, ACTIVITY_TYPE_HOME);
+ ActivityManager.RunningTaskInfo bubbleTask = createTaskInfo(2, ACTIVITY_TYPE_STANDARD);
+ ActivityManager.RunningTaskInfo otherTask = createTaskInfo(3, ACTIVITY_TYPE_STANDARD);
+
+ TransitionInfo startDragTransition =
+ new TransitionInfoBuilder(TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP)
+ .addChange(TRANSIT_TO_FRONT, homeTask)
+ .addChange(TRANSIT_TO_BACK, bubbleTask)
+ .build();
+
+ // Start drag to desktop which brings home to front
+ mHomeTransitionObserver.onTransitionReady(new Binder(), startDragTransition,
+ MockTransactionPool.create(), MockTransactionPool.create());
+ // Does not notify home visibility yet
+ verify(mListener, never()).onHomeVisibilityChanged(anyBoolean());
+
+ TransitionInfo convertToBubbleTransition =
+ new TransitionInfoBuilder(TRANSIT_CONVERT_TO_BUBBLE)
+ .addChange(TRANSIT_TO_FRONT, bubbleTask)
+ .addChange(TRANSIT_TO_FRONT, otherTask)
+ .addChange(TRANSIT_TO_BACK, homeTask)
+ .build();
+
+ // Convert to bubble. Transition includes home task to back which updates home visibility
+ mHomeTransitionObserver.onTransitionReady(new Binder(), convertToBubbleTransition,
+ MockTransactionPool.create(), MockTransactionPool.create());
+
+ // Notifies home visibility change due to home moving to back in the second transition
+ verify(mListener).onHomeVisibilityChanged(false);
+ }
+
@Test
public void testHomeActivityWithBackGestureNotifiesHomeIsVisibleAfterClose()
throws RemoteException {
@@ -227,4 +301,14 @@ public class HomeTransitionObserverTest extends ShellTestCase {
when(change.getMode()).thenReturn(mode);
taskInfo.isRunning = isRunning;
}
+
+ private static ActivityManager.RunningTaskInfo createTaskInfo(int taskId, int activityType) {
+ ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo();
+ taskInfo.taskId = taskId;
+ taskInfo.topActivityType = activityType;
+ taskInfo.configuration.windowConfiguration.setActivityType(activityType);
+ taskInfo.token = mock(WindowContainerToken.class);
+ taskInfo.isRunning = true;
+ return taskInfo;
+ }
}
--
GitLab
From 567e8a795366388863a8e0d72412c110de9aa141 Mon Sep 17 00:00:00 2001
From: Mady Mellor
Date: Fri, 7 Feb 2025 14:22:02 -0800
Subject: [PATCH 021/111] Use BubbleTaskViewListener for floating bubbles
(behind a flag)
Flag: com.android.wm.shell.enable_bubble_task_view_listener
Test: manual - enable the flag and use floating bubbles, try basic
interactions - expand, switch, dismiss, hit back
Bug: 272102927
Change-Id: Ide2298ce36c91eabb8603354ebe874a932ec1b82
---
.../wm/shell/bubbles/BubbleExpandedView.java | 47 +++++++++++++++++--
1 file changed, 42 insertions(+), 5 deletions(-)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
index 3f607a9c52ef3..f9fef9b45c398 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
@@ -197,6 +197,8 @@ public class BubbleExpandedView extends LinearLayout {
*/
private final FrameLayout mExpandedViewContainer = new FrameLayout(getContext());
+ private TaskView.Listener mCurrentTaskViewListener;
+
private final TaskView.Listener mTaskViewListener = new TaskView.Listener() {
private boolean mInitialized = false;
private boolean mDestroyed = false;
@@ -453,7 +455,34 @@ public class BubbleExpandedView extends LinearLayout {
mTaskView = bubbleTaskView.getTaskView();
// reset the insets that might left after TaskView is shown in BubbleBarExpandedView
mTaskView.setCaptionInsets(null);
- bubbleTaskView.setDelegateListener(mTaskViewListener);
+ if (Flags.enableBubbleTaskViewListener()) {
+ mCurrentTaskViewListener = new BubbleTaskViewListener(mContext, bubbleTaskView,
+ /* viewParent= */ this, expandedViewManager,
+ new BubbleTaskViewListener.Callback() {
+ @Override
+ public void onTaskCreated() {
+ setContentVisibility(true);
+ }
+
+ @Override
+ public void onContentVisibilityChanged(boolean visible) {
+ setContentVisibility(visible);
+ }
+
+ @Override
+ public void onBackPressed() {
+ mStackView.onBackPressed();
+ }
+
+ @Override
+ public void onTaskRemovalStarted() {
+ // nothing to do / handled in listener.
+ }
+ });
+ } else {
+ mCurrentTaskViewListener = mTaskViewListener;
+ bubbleTaskView.setDelegateListener(mCurrentTaskViewListener);
+ }
// set a fixed width so it is not recalculated as part of a rotation. the width will be
// updated manually after the rotation.
@@ -464,9 +493,12 @@ public class BubbleExpandedView extends LinearLayout {
}
mExpandedViewContainer.addView(mTaskView, lp);
bringChildToFront(mTaskView);
- if (bubbleTaskView.isCreated()) {
- mTaskViewListener.onTaskCreated(
- bubbleTaskView.getTaskId(), bubbleTaskView.getComponentName());
+
+ if (!Flags.enableBubbleTaskViewListener()) {
+ if (bubbleTaskView.isCreated()) {
+ mCurrentTaskViewListener.onTaskCreated(
+ bubbleTaskView.getTaskId(), bubbleTaskView.getComponentName());
+ }
}
}
}
@@ -897,7 +929,12 @@ public class BubbleExpandedView extends LinearLayout {
Log.w(TAG, "Stack is null for bubble: " + bubble);
return;
}
- boolean isNew = mBubble == null || didBackingContentChange(bubble);
+ boolean isNew;
+ if (mCurrentTaskViewListener instanceof BubbleTaskViewListener) {
+ isNew = ((BubbleTaskViewListener) mCurrentTaskViewListener).setBubble(bubble);
+ } else {
+ isNew = mBubble == null || didBackingContentChange(bubble);
+ }
boolean isUpdate = bubble != null && mBubble != null
&& bubble.getKey().equals(mBubble.getKey());
ProtoLog.d(WM_SHELL_BUBBLES, "BubbleExpandedView - update bubble=%s; isNew=%b; isUpdate=%b",
--
GitLab
From 7918518f4ee449249db1c13f850e0fb42e3f3269 Mon Sep 17 00:00:00 2001
From: Ben Lin
Date: Fri, 14 Feb 2025 16:03:25 -0800
Subject: [PATCH 022/111] Add `enable_projected_display_desktop_mode` flag.
Bug: 384568161
Change-Id: I48325a1d51228b29785977edd7da9fd44ff1fe14
Test: m
Flag: com.android.window.flags.enable_projected_display_desktop_mode
---
.../android/window/flags/lse_desktop_experience.aconfig | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/core/java/android/window/flags/lse_desktop_experience.aconfig b/core/java/android/window/flags/lse_desktop_experience.aconfig
index 8265d2523d6f1..96fb001211a48 100644
--- a/core/java/android/window/flags/lse_desktop_experience.aconfig
+++ b/core/java/android/window/flags/lse_desktop_experience.aconfig
@@ -778,3 +778,10 @@ flag {
description: "Show recent apps in the taskbar overflow."
bug: "368119679"
}
+
+flag {
+ name: "enable_projected_display_desktop_mode"
+ namespace: "lse_desktop_experience"
+ description: "Enable Desktop Mode on Projected Mode devices but constrained to the external display."
+ bug: "384568161"
+}
\ No newline at end of file
--
GitLab
From 9b9999a025017f2b8d02b5719fdd8fcc464bf31e Mon Sep 17 00:00:00 2001
From: Chandru S
Date: Thu, 20 Feb 2025 04:55:39 +0000
Subject: [PATCH 023/111] Fix race condition between app launch animation and
shade expansion
Whenever an app is launched from shade, ActivityTransitionAnimator#onTransitionAnimationStart sets blursDisabledForAppLaunch to true
This is reset to false when ActivityTransitionAnimator#onTransitionAnimationEnd is invoked.
When ActivityTransitionAnimator#onTransitionAnimationEnd is invoked before shadeExpansion becomes 0, a non-zero blur radius is computed and applied, this causes a one frame flicker when we launch an app from shade on an unlocked device.
Flag: com.android.systemui.bouncer_ui_revamp
Test: verified manually
Bug: 396054791
Change-Id: I35e33fc0200e9cd176fc9c622e826dd8765d2e2e
---
.../NotificationShadeDepthController.kt | 39 ++++++++++++++++++-
1 file changed, 37 insertions(+), 2 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
index 6aa2fe29e768b..3db004848d221 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt
@@ -110,6 +110,10 @@ constructor(
private var prevTimestamp: Long = -1
private var prevShadeDirection = 0
private var prevShadeVelocity = 0f
+ // tracks whether app launch transition is in progress. This involves two independent factors
+ // that control blur, shade expansion and app launch animation from outside sysui.
+ // They can complete out of order, this flag will be reset by the animation that finishes later.
+ private var appLaunchTransitionIsInProgress = false
// Only for dumpsys
private var lastAppliedBlur = 0
@@ -158,6 +162,18 @@ constructor(
if (field == value) {
return
}
+ // Set this to true now, this will be reset when the next shade expansion finishes or
+ // when the app launch finishes, whichever happens later.
+ if (value) {
+ appLaunchTransitionIsInProgress = true
+ } else {
+ // App was launching and now it has finished launching
+ if (shadeExpansion == 0.0f) {
+ // this means shade expansion finished before app launch was done.
+ // reset the flag here
+ appLaunchTransitionIsInProgress = false
+ }
+ }
field = value
scheduleUpdate()
@@ -172,6 +188,12 @@ constructor(
shadeAnimation.animateTo(0)
shadeAnimation.finishIfRunning()
}
+ @Deprecated(
+ message =
+ "This might get reset to false before shade expansion is fully done, " +
+ "consider using areBlursDisabledForAppLaunch"
+ )
+ get() = field
private var zoomOutCalculatedFromShadeRadius: Float = 0.0f
@@ -183,6 +205,11 @@ constructor(
scheduleUpdate()
}
+ private val areBlursDisabledForAppLaunch: Boolean
+ get() =
+ blursDisabledForAppLaunch ||
+ (Flags.bouncerUiRevamp() && appLaunchTransitionIsInProgress)
+
/** Force stop blur effect when necessary. */
private var scrimsVisible: Boolean = false
set(value) {
@@ -221,7 +248,7 @@ constructor(
combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(transitionToFullShadeProgress))
var shadeRadius = max(combinedBlur, wakeAndUnlockBlurRadius)
- if (blursDisabledForAppLaunch || blursDisabledForUnlock) {
+ if (areBlursDisabledForAppLaunch || blursDisabledForUnlock) {
shadeRadius = 0f
}
@@ -259,7 +286,7 @@ constructor(
private val shouldBlurBeOpaque: Boolean
get() =
if (Flags.notificationShadeBlur()) false
- else scrimsVisible && !blursDisabledForAppLaunch
+ else scrimsVisible && !areBlursDisabledForAppLaunch
/** Callback that updates the window blur value and is called only once per frame. */
@VisibleForTesting
@@ -442,6 +469,13 @@ constructor(
val shadeDirection = sign(diff).toInt()
val shadeVelocity =
MathUtils.constrain(VELOCITY_SCALE * diff / deltaTime, MIN_VELOCITY, MAX_VELOCITY)
+ if (expansion == 0.0f && appLaunchTransitionIsInProgress && !blursDisabledForAppLaunch) {
+ // Shade expansion finished but the app launch is already done, then this should mark
+ // the transition as done.
+ Log.d(TAG, "appLaunchTransitionIsInProgress is now false from shade expansion event")
+ appLaunchTransitionIsInProgress = false
+ }
+
updateShadeAnimationBlur(expansion, tracking, shadeVelocity, shadeDirection)
prevShadeDirection = shadeDirection
@@ -553,6 +587,7 @@ constructor(
it.println("brightnessMirrorRadius: ${brightnessMirrorSpring.radius}")
it.println("wakeAndUnlockBlur: $wakeAndUnlockBlurRadius")
it.println("blursDisabledForAppLaunch: $blursDisabledForAppLaunch")
+ it.println("appLaunchTransitionIsInProgress: $appLaunchTransitionIsInProgress")
it.println("qsPanelExpansion: $qsPanelExpansion")
it.println("transitionToFullShadeProgress: $transitionToFullShadeProgress")
it.println("lastAppliedBlur: $lastAppliedBlur")
--
GitLab
From 8951b6a57ed5279c1dd9ba57d1d8cb7c85c61a8d Mon Sep 17 00:00:00 2001
From: amehfooz
Date: Thu, 20 Feb 2025 05:42:42 +0000
Subject: [PATCH 024/111] [SB][Chips] Update OngoingActivityChipsViewModelTest
This CL updats OngoingActivityChipsViewModelTest to use helper methods
to make the tests pass when StatusBarChipsModernization is enabled.
Bug: 372657935
Flag: com.android.systemui.status_bar_chips_modernization
Test: atest OngoingActivityChipsViewModelTest
Change-Id: Ic4b8803f7d682256f638e39300fa3126176080c6
---
.../OngoingActivityChipsViewModelTest.kt | 75 ++++++++-----------
1 file changed, 32 insertions(+), 43 deletions(-)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModelTest.kt
index 626dcd5b0864d..719924c865fd9 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/chips/ui/viewmodel/OngoingActivityChipsViewModelTest.kt
@@ -22,15 +22,18 @@ import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.Expandable
import com.android.systemui.common.shared.model.Icon
-import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.Kosmos
+import com.android.systemui.kosmos.collectLastValue
+import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
+import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.mediaprojection.data.model.MediaProjectionState
import com.android.systemui.mediaprojection.data.repository.fakeMediaProjectionRepository
import com.android.systemui.mediaprojection.taskswitcher.FakeActivityTaskManager.Companion.createTask
@@ -48,16 +51,13 @@ import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.statusbar.phone.mockSystemUIDialogFactory
import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
-import com.android.systemui.statusbar.phone.ongoingcall.data.repository.ongoingCallRepository
-import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel
-import com.android.systemui.statusbar.phone.ongoingcall.shared.model.inCallModel
+import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallTestHelper.addOngoingCallState
+import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallTestHelper.removeOngoingCallState
import com.android.systemui.testKosmos
import com.android.systemui.util.time.fakeSystemClock
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -72,15 +72,14 @@ import org.mockito.kotlin.whenever
/** Tests for [OngoingActivityChipsViewModel] when the [StatusBarNotifChips] flag is disabled. */
@SmallTest
@RunWith(AndroidJUnit4::class)
+@EnableFlags(StatusBarChipsModernization.FLAG_NAME)
@DisableFlags(StatusBarNotifChips.FLAG_NAME)
class OngoingActivityChipsViewModelTest : SysuiTestCase() {
- private val kosmos = testKosmos()
- private val testScope = kosmos.testScope
+ private val kosmos = testKosmos().useUnconfinedTestDispatcher()
private val systemClock = kosmos.fakeSystemClock
private val screenRecordState = kosmos.screenRecordRepository.screenRecordState
private val mediaProjectionState = kosmos.fakeMediaProjectionRepository.mediaProjectionState
- private val callRepo = kosmos.ongoingCallRepository
private val mockSystemUIDialog = mock()
private val chipBackgroundView = mock()
@@ -96,7 +95,7 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
private val mockExpandable: Expandable =
mock().apply { whenever(dialogTransitionController(any())).thenReturn(mock()) }
- private val underTest = kosmos.ongoingActivityChipsViewModel
+ private val Kosmos.underTest by Kosmos.Fixture { ongoingActivityChipsViewModel }
@Before
fun setUp() {
@@ -111,10 +110,10 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
@Test
fun primaryChip_allHidden_hidden() =
- testScope.runTest {
+ kosmos.runTest {
screenRecordState.value = ScreenRecordModel.DoingNothing
mediaProjectionState.value = MediaProjectionState.NotProjecting
- callRepo.setOngoingCallState(OngoingCallModel.NoCall)
+ removeOngoingCallState("testKey")
val latest by collectLastValue(underTest.primaryChip)
@@ -123,10 +122,10 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
@Test
fun primaryChip_screenRecordShow_restHidden_screenRecordShown() =
- testScope.runTest {
+ kosmos.runTest {
screenRecordState.value = ScreenRecordModel.Recording
mediaProjectionState.value = MediaProjectionState.NotProjecting
- callRepo.setOngoingCallState(OngoingCallModel.NoCall)
+ removeOngoingCallState("testKey")
val latest by collectLastValue(underTest.primaryChip)
@@ -135,10 +134,10 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
@Test
fun primaryChip_screenRecordShowAndCallShow_screenRecordShown() =
- testScope.runTest {
+ kosmos.runTest {
screenRecordState.value = ScreenRecordModel.Recording
- callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
+ addOngoingCallState()
val latest by collectLastValue(underTest.primaryChip)
@@ -147,11 +146,11 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
@Test
fun primaryChip_screenRecordShowAndShareToAppShow_screenRecordShown() =
- testScope.runTest {
+ kosmos.runTest {
screenRecordState.value = ScreenRecordModel.Recording
mediaProjectionState.value =
MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE)
- callRepo.setOngoingCallState(OngoingCallModel.NoCall)
+ removeOngoingCallState("testKey")
val latest by collectLastValue(underTest.primaryChip)
@@ -160,11 +159,11 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
@Test
fun primaryChip_shareToAppShowAndCallShow_shareToAppShown() =
- testScope.runTest {
+ kosmos.runTest {
screenRecordState.value = ScreenRecordModel.DoingNothing
mediaProjectionState.value =
MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE)
- callRepo.setOngoingCallState(inCallModel(startTimeMs = 34))
+ addOngoingCallState()
val latest by collectLastValue(underTest.primaryChip)
@@ -173,15 +172,13 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
@Test
fun primaryChip_screenRecordAndShareToAppAndCastToOtherHideAndCallShown_callShown() =
- testScope.runTest {
+ kosmos.runTest {
val notificationKey = "call"
screenRecordState.value = ScreenRecordModel.DoingNothing
// MediaProjection covers both share-to-app and cast-to-other-device
mediaProjectionState.value = MediaProjectionState.NotProjecting
- callRepo.setOngoingCallState(
- inCallModel(startTimeMs = 34, notificationKey = notificationKey)
- )
+ addOngoingCallState(key = notificationKey)
val latest by collectLastValue(underTest.primaryChip)
@@ -190,12 +187,10 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
@Test
fun primaryChip_higherPriorityChipAdded_lowerPriorityChipReplaced() =
- testScope.runTest {
+ kosmos.runTest {
// Start with just the lowest priority chip shown
val callNotificationKey = "call"
- callRepo.setOngoingCallState(
- inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
- )
+ addOngoingCallState(key = callNotificationKey)
// And everything else hidden
mediaProjectionState.value = MediaProjectionState.NotProjecting
screenRecordState.value = ScreenRecordModel.DoingNothing
@@ -224,15 +219,13 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
@Test
fun primaryChip_highestPriorityChipRemoved_showsNextPriorityChip() =
- testScope.runTest {
+ kosmos.runTest {
// WHEN all chips are active
screenRecordState.value = ScreenRecordModel.Recording
mediaProjectionState.value =
MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE)
val callNotificationKey = "call"
- callRepo.setOngoingCallState(
- inCallModel(startTimeMs = 34, notificationKey = callNotificationKey)
- )
+ addOngoingCallState(key = callNotificationKey)
val latest by collectLastValue(underTest.primaryChip)
@@ -255,17 +248,15 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
/** Regression test for b/347726238. */
@Test
fun primaryChip_timerDoesNotResetAfterSubscribersRestart() =
- testScope.runTest {
+ kosmos.runTest {
var latest: OngoingActivityChipModel? = null
- val job1 = underTest.primaryChip.onEach { latest = it }.launchIn(this)
+ val job1 = underTest.primaryChip.onEach { latest = it }.launchIn(kosmos.testScope)
// Start a chip with a timer
systemClock.setElapsedRealtime(1234)
screenRecordState.value = ScreenRecordModel.Recording
- runCurrent()
-
assertThat((latest as OngoingActivityChipModel.Active.Timer).startTimeMs)
.isEqualTo(1234)
@@ -276,9 +267,7 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
systemClock.setElapsedRealtime(5678)
// WHEN we re-subscribe to the chip flow
- val job2 = underTest.primaryChip.onEach { latest = it }.launchIn(this)
-
- runCurrent()
+ val job2 = underTest.primaryChip.onEach { latest = it }.launchIn(kosmos.testScope)
// THEN the old start time is still used
assertThat((latest as OngoingActivityChipModel.Active.Timer).startTimeMs)
@@ -289,14 +278,14 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
@Test
fun primaryChip_screenRecordStoppedViaDialog_chipHiddenWithoutAnimation() =
- testScope.runTest {
+ kosmos.runTest {
screenRecordState.value = ScreenRecordModel.Recording
mediaProjectionState.value =
MediaProjectionState.Projecting.EntireScreen(
NORMAL_PACKAGE,
hostDeviceName = "Recording Display",
)
- callRepo.setOngoingCallState(OngoingCallModel.NoCall)
+ removeOngoingCallState("testKey")
val latest by collectLastValue(underTest.primaryChip)
@@ -319,11 +308,11 @@ class OngoingActivityChipsViewModelTest : SysuiTestCase() {
@Test
fun primaryChip_projectionStoppedViaDialog_chipHiddenWithoutAnimation() =
- testScope.runTest {
+ kosmos.runTest {
mediaProjectionState.value =
MediaProjectionState.Projecting.EntireScreen(NORMAL_PACKAGE)
screenRecordState.value = ScreenRecordModel.DoingNothing
- callRepo.setOngoingCallState(OngoingCallModel.NoCall)
+ removeOngoingCallState("testKey")
val latest by collectLastValue(underTest.primaryChip)
--
GitLab
From 6b2953431f644bb3114e843926b9c97652c84fc7 Mon Sep 17 00:00:00 2001
From: Charles Chen
Date: Tue, 11 Feb 2025 17:18:27 +0800
Subject: [PATCH 025/111] Clean up move_animation_options_to_change
Bug: 327332488
Test: presubmit
Flag: EXEMPT remove flag
Change-Id: I2b4d8c93be50bf013e1863f1b95507013973d24e
---
.../java/android/window/TransitionFilter.java | 6 +-
core/java/android/window/TransitionInfo.java | 38 ----------
.../window/flags/windowing_sdk.aconfig | 10 ---
.../extensions/embedding/SplitPresenter.java | 3 +-
.../ActivityEmbeddingAnimationRunner.java | 14 ++--
.../ActivityEmbeddingAnimationSpec.java | 44 +++++-------
.../ActivityEmbeddingController.java | 4 --
.../shell/transition/DefaultMixedHandler.java | 4 --
.../transition/DefaultTransitionHandler.java | 16 +----
.../transition/TransitionAnimationHelper.java | 18 +----
...ActivityEmbeddingAnimationRunnerTests.java | 53 --------------
.../ActivityEmbeddingControllerTests.java | 34 ---------
.../com/android/server/wm/Transition.java | 70 ++++++++-----------
.../android/server/wm/TransitionTests.java | 24 -------
14 files changed, 62 insertions(+), 276 deletions(-)
diff --git a/core/java/android/window/TransitionFilter.java b/core/java/android/window/TransitionFilter.java
index 61fc6226f822e..d8d20119a6023 100644
--- a/core/java/android/window/TransitionFilter.java
+++ b/core/java/android/window/TransitionFilter.java
@@ -31,8 +31,6 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.view.WindowManager;
-import com.android.window.flags.Flags;
-
/**
* A parcelable filter that can be used for rerouting transitions to a remote. This is a local
* representation so that the transition system doesn't need to make blocking queries over
@@ -261,9 +259,7 @@ public final class TransitionFilter implements Parcelable {
// only applies to activity/task
&& (change.getTaskInfo() != null
|| change.getActivityComponent() != null)) {
- final TransitionInfo.AnimationOptions opts =
- Flags.moveAnimationOptionsToChange() ? change.getAnimationOptions()
- : info.getAnimationOptions();
+ final TransitionInfo.AnimationOptions opts = change.getAnimationOptions();
if (opts != null) {
boolean canActuallyOverride = change.getTaskInfo() == null
|| opts.getOverrideTaskTransition();
diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java
index 4f34aa36a2043..32175f122d611 100644
--- a/core/java/android/window/TransitionInfo.java
+++ b/core/java/android/window/TransitionInfo.java
@@ -57,8 +57,6 @@ import android.view.Surface;
import android.view.SurfaceControl;
import android.view.WindowManager;
-import com.android.window.flags.Flags;
-
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -220,10 +218,6 @@ public final class TransitionInfo implements Parcelable {
private final ArrayList mChanges = new ArrayList<>();
private final ArrayList mRoots = new ArrayList<>();
- // TODO(b/327332488): Clean-up usages after the flag is fully enabled.
- @Deprecated
- private AnimationOptions mOptions;
-
/** This is only a BEST-EFFORT id used for log correlation. DO NOT USE for any real work! */
private int mDebugId = -1;
@@ -238,7 +232,6 @@ public final class TransitionInfo implements Parcelable {
mFlags = in.readInt();
in.readTypedList(mChanges, Change.CREATOR);
in.readTypedList(mRoots, Root.CREATOR);
- mOptions = in.readTypedObject(AnimationOptions.CREATOR);
mDebugId = in.readInt();
mTrack = in.readInt();
}
@@ -250,7 +243,6 @@ public final class TransitionInfo implements Parcelable {
dest.writeInt(mFlags);
dest.writeTypedList(mChanges);
dest.writeTypedList(mRoots, flags);
- dest.writeTypedObject(mOptions, flags);
dest.writeInt(mDebugId);
dest.writeInt(mTrack);
}
@@ -286,18 +278,6 @@ public final class TransitionInfo implements Parcelable {
mRoots.add(other);
}
- /**
- * @deprecated Set {@link AnimationOptions} to change. This method is only used if
- * {@link Flags#FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE} is disabled.
- */
- @Deprecated
- public void setAnimationOptions(@Nullable AnimationOptions options) {
- if (Flags.moveAnimationOptionsToChange()) {
- return;
- }
- mOptions = options;
- }
-
public @TransitionType int getType() {
return mType;
}
@@ -359,16 +339,6 @@ public final class TransitionInfo implements Parcelable {
return mRoots.get(0).mLeash;
}
- /**
- * @deprecated Use {@link Change#getAnimationOptions()} instead. This method is called only
- * if {@link Flags#FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE} is disabled.
- */
- @Deprecated
- @Nullable
- public AnimationOptions getAnimationOptions() {
- return mOptions;
- }
-
/**
* @return the list of {@link Change}s in this transition. The list is sorted top-to-bottom
* in Z (meaning index 0 is the top-most container).
@@ -455,9 +425,6 @@ public final class TransitionInfo implements Parcelable {
StringBuilder sb = new StringBuilder();
sb.append("{id=").append(mDebugId).append(" t=").append(transitTypeToString(mType))
.append(" f=0x").append(Integer.toHexString(mFlags)).append(" trk=").append(mTrack);
- if (mOptions != null) {
- sb.append(" opt=").append(mOptions);
- }
sb.append(" r=[");
for (int i = 0; i < mRoots.size(); ++i) {
if (i > 0) {
@@ -656,8 +623,6 @@ public final class TransitionInfo implements Parcelable {
for (int i = 0; i < mRoots.size(); ++i) {
out.mRoots.add(mRoots.get(i).localRemoteCopy());
}
- // Doesn't have any native stuff, so no need for actual copy
- out.mOptions = mOptions;
return out;
}
@@ -860,9 +825,6 @@ public final class TransitionInfo implements Parcelable {
* Sets {@link AnimationOptions} to override animation.
*/
public void setAnimationOptions(@Nullable AnimationOptions options) {
- if (!Flags.moveAnimationOptionsToChange()) {
- return;
- }
mAnimationOptions = options;
}
diff --git a/core/java/android/window/flags/windowing_sdk.aconfig b/core/java/android/window/flags/windowing_sdk.aconfig
index 54d0eeffc9bbc..6e45d3dc659fc 100644
--- a/core/java/android/window/flags/windowing_sdk.aconfig
+++ b/core/java/android/window/flags/windowing_sdk.aconfig
@@ -60,16 +60,6 @@ flag {
bug: "293658614"
}
-flag {
- namespace: "windowing_sdk"
- name: "move_animation_options_to_change"
- description: "Move AnimationOptions from TransitionInfo to each Change"
- bug: "327332488"
- metadata {
- purpose: PURPOSE_BUGFIX
- }
-}
-
flag {
namespace: "windowing_sdk"
name: "rear_display_disable_force_desktop_system_decorations"
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java
index eb59d6efdeff5..7ab9e2e65b76c 100644
--- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java
+++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java
@@ -705,8 +705,7 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
}
private static boolean isOverlayTransitionSupported() {
- return Flags.moveAnimationOptionsToChange()
- && Flags.activityEmbeddingOverlayPresentationFlag();
+ return Flags.activityEmbeddingOverlayPresentationFlag();
}
@NonNull
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java
index f269b3831aab3..78f5154c0ecb1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java
@@ -364,7 +364,7 @@ class ActivityEmbeddingAnimationRunner {
@NonNull SurfaceControl.Transaction finishTransaction,
@NonNull List adapters) {
for (ActivityEmbeddingAnimationAdapter adapter : adapters) {
- final int backgroundColor = getTransitionBackgroundColorIfSet(info, adapter.mChange,
+ final int backgroundColor = getTransitionBackgroundColorIfSet(adapter.mChange,
adapter.mAnimation, 0 /* defaultColor */);
if (backgroundColor != 0) {
// We only need to show one color.
@@ -436,8 +436,8 @@ class ActivityEmbeddingAnimationRunner {
final TransitionInfo.AnimationOptions options = boundsAnimationChange
.getAnimationOptions();
if (options != null) {
- final Animation overrideAnimation = mAnimationSpec.loadCustomAnimationFromOptions(
- options, TRANSIT_CHANGE);
+ final Animation overrideAnimation =
+ mAnimationSpec.loadCustomAnimation(options, TRANSIT_CHANGE);
if (overrideAnimation != null) {
overrideShowBackdrop = overrideAnimation.getShowBackdrop();
}
@@ -447,7 +447,7 @@ class ActivityEmbeddingAnimationRunner {
// There are two animations in the array. The first one is for the start leash
// (snapshot), and the second one is for the end leash (TaskFragment).
final Animation[] animations =
- mAnimationSpec.createChangeBoundsChangeAnimations(info, change, parentBounds);
+ mAnimationSpec.createChangeBoundsChangeAnimations(change, parentBounds);
// Jump cut if either animation has zero for duration.
for (Animation animation : animations) {
if (shouldUseJumpCutForAnimation(animation)) {
@@ -500,12 +500,10 @@ class ActivityEmbeddingAnimationRunner {
// window without bounds change.
animation = ActivityEmbeddingAnimationSpec.createNoopAnimation(change);
} else if (TransitionUtil.isClosingType(change.getMode())) {
- animation =
- mAnimationSpec.createChangeBoundsCloseAnimation(info, change, parentBounds);
+ animation = mAnimationSpec.createChangeBoundsCloseAnimation(change, parentBounds);
shouldShowBackgroundColor = false;
} else {
- animation =
- mAnimationSpec.createChangeBoundsOpenAnimation(info, change, parentBounds);
+ animation = mAnimationSpec.createChangeBoundsOpenAnimation(change, parentBounds);
shouldShowBackgroundColor = false;
}
if (shouldUseJumpCutForAnimation(animation)) {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationSpec.java b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationSpec.java
index 77799e99607b9..2b9eda40cdbbc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationSpec.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationSpec.java
@@ -42,7 +42,6 @@ import android.view.animation.TranslateAnimation;
import android.window.TransitionInfo;
import com.android.internal.policy.TransitionAnimation;
-import com.android.window.flags.Flags;
import com.android.wm.shell.shared.TransitionUtil;
/** Animation spec for ActivityEmbedding transition. */
@@ -94,9 +93,10 @@ class ActivityEmbeddingAnimationSpec {
/** Animation for window that is opening in a change transition. */
@NonNull
- Animation createChangeBoundsOpenAnimation(@NonNull TransitionInfo info,
- @NonNull TransitionInfo.Change change, @NonNull Rect parentBounds) {
- final Animation customAnimation = loadCustomAnimation(info, change, TRANSIT_CHANGE);
+ Animation createChangeBoundsOpenAnimation(@NonNull TransitionInfo.Change change,
+ @NonNull Rect parentBounds) {
+ final Animation customAnimation =
+ loadCustomAnimation(change.getAnimationOptions(), TRANSIT_CHANGE);
if (customAnimation != null) {
return customAnimation;
}
@@ -126,9 +126,10 @@ class ActivityEmbeddingAnimationSpec {
/** Animation for window that is closing in a change transition. */
@NonNull
- Animation createChangeBoundsCloseAnimation(@NonNull TransitionInfo info,
- @NonNull TransitionInfo.Change change, @NonNull Rect parentBounds) {
- final Animation customAnimation = loadCustomAnimation(info, change, TRANSIT_CHANGE);
+ Animation createChangeBoundsCloseAnimation(@NonNull TransitionInfo.Change change,
+ @NonNull Rect parentBounds) {
+ final Animation customAnimation =
+ loadCustomAnimation(change.getAnimationOptions(), TRANSIT_CHANGE);
if (customAnimation != null) {
return customAnimation;
}
@@ -162,12 +163,13 @@ class ActivityEmbeddingAnimationSpec {
* the second one is for the end leash.
*/
@NonNull
- Animation[] createChangeBoundsChangeAnimations(@NonNull TransitionInfo info,
- @NonNull TransitionInfo.Change change, @NonNull Rect parentBounds) {
+ Animation[] createChangeBoundsChangeAnimations(@NonNull TransitionInfo.Change change,
+ @NonNull Rect parentBounds) {
// TODO(b/293658614): Support more complicated animations that may need more than a noop
// animation as the start leash.
final Animation noopAnimation = createNoopAnimation(change);
- final Animation customAnimation = loadCustomAnimation(info, change, TRANSIT_CHANGE);
+ final Animation customAnimation =
+ loadCustomAnimation(change.getAnimationOptions(), TRANSIT_CHANGE);
if (customAnimation != null) {
return new Animation[]{noopAnimation, customAnimation};
}
@@ -221,7 +223,8 @@ class ActivityEmbeddingAnimationSpec {
Animation loadOpenAnimation(@NonNull TransitionInfo info,
@NonNull TransitionInfo.Change change, @NonNull Rect wholeAnimationBounds) {
final boolean isEnter = TransitionUtil.isOpeningType(change.getMode());
- final Animation customAnimation = loadCustomAnimation(info, change, change.getMode());
+ final Animation customAnimation =
+ loadCustomAnimation(change.getAnimationOptions(), change.getMode());
final Animation animation;
if (customAnimation != null) {
animation = customAnimation;
@@ -248,7 +251,8 @@ class ActivityEmbeddingAnimationSpec {
Animation loadCloseAnimation(@NonNull TransitionInfo info,
@NonNull TransitionInfo.Change change, @NonNull Rect wholeAnimationBounds) {
final boolean isEnter = TransitionUtil.isOpeningType(change.getMode());
- final Animation customAnimation = loadCustomAnimation(info, change, change.getMode());
+ final Animation customAnimation =
+ loadCustomAnimation(change.getAnimationOptions(), change.getMode());
final Animation animation;
if (customAnimation != null) {
animation = customAnimation;
@@ -280,20 +284,8 @@ class ActivityEmbeddingAnimationSpec {
}
@Nullable
- private Animation loadCustomAnimation(@NonNull TransitionInfo info,
- @NonNull TransitionInfo.Change change, @WindowManager.TransitionType int mode) {
- final TransitionInfo.AnimationOptions options;
- if (Flags.moveAnimationOptionsToChange()) {
- options = change.getAnimationOptions();
- } else {
- options = info.getAnimationOptions();
- }
- return loadCustomAnimationFromOptions(options, mode);
- }
-
- @Nullable
- Animation loadCustomAnimationFromOptions(@Nullable TransitionInfo.AnimationOptions options,
- @WindowManager.TransitionType int mode) {
+ Animation loadCustomAnimation(@Nullable TransitionInfo.AnimationOptions options,
+ @WindowManager.TransitionType int mode) {
if (options == null || options.getType() != ANIM_CUSTOM) {
return null;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingController.java
index 55ed5fa4b56f4..3a95333309ac5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingController.java
@@ -40,7 +40,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.window.flags.Flags;
import com.android.wm.shell.shared.TransitionUtil;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.transition.Transitions;
@@ -123,9 +122,6 @@ public class ActivityEmbeddingController implements Transitions.TransitionHandle
}
private boolean shouldAnimateAnimationOptions(@NonNull TransitionInfo info) {
- if (!Flags.moveAnimationOptionsToChange()) {
- return shouldAnimateAnimationOptions(info.getAnimationOptions());
- }
for (TransitionInfo.Change change : info.getChanges()) {
if (!shouldAnimateAnimationOptions(change.getAnimationOptions())) {
// If any of override animation is not supported, don't animate the transition.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
index 743bd052995eb..347dcff865299 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java
@@ -40,7 +40,6 @@ import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
import com.android.internal.protolog.ProtoLog;
-import com.android.window.flags.Flags;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.activityembedding.ActivityEmbeddingController;
import com.android.wm.shell.common.ComponentUtils;
@@ -439,9 +438,6 @@ public class DefaultMixedHandler implements MixedTransitionHandler,
for (int i = 0; i < info.getRootCount(); ++i) {
out.addRoot(info.getRoot(i));
}
- if (!Flags.moveAnimationOptionsToChange()) {
- out.setAnimationOptions(info.getAnimationOptions());
- }
return out;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
index 01428e60582e3..e9c6adec75d7c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
@@ -539,7 +539,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
cornerRadius = 0;
}
- backgroundColorForTransition = getTransitionBackgroundColorIfSet(info, change, a,
+ backgroundColorForTransition = getTransitionBackgroundColorIfSet(change, a,
backgroundColorForTransition);
if (!isTask && a.getExtensionEdges() != 0x0) {
@@ -606,12 +606,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
mTransactionPool, mMainExecutor, animRelOffset, cornerRadius,
clipRect);
- final TransitionInfo.AnimationOptions options;
- if (Flags.moveAnimationOptionsToChange()) {
- options = change.getAnimationOptions();
- } else {
- options = info.getAnimationOptions();
- }
+ final TransitionInfo.AnimationOptions options = change.getAnimationOptions();
if (options != null) {
attachThumbnail(animations, onAnimFinish, change, options, cornerRadius);
}
@@ -834,12 +829,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
final boolean isOpeningType = TransitionUtil.isOpeningType(type);
final boolean enter = TransitionUtil.isOpeningType(changeMode);
final boolean isTask = change.getTaskInfo() != null;
- final TransitionInfo.AnimationOptions options;
- if (Flags.moveAnimationOptionsToChange()) {
- options = change.getAnimationOptions();
- } else {
- options = info.getAnimationOptions();
- }
+ final TransitionInfo.AnimationOptions options = change.getAnimationOptions();
final int overrideType = options != null ? options.getType() : ANIM_NONE;
final int userId = options != null ? options.getUserId() : UserHandle.USER_CURRENT;
final Rect endBounds = TransitionUtil.isClosingType(changeMode)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/TransitionAnimationHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/TransitionAnimationHelper.java
index 4feb4753096ec..7984bcedc4e55 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/TransitionAnimationHelper.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/TransitionAnimationHelper.java
@@ -58,7 +58,6 @@ import android.window.TransitionInfo;
import com.android.internal.R;
import com.android.internal.policy.TransitionAnimation;
import com.android.internal.protolog.ProtoLog;
-import com.android.window.flags.Flags;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.shared.TransitionUtil;
@@ -78,12 +77,7 @@ public class TransitionAnimationHelper {
final boolean isFreeform = isTask && change.getTaskInfo().isFreeform();
final boolean isCoveredByOpaqueFullscreenChange =
isCoveredByOpaqueFullscreenChange(info, change);
- final TransitionInfo.AnimationOptions options;
- if (Flags.moveAnimationOptionsToChange()) {
- options = change.getAnimationOptions();
- } else {
- options = info.getAnimationOptions();
- }
+ final TransitionInfo.AnimationOptions options = change.getAnimationOptions();
final int overrideType = options != null ? options.getType() : ANIM_NONE;
int animAttr = 0;
boolean translucent = false;
@@ -279,16 +273,10 @@ public class TransitionAnimationHelper {
* the given transition animation.
*/
@ColorInt
- public static int getTransitionBackgroundColorIfSet(@NonNull TransitionInfo info,
- @NonNull TransitionInfo.Change change, @NonNull Animation a,
- @ColorInt int defaultColor) {
+ public static int getTransitionBackgroundColorIfSet(@NonNull TransitionInfo.Change change,
+ @NonNull Animation a, @ColorInt int defaultColor) {
if (!a.getShowBackdrop()) {
return defaultColor;
- }
- if (!Flags.moveAnimationOptionsToChange() && info.getAnimationOptions() != null
- && info.getAnimationOptions().getBackgroundColor() != 0) {
- // If available use the background color provided through AnimationOptions
- return info.getAnimationOptions().getBackgroundColor();
} else if (a.getBackdropColor() != 0) {
// Otherwise fallback on the background color provided through the animation
// definition.
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunnerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunnerTests.java
index 94dc774a6737a..d4d8d93abf7d5 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunnerTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunnerTests.java
@@ -39,7 +39,6 @@ import android.animation.Animator;
import android.annotation.NonNull;
import android.graphics.Point;
import android.graphics.Rect;
-import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
@@ -77,7 +76,6 @@ public class ActivityEmbeddingAnimationRunnerTests extends ActivityEmbeddingAnim
doNothing().when(mController).onAnimationFinished(any());
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testStartAnimation() {
final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
@@ -103,7 +101,6 @@ public class ActivityEmbeddingAnimationRunnerTests extends ActivityEmbeddingAnim
verify(mController).onAnimationFinished(mTransition);
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testChangesBehindStartingWindow() {
final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
@@ -118,7 +115,6 @@ public class ActivityEmbeddingAnimationRunnerTests extends ActivityEmbeddingAnim
assertEquals(0, animator.getDuration());
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testTransitionTypeDragResize() {
final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_TASK_FRAGMENT_DRAG_RESIZE, 0)
@@ -133,25 +129,6 @@ public class ActivityEmbeddingAnimationRunnerTests extends ActivityEmbeddingAnim
assertEquals(0, animator.getDuration());
}
- @DisableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
- @Test
- public void testInvalidCustomAnimation_disableAnimationOptionsPerChange() {
- final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
- .addChange(createChange(FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY, TRANSIT_OPEN))
- .build();
- info.setAnimationOptions(TransitionInfo.AnimationOptions
- .makeCustomAnimOptions("packageName", 0 /* enterResId */, 0 /* exitResId */,
- 0 /* backgroundColor */, false /* overrideTaskTransition */));
- final Animator animator = mAnimRunner.createAnimator(
- info, mStartTransaction, mFinishTransaction,
- () -> mFinishCallback.onTransitionFinished(null /* wct */),
- new ArrayList<>());
-
- // An invalid custom animation is equivalent to jump-cut.
- assertEquals(0, animator.getDuration());
- }
-
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testInvalidCustomAnimation_enableAnimationOptionsPerChange() {
final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
@@ -169,36 +146,6 @@ public class ActivityEmbeddingAnimationRunnerTests extends ActivityEmbeddingAnim
assertEquals(0, animator.getDuration());
}
- @DisableFlags(Flags.FLAG_ACTIVITY_EMBEDDING_OVERLAY_PRESENTATION_FLAG)
- @Test
- public void testCalculateParentBounds_flagDisabled() {
- final Rect parentBounds = new Rect(0, 0, 2000, 2000);
- final Rect primaryBounds = new Rect();
- final Rect secondaryBounds = new Rect();
- parentBounds.splitVertically(primaryBounds, secondaryBounds);
-
- final TransitionInfo.Change change = createChange(0 /* flags */);
- change.setStartAbsBounds(secondaryBounds);
-
- final TransitionInfo.Change boundsAnimationChange = createChange(0 /* flags */);
- boundsAnimationChange.setStartAbsBounds(primaryBounds);
- boundsAnimationChange.setEndAbsBounds(primaryBounds);
- final Rect actualParentBounds = new Rect();
-
- calculateParentBounds(change, boundsAnimationChange, actualParentBounds);
-
- assertEquals(parentBounds, actualParentBounds);
-
- actualParentBounds.setEmpty();
-
- boundsAnimationChange.setStartAbsBounds(secondaryBounds);
- boundsAnimationChange.setEndAbsBounds(primaryBounds);
-
- calculateParentBounds(boundsAnimationChange, boundsAnimationChange, actualParentBounds);
-
- assertEquals(parentBounds, actualParentBounds);
- }
-
// TODO(b/243518738): Rewrite with TestParameter
@EnableFlags(Flags.FLAG_ACTIVITY_EMBEDDING_OVERLAY_PRESENTATION_FLAG)
@Test
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingControllerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingControllerTests.java
index 9f29ef71930a9..53a13d0d4ffd7 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingControllerTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/activityembedding/ActivityEmbeddingControllerTests.java
@@ -32,8 +32,6 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.graphics.Rect;
-import android.platform.test.annotations.DisableFlags;
-import android.platform.test.annotations.EnableFlags;
import android.view.SurfaceControl;
import android.window.TransitionInfo;
@@ -41,7 +39,6 @@ import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
-import com.android.window.flags.Flags;
import com.android.wm.shell.transition.TransitionInfoBuilder;
import org.junit.Before;
@@ -69,13 +66,11 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation
any());
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testInstantiate() {
verify(mShellInit).addInitCallback(any(), any());
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testOnInit() {
mController.onInit();
@@ -83,7 +78,6 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation
verify(mTransitions).addHandler(mController);
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testSetAnimScaleSetting() {
mController.setAnimScaleSetting(1.0f);
@@ -92,7 +86,6 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation
verify(mAnimSpec).setAnimScaleSetting(1.0f);
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testStartAnimation_containsNonActivityEmbeddingChange() {
final TransitionInfo.Change nonEmbeddedOpen = createChange(0 /* flags */);
@@ -129,7 +122,6 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation
assertFalse(info2.getChanges().contains(nonEmbeddedClose));
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testStartAnimation_containsOnlyFillTaskActivityEmbeddingChange() {
final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_OPEN, 0)
@@ -146,7 +138,6 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation
verifyNoMoreInteractions(mFinishCallback);
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testStartAnimation_containsActivityEmbeddingSplitChange() {
// Change that occupies only part of the Task.
@@ -164,7 +155,6 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation
verifyNoMoreInteractions(mFinishTransaction);
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testStartAnimation_containsChangeEnterActivityEmbeddingSplit() {
// Change that is entering ActivityEmbedding split.
@@ -181,7 +171,6 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation
verifyNoMoreInteractions(mFinishTransaction);
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testStartAnimation_containsChangeExitActivityEmbeddingSplit() {
// Change that is exiting ActivityEmbedding split.
@@ -198,27 +187,6 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation
verifyNoMoreInteractions(mFinishTransaction);
}
- @DisableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
- @Test
- public void testShouldAnimate_containsAnimationOptions_disableAnimOptionsPerChange() {
- final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_CLOSE, 0)
- .addChange(createEmbeddedChange(EMBEDDED_RIGHT_BOUNDS, TASK_BOUNDS, TASK_BOUNDS))
- .build();
-
- info.setAnimationOptions(TransitionInfo.AnimationOptions
- .makeCustomAnimOptions("packageName", 0 /* enterResId */, 0 /* exitResId */,
- 0 /* backgroundColor */, false /* overrideTaskTransition */));
- assertTrue(mController.shouldAnimate(info));
-
- info.setAnimationOptions(TransitionInfo.AnimationOptions
- .makeSceneTransitionAnimOptions());
- assertFalse(mController.shouldAnimate(info));
-
- info.setAnimationOptions(TransitionInfo.AnimationOptions.makeCrossProfileAnimOptions());
- assertFalse(mController.shouldAnimate(info));
- }
-
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testShouldAnimate_containsAnimationOptions_enableAnimOptionsPerChange() {
final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_CLOSE, 0)
@@ -239,7 +207,6 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation
assertFalse(mController.shouldAnimate(info));
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@UiThreadTest
@Test
public void testMergeAnimation() {
@@ -278,7 +245,6 @@ public class ActivityEmbeddingControllerTests extends ActivityEmbeddingAnimation
verify(mFinishCallback).onTransitionFinished(any());
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testOnAnimationFinished() {
// Should not call finish when there is no transition.
diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java
index 5217a759c6ae1..d04135f6c55da 100644
--- a/services/core/java/com/android/server/wm/Transition.java
+++ b/services/core/java/com/android/server/wm/Transition.java
@@ -2026,23 +2026,18 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
if (mOverrideOptions == null) {
return;
}
-
- if (!Flags.moveAnimationOptionsToChange()) {
- info.setAnimationOptions(mOverrideOptions);
- } else {
- final List changes = info.getChanges();
- for (int i = changes.size() - 1; i >= 0; --i) {
- final WindowContainer> container = mTargets.get(i).mContainer;
- if (container.asActivityRecord() != null
- || shouldApplyAnimOptionsToTask(container.asTask())) {
- changes.get(i).setAnimationOptions(mOverrideOptions);
- // TODO(b/295805497): Extract mBackgroundColor from AnimationOptions.
- changes.get(i).setBackgroundColor(mOverrideOptions.getBackgroundColor());
- } else if (shouldApplyAnimOptionsToEmbeddedTf(container.asTaskFragment())) {
- // We only override AnimationOptions because backgroundColor should be from
- // TaskFragmentAnimationParams.
- changes.get(i).setAnimationOptions(mOverrideOptions);
- }
+ final List changes = info.getChanges();
+ for (int i = changes.size() - 1; i >= 0; --i) {
+ final WindowContainer> container = mTargets.get(i).mContainer;
+ if (container.asActivityRecord() != null
+ || shouldApplyAnimOptionsToTask(container.asTask())) {
+ changes.get(i).setAnimationOptions(mOverrideOptions);
+ // TODO(b/295805497): Extract mBackgroundColor from AnimationOptions.
+ changes.get(i).setBackgroundColor(mOverrideOptions.getBackgroundColor());
+ } else if (shouldApplyAnimOptionsToEmbeddedTf(container.asTaskFragment())) {
+ // We only override AnimationOptions because backgroundColor should be from
+ // TaskFragmentAnimationParams.
+ changes.get(i).setAnimationOptions(mOverrideOptions);
}
}
updateActivityTargetForCrossProfileAnimation(info);
@@ -2933,9 +2928,6 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
final AnimationOptions animOptionsForActivityTransition =
calculateAnimationOptionsForActivityTransition(type, sortedTargets);
- if (!Flags.moveAnimationOptionsToChange() && animOptionsForActivityTransition != null) {
- out.setAnimationOptions(animOptionsForActivityTransition);
- }
final ArraySet occludedAtEndContainers = new ArraySet<>();
// Convert all the resolved ChangeInfos into TransactionInfo.Change objects in order.
@@ -3059,28 +3051,26 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener {
}
AnimationOptions animOptions = null;
- if (Flags.moveAnimationOptionsToChange()) {
- if (activityRecord != null && animOptionsForActivityTransition != null) {
- animOptions = animOptionsForActivityTransition;
- } else if (Flags.activityEmbeddingOverlayPresentationFlag()
- && isEmbeddedTaskFragment) {
- final TaskFragmentAnimationParams params = taskFragment.getAnimationParams();
- if (params.hasOverrideAnimation()) {
- // Only set AnimationOptions if there's any animation override.
- // We use separated field for backgroundColor, and
- // AnimationOptions#backgroundColor will be removed in long term.
- animOptions = AnimationOptions.makeCustomAnimOptions(
- taskFragment.getTask().getBasePackageName(),
- params.getOpenAnimationResId(), params.getChangeAnimationResId(),
- params.getCloseAnimationResId(), 0 /* backgroundColor */,
- false /* overrideTaskTransition */);
- animOptions.setUserId(taskFragment.getTask().mUserId);
- }
- }
- if (animOptions != null) {
- change.setAnimationOptions(animOptions);
+ if (activityRecord != null && animOptionsForActivityTransition != null) {
+ animOptions = animOptionsForActivityTransition;
+ } else if (Flags.activityEmbeddingOverlayPresentationFlag()
+ && isEmbeddedTaskFragment) {
+ final TaskFragmentAnimationParams params = taskFragment.getAnimationParams();
+ if (params.hasOverrideAnimation()) {
+ // Only set AnimationOptions if there's any animation override.
+ // We use separated field for backgroundColor, and
+ // AnimationOptions#backgroundColor will be removed in long term.
+ animOptions = AnimationOptions.makeCustomAnimOptions(
+ taskFragment.getTask().getBasePackageName(),
+ params.getOpenAnimationResId(), params.getChangeAnimationResId(),
+ params.getCloseAnimationResId(), 0 /* backgroundColor */,
+ false /* overrideTaskTransition */);
+ animOptions.setUserId(taskFragment.getTask().mUserId);
}
}
+ if (animOptions != null) {
+ change.setAnimationOptions(animOptions);
+ }
if (activityRecord != null) {
change.setActivityComponent(activityRecord.mActivityComponent);
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
index 2ee34d3a4b366..b9f88cd73e9dc 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -82,8 +82,6 @@ import android.graphics.Color;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.IBinder;
-import android.platform.test.annotations.DisableFlags;
-import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -104,7 +102,6 @@ import androidx.annotation.NonNull;
import androidx.test.filters.SmallTest;
import com.android.internal.graphics.ColorUtils;
-import com.android.window.flags.Flags;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -2009,21 +2006,6 @@ public class TransitionTests extends WindowTestsBase {
assertEquals(expectedBackgroundColor, info.getChanges().get(1).getBackgroundColor());
}
- @DisableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
- @Test
- public void testOverrideAnimationOptionsToInfoIfNecessary_disableAnimOptionsPerChange() {
- ActivityRecord r = initializeOverrideAnimationOptionsTest();
- TransitionInfo.AnimationOptions options = TransitionInfo.AnimationOptions
- .makeCommonAnimOptions("testPackage");
- mTransition.setOverrideAnimation(options, r, null /* startCallback */,
- null /* finishCallback */);
-
- mTransition.overrideAnimationOptionsToInfoIfNecessary(mInfo);
-
- assertEquals(options, mInfo.getAnimationOptions());
- }
-
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testOverrideAnimationOptionsToInfoIfNecessary_fromStyleAnimOptions() {
ActivityRecord r = initializeOverrideAnimationOptionsTest();
@@ -2049,7 +2031,6 @@ public class TransitionTests extends WindowTestsBase {
options, activityChange.getAnimationOptions());
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testOverrideAnimationOptionsToInfoIfNecessary_sceneAnimOptions() {
ActivityRecord r = initializeOverrideAnimationOptionsTest();
@@ -2075,7 +2056,6 @@ public class TransitionTests extends WindowTestsBase {
options, activityChange.getAnimationOptions());
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testOverrideAnimationOptionsToInfoIfNecessary_crossProfileAnimOptions() {
ActivityRecord r = initializeOverrideAnimationOptionsTest();
@@ -2103,7 +2083,6 @@ public class TransitionTests extends WindowTestsBase {
assertTrue(activityChange.hasFlags(FLAG_CROSS_PROFILE_OWNER_THUMBNAIL));
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testOverrideAnimationOptionsToInfoIfNecessary_customAnimOptions() {
ActivityRecord r = initializeOverrideAnimationOptionsTest();
@@ -2136,7 +2115,6 @@ public class TransitionTests extends WindowTestsBase {
options.getBackgroundColor(), activityChange.getBackgroundColor());
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testOverrideAnimationOptionsToInfoIfNecessary_haveTaskFragmentAnimParams() {
ActivityRecord r = initializeOverrideAnimationOptionsTest();
@@ -2185,7 +2163,6 @@ public class TransitionTests extends WindowTestsBase {
options.getBackgroundColor(), activityChange.getBackgroundColor());
}
- @EnableFlags(Flags.FLAG_MOVE_ANIMATION_OPTIONS_TO_CHANGE)
@Test
public void testOverrideAnimationOptionsToInfoIfNecessary_customAnimOptionsWithTaskOverride() {
ActivityRecord r = initializeOverrideAnimationOptionsTest();
@@ -2415,7 +2392,6 @@ public class TransitionTests extends WindowTestsBase {
}
@Test
- @EnableFlags(Flags.FLAG_ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS)
public void testMoveDisplayToTop() {
// Set up two displays, each of which has a task.
DisplayContent otherDisplay = createNewDisplay();
--
GitLab
From 11f10d71be9179627e7b75f4045c9fa7b7cedccb Mon Sep 17 00:00:00 2001
From: Ze Li
Date: Thu, 20 Feb 2025 15:32:27 +0800
Subject: [PATCH 026/111] [Battery refactor] Move stylus related functions to
BluetoothUtils as util functions.
Test: com.android.settingslib.bluetooth.BluetoothUtilsTest
Bug: 397847825
Flag: EXEMPT utils function
Change-Id: I9e7d4d167ce303fb6f4c28851128192948ec0570
---
.../settingslib/bluetooth/BluetoothUtils.java | 51 +++++++++++
.../bluetooth/BluetoothUtilsTest.java | 84 ++++++++++++++++---
2 files changed, 123 insertions(+), 12 deletions(-)
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
index 522a436b07320..335f4a8293a02 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java
@@ -23,6 +23,7 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import android.hardware.input.InputManager;
import android.media.AudioDeviceAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioManager;
@@ -34,6 +35,7 @@ import android.sysprop.BluetoothProperties;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
+import android.view.InputDevice;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
@@ -1193,4 +1195,53 @@ public class BluetoothUtils {
}
device.setMetadata(METADATA_FAST_PAIR_CUSTOMIZED_FIELDS, fastPairCustomizedMeta.getBytes());
}
+
+ /**
+ * Returns the {@link InputDevice} of the given bluetooth address if the device is a input
+ * device.
+ *
+ * @param address The address of the bluetooth device
+ * @return The {@link InputDevice} of the given address if applicable
+ */
+ @Nullable
+ public static InputDevice getInputDevice(Context context, String address) {
+ InputManager im = context.getSystemService(InputManager.class);
+
+ if (im != null) {
+ for (int deviceId : im.getInputDeviceIds()) {
+ String btAddress = im.getInputDeviceBluetoothAddress(deviceId);
+
+ if (btAddress != null && btAddress.equals(address)) {
+ return im.getInputDevice(deviceId);
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Identifies whether a device is a stylus using the associated {@link InputDevice} or
+ * {@link CachedBluetoothDevice}.
+ * InputDevices are only available when the device is USI or Bluetooth-connected, whereas
+ * CachedBluetoothDevices are available for Bluetooth devices when connected or paired,
+ * so to handle all cases, both are needed.
+ *
+ * @param inputDevice The associated input device of the stylus
+ * @param cachedBluetoothDevice The associated bluetooth device of the stylus
+ */
+ public static boolean isDeviceStylus(@Nullable InputDevice inputDevice,
+ @Nullable CachedBluetoothDevice cachedBluetoothDevice) {
+ if (inputDevice != null && inputDevice.supportsSource(InputDevice.SOURCE_STYLUS)) {
+ return true;
+ }
+
+ if (cachedBluetoothDevice != null) {
+ BluetoothDevice bluetoothDevice = cachedBluetoothDevice.getDevice();
+ String deviceType = BluetoothUtils.getStringMetaData(bluetoothDevice,
+ BluetoothDevice.METADATA_DEVICE_TYPE);
+ return TextUtils.equals(deviceType, BluetoothDevice.DEVICE_TYPE_STYLUS);
+ }
+
+ return false;
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
index ebe6128e55821..0325c0ec79154 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java
@@ -15,7 +15,9 @@
*/
package com.android.settingslib.bluetooth;
+import static com.android.settingslib.bluetooth.BluetoothUtils.getInputDevice;
import static com.android.settingslib.bluetooth.BluetoothUtils.isAvailableAudioSharingMediaBluetoothDevice;
+import static com.android.settingslib.bluetooth.BluetoothUtils.isDeviceStylus;
import static com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast.UNKNOWN_VALUE_PLACEHOLDER;
import static com.android.settingslib.flags.Flags.FLAG_ENABLE_DETERMINING_ADVANCED_DETAILS_HEADER_WITH_METADATA;
@@ -42,6 +44,7 @@ import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
+import android.hardware.input.InputManager;
import android.media.AudioDeviceAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioManager;
@@ -51,6 +54,7 @@ import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.util.Pair;
+import android.view.InputDevice;
import com.android.internal.R;
import com.android.settingslib.flags.Flags;
@@ -97,14 +101,18 @@ public class BluetoothUtilsTest {
@Mock private LocalBluetoothLeBroadcastAssistant mAssistant;
@Mock private CachedBluetoothDeviceManager mDeviceManager;
@Mock private BluetoothLeBroadcastReceiveState mLeBroadcastReceiveState;
+ @Mock
+ private InputManager mInputManager;
private Context mContext;
private ShadowBluetoothAdapter mShadowBluetoothAdapter;
+ private final InputDevice mInputDevice = mock(InputDevice.class);
private static final String STRING_METADATA = "string_metadata";
private static final String LE_AUDIO_SHARING_METADATA = "le_audio_sharing";
private static final String BOOL_METADATA = "true";
private static final String INT_METADATA = "25";
private static final int METADATA_FAST_PAIR_CUSTOMIZED_FIELDS = 25;
+ private static final int TEST_DEVICE_ID = 123;
private static final String KEY_HEARABLE_CONTROL_SLICE = "HEARABLE_CONTROL_SLICE_WITH_WIDTH";
private static final String CONTROL_METADATA =
""
@@ -115,6 +123,7 @@ public class BluetoothUtilsTest {
private static final String FAKE_TEMP_BOND_METADATA = "fake";
private static final String TEST_EXCLUSIVE_MANAGER_PACKAGE = "com.test.manager";
private static final String TEST_EXCLUSIVE_MANAGER_COMPONENT = "com.test.manager/.component";
+ private static final String TEST_ADDRESS = "11:22:33:44:55:66";
private static final int TEST_BROADCAST_ID = 25;
@Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
@@ -134,6 +143,10 @@ public class BluetoothUtilsTest {
when(mA2dpProfile.getProfileId()).thenReturn(BluetoothProfile.A2DP);
when(mLeAudioProfile.getProfileId()).thenReturn(BluetoothProfile.LE_AUDIO);
when(mHearingAid.getProfileId()).thenReturn(BluetoothProfile.HEARING_AID);
+ when(mContext.getSystemService(InputManager.class)).thenReturn(mInputManager);
+ when(mInputManager.getInputDeviceIds()).thenReturn(new int[]{TEST_DEVICE_ID});
+ when(mInputManager.getInputDeviceBluetoothAddress(TEST_DEVICE_ID)).thenReturn(TEST_ADDRESS);
+ when(mInputManager.getInputDevice(TEST_DEVICE_ID)).thenReturn(mInputDevice);
}
@Test
@@ -1097,9 +1110,8 @@ public class BluetoothUtilsTest {
@Test
public void getAudioDeviceAttributesForSpatialAudio_bleHeadset() {
- String address = "11:22:33:44:55:66";
when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
- when(mCachedBluetoothDevice.getAddress()).thenReturn(address);
+ when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_ADDRESS);
when(mCachedBluetoothDevice.getProfiles()).thenReturn(List.of(mLeAudioProfile));
when(mLeAudioProfile.isEnabled(mBluetoothDevice)).thenReturn(true);
@@ -1112,14 +1124,13 @@ public class BluetoothUtilsTest {
new AudioDeviceAttributes(
AudioDeviceAttributes.ROLE_OUTPUT,
AudioDeviceInfo.TYPE_BLE_HEADSET,
- address));
+ TEST_ADDRESS));
}
@Test
public void getAudioDeviceAttributesForSpatialAudio_bleSpeaker() {
- String address = "11:22:33:44:55:66";
when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
- when(mCachedBluetoothDevice.getAddress()).thenReturn(address);
+ when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_ADDRESS);
when(mCachedBluetoothDevice.getProfiles()).thenReturn(List.of(mLeAudioProfile));
when(mLeAudioProfile.isEnabled(mBluetoothDevice)).thenReturn(true);
@@ -1132,14 +1143,14 @@ public class BluetoothUtilsTest {
new AudioDeviceAttributes(
AudioDeviceAttributes.ROLE_OUTPUT,
AudioDeviceInfo.TYPE_BLE_SPEAKER,
- address));
+ TEST_ADDRESS));
}
@Test
public void getAudioDeviceAttributesForSpatialAudio_a2dp() {
- String address = "11:22:33:44:55:66";
+
when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
- when(mCachedBluetoothDevice.getAddress()).thenReturn(address);
+ when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_ADDRESS);
when(mCachedBluetoothDevice.getProfiles()).thenReturn(List.of(mA2dpProfile));
when(mA2dpProfile.isEnabled(mBluetoothDevice)).thenReturn(true);
@@ -1152,14 +1163,13 @@ public class BluetoothUtilsTest {
new AudioDeviceAttributes(
AudioDeviceAttributes.ROLE_OUTPUT,
AudioDeviceInfo.TYPE_BLUETOOTH_A2DP,
- address));
+ TEST_ADDRESS));
}
@Test
public void getAudioDeviceAttributesForSpatialAudio_hearingAid() {
- String address = "11:22:33:44:55:66";
when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
- when(mCachedBluetoothDevice.getAddress()).thenReturn(address);
+ when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_ADDRESS);
when(mCachedBluetoothDevice.getProfiles()).thenReturn(List.of(mHearingAid));
when(mHearingAid.isEnabled(mBluetoothDevice)).thenReturn(true);
@@ -1172,7 +1182,7 @@ public class BluetoothUtilsTest {
new AudioDeviceAttributes(
AudioDeviceAttributes.ROLE_OUTPUT,
AudioDeviceInfo.TYPE_HEARING_AID,
- address));
+ TEST_ADDRESS));
}
@Test
@@ -1375,4 +1385,54 @@ public class BluetoothUtilsTest {
verify(mBluetoothDevice).setMetadata(METADATA_FAST_PAIR_CUSTOMIZED_FIELDS,
TEMP_BOND_METADATA.getBytes());
}
+
+ @Test
+ public void getInputDevice_addressNotMatched_returnsNull() {
+ assertThat(getInputDevice(mContext, "123")).isNull();
+ }
+
+ @Test
+ public void getInputDevice_isInputDevice_returnsInputDevice() {
+ assertThat(getInputDevice(mContext, TEST_ADDRESS)).isEqualTo(mInputDevice);
+ }
+
+ @Test
+ public void isDeviceStylus_noDevices_false() {
+ assertThat(isDeviceStylus(null, null)).isFalse();
+ }
+
+ @Test
+ public void isDeviceStylus_nonStylusInputDevice_false() {
+ InputDevice inputDevice = new InputDevice.Builder()
+ .setSources(InputDevice.SOURCE_DPAD)
+ .build();
+
+ assertThat(isDeviceStylus(inputDevice, null)).isFalse();
+ }
+
+ @Test
+ public void isDeviceStylus_stylusInputDevice_true() {
+ InputDevice inputDevice = new InputDevice.Builder()
+ .setSources(InputDevice.SOURCE_STYLUS)
+ .build();
+
+ assertThat(isDeviceStylus(inputDevice, null)).isTrue();
+ }
+
+ @Test
+ public void isDeviceStylus_nonStylusBluetoothDevice_false() {
+ when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_DEVICE_TYPE)).thenReturn(
+ BluetoothDevice.DEVICE_TYPE_WATCH.getBytes());
+
+ assertThat(isDeviceStylus(null, mCachedBluetoothDevice)).isFalse();
+ }
+
+ @Test
+ public void isDeviceStylus_stylusBluetoothDevice_true() {
+ when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_DEVICE_TYPE)).thenReturn(
+ BluetoothDevice.DEVICE_TYPE_STYLUS.getBytes());
+ when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
+
+ assertThat(isDeviceStylus(null, mCachedBluetoothDevice)).isTrue();
+ }
}
--
GitLab
From 3d5873681c3ef0f546c7a2170a8265747389a2fd Mon Sep 17 00:00:00 2001
From: Angela Wang
Date: Thu, 20 Feb 2025 11:12:23 +0000
Subject: [PATCH 027/111] Fix AmbientVolumeControllerTest failed
Flag: EXEMPT bugfix
Bug: 397874606
Test: atest AmbientVolumeControllerTest
Change-Id: Idf9139e16193c76362a261c92b5b9cc6131feb96
---
.../settingslib/bluetooth/AmbientVolumeControllerTest.java | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/AmbientVolumeControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/AmbientVolumeControllerTest.java
index abc1d226972b7..e4381ae0a6639 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/AmbientVolumeControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/AmbientVolumeControllerTest.java
@@ -26,6 +26,7 @@ import static org.mockito.Mockito.when;
import android.bluetooth.AudioInputControl;
import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothProfile;
import android.content.Context;
import androidx.test.core.app.ApplicationProvider;
@@ -67,6 +68,9 @@ public class AmbientVolumeControllerTest {
@Before
public void setUp() {
when(mProfileManager.getVolumeControlProfile()).thenReturn(mVolumeControlProfile);
+ when(mVolumeControlProfile.isProfileReady()).thenReturn(true);
+ when(mVolumeControlProfile.getConnectionStatus(mDevice)).thenReturn(
+ BluetoothProfile.STATE_CONNECTED);
when(mDevice.getAddress()).thenReturn(TEST_ADDRESS);
when(mDevice.isConnected()).thenReturn(true);
mVolumeController = new AmbientVolumeController(mProfileManager, mCallback);
@@ -74,8 +78,6 @@ public class AmbientVolumeControllerTest {
@Test
public void onServiceConnected_notifyCallback() {
- when(mVolumeControlProfile.isProfileReady()).thenReturn(true);
-
mVolumeController.onServiceConnected();
verify(mCallback).onVolumeControlServiceConnected();
--
GitLab
From fe05a0b30a377ad23f17256a6947402d014f018d Mon Sep 17 00:00:00 2001
From: Toshiki Kikuchi
Date: Wed, 19 Feb 2025 21:38:41 +0900
Subject: [PATCH 028/111] Setup desktop when entering desktop by app-initiated
transition
This CL setup the desktop env (e.g., bring up DesktopWallpaper) when an
app is launched (or moved to top) into the desktop by app-initiated
transition when the desktop session is not activated.
We probably want to consolidate the logic with handleFreeformTaskLaunch
but this CL is the hot fix.
Flag: com.android.window.flags.enable_display_windowing_mode_switching
Bug: 397249847
Test: DesktopTasksControllerTest
Change-Id: Ia778bff76eaccadb1adb9558c4b529a145d48ea3
---
.../desktopmode/DesktopTasksController.kt | 69 +++++++++++++---
.../desktopmode/DesktopTasksControllerTest.kt | 80 ++++++++++++++++++-
2 files changed, 132 insertions(+), 17 deletions(-)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
index 93058db0c171a..0da611e02def6 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
@@ -1055,7 +1055,8 @@ class DesktopTasksController(
)
}
- private fun startLaunchTransition(
+ @VisibleForTesting
+ fun startLaunchTransition(
transitionType: Int,
wct: WindowContainerTransaction,
launchingTaskId: Int?,
@@ -1063,34 +1064,52 @@ class DesktopTasksController(
displayId: Int = DEFAULT_DISPLAY,
unminimizeReason: UnminimizeReason = UnminimizeReason.UNKNOWN,
): IBinder {
+ // TODO: b/397619806 - Consolidate sharable logic with [handleFreeformTaskLaunch].
+ var launchTransaction = wct
val taskIdToMinimize =
addAndGetMinimizeChanges(
displayId,
- wct,
+ launchTransaction,
newTaskId = launchingTaskId,
launchingNewIntent = launchingTaskId == null,
)
val exitImmersiveResult =
desktopImmersiveController.exitImmersiveIfApplicable(
- wct = wct,
+ wct = launchTransaction,
displayId = displayId,
excludeTaskId = launchingTaskId,
reason = DesktopImmersiveController.ExitReason.TASK_LAUNCH,
)
+ var deskIdToActivate: Int? = null
+ if (
+ DesktopExperienceFlags.ENABLE_DISPLAY_WINDOWING_MODE_SWITCHING.isTrue &&
+ !isDesktopModeShowing(displayId)
+ ) {
+ deskIdToActivate =
+ checkNotNull(
+ launchingTaskId?.let { taskRepository.getDeskIdForTask(it) }
+ ?: getDefaultDeskId(displayId)
+ )
+ val activateDeskWct = WindowContainerTransaction()
+ addDeskActivationChanges(deskIdToActivate, activateDeskWct)
+ // Desk activation must be handled before app launch-related transactions.
+ activateDeskWct.merge(launchTransaction, /* transfer= */ true)
+ launchTransaction = activateDeskWct
+ }
val t =
if (remoteTransition == null) {
desktopMixedTransitionHandler.startLaunchTransition(
transitionType = transitionType,
- wct = wct,
+ wct = launchTransaction,
taskId = launchingTaskId,
minimizingTaskId = taskIdToMinimize,
exitingImmersiveTask = exitImmersiveResult.asExit()?.exitingTask,
)
} else if (taskIdToMinimize == null) {
val remoteTransitionHandler = OneShotRemoteHandler(mainExecutor, remoteTransition)
- transitions.startTransition(transitionType, wct, remoteTransitionHandler).also {
- remoteTransitionHandler.setTransition(it)
- }
+ transitions
+ .startTransition(transitionType, launchTransaction, remoteTransitionHandler)
+ .also { remoteTransitionHandler.setTransition(it) }
} else {
val remoteTransitionHandler =
DesktopWindowLimitRemoteHandler(
@@ -1099,9 +1118,9 @@ class DesktopTasksController(
remoteTransition,
taskIdToMinimize,
)
- transitions.startTransition(transitionType, wct, remoteTransitionHandler).also {
- remoteTransitionHandler.setTransition(it)
- }
+ transitions
+ .startTransition(transitionType, launchTransaction, remoteTransitionHandler)
+ .also { remoteTransitionHandler.setTransition(it) }
}
if (taskIdToMinimize != null) {
addPendingMinimizeTransition(t, taskIdToMinimize, MinimizeReason.TASK_LIMIT)
@@ -1109,6 +1128,24 @@ class DesktopTasksController(
if (launchingTaskId != null && taskRepository.isMinimizedTask(launchingTaskId)) {
addPendingUnminimizeTransition(t, displayId, launchingTaskId, unminimizeReason)
}
+ if (
+ DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue &&
+ deskIdToActivate != null
+ ) {
+ if (DesktopExperienceFlags.ENABLE_DISPLAY_WINDOWING_MODE_SWITCHING.isTrue) {
+ desksTransitionObserver.addPendingTransition(
+ DeskTransition.ActivateDesk(
+ token = t,
+ displayId = displayId,
+ deskId = deskIdToActivate,
+ )
+ )
+ }
+
+ desktopModeEnterExitTransitionListener?.onEnterDesktopModeTransitionStarted(
+ FREEFORM_ANIMATION_DURATION
+ )
+ }
exitImmersiveResult.asExit()?.runOnTransitionStart?.invoke(t)
return t
}
@@ -2665,10 +2702,9 @@ class DesktopTasksController(
activateDesk(deskId, remoteTransition)
}
- /** Activates the given desk. */
- fun activateDesk(deskId: Int, remoteTransition: RemoteTransition? = null) {
+ /** Activates the given desk but without starting a transition. */
+ fun addDeskActivationChanges(deskId: Int, wct: WindowContainerTransaction) {
val displayId = taskRepository.getDisplayForDesk(deskId)
- val wct = WindowContainerTransaction()
if (DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue) {
prepareForDeskActivation(displayId, wct)
desksOrganizer.activateDesk(wct, deskId)
@@ -2681,6 +2717,13 @@ class DesktopTasksController(
} else {
bringDesktopAppsToFront(displayId, wct)
}
+ }
+
+ /** Activates the given desk. */
+ fun activateDesk(deskId: Int, remoteTransition: RemoteTransition? = null) {
+ val displayId = taskRepository.getDisplayForDesk(deskId)
+ val wct = WindowContainerTransaction()
+ addDeskActivationChanges(deskId, wct)
val transitionType = transitionType(remoteTransition)
val handler =
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
index fcd92ac2678ad..950d38a633953 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
@@ -2477,8 +2477,7 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
controller.moveTaskToFront(task.taskId, unminimizeReason = UnminimizeReason.UNKNOWN)
val wct = getLatestDesktopMixedTaskWct(type = TRANSIT_OPEN)
- assertThat(wct.hierarchyOps).hasSize(1)
- wct.assertLaunchTaskAt(0, task.taskId, WINDOWING_MODE_FREEFORM)
+ wct.assertLaunchTask(task.taskId, WINDOWING_MODE_FREEFORM)
}
@Test
@@ -6240,6 +6239,61 @@ class DesktopTasksControllerTest(flags: FlagsParameterization) : ShellTestCase()
assertThat(taskRepository.getNumberOfDesks(DEFAULT_DISPLAY)).isEqualTo(currentDeskCount + 1)
}
+ @Test
+ @EnableFlags(
+ Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
+ Flags.FLAG_ENABLE_DESKTOP_WALLPAPER_ACTIVITY_FOR_SYSTEM_USER,
+ )
+ fun startLaunchTransition_desktopNotShowing_movesWallpaperToFront() {
+ val launchingTask = createFreeformTask()
+ val wct = WindowContainerTransaction()
+ wct.reorder(launchingTask.token, /* onTop= */ true)
+ whenever(
+ desktopMixedTransitionHandler.startLaunchTransition(
+ eq(TRANSIT_OPEN),
+ any(),
+ anyOrNull(),
+ anyOrNull(),
+ anyOrNull(),
+ )
+ )
+ .thenReturn(Binder())
+
+ controller.startLaunchTransition(TRANSIT_OPEN, wct, launchingTaskId = null)
+
+ val latestWct = getLatestDesktopMixedTaskWct(type = TRANSIT_OPEN)
+ val launchingTaskReorderIndex = latestWct.indexOfReorder(launchingTask, toTop = true)
+ val wallpaperReorderIndex = latestWct.indexOfReorder(wallpaperToken, toTop = true)
+ assertThat(launchingTaskReorderIndex).isNotEqualTo(-1)
+ assertThat(wallpaperReorderIndex).isNotEqualTo(-1)
+ assertThat(launchingTaskReorderIndex).isGreaterThan(wallpaperReorderIndex)
+ }
+
+ @Test
+ @EnableFlags(
+ Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY,
+ Flags.FLAG_ENABLE_DESKTOP_WALLPAPER_ACTIVITY_FOR_SYSTEM_USER,
+ )
+ fun startLaunchTransition_desktopShowing_doesNotReorderWallpaper() {
+ val wct = WindowContainerTransaction()
+ whenever(
+ desktopMixedTransitionHandler.startLaunchTransition(
+ eq(TRANSIT_OPEN),
+ any(),
+ anyOrNull(),
+ anyOrNull(),
+ anyOrNull(),
+ )
+ )
+ .thenReturn(Binder())
+
+ setUpFreeformTask()
+ controller.startLaunchTransition(TRANSIT_OPEN, wct, launchingTaskId = null)
+
+ val latestWct = getLatestDesktopMixedTaskWct(type = TRANSIT_OPEN)
+ assertNull(latestWct.hierarchyOps.find { op -> op.container == wallpaperToken.asBinder() })
+ }
+
private class RunOnStartTransitionCallback : ((IBinder) -> Unit) {
var invocations = 0
private set
@@ -6626,13 +6680,20 @@ private fun WindowContainerTransaction.assertWithoutHop(
}
private fun WindowContainerTransaction.indexOfReorder(
- task: RunningTaskInfo,
+ token: WindowContainerToken,
toTop: Boolean? = null,
): Int {
- val hop = hierarchyOps.singleOrNull(ReorderPredicate(task.token, toTop)) ?: return -1
+ val hop = hierarchyOps.singleOrNull(ReorderPredicate(token, toTop)) ?: return -1
return hierarchyOps.indexOf(hop)
}
+private fun WindowContainerTransaction.indexOfReorder(
+ task: RunningTaskInfo,
+ toTop: Boolean? = null,
+): Int {
+ return indexOfReorder(task.token, toTop)
+}
+
private class ReorderPredicate(val token: WindowContainerToken, val toTop: Boolean? = null) :
((WindowContainerTransaction.HierarchyOp) -> Boolean) {
override fun invoke(hop: WindowContainerTransaction.HierarchyOp): Boolean =
@@ -6750,6 +6811,17 @@ private fun WindowContainerTransaction.assertPendingIntentAt(index: Int, intent:
assertThat(op.pendingIntent?.intent?.categories).isEqualTo(intent.categories)
}
+private fun WindowContainerTransaction.assertLaunchTask(taskId: Int, windowingMode: Int) {
+ val keyLaunchWindowingMode = "android.activity.windowingMode"
+
+ assertHop { hop ->
+ hop.type == HIERARCHY_OP_TYPE_LAUNCH_TASK &&
+ hop.launchOptions?.getInt(LAUNCH_KEY_TASK_ID) == taskId &&
+ hop.launchOptions?.getInt(keyLaunchWindowingMode, WINDOWING_MODE_UNDEFINED) ==
+ windowingMode
+ }
+}
+
private fun WindowContainerTransaction.assertLaunchTaskAt(
index: Int,
taskId: Int,
--
GitLab
From 4b04c4f50f7c9f617733990aae1d8c50515aeec0 Mon Sep 17 00:00:00 2001
From: Felix Stern
Date: Thu, 20 Feb 2025 07:00:49 -0800
Subject: [PATCH 029/111] Wait for IME window to be drawn in
testSurfaceRemovedAfterHideSoftInput
Fix: 397916079
Flag: android.view.inputmethod.refactor_insets_controller
Test: atest com.android.inputmethodservice.InputMethodServiceTest#testSurfaceRemovedAfterHideSoftInput
Change-Id: I1e4d35c201fe34a20f0a1e4b12cd82263c86305b
---
.../android/inputmethodservice/InputMethodServiceTest.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
index 856466675a28f..037d90ce5df0e 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
@@ -267,8 +267,8 @@ public class InputMethodServiceTest {
final var window = mInputMethodService.getWindow().getWindow();
assertWithMessage("IME window exists").that(window).isNotNull();
- assertWithMessage("IME window showing").that(
- window.getDecorView().getVisibility()).isEqualTo(View.VISIBLE);
+ eventually(() -> assertWithMessage("IME window showing").that(
+ window.getDecorView().getVisibility()).isEqualTo(View.VISIBLE));
mActivity.getWindow().getDecorView().setWindowInsetsAnimationCallback(
new WindowInsetsAnimation.Callback(
--
GitLab
From 6329f3e8070aa630308f45cd40c67314b83bb9bb Mon Sep 17 00:00:00 2001
From: Owner Cleanup Bot
Date: Thu, 20 Feb 2025 07:49:02 -0800
Subject: [PATCH 030/111] [owners] Remove arcwang@google.com from
packages/SettingsLib/src/com/android/settingslib/connectivity/OWNERS
This suggested change is automatically generated based on group
memberships and affiliations.
Please approve this change and vote the highest CR. This will keep the OWNERs
file tidy. We ask that you do not ignore this change and approve it
unless you know a reason the OWNER should remain. It can always be
reverted if needed.
If this change is in error, vote the lowest CR value (i.e. reject the CL)
and the bot will abandon it.
See the owner's recent review activity for context:
https://android-review.googlesource.com/q/arcwang@google.com
To report an issue, file a bug in the Infra>Codereview component.
Change-Id: I92fa4505afa87da52d8e39e3597272c226cac36c
---
.../SettingsLib/src/com/android/settingslib/connectivity/OWNERS | 1 -
1 file changed, 1 deletion(-)
diff --git a/packages/SettingsLib/src/com/android/settingslib/connectivity/OWNERS b/packages/SettingsLib/src/com/android/settingslib/connectivity/OWNERS
index 9f15c1bb5081c..b676d8daad52a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/connectivity/OWNERS
+++ b/packages/SettingsLib/src/com/android/settingslib/connectivity/OWNERS
@@ -1,6 +1,5 @@
# Default reviewers for this and subdirectories.
andychou@google.com
-arcwang@google.com
changbetty@google.com
qal@google.com
wengsu@google.com
--
GitLab
From 5e050679706d8ee23cdca61b54dc5725ad3eed19 Mon Sep 17 00:00:00 2001
From: Mina Granic
Date: Wed, 5 Feb 2025 18:26:56 +0000
Subject: [PATCH 031/111] Add an opt-out property for camera compat freeform
treatment.
The name has been chosen to be future-proof for other windowing
modes and platforms.
Flag: com.android.window.flags.enable_camera_compat_for_desktop_windowing_opt_out
Test: atest WmTests:AppCompatCameraOverridesTest
Fixes: 328616176
Change-Id: I2c7e9cfde4ba139e46c070d2cbc08e853416ef0e
---
core/java/android/view/WindowManager.java | 37 +++++++++++++++++++
.../server/wm/AppCompatCameraOverrides.java | 37 +++++++++++++++++--
.../wm/AppCompatCameraOverridesTest.java | 30 +++++++++++++++
3 files changed, 100 insertions(+), 4 deletions(-)
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 93eed370004b6..24647f459ab5e 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -1198,6 +1198,43 @@ public interface WindowManager extends ViewManager {
String PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE =
"android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE";
+ /**
+ * Application-level [PackageManager][android.content.pm.PackageManager.Property] tag that (when
+ * set to false) informs the system the app has opted out of the camera compatibility treatment
+ * for fixed-orientation apps, which simulates running on a portrait device, in the orientation
+ * requested by the app.
+ *
+ *
This treatment aims to mitigate camera issues on large screens, like stretched or sideways
+ * previews. It simulates running on a portrait device by:
+ *
+ *
Letterboxing the app window,
+ *
Cropping the camera buffer to match the app's requested orientation,
+ *
Setting the camera sensor orientation to portrait.
+ *
Setting the display rotation to match the app's requested orientation, given portrait
+ * natural orientation,
+ *
Refreshes the activity to trigger new camera setup, with sandboxed values.
+ *
+ *
+ *
To opt out of the camera compatibility treatment, add this property to your app manifest
+ * and set the value to {@code false}.
+ *
+ *
Not setting this property at all, or setting this property to {@code true} has no effect.
+ *
+ *
+ *
+ * @hide
+ */
+ //TODO(b/394590412): Make this property public.
+ String PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION =
+ "android.window.PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION";
+
/**
* Application level {@link android.content.pm.PackageManager.Property PackageManager.Property}
* for an app to inform the system that the app should be excluded from the compatibility
diff --git a/services/core/java/com/android/server/wm/AppCompatCameraOverrides.java b/services/core/java/com/android/server/wm/AppCompatCameraOverrides.java
index 47d30c98120c7..5eed54704f36d 100644
--- a/services/core/java/com/android/server/wm/AppCompatCameraOverrides.java
+++ b/services/core/java/com/android/server/wm/AppCompatCameraOverrides.java
@@ -23,6 +23,7 @@ import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_ENABLE_REFR
import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA;
import static android.content.pm.ActivityInfo.OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA;
import static android.view.WindowManager.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION;
+import static android.view.WindowManager.PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION;
import static android.view.WindowManager.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH;
import static android.view.WindowManager.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE;
@@ -32,6 +33,7 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLAS
import static com.android.server.wm.AppCompatUtils.isChangeEnabled;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import com.android.server.wm.utils.OptPropFactory;
import com.android.window.flags.Flags;
@@ -60,6 +62,8 @@ class AppCompatCameraOverrides {
private final OptPropFactory.OptProp mCameraCompatEnableRefreshViaPauseOptProp;
@NonNull
private final OptPropFactory.OptProp mCameraCompatAllowForceRotationOptProp;
+ @Nullable
+ private final OptPropFactory.OptProp mCameraCompatAllowOrientationTreatmentOptProp;
AppCompatCameraOverrides(@NonNull ActivityRecord activityRecord,
@NonNull AppCompatConfiguration appCompatConfiguration,
@@ -80,6 +84,10 @@ class AppCompatCameraOverrides {
mCameraCompatAllowForceRotationOptProp = optPropBuilder.create(
PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION,
isCameraCompatTreatmentEnabled);
+ mCameraCompatAllowOrientationTreatmentOptProp =
+ Flags.enableCameraCompatForDesktopWindowingOptOut() ? optPropBuilder.create(
+ PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION,
+ isCameraCompatTreatmentEnabled) : null;
}
/**
@@ -168,10 +176,31 @@ class AppCompatCameraOverrides {
*
*/
boolean shouldApplyFreeformTreatmentForCameraCompat() {
- return Flags.enableCameraCompatForDesktopWindowing() && (isChangeEnabled(mActivityRecord,
- OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT)
- || mActivityRecord.mWmService.mAppCompatConfiguration
- .isCameraCompatFreeformWindowingTreatmentEnabled());
+ return Flags.enableCameraCompatForDesktopWindowing()
+ && (shouldEnableCameraCompatFreeformTreatmentForApp()
+ || shouldEnableCameraCompatFreeformTreatmentForAllApps());
+ }
+
+ private boolean shouldEnableCameraCompatFreeformTreatmentForApp() {
+ if (mCameraCompatAllowOrientationTreatmentOptProp != null) {
+ return mCameraCompatAllowOrientationTreatmentOptProp
+ .shouldEnableWithOptOutOverrideAndProperty(isChangeEnabled(mActivityRecord,
+ OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT));
+ } else {
+ return isChangeEnabled(mActivityRecord,
+ OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT);
+ }
+ }
+
+ /**
+ * Returns whether camera compat treatment should be enabled for all apps targeted for treatment
+ * (usually fixed-orientation apps).
+ *
+ *
This can be enabled via adb only.
+ */
+ private boolean shouldEnableCameraCompatFreeformTreatmentForAllApps() {
+ return mActivityRecord.mWmService.mAppCompatConfiguration
+ .isCameraCompatFreeformWindowingTreatmentEnabled();
}
boolean isOverrideOrientationOnlyForCameraEnabled() {
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraOverridesTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraOverridesTest.java
index 4ad1cd192eb6b..d4be7f812cb5f 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraOverridesTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatCameraOverridesTest.java
@@ -23,12 +23,14 @@ import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_ENABLE_REFR
import static android.content.pm.ActivityInfo.OVERRIDE_MIN_ASPECT_RATIO_ONLY_FOR_CAMERA;
import static android.content.pm.ActivityInfo.OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA;
import static android.view.WindowManager.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION;
+import static android.view.WindowManager.PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION;
import static android.view.WindowManager.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH;
import static android.view.WindowManager.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE;
import static android.view.WindowManager.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING;
+import static com.android.window.flags.Flags.FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING_OPT_OUT;
import android.compat.testing.PlatformCompatChangeRule;
import android.platform.test.annotations.DisableFlags;
@@ -237,6 +239,34 @@ public class AppCompatCameraOverridesTest extends WindowTestsBase {
});
}
+ @Test
+ @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT})
+ @EnableFlags({FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING,
+ FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING_OPT_OUT})
+ public void testShouldApplyCameraCompatFreeformTreatment_propertyFalse_returnsFalse() {
+ runTestScenario((robot) -> {
+ robot.activity().createActivityWithComponentInNewTask();
+
+ robot.prop().disable(PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION);
+
+ robot.checkShouldApplyFreeformTreatmentForCameraCompat(false);
+ });
+ }
+
+ @Test
+ @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT})
+ @EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
+ @DisableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING_OPT_OUT)
+ public void testShouldApplyCameraCompatFreeformTreatment_optOutFlagNotEnabled_optOutIgnored() {
+ runTestScenario((robot) -> {
+ robot.activity().createActivityWithComponentInNewTask();
+
+ robot.prop().disable(PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION);
+
+ robot.checkShouldApplyFreeformTreatmentForCameraCompat(true);
+ });
+ }
+
@Test
@EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_ENABLE_FREEFORM_WINDOWING_TREATMENT})
@EnableFlags(FLAG_ENABLE_CAMERA_COMPAT_FOR_DESKTOP_WINDOWING)
--
GitLab
From e20bb1b52b52d4655a01ce99ec40328eb19bd04c Mon Sep 17 00:00:00 2001
From: Mina Granic
Date: Mon, 17 Feb 2025 11:21:58 +0000
Subject: [PATCH 032/111] Add a flag to launch the opt-out property for Camera
Compat for freeform.
Flag: com.android.window.flags.enable_camera_compat_for_desktop_windowing_opt_out_api
Test: EXEMPT flag
Bug: 397165621
Change-Id: I1a15f05249d29bfd615fa6bc67cbedf306c5c0e5
---
.../android/window/flags/lse_desktop_experience.aconfig | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/core/java/android/window/flags/lse_desktop_experience.aconfig b/core/java/android/window/flags/lse_desktop_experience.aconfig
index b137bb02b4181..30bb67c9b98a4 100644
--- a/core/java/android/window/flags/lse_desktop_experience.aconfig
+++ b/core/java/android/window/flags/lse_desktop_experience.aconfig
@@ -194,6 +194,13 @@ flag {
}
}
+flag {
+ name: "enable_camera_compat_for_desktop_windowing_opt_out_api"
+ namespace: "lse_desktop_experience"
+ description: "Introduces a developer API to opt-out of Camera Compat treatment for fixed-orientation apps in desktop windowing mode"
+ bug: "397165621"
+}
+
flag {
name: "enable_task_stack_observer_in_shell"
namespace: "lse_desktop_experience"
--
GitLab
From 122a8ac238926efeee21c83324b237ee684b3d9d Mon Sep 17 00:00:00 2001
From: Steven Ng
Date: Tue, 4 Feb 2025 04:56:56 +0000
Subject: [PATCH 033/111] Add logic to determine if a wallpaper is compatible
with a display
Also fix a bug that the fallback wallpaper isn't used after setting a new wallpaper due to the wallpaper connection hasn't established yet.
Test: atests FrameworksMockingServicesTests:WallpaperManagerServiceTests
Flag: android.app.enable_connected_displays_wallpaper
Bug: 384519749
Bug: 384521079
Change-Id: I392a072e87a6977e89a9b8e884d7a2f07d1c0708
---
.../server/wallpaper/WallpaperCropper.java | 53 +++++
.../wallpaper/WallpaperManagerService.java | 26 +--
.../wallpaper/WallpaperCropperTest.java | 194 ++++++++++++++++++
.../WallpaperManagerServiceTests.java | 100 +++++----
4 files changed, 317 insertions(+), 56 deletions(-)
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperCropper.java b/services/core/java/com/android/server/wallpaper/WallpaperCropper.java
index b3e68a35764b2..8e8455ad52888 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperCropper.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperCropper.java
@@ -16,6 +16,8 @@
package com.android.server.wallpaper;
+import static android.app.WallpaperManager.ORIENTATION_LANDSCAPE;
+import static android.app.WallpaperManager.ORIENTATION_SQUARE_LANDSCAPE;
import static android.app.WallpaperManager.ORIENTATION_UNKNOWN;
import static android.app.WallpaperManager.getOrientation;
import static android.app.WallpaperManager.getRotatedOrientation;
@@ -28,6 +30,7 @@ import static com.android.server.wallpaper.WallpaperUtils.WALLPAPER;
import static com.android.server.wallpaper.WallpaperUtils.getWallpaperDir;
import static com.android.window.flags.Flags.multiCrop;
+import android.app.WallpaperManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageDecoder;
@@ -821,4 +824,54 @@ public class WallpaperCropper {
}
}
}
+
+ /**
+ * Returns true if a wallpaper is compatible with a given display with ID, {@code displayId}.
+ *
+ *
A wallpaper is compatible with a display if any of the following are true
+ *
the display is a default display
+ * the wallpaper is a stock wallpaper
+ * the wallpaper size is at least 3/4 of the display resolution and, in landscape displays,
+ * the wallpaper has an aspect ratio of at least 11:13.
+ */
+ @VisibleForTesting
+ boolean isWallpaperCompatibleForDisplay(int displayId, WallpaperData wallpaperData) {
+ if (displayId == DEFAULT_DISPLAY) {
+ return true;
+ }
+
+ File wallpaperFile = wallpaperData.getWallpaperFile();
+ if (!wallpaperFile.exists()) {
+ // Assumption: Stock wallpaper is suitable for all display sizes.
+ return true;
+ }
+
+ DisplayInfo displayInfo = mWallpaperDisplayHelper.getDisplayInfo(displayId);
+ Point displaySize = new Point(displayInfo.logicalWidth, displayInfo.logicalHeight);
+ int displayOrientation = WallpaperManager.getOrientation(displaySize);
+
+ Point wallpaperImageSize = new Point(
+ (int) Math.ceil(wallpaperData.cropHint.width() / wallpaperData.mSampleSize),
+ (int) Math.ceil(wallpaperData.cropHint.height() / wallpaperData.mSampleSize));
+ if (wallpaperImageSize.equals(0, 0)) {
+ BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ BitmapFactory.decodeFile(wallpaperFile.getAbsolutePath(), options);
+ wallpaperImageSize.set(options.outWidth, options.outHeight);
+ }
+
+ double maxDisplayToImageRatio = Math.max((double) displaySize.x / wallpaperImageSize.x,
+ (double) displaySize.y / wallpaperImageSize.y);
+ if (maxDisplayToImageRatio > 1.5) {
+ return false;
+ }
+
+ // For displays in landscape, we only support images with an aspect ratio >= 11:13
+ if (displayOrientation == ORIENTATION_LANDSCAPE) {
+ return ((double) wallpaperImageSize.x / wallpaperImageSize.y) >= 11.0 / 13;
+ }
+
+ // For other orientations, we don't enforce any aspect ratio.
+ return true;
+ }
}
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 69b2b9b326ba4..d620e98d3437f 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -118,7 +118,6 @@ import android.service.wallpaper.WallpaperService;
import android.system.ErrnoException;
import android.system.Os;
import android.text.TextUtils;
-import android.util.ArraySet;
import android.util.EventLog;
import android.util.IntArray;
import android.util.Slog;
@@ -161,7 +160,6 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
-import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Predicate;
@@ -743,10 +741,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
final WallpaperDisplayHelper mWallpaperDisplayHelper;
final WallpaperCropper mWallpaperCropper;
- // TODO(b/384519749): Remove this set after we introduce the aspect ratio check.
- private final Set mWallpaperCompatibleDisplaysForTest = new ArraySet<>();
-
- private boolean isWallpaperCompatibleForDisplay(int displayId, WallpaperConnection connection) {
+ @VisibleForTesting
+ boolean isWallpaperCompatibleForDisplay(int displayId, WallpaperConnection connection) {
if (connection == null) {
return false;
}
@@ -757,26 +753,14 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
// Image wallpaper
if (isDeviceEligibleForDesktopExperienceWallpaper(mContext)) {
- // TODO(b/384519749): check display's resolution and image wallpaper cropped image
- // aspect ratio.
- return displayId == DEFAULT_DISPLAY
- || mWallpaperCompatibleDisplaysForTest.contains(displayId);
+ return mWallpaperCropper.isWallpaperCompatibleForDisplay(displayId,
+ connection.mWallpaper);
}
// When enableConnectedDisplaysWallpaper is off, we assume the image wallpaper supports all
// usable displays.
return true;
}
- @VisibleForTesting
- void addWallpaperCompatibleDisplayForTest(int displayId) {
- mWallpaperCompatibleDisplaysForTest.add(displayId);
- }
-
- @VisibleForTesting
- void removeWallpaperCompatibleDisplayForTest(int displayId) {
- mWallpaperCompatibleDisplaysForTest.remove(displayId);
- }
-
private void updateFallbackConnection(int clientUid) {
if (mLastWallpaper == null || mFallbackWallpaper == null) return;
final WallpaperConnection systemConnection = mLastWallpaper.connection;
@@ -844,7 +828,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
// `which` flag.
DisplayConnector fallbackConnector =
mFallbackWallpaper.connection.getDisplayConnectorOrCreate(displayId);
- if (fallbackConnector != null && fallbackConnector.mEngine != null) {
+ if (fallbackConnector != null) {
fallbackConnector.mWhich = which;
fallbackConnector.connectLocked(mFallbackWallpaper.connection,
mFallbackWallpaper);
diff --git a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperCropperTest.java b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperCropperTest.java
index b53f6fbee1835..49c37f163ff2b 100644
--- a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperCropperTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperCropperTest.java
@@ -16,6 +16,7 @@
package com.android.server.wallpaper;
+import static android.app.WallpaperManager.FLAG_SYSTEM;
import static android.app.WallpaperManager.ORIENTATION_LANDSCAPE;
import static android.app.WallpaperManager.ORIENTATION_UNKNOWN;
import static android.app.WallpaperManager.ORIENTATION_PORTRAIT;
@@ -23,13 +24,20 @@ import static android.app.WallpaperManager.ORIENTATION_SQUARE_LANDSCAPE;
import static android.app.WallpaperManager.ORIENTATION_SQUARE_PORTRAIT;
import static android.app.WallpaperManager.getOrientation;
import static android.app.WallpaperManager.getRotatedOrientation;
+import static android.os.UserHandle.USER_SYSTEM;
+import static android.view.Display.DEFAULT_DISPLAY;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static com.android.window.flags.Flags.FLAG_MULTI_CROP;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
@@ -37,15 +45,29 @@ import android.graphics.Point;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.util.Log;
import android.util.SparseArray;
+import android.view.Display;
+import android.view.DisplayInfo;
import androidx.test.runner.AndroidJUnit4;
+import com.android.dx.mockito.inline.extended.ExtendedMockito;
+import com.android.dx.mockito.inline.extended.StaticMockitoSession;
+
+import org.junit.AfterClass;
import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.mockito.Mock;
+import org.mockito.quality.Strictness;
+import java.io.File;
+import java.io.IOException;
import java.util.Comparator;
import java.util.List;
@@ -57,6 +79,7 @@ import java.util.List;
@RunWith(AndroidJUnit4.class)
@RequiresFlagsEnabled(FLAG_MULTI_CROP)
public class WallpaperCropperTest {
+ private static final String TAG = "WallpaperCropperTest";
@Mock
private WallpaperDisplayHelper mWallpaperDisplayHelper;
@@ -94,6 +117,8 @@ public class WallpaperCropperTest {
private static final List> ALL_FOLDABLE_DISPLAYS = List.of(
FOLDABLE_ONE, FOLDABLE_TWO, FOLDABLE_THREE, FOLDABLE_FOUR);
+ private static StaticMockitoSession sMockitoSession;
+
private SparseArray mDisplaySizes = new SparseArray<>();
private int mFolded = ORIENTATION_UNKNOWN;
private int mFoldedRotated = ORIENTATION_UNKNOWN;
@@ -103,12 +128,53 @@ public class WallpaperCropperTest {
private static final List ALL_MODES = List.of(
WallpaperCropper.ADD, WallpaperCropper.REMOVE, WallpaperCropper.BALANCE);
+ private final SparseArray mTempDirs = new SparseArray<>();
+
+ private final TemporaryFolder mFolder = new TemporaryFolder();
+
+ @Rule
+ public RuleChain rules = RuleChain.outerRule(mFolder);
+
+ @BeforeClass
+ public static void setUpClass() {
+ sMockitoSession = mockitoSession()
+ .strictness(Strictness.LENIENT)
+ .spyStatic(WallpaperUtils.class)
+ .startMocking();
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ if (sMockitoSession != null) {
+ sMockitoSession.finishMocking();
+ sMockitoSession = null;
+ }
+ }
+
@Before
public void setUp() {
initMocks(this);
+ ExtendedMockito.doAnswer(invocation -> {
+ int userId = (invocation.getArgument(0));
+ return getWallpaperTestDir(userId);
+ }).when(() -> WallpaperUtils.getWallpaperDir(anyInt()));
+
mWallpaperCropper = new WallpaperCropper(mWallpaperDisplayHelper);
}
+ private File getWallpaperTestDir(int userId) {
+ File tempDir = mTempDirs.get(userId);
+ if (tempDir == null) {
+ try {
+ tempDir = mFolder.newFolder(String.valueOf(userId));
+ mTempDirs.append(userId, tempDir);
+ } catch (IOException e) {
+ Log.e(TAG, "getWallpaperTestDir failed at userId= " + userId);
+ }
+ }
+ return tempDir;
+ }
+
private void setUpWithDisplays(List displaySizes) {
mDisplaySizes = new SparseArray<>();
displaySizes.forEach(size -> {
@@ -632,6 +698,134 @@ public class WallpaperCropperTest {
}
}
+ // Test isWallpaperCompatibleForDisplay always return true for the default display.
+ @Test
+ public void isWallpaperCompatibleForDisplay_defaultDisplay_returnTrue()
+ throws Exception {
+ DisplayInfo displayInfo = new DisplayInfo();
+ displayInfo.logicalWidth = 2560;
+ displayInfo.logicalHeight = 1044;
+ doReturn(displayInfo).when(mWallpaperDisplayHelper).getDisplayInfo(eq(DEFAULT_DISPLAY));
+ WallpaperData wallpaperData = createWallpaperData(/* isStockWallpaper = */ false,
+ new Point(100, 100));
+
+ assertThat(
+ mWallpaperCropper.isWallpaperCompatibleForDisplay(DEFAULT_DISPLAY,
+ wallpaperData)).isTrue();
+ }
+
+ // Test isWallpaperCompatibleForDisplay always return true for the stock wallpaper.
+ @Test
+ public void isWallpaperCompatibleForDisplay_stockWallpaper_returnTrue()
+ throws Exception {
+ final int displayId = 2;
+ DisplayInfo displayInfo = new DisplayInfo();
+ displayInfo.logicalWidth = 2560;
+ displayInfo.logicalHeight = 1044;
+ doReturn(displayInfo).when(mWallpaperDisplayHelper).getDisplayInfo(eq(displayId));
+ WallpaperData wallpaperData = createWallpaperData(/* isStockWallpaper = */ true,
+ new Point(100, 100));
+
+ assertThat(
+ mWallpaperCropper.isWallpaperCompatibleForDisplay(displayId,
+ wallpaperData)).isTrue();
+ }
+
+ // Test isWallpaperCompatibleForDisplay wallpaper is suitable for the display and wallpaper
+ // aspect ratio meets the hard-coded aspect ratio.
+ @Test
+ public void isWallpaperCompatibleForDisplay_wallpaperSizeSuitableForDisplayAndMeetAspectRatio_returnTrue()
+ throws Exception {
+ final int displayId = 2;
+ DisplayInfo displayInfo = new DisplayInfo();
+ displayInfo.logicalWidth = 2560;
+ displayInfo.logicalHeight = 1044;
+ doReturn(displayInfo).when(mWallpaperDisplayHelper).getDisplayInfo(eq(displayId));
+ WallpaperData wallpaperData = createWallpaperData(/* isStockWallpaper = */ false,
+ new Point(4000, 3000));
+
+ assertThat(
+ mWallpaperCropper.isWallpaperCompatibleForDisplay(displayId,
+ wallpaperData)).isTrue();
+ }
+
+ // Test isWallpaperCompatibleForDisplay wallpaper is not suitable for the display and wallpaper
+ // aspect ratio meets the hard-coded aspect ratio.
+ @Test
+ public void isWallpaperCompatibleForDisplay_wallpaperSizeNotSuitableForDisplayAndMeetAspectRatio_returnFalse()
+ throws Exception {
+ final int displayId = 2;
+ DisplayInfo displayInfo = new DisplayInfo();
+ displayInfo.logicalWidth = 2560;
+ displayInfo.logicalHeight = 1044;
+ doReturn(displayInfo).when(mWallpaperDisplayHelper).getDisplayInfo(eq(displayId));
+ WallpaperData wallpaperData = createWallpaperData(/* isStockWallpaper = */ false,
+ new Point(1000, 500));
+
+ assertThat(
+ mWallpaperCropper.isWallpaperCompatibleForDisplay(displayId,
+ wallpaperData)).isFalse();
+ }
+
+ // Test isWallpaperCompatibleForDisplay wallpaper is suitable for the display and wallpaper
+ // aspect ratio doesn't meet the hard-coded aspect ratio.
+ @Test
+ public void isWallpaperCompatibleForDisplay_wallpaperSizeSuitableForDisplayAndDoNotMeetAspectRatio_returnFalse()
+ throws Exception {
+ final int displayId = 2;
+ DisplayInfo displayInfo = new DisplayInfo();
+ displayInfo.logicalWidth = 2560;
+ displayInfo.logicalHeight = 1044;
+ doReturn(displayInfo).when(mWallpaperDisplayHelper).getDisplayInfo(eq(displayId));
+ WallpaperData wallpaperData = createWallpaperData(/* isStockWallpaper = */ false,
+ new Point(2000, 4000));
+
+ assertThat(
+ mWallpaperCropper.isWallpaperCompatibleForDisplay(displayId,
+ wallpaperData)).isFalse();
+ }
+
+ // Test isWallpaperCompatibleForDisplay, portrait display, wallpaper is suitable for the display
+ // and wallpaper aspect ratio doesn't meet the hard-coded aspect ratio.
+ @Test
+ public void isWallpaperCompatibleForDisplay_portraitDisplay_wallpaperSizeSuitableForDisplayAndMeetAspectRatio_returnTrue()
+ throws Exception {
+ final int displayId = 2;
+ DisplayInfo displayInfo = new DisplayInfo();
+ displayInfo.logicalWidth = 1044;
+ displayInfo.logicalHeight = 2560;
+ doReturn(displayInfo).when(mWallpaperDisplayHelper).getDisplayInfo(eq(displayId));
+ WallpaperData wallpaperData = createWallpaperData(/* isStockWallpaper = */ false,
+ new Point(2000, 4000));
+
+ assertThat(
+ mWallpaperCropper.isWallpaperCompatibleForDisplay(displayId,
+ wallpaperData)).isTrue();
+ }
+
+ private void mockDisplay(int displayId, Point displayResolution) {
+ final Display mockDisplay = mock(Display.class);
+ when(mockDisplay.getDisplayInfo(any(DisplayInfo.class))).thenAnswer(invocation -> {
+ DisplayInfo displayInfo = invocation.getArgument(0);
+ displayInfo.displayId = displayId;
+ displayInfo.logicalWidth = displayResolution.x;
+ displayInfo.logicalHeight = displayResolution.y;
+ return true;
+ });
+ }
+
+ private WallpaperData createWallpaperData(boolean isStockWallpaper, Point wallpaperSize)
+ throws Exception {
+ WallpaperData wallpaperData = new WallpaperData(USER_SYSTEM, FLAG_SYSTEM);
+ File wallpaperFile = wallpaperData.getWallpaperFile();
+ if (!isStockWallpaper) {
+ wallpaperFile.getParentFile().mkdirs();
+ wallpaperFile.createNewFile();
+ }
+ wallpaperData.cropHint.set(0, 0, wallpaperSize.x, wallpaperSize.y);
+ return wallpaperData;
+ }
+
private static Rect centerOf(Rect container, Point point) {
checkSubset(container, point);
int diffWidth = container.width() - point.x;
diff --git a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java
index bc04fd94c7193..e99c9de108f58 100644
--- a/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/wallpaper/WallpaperManagerServiceTests.java
@@ -123,6 +123,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
+import java.util.Map;
/**
* Tests for the {@link WallpaperManagerService} class.
@@ -742,7 +743,9 @@ public class WallpaperManagerServiceTests {
wallpaper.connection.mService = mockIWallpaperService;
// GIVEN there are two displays: DEFAULT_DISPLAY, 2
final int testDisplayId = 2;
- setUpDisplays(List.of(DEFAULT_DISPLAY, testDisplayId));
+ setUpDisplays(Map.of(
+ DEFAULT_DISPLAY, true,
+ testDisplayId, true));
// WHEN display ID, 2, is ready.
WallpaperManagerInternal wallpaperManagerInternal = LocalServices.getService(
@@ -782,7 +785,9 @@ public class WallpaperManagerServiceTests {
lockWallpaper.connection.mService = mockIWallpaperService;
// GIVEN there are two displays: DEFAULT_DISPLAY, 2
final int testDisplayId = 2;
- setUpDisplays(List.of(DEFAULT_DISPLAY, testDisplayId));
+ setUpDisplays(Map.of(
+ DEFAULT_DISPLAY, true,
+ testDisplayId, true));
// WHEN display ID, 2, is ready.
WallpaperManagerInternal wallpaperManagerInternal = LocalServices.getService(
@@ -823,13 +828,15 @@ public class WallpaperManagerServiceTests {
throws Exception {
final int testUserId = USER_SYSTEM;
mService.switchUser(testUserId, null);
+ mService.mLastWallpaper.connection.mWallpaper.cropHint.set(0, 0, 4000, 2250);
IWallpaperService mockIWallpaperService = mock(IWallpaperService.class);
mService.mFallbackWallpaper.connection.mService = mockIWallpaperService;
// GIVEN there are two displays: DEFAULT_DISPLAY, 2
final int testDisplayId = 2;
- setUpDisplays(List.of(DEFAULT_DISPLAY, testDisplayId));
- // GIVEN the wallpaper isn't compatible with display ID, 2
- mService.removeWallpaperCompatibleDisplayForTest(testDisplayId);
+ setUpDisplays(Map.of(
+ DEFAULT_DISPLAY, true,
+ // Given the wallpaper is smaller thn the display resolution.
+ testDisplayId, false));
// WHEN display ID, 2, is ready.
WallpaperManagerInternal wallpaperManagerInternal = LocalServices.getService(
@@ -868,7 +875,10 @@ public class WallpaperManagerServiceTests {
wallpaper.connection.mService = mockIWallpaperService;
// GIVEN there are two displays: DEFAULT_DISPLAY, 2
final int testDisplayId = 2;
- setUpDisplays(List.of(DEFAULT_DISPLAY, testDisplayId));
+ mService.mLastWallpaper.connection.mWallpaper.cropHint.set(0, 0, 4000, 2250);
+ setUpDisplays(Map.of(
+ DEFAULT_DISPLAY, true,
+ testDisplayId, true));
// GIVEN wallpaper connections have been established for display ID, 2.
WallpaperManagerInternal wallpaperManagerInternal = LocalServices.getService(
WallpaperManagerInternal.class);
@@ -906,7 +916,9 @@ public class WallpaperManagerServiceTests {
lockWallpaper.connection.mService = mockIWallpaperService;
// GIVEN there are two displays: DEFAULT_DISPLAY, 2
final int testDisplayId = 2;
- setUpDisplays(List.of(DEFAULT_DISPLAY, testDisplayId));
+ setUpDisplays(Map.of(
+ DEFAULT_DISPLAY, true,
+ testDisplayId, true));
// GIVEN wallpaper connections have been established for display ID, 2.
WallpaperManagerInternal wallpaperManagerInternal = LocalServices.getService(
WallpaperManagerInternal.class);
@@ -940,9 +952,9 @@ public class WallpaperManagerServiceTests {
mService.mFallbackWallpaper.connection.mService = mockIWallpaperService;
// GIVEN there are two displays: DEFAULT_DISPLAY, 2
final int testDisplayId = 2;
- setUpDisplays(List.of(DEFAULT_DISPLAY, testDisplayId));
- // GIVEN display ID, 2, is incompatible with the wallpaper.
- mService.removeWallpaperCompatibleDisplayForTest(testDisplayId);
+ setUpDisplays(Map.of(
+ DEFAULT_DISPLAY, true,
+ testDisplayId, false));
// GIVEN wallpaper connections have been established for display ID, 2.
WallpaperManagerInternal wallpaperManagerInternal = LocalServices.getService(
WallpaperManagerInternal.class);
@@ -989,7 +1001,9 @@ public class WallpaperManagerServiceTests {
wallpaper.connection.mService = mockIWallpaperService;
// GIVEN there are two displays: DEFAULT_DISPLAY, 2
final int testDisplayId = 2;
- setUpDisplays(List.of(DEFAULT_DISPLAY, testDisplayId));
+ setUpDisplays(Map.of(
+ DEFAULT_DISPLAY, true,
+ testDisplayId, true));
// GIVEN wallpaper connections have been established for displayID, 2.
WallpaperManagerInternal wallpaperManagerInternal = LocalServices.getService(
WallpaperManagerInternal.class);
@@ -1023,7 +1037,9 @@ public class WallpaperManagerServiceTests {
lockWallpaper.connection.mService = mockIWallpaperService;
// GIVEN there are two displays: DEFAULT_DISPLAY, 2
final int testDisplayId = 2;
- setUpDisplays(List.of(DEFAULT_DISPLAY, testDisplayId));
+ setUpDisplays(Map.of(
+ DEFAULT_DISPLAY, true,
+ testDisplayId, true));
// GIVEN wallpaper connections have been established for displayID, 2.
WallpaperManagerInternal wallpaperManagerInternal = LocalServices.getService(
WallpaperManagerInternal.class);
@@ -1051,12 +1067,14 @@ public class WallpaperManagerServiceTests {
@Test
@EnableFlags(Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_WALLPAPER)
public void deviceBooted_multiDisplays_shouldHaveExpectedConnections() {
+ final int testUserId = USER_SYSTEM;
final int incompatibleDisplayId = 2;
final int compatibleDisplayId = 3;
- setUpDisplays(List.of(DEFAULT_DISPLAY, incompatibleDisplayId, compatibleDisplayId));
- mService.removeWallpaperCompatibleDisplayForTest(incompatibleDisplayId);
+ setUpDisplays(Map.of(
+ DEFAULT_DISPLAY, true,
+ compatibleDisplayId, true,
+ incompatibleDisplayId, false));
- final int testUserId = USER_SYSTEM;
// After reboot, a switch user triggers the wallpapers initialization.
mService.switchUser(testUserId, null);
@@ -1087,15 +1105,18 @@ public class WallpaperManagerServiceTests {
public void setWallpaperComponent_multiDisplays_displayBecomeCompatible_shouldHaveExpectedConnections() {
final int display2 = 2;
final int display3 = 3;
- setUpDisplays(List.of(DEFAULT_DISPLAY, display2, display3));
- mService.removeWallpaperCompatibleDisplayForTest(display2);
final int testUserId = USER_SYSTEM;
+ setUpDisplays(Map.of(
+ DEFAULT_DISPLAY, true,
+ display2, false,
+ display3, true));
+
mService.switchUser(testUserId, null);
+ doReturn(true).when(mService.mWallpaperCropper).isWallpaperCompatibleForDisplay(
+ eq(display2), any());
// Switch to a test wallpaper and then image wallpaper later to simulate a wallpaper change.
mService.setWallpaperComponent(TEST_WALLPAPER_COMPONENT, sContext.getOpPackageName(),
FLAG_SYSTEM | FLAG_LOCK, testUserId);
- mService.addWallpaperCompatibleDisplayForTest(display2);
-
mService.setWallpaperComponent(sImageWallpaperComponentName, sContext.getOpPackageName(),
FLAG_SYSTEM | FLAG_LOCK, testUserId);
@@ -1124,15 +1145,19 @@ public class WallpaperManagerServiceTests {
public void setWallpaperComponent_multiDisplays_displayBecomeIncompatible_shouldHaveExpectedConnections() {
final int display2 = 2;
final int display3 = 3;
- setUpDisplays(List.of(DEFAULT_DISPLAY, display2, display3));
- mService.removeWallpaperCompatibleDisplayForTest(display2);
final int testUserId = USER_SYSTEM;
+ setUpDisplays(Map.of(
+ DEFAULT_DISPLAY, true,
+ display2, true,
+ display3, true));
mService.switchUser(testUserId, null);
+ doReturn(false).when(mService.mWallpaperCropper).isWallpaperCompatibleForDisplay(
+ eq(display2), any());
+ doReturn(false).when(mService.mWallpaperCropper).isWallpaperCompatibleForDisplay(
+ eq(display3), any());
// Switch to a test wallpaper and then image wallpaper later to simulate a wallpaper change.
mService.setWallpaperComponent(TEST_WALLPAPER_COMPONENT, sContext.getOpPackageName(),
FLAG_SYSTEM | FLAG_LOCK, testUserId);
- mService.removeWallpaperCompatibleDisplayForTest(display3);
-
mService.setWallpaperComponent(sImageWallpaperComponentName, sContext.getOpPackageName(),
FLAG_SYSTEM | FLAG_LOCK, testUserId);
@@ -1159,14 +1184,15 @@ public class WallpaperManagerServiceTests {
public void setWallpaperComponent_systemAndLockWallpapers_multiDisplays_shouldHaveExpectedConnections() {
final int incompatibleDisplayId = 2;
final int compatibleDisplayId = 3;
- setUpDisplays(List.of(DEFAULT_DISPLAY, incompatibleDisplayId, compatibleDisplayId));
+ setUpDisplays(Map.of(
+ DEFAULT_DISPLAY, true,
+ incompatibleDisplayId, false,
+ compatibleDisplayId, true));
final int testUserId = USER_SYSTEM;
mService.switchUser(testUserId, null);
// Switch to a test wallpaper and then image wallpaper later to simulate a wallpaper change.
mService.setWallpaperComponent(TEST_WALLPAPER_COMPONENT, sContext.getOpPackageName(),
FLAG_SYSTEM | FLAG_LOCK, testUserId);
- mService.removeWallpaperCompatibleDisplayForTest(incompatibleDisplayId);
-
mService.setWallpaperComponent(sImageWallpaperComponentName, sContext.getOpPackageName(),
FLAG_SYSTEM, testUserId);
@@ -1258,21 +1284,27 @@ public class WallpaperManagerServiceTests {
* to return them. It also sets up the {@link WindowManagerInternal} to indicate that all
* displays support home.
*
- * @param displayIds A list of display IDs to create mock displays for.
+ * @param displayIdsToWallpaperCompatibility A map of display IDs to wallpaper compatibility.
*/
- private void setUpDisplays(List displayIds) {
+ private void setUpDisplays(Map displayIdsToWallpaperCompatibility) {
+ spyOn(mService.mWallpaperCropper);
doReturn(true).when(sWindowManagerInternal).isHomeSupportedOnDisplay(anyInt());
- Display[] mockDisplays = new Display[displayIds.size()];
- for (int i = 0; i < displayIds.size(); i++) {
- final int displayId = displayIds.get(i);
+ Display[] mockDisplays = new Display[displayIdsToWallpaperCompatibility.size()];
+ int counter = 0;
+ for (Map.Entry entry : displayIdsToWallpaperCompatibility.entrySet()) {
+ final int displayId = entry.getKey();
+ final boolean compatibleWithWallpaper = entry.getValue();
final Display mockDisplay = mock(Display.class);
- mockDisplays[i] = mockDisplay;
+ mockDisplays[counter] = mockDisplay;
doReturn(DISPLAY_SIZE_DIMENSION).when(mockDisplay).getMaximumSizeDimension();
doReturn(mockDisplay).when(mDisplayManager).getDisplay(eq(displayId));
doReturn(displayId).when(mockDisplay).getDisplayId();
doReturn(true).when(mockDisplay).hasAccess(anyInt());
- mService.addWallpaperCompatibleDisplayForTest(displayId);
+ doReturn(compatibleWithWallpaper).when(
+ mService.mWallpaperCropper).isWallpaperCompatibleForDisplay(eq(displayId),
+ any());
+ counter++;
}
doReturn(mockDisplays).when(mDisplayManager).getDisplays();
@@ -1295,6 +1327,4 @@ public class WallpaperManagerServiceTests {
assertEquals(pfdContents, fileContents);
}
}
-
-
}
--
GitLab
From 9c43bf5cd675b3c80d5f9000b137ac27f978c11f Mon Sep 17 00:00:00 2001
From: Jon Eckenrode
Date: Wed, 19 Feb 2025 23:02:36 +0000
Subject: [PATCH 034/111] Added notes about Android 16 ignoring screen
orientation, aspect ratio, and resizability APIs and manifest attributes.
Flag: DOCS_ONLY
Test: None -- docs won't build
NO_BUG: None created
Change-Id: I9aa4edfd65454aa7c879edbd9fb134bb1dc99b0a
---
core/java/android/app/Activity.java | 26 +++++++-----
core/res/res/values/attrs_manifest.xml | 58 ++++++++++++++------------
2 files changed, 48 insertions(+), 36 deletions(-)
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index ee9c64f973820..b4f653354e07f 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -7684,16 +7684,19 @@ public class Activity extends ContextThemeWrapper
/**
* Change the desired orientation of this activity. If the activity is currently in the
* foreground or otherwise impacting the screen orientation, the screen is immediately changed
- * (possibly causing the activity to be restarted). Otherwise, the requested orientation is used
- * the next time the activity is visible.
+ * (possibly causing the activity to be restarted). Otherwise, the new orientation is used the
+ * next time the activity is visible.
*
*
diff --git a/packages/InputDevices/res/values-am/strings.xml b/packages/InputDevices/res/values-am/strings.xml
index 859325387dff6..722d949f7d8f0 100644
--- a/packages/InputDevices/res/values-am/strings.xml
+++ b/packages/InputDevices/res/values-am/strings.xml
@@ -57,6 +57,5 @@
"ሰርቢያኛ (ሲሪሊክኛ)""ሞንቴኔግሮኛ (ሲሪሊክኛ)""ሮማኒያኛ"
-
-
+ "እንግሊዝኛ (ሕንድ)"
diff --git a/packages/InputDevices/res/values-as/strings.xml b/packages/InputDevices/res/values-as/strings.xml
index e6540e4860552..acff29d4057fd 100644
--- a/packages/InputDevices/res/values-as/strings.xml
+++ b/packages/InputDevices/res/values-as/strings.xml
@@ -57,6 +57,5 @@
"ছাৰ্বিয়ান (চিৰিলিক)""মণ্টেনেগ্ৰিণ (চিৰিলিক)""ৰোমানিয়ান"
-
-
+ "ইংৰাজী (ভাৰত)"
diff --git a/packages/InputDevices/res/values-az/strings.xml b/packages/InputDevices/res/values-az/strings.xml
index aa93a92b994eb..c0fe764ac161c 100644
--- a/packages/InputDevices/res/values-az/strings.xml
+++ b/packages/InputDevices/res/values-az/strings.xml
@@ -57,6 +57,5 @@
"Serb dili (Kiril)""Monteneqro dili (Kiril)""Rumın dili"
-
-
+ "İngilis dili (Hindistan)"
diff --git a/packages/InputDevices/res/values-bg/strings.xml b/packages/InputDevices/res/values-bg/strings.xml
index ceb7e376280f7..78b93dad96350 100644
--- a/packages/InputDevices/res/values-bg/strings.xml
+++ b/packages/InputDevices/res/values-bg/strings.xml
@@ -57,6 +57,5 @@
"сръбски (кирилица)""черногорски (кирилица)""румънски"
-
-
+ "английски (Индия)"
diff --git a/packages/InputDevices/res/values-bn/strings.xml b/packages/InputDevices/res/values-bn/strings.xml
index 369a8035dab8d..da529e1fffadd 100644
--- a/packages/InputDevices/res/values-bn/strings.xml
+++ b/packages/InputDevices/res/values-bn/strings.xml
@@ -57,6 +57,5 @@
"সার্বিয়ান (সিরিলিক)""মন্টেনেগ্রিন (সিরিলিক)""রোমানিয়ান"
-
-
+ "ইংরাজি (ভারত)"
diff --git a/packages/InputDevices/res/values-ca/strings.xml b/packages/InputDevices/res/values-ca/strings.xml
index bbf39467284f2..8b05b49b995cc 100644
--- a/packages/InputDevices/res/values-ca/strings.xml
+++ b/packages/InputDevices/res/values-ca/strings.xml
@@ -57,6 +57,5 @@
"Serbi (ciríl·lic)""Montenegrí (ciríl·lic)""Romanès"
-
-
+ "Anglès (Índia)"
diff --git a/packages/InputDevices/res/values-da/strings.xml b/packages/InputDevices/res/values-da/strings.xml
index 00a2a62091af5..a9925add45f14 100644
--- a/packages/InputDevices/res/values-da/strings.xml
+++ b/packages/InputDevices/res/values-da/strings.xml
@@ -57,6 +57,5 @@
"Serbisk (kyrillisk)""Montenegrinsk (kyrillisk)""Rumænsk"
-
-
+ "Engelsk (Indien)"
diff --git a/packages/InputDevices/res/values-de/strings.xml b/packages/InputDevices/res/values-de/strings.xml
index 717c5975a75f5..9bd23eba8de37 100644
--- a/packages/InputDevices/res/values-de/strings.xml
+++ b/packages/InputDevices/res/values-de/strings.xml
@@ -57,6 +57,5 @@
"Serbisch (kyrillisch)""Montenegrinisch (kyrillisch)""Rumänisch"
-
-
+ "Englisch (Indien)"
diff --git a/packages/InputDevices/res/values-el/strings.xml b/packages/InputDevices/res/values-el/strings.xml
index 02b7f1f8a9fd8..cf49339b7ef26 100644
--- a/packages/InputDevices/res/values-el/strings.xml
+++ b/packages/InputDevices/res/values-el/strings.xml
@@ -57,6 +57,5 @@
"Σερβικά (Κυριλλικά)""Μαυροβουνιακά (Κυριλλικά)""Ρουμανικά"
-
-
+ "Αγγλικά (Ινδίας)"
diff --git a/packages/InputDevices/res/values-en-rAU/strings.xml b/packages/InputDevices/res/values-en-rAU/strings.xml
index 1cdcc552d5eef..3b8c50da6f117 100644
--- a/packages/InputDevices/res/values-en-rAU/strings.xml
+++ b/packages/InputDevices/res/values-en-rAU/strings.xml
@@ -57,6 +57,5 @@
"Serbian (Cyrillic)""Montenegrin (Cyrillic)""Romanian"
-
-
+ "English (India)"
diff --git a/packages/InputDevices/res/values-en-rGB/strings.xml b/packages/InputDevices/res/values-en-rGB/strings.xml
index 1cdcc552d5eef..3b8c50da6f117 100644
--- a/packages/InputDevices/res/values-en-rGB/strings.xml
+++ b/packages/InputDevices/res/values-en-rGB/strings.xml
@@ -57,6 +57,5 @@
"Serbian (Cyrillic)""Montenegrin (Cyrillic)""Romanian"
-
-
+ "English (India)"
diff --git a/packages/InputDevices/res/values-en-rIN/strings.xml b/packages/InputDevices/res/values-en-rIN/strings.xml
index 1cdcc552d5eef..3b8c50da6f117 100644
--- a/packages/InputDevices/res/values-en-rIN/strings.xml
+++ b/packages/InputDevices/res/values-en-rIN/strings.xml
@@ -57,6 +57,5 @@
"Serbian (Cyrillic)""Montenegrin (Cyrillic)""Romanian"
-
-
+ "English (India)"
diff --git a/packages/InputDevices/res/values-es-rUS/strings.xml b/packages/InputDevices/res/values-es-rUS/strings.xml
index edd76575215e8..48ccb8de8d233 100644
--- a/packages/InputDevices/res/values-es-rUS/strings.xml
+++ b/packages/InputDevices/res/values-es-rUS/strings.xml
@@ -57,6 +57,5 @@
"Serbio (cirílico)""Montenegrino (cirílico)""Rumano"
-
-
+ "Inglés (India)"
diff --git a/packages/InputDevices/res/values-es/strings.xml b/packages/InputDevices/res/values-es/strings.xml
index b522845ebacb8..ef7362515f9aa 100644
--- a/packages/InputDevices/res/values-es/strings.xml
+++ b/packages/InputDevices/res/values-es/strings.xml
@@ -57,6 +57,5 @@
"Serbio (cirílico)""Montenegrino (cirílico)""Rumano"
-
-
+ "Inglés (India)"
diff --git a/packages/InputDevices/res/values-et/strings.xml b/packages/InputDevices/res/values-et/strings.xml
index 82670ddd339e7..22891976a02ea 100644
--- a/packages/InputDevices/res/values-et/strings.xml
+++ b/packages/InputDevices/res/values-et/strings.xml
@@ -57,6 +57,5 @@
"serbia (kirillitsa)""montenegro (kirillitsa)""rumeenia"
-
-
+ "inglise (India)"
diff --git a/packages/InputDevices/res/values-eu/strings.xml b/packages/InputDevices/res/values-eu/strings.xml
index b777b8c21ad9d..0fe3b5756b305 100644
--- a/packages/InputDevices/res/values-eu/strings.xml
+++ b/packages/InputDevices/res/values-eu/strings.xml
@@ -57,6 +57,5 @@
"Serbiarra (zirilikoa)""Montenegroarra (zirilikoa)""Errumaniera"
-
-
+ "Ingelesa (India)"
diff --git a/packages/InputDevices/res/values-fa/strings.xml b/packages/InputDevices/res/values-fa/strings.xml
index 9ec7a34193bcf..16b9ad4c1880b 100644
--- a/packages/InputDevices/res/values-fa/strings.xml
+++ b/packages/InputDevices/res/values-fa/strings.xml
@@ -57,6 +57,5 @@
"صربی (سیریلیک)""مونتهنگرویی (سیریلیک)""رومانیایی"
-
-
+ "انگلیسی (هند)"
diff --git a/packages/InputDevices/res/values-fi/strings.xml b/packages/InputDevices/res/values-fi/strings.xml
index 6825ea9396bf8..0d8bd06eeb0df 100644
--- a/packages/InputDevices/res/values-fi/strings.xml
+++ b/packages/InputDevices/res/values-fi/strings.xml
@@ -57,6 +57,5 @@
"serbia (kyrillinen)""montenegro (kyrillinen)""romania"
-
-
+ "englanti (Intia)"
diff --git a/packages/InputDevices/res/values-fr/strings.xml b/packages/InputDevices/res/values-fr/strings.xml
index fb4d1442d71f9..bdb0d02855029 100644
--- a/packages/InputDevices/res/values-fr/strings.xml
+++ b/packages/InputDevices/res/values-fr/strings.xml
@@ -57,6 +57,5 @@
"Serbe (cyrillique)""Monténégrin (cyrillique)""Roumain"
-
-
+ "Anglais (Inde)"
diff --git a/packages/InputDevices/res/values-gl/strings.xml b/packages/InputDevices/res/values-gl/strings.xml
index 925adf9466f9f..c62abba0f1d0b 100644
--- a/packages/InputDevices/res/values-gl/strings.xml
+++ b/packages/InputDevices/res/values-gl/strings.xml
@@ -57,6 +57,5 @@
"Serbio (cirílico)""Montenegrino (cirílico)""Romanés"
-
-
+ "Inglés (India)"
diff --git a/packages/InputDevices/res/values-hi/strings.xml b/packages/InputDevices/res/values-hi/strings.xml
index 175197905af19..bf3bd9a36437d 100644
--- a/packages/InputDevices/res/values-hi/strings.xml
+++ b/packages/InputDevices/res/values-hi/strings.xml
@@ -57,6 +57,5 @@
"सर्बियन (सिरिलिक)""मोंटेनेग्रिन (सिरिलिक)""रोमेनियन"
-
-
+ "अंग्रेज़ी (भारत)"
diff --git a/packages/InputDevices/res/values-hu/strings.xml b/packages/InputDevices/res/values-hu/strings.xml
index c83ba841653b2..6b4259a358116 100644
--- a/packages/InputDevices/res/values-hu/strings.xml
+++ b/packages/InputDevices/res/values-hu/strings.xml
@@ -57,6 +57,5 @@
"szerb (cirill betűs)""montenegrói (cirill betűs)""román"
-
-
+ "angol (India)"
diff --git a/packages/InputDevices/res/values-hy/strings.xml b/packages/InputDevices/res/values-hy/strings.xml
index 718f8d1fede13..43153fab95eb4 100644
--- a/packages/InputDevices/res/values-hy/strings.xml
+++ b/packages/InputDevices/res/values-hy/strings.xml
@@ -57,6 +57,5 @@
"սերբերեն (կյուրեղատառ)""չեռնոգորերեն (կյուրեղատառ)""Ռումիներեն"
-
-
+ "անգլերեն (Հնդկաստան)"
diff --git a/packages/InputDevices/res/values-in/strings.xml b/packages/InputDevices/res/values-in/strings.xml
index ba2e5bd38b9a2..1aa1b2bb1e8aa 100644
--- a/packages/InputDevices/res/values-in/strings.xml
+++ b/packages/InputDevices/res/values-in/strings.xml
@@ -57,6 +57,5 @@
"Serbia (Sirilik)""Montenegro (Sirilik)""Rumania"
-
-
+ "Inggris (India)"
diff --git a/packages/InputDevices/res/values-is/strings.xml b/packages/InputDevices/res/values-is/strings.xml
index 842119d0ee543..9547882f65baa 100644
--- a/packages/InputDevices/res/values-is/strings.xml
+++ b/packages/InputDevices/res/values-is/strings.xml
@@ -57,6 +57,5 @@
"Serbneska (kyrillískt)""Svartfellska (kyrillískt)""rúmenska"
-
-
+ "Enska (Indland)"
diff --git a/packages/InputDevices/res/values-it/strings.xml b/packages/InputDevices/res/values-it/strings.xml
index f7f76e0a64be7..090397de169ca 100644
--- a/packages/InputDevices/res/values-it/strings.xml
+++ b/packages/InputDevices/res/values-it/strings.xml
@@ -57,6 +57,5 @@
"Serbo (cirillico)""Montenegrino (cirillico)""Rumeno"
-
-
+ "Inglese (India)"
diff --git a/packages/InputDevices/res/values-iw/strings.xml b/packages/InputDevices/res/values-iw/strings.xml
index 0df5d20e351b5..b0faa6ef0fa2f 100644
--- a/packages/InputDevices/res/values-iw/strings.xml
+++ b/packages/InputDevices/res/values-iw/strings.xml
@@ -57,6 +57,5 @@
"סרבית (אותיות קיריליות)""מונטנגרית (אותיות קיריליות)""רומנית"
-
-
+ "אנגלית (הודו)"
diff --git a/packages/InputDevices/res/values-kk/strings.xml b/packages/InputDevices/res/values-kk/strings.xml
index 60ad838930a72..05f9243e89a61 100644
--- a/packages/InputDevices/res/values-kk/strings.xml
+++ b/packages/InputDevices/res/values-kk/strings.xml
@@ -57,6 +57,5 @@
"Сербия (кириллица)""Черногория (кириллица)""Румын"
-
-
+ "Ағылшын (Үндістан)"
diff --git a/packages/InputDevices/res/values-km/strings.xml b/packages/InputDevices/res/values-km/strings.xml
index 936c925ab89b8..03a3a439d3334 100644
--- a/packages/InputDevices/res/values-km/strings.xml
+++ b/packages/InputDevices/res/values-km/strings.xml
@@ -57,6 +57,5 @@
"សែប៊ី (ស៊ីរីលីក)""ម៉ុងតេណេហ្គ្រោ (ស៊ីរីលីក)""រ៉ូម៉ានី"
-
-
+ "អង់គ្លេស (ឥណ្ឌា)"
diff --git a/packages/InputDevices/res/values-kn/strings.xml b/packages/InputDevices/res/values-kn/strings.xml
index 24539519f1555..f4f4fa4aeaf71 100644
--- a/packages/InputDevices/res/values-kn/strings.xml
+++ b/packages/InputDevices/res/values-kn/strings.xml
@@ -57,6 +57,5 @@
"ಸೆರ್ಬಿಯನ್ (ಸಿರಿಲಿಕ್)""ಮೊಂಟೆನೆಗ್ರಿನ್ (ಸಿರಿಲಿಕ್)""ರೊಮೇನಿಯನ್"
-
-
+ "ಇಂಗ್ಲಿಷ್ (ಭಾರತ)"
diff --git a/packages/InputDevices/res/values-ky/strings.xml b/packages/InputDevices/res/values-ky/strings.xml
index f6d018ec7f01a..2222900b4c3b0 100644
--- a/packages/InputDevices/res/values-ky/strings.xml
+++ b/packages/InputDevices/res/values-ky/strings.xml
@@ -57,6 +57,5 @@
"Сербче (Кирилл)""Черногориялыкча (Кирилл)""Румынча"
-
-
+ "Англисче (Индия)"
diff --git a/packages/InputDevices/res/values-lo/strings.xml b/packages/InputDevices/res/values-lo/strings.xml
index 61f8f71cf073b..44380b0ba7603 100644
--- a/packages/InputDevices/res/values-lo/strings.xml
+++ b/packages/InputDevices/res/values-lo/strings.xml
@@ -57,6 +57,5 @@
"ເຊີບຽນ (ຊີຣິວລິກ)""ມອນເທເນກຣິນ (ຊີຣິວລິກ)""ໂຣມານຽນ"
-
-
+ "ອັງກິດ (ອິນເດຍ)"
diff --git a/packages/InputDevices/res/values-lv/strings.xml b/packages/InputDevices/res/values-lv/strings.xml
index cc2c94c1811fb..3a55b6af7037a 100644
--- a/packages/InputDevices/res/values-lv/strings.xml
+++ b/packages/InputDevices/res/values-lv/strings.xml
@@ -57,6 +57,5 @@
"Serbu (kirilica)""Melnkalniešu (kirilica)""Rumāņu"
-
-
+ "Angļu (Indija)"
diff --git a/packages/InputDevices/res/values-mk/strings.xml b/packages/InputDevices/res/values-mk/strings.xml
index 60981d65a4849..351ac947c491f 100644
--- a/packages/InputDevices/res/values-mk/strings.xml
+++ b/packages/InputDevices/res/values-mk/strings.xml
@@ -57,6 +57,5 @@
"српски (кирилица)""црногорски (кирилица)""романски"
-
-
+ "англиски (Индија)"
diff --git a/packages/InputDevices/res/values-ml/strings.xml b/packages/InputDevices/res/values-ml/strings.xml
index 8064c74c7b614..ed6cb8b70c967 100644
--- a/packages/InputDevices/res/values-ml/strings.xml
+++ b/packages/InputDevices/res/values-ml/strings.xml
@@ -57,6 +57,5 @@
"സെർബിയൻ (സിറിലിക്)""മോണ്ടിനെഗ്രിൻ (സിറിലിക്)""റൊമേനിയൻ"
-
-
+ "ഇംഗ്ലീഷ് (ഇന്ത്യ)"
diff --git a/packages/InputDevices/res/values-mn/strings.xml b/packages/InputDevices/res/values-mn/strings.xml
index 547ce49fc6584..e77551e1a1237 100644
--- a/packages/InputDevices/res/values-mn/strings.xml
+++ b/packages/InputDevices/res/values-mn/strings.xml
@@ -57,6 +57,5 @@
"Серби (кирилл)""Монтенегро (кирилл)""Румын"
-
-
+ "Англи хэл (Энэтхэг)"
diff --git a/packages/InputDevices/res/values-mr/strings.xml b/packages/InputDevices/res/values-mr/strings.xml
index 25bdfab5a5842..9483a47aef33b 100644
--- a/packages/InputDevices/res/values-mr/strings.xml
+++ b/packages/InputDevices/res/values-mr/strings.xml
@@ -57,6 +57,5 @@
"सर्बियन (सिरिलिक)""मॉन्टेनेग्रिन (सिरिलिक)""रोमानियन"
-
-
+ "इंग्रजी (भारत)"
diff --git a/packages/InputDevices/res/values-my/strings.xml b/packages/InputDevices/res/values-my/strings.xml
index 4ef5aab9bec6a..1325470d68c63 100644
--- a/packages/InputDevices/res/values-my/strings.xml
+++ b/packages/InputDevices/res/values-my/strings.xml
@@ -57,6 +57,5 @@
"ဆားဘီးယား (စီရီလစ်)""မွန်တီနီဂရင်း (စီရီလစ်)""ရိုမေးနီးယား"
-
-
+ "အင်္ဂလိပ် (အိန္ဒိယ)"
diff --git a/packages/InputDevices/res/values-nb/strings.xml b/packages/InputDevices/res/values-nb/strings.xml
index 837e24645e63f..e6c082607b62b 100644
--- a/packages/InputDevices/res/values-nb/strings.xml
+++ b/packages/InputDevices/res/values-nb/strings.xml
@@ -57,6 +57,5 @@
"Serbisk (kyrillisk)""Montenegrisk (kyrillisk)""Rumensk"
-
-
+ "Engelsk (India)"
diff --git a/packages/InputDevices/res/values-ne/strings.xml b/packages/InputDevices/res/values-ne/strings.xml
index 0ab1ea6db71f3..bc2d0bfa27467 100644
--- a/packages/InputDevices/res/values-ne/strings.xml
+++ b/packages/InputDevices/res/values-ne/strings.xml
@@ -57,6 +57,5 @@
"सर्बियाली (सिरिलिक)""मोन्टेनिग्रिन (सिरिलिक)""रोमानियाली"
-
-
+ "अङ्ग्रेजी (भारत)"
diff --git a/packages/InputDevices/res/values-or/strings.xml b/packages/InputDevices/res/values-or/strings.xml
index 97f9088ceb333..7606b6fc26d9f 100644
--- a/packages/InputDevices/res/values-or/strings.xml
+++ b/packages/InputDevices/res/values-or/strings.xml
@@ -57,6 +57,5 @@
"ସର୍ବିଆନ (ସିରିଲିକ)""ମଣ୍ଟେନେଗ୍ରିନ (ସିରିଲିକ)""ରୋମାନିଆନ"
-
-
+ "ଇଂରାଜୀ (ଭାରତ)"
diff --git a/packages/InputDevices/res/values-pl/strings.xml b/packages/InputDevices/res/values-pl/strings.xml
index 0fd962b46e9b2..7f4b58fa9d1af 100644
--- a/packages/InputDevices/res/values-pl/strings.xml
+++ b/packages/InputDevices/res/values-pl/strings.xml
@@ -57,6 +57,5 @@
"serbski (cyrylica)""czarnogórski (cyrylica)""rumuński"
-
-
+ "Angielski (Indie)"
diff --git a/packages/InputDevices/res/values-ro/strings.xml b/packages/InputDevices/res/values-ro/strings.xml
index 169378de0e88e..a416a482da8c8 100644
--- a/packages/InputDevices/res/values-ro/strings.xml
+++ b/packages/InputDevices/res/values-ro/strings.xml
@@ -57,6 +57,5 @@
"Sârbă (caractere chirilice)""Muntenegreană (Chirilică)""Română"
-
-
+ "Engleză (India)"
diff --git a/packages/InputDevices/res/values-si/strings.xml b/packages/InputDevices/res/values-si/strings.xml
index ba27136317d99..2d5ffc3a5a252 100644
--- a/packages/InputDevices/res/values-si/strings.xml
+++ b/packages/InputDevices/res/values-si/strings.xml
@@ -57,6 +57,5 @@
"සර්බියානු (සිරිලික්)""මොන්ටෙනේග්රීන් (සිරිලික්)""රුමේනියානු"
-
-
+ "ඉංග්රීසි (ඉන්දියාව)"
diff --git a/packages/InputDevices/res/values-sq/strings.xml b/packages/InputDevices/res/values-sq/strings.xml
index c77de92f9cdf7..97ab5f9ac3f78 100644
--- a/packages/InputDevices/res/values-sq/strings.xml
+++ b/packages/InputDevices/res/values-sq/strings.xml
@@ -57,6 +57,5 @@
"Serbisht (cirilike)""Malazisht (cirilike)""Rumanisht"
-
-
+ "Anglisht (Indi)"
diff --git a/packages/InputDevices/res/values-sw/strings.xml b/packages/InputDevices/res/values-sw/strings.xml
index d9ac91f860f1b..fd8b84577dd80 100644
--- a/packages/InputDevices/res/values-sw/strings.xml
+++ b/packages/InputDevices/res/values-sw/strings.xml
@@ -57,6 +57,5 @@
"Kiserbia (Kisiriliki)""Kimontenegri (Kisiriliki)""Kiromania"
-
-
+ "Kiingereza (India)"
diff --git a/packages/InputDevices/res/values-ta/strings.xml b/packages/InputDevices/res/values-ta/strings.xml
index fc91d696f5751..0bf41fe7ededb 100644
--- a/packages/InputDevices/res/values-ta/strings.xml
+++ b/packages/InputDevices/res/values-ta/strings.xml
@@ -57,6 +57,5 @@
"செர்பியன் (சிரிலிக்)""மாண்டினெக்ரன் (சிரிலிக்)""ரோமானியன்"
-
-
+ "ஆங்கிலம் (இந்தியா)"
diff --git a/packages/InputDevices/res/values-tl/strings.xml b/packages/InputDevices/res/values-tl/strings.xml
index ea815d5cbd8d4..270331d4776c3 100644
--- a/packages/InputDevices/res/values-tl/strings.xml
+++ b/packages/InputDevices/res/values-tl/strings.xml
@@ -57,6 +57,5 @@
"Serbian (Cyrillic)""Montenegrin (Cyrillic)""Romanian"
-
-
+ "English (India)"
diff --git a/packages/InputDevices/res/values-tr/strings.xml b/packages/InputDevices/res/values-tr/strings.xml
index 3a40c84c71d3c..1d1d4e1e73bde 100644
--- a/packages/InputDevices/res/values-tr/strings.xml
+++ b/packages/InputDevices/res/values-tr/strings.xml
@@ -57,6 +57,5 @@
"Sırpça (Kiril)""Karadağca (Kiril)""Rumence"
-
-
+ "İngilizce (Hindistan)"
diff --git a/packages/InputDevices/res/values-uk/strings.xml b/packages/InputDevices/res/values-uk/strings.xml
index 0e0d562e0b738..70f731d3be819 100644
--- a/packages/InputDevices/res/values-uk/strings.xml
+++ b/packages/InputDevices/res/values-uk/strings.xml
@@ -57,6 +57,5 @@
"Сербська (кирилиця)""Чорногорська (кирилиця)""Румунська"
-
-
+ "Англійська (Індія)"
diff --git a/packages/InputDevices/res/values-ur/strings.xml b/packages/InputDevices/res/values-ur/strings.xml
index 44721b8eb7ac2..07e38357d01da 100644
--- a/packages/InputDevices/res/values-ur/strings.xml
+++ b/packages/InputDevices/res/values-ur/strings.xml
@@ -57,6 +57,5 @@
"سربیائی (سیریلک)""مونٹے نیگریائی (سیریلک)""رومانیائی"
-
-
+ "انگریزی (ہندوستان)"
diff --git a/packages/InputDevices/res/values-uz/strings.xml b/packages/InputDevices/res/values-uz/strings.xml
index 776c1c71a2565..b44820a5ef74d 100644
--- a/packages/InputDevices/res/values-uz/strings.xml
+++ b/packages/InputDevices/res/values-uz/strings.xml
@@ -57,6 +57,5 @@
"Serb (kirill)""Chernogor (kirill)""Rumin"
-
-
+ "Ingliz (Hindiston)"
diff --git a/packages/InputDevices/res/values-vi/strings.xml b/packages/InputDevices/res/values-vi/strings.xml
index 1fcba4269748b..3f9de673135f6 100644
--- a/packages/InputDevices/res/values-vi/strings.xml
+++ b/packages/InputDevices/res/values-vi/strings.xml
@@ -57,6 +57,5 @@
"Tiếng Serbia (Chữ Kirin)""Tiếng Montenegro (Chữ Kirin)""Tiếng Romania"
-
-
+ "Tiếng Anh (Ấn Độ)"
diff --git a/packages/InputDevices/res/values-zh-rCN/strings.xml b/packages/InputDevices/res/values-zh-rCN/strings.xml
index cb7f6cb895dc0..bf37dc5b8ab6e 100644
--- a/packages/InputDevices/res/values-zh-rCN/strings.xml
+++ b/packages/InputDevices/res/values-zh-rCN/strings.xml
@@ -57,6 +57,5 @@
"塞尔维亚语(西里尔字母)""黑山语(西里尔字母)""罗马尼亚语"
-
-
+ "英语(印度)"
diff --git a/packages/InputDevices/res/values-zh-rHK/strings.xml b/packages/InputDevices/res/values-zh-rHK/strings.xml
index c718760a618e8..c30c9723f8fae 100644
--- a/packages/InputDevices/res/values-zh-rHK/strings.xml
+++ b/packages/InputDevices/res/values-zh-rHK/strings.xml
@@ -57,6 +57,5 @@
"塞爾維亞文 (西里爾字母)""蒙特內哥羅文 (西里爾字母)""羅馬尼亞文"
-
-
+ "英文 (印度)"
diff --git a/packages/InputDevices/res/values-zh-rTW/strings.xml b/packages/InputDevices/res/values-zh-rTW/strings.xml
index 68cf9b0e6b207..b840b1c502118 100644
--- a/packages/InputDevices/res/values-zh-rTW/strings.xml
+++ b/packages/InputDevices/res/values-zh-rTW/strings.xml
@@ -57,6 +57,5 @@
"塞爾維亞文 (西里爾字母)""蒙特內哥羅文 (西里爾字母)""羅馬尼亞文"
-
-
+ "英文 (印度)"
diff --git a/packages/InputDevices/res/values-zu/strings.xml b/packages/InputDevices/res/values-zu/strings.xml
index 4ae9e47fdf914..bc79dbd5e8984 100644
--- a/packages/InputDevices/res/values-zu/strings.xml
+++ b/packages/InputDevices/res/values-zu/strings.xml
@@ -57,6 +57,5 @@
"Serbian (Cyrillic)""Montenegrin (Cyrillic)""IsiRomanian"
-
-
+ "IsiNgisi (India)"
--
GitLab
From b1ba76d1010074888e2d208ce7b6551d3b61815d Mon Sep 17 00:00:00 2001
From: Diya Bera
Date: Thu, 20 Feb 2025 23:52:59 +0000
Subject: [PATCH 063/111] Update enabled for app check for Identity Check
Previously, there was only one toggle for "verify it's you" for both
face and fingerprint. As part of biometrics_onboarding_education flag
implementation, there are two separate toggles for face and fingerprint.
Identity Check needs to make sure that the toggle for the sensor that is
enrolled is enabled.
Test: Manual (See bug)
Bug: 397427773
Flag: com.android.settings.flags.biometrics_onboarding_education
Change-Id: I98f5516b0dcb3669d4f9511e7fee2f73a6c49cbb
---
.../server/biometrics/BiometricService.java | 20 ++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java
index a5058dd51a334..cf5fa9699ca97 100644
--- a/services/core/java/com/android/server/biometrics/BiometricService.java
+++ b/services/core/java/com/android/server/biometrics/BiometricService.java
@@ -540,9 +540,23 @@ public class BiometricService extends SystemService {
DEFAULT_MANDATORY_BIOMETRICS_STATUS)
&& mMandatoryBiometricsRequirementsSatisfied.getOrDefault(userId,
DEFAULT_MANDATORY_BIOMETRICS_REQUIREMENTS_SATISFIED_STATUS)
- && getEnabledForApps(userId, TYPE_ANY_BIOMETRIC)
- && (mFingerprintEnrolledForUser.getOrDefault(userId, false /* default */)
- || mFaceEnrolledForUser.getOrDefault(userId, false /* default */));
+ && getBiometricStatusForIdentityCheck(userId);
+ }
+
+ private boolean getBiometricStatusForIdentityCheck(int userId) {
+ if (com.android.settings.flags.Flags.biometricsOnboardingEducation()) {
+ if (mFingerprintEnrolledForUser.getOrDefault(userId, false /* default */)
+ && getEnabledForApps(userId, TYPE_FINGERPRINT)) {
+ return true;
+ } else {
+ return mFaceEnrolledForUser.getOrDefault(userId, false /* default */)
+ && getEnabledForApps(userId, TYPE_FACE);
+ }
+ } else {
+ return (mFingerprintEnrolledForUser.getOrDefault(userId, false /* default */)
+ || mFaceEnrolledForUser.getOrDefault(userId, false /* default */))
+ && getEnabledForApps(userId, TYPE_ANY_BIOMETRIC);
+ }
}
void notifyEnabledOnKeyguardCallbacks(int userId, int modality) {
--
GitLab
From 38c5d9b9ab0dc00f20643843cb2c8b24f8ce03f5 Mon Sep 17 00:00:00 2001
From: James Mattis
Date: Thu, 20 Feb 2025 16:09:45 -0800
Subject: [PATCH 064/111] Return false for emergency calls for automotive
For automotive devices that lack the feature Telephony calling, return
false for emergency calls for the status bar. Not doing so results in
the UI crashing.
Flag: EXEMPT bugfix
Bug: 396801499
Bug: 310710841
Bug: 398045526
Test: AndroidAutomotiveNavigationBarTests:
android.platform.tests.NavigationBarTest#testNotificationButton
Change-Id: I978a4c1f2ca151193cb71d151375b0f675cd9634
---
.../prod/MobileConnectionsRepositoryImpl.kt | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt
index d3369033942e2..2efc0579f333f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryImpl.kt
@@ -20,6 +20,7 @@ import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
+import android.content.pm.PackageManager
import android.telephony.CarrierConfigManager
import android.telephony.SubscriptionInfo
import android.telephony.SubscriptionManager
@@ -192,6 +193,19 @@ constructor(
serviceStateChangedEvent
.mapLatest {
val modems = telephonyManager.activeModemCount
+
+ // Assume false for automotive devices which don't have the calling feature.
+ // TODO: b/398045526 to revisit the below.
+ val isAutomotive: Boolean =
+ context.packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
+ val hasFeatureCalling: Boolean =
+ context.packageManager.hasSystemFeature(
+ PackageManager.FEATURE_TELEPHONY_CALLING
+ )
+ if (isAutomotive && !hasFeatureCalling) {
+ return@mapLatest false
+ }
+
// Check the service state for every modem. If any state reports emergency calling
// capable, then consider the device to have emergency call capabilities
(0..
Date: Wed, 19 Feb 2025 16:20:25 -0800
Subject: [PATCH 065/111] Add javadocs to SurfaceControl APIs
Clarify how to unset properties and callout surprising behaviors
where appropriate.
Fixes: 394897209
Test: n/a
Flag: EXEMPT doc
Change-Id: I1c3fb4988f540542bd869089687d58eff1b16bc8
---
core/java/android/view/SurfaceControl.java | 75 ++++++++++++++++++++--
1 file changed, 70 insertions(+), 5 deletions(-)
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 0903d2293d67e..c4347f05f4a31 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -3080,6 +3080,21 @@ public final class SurfaceControl implements Parcelable {
}
/**
+ * Changes the default ApplyToken.
+ *
+ * ApplyToken is used to determine the order in which Transactions are applied.
+ * Transactions applied with the same ApplyToken will be applied in the order
+ * they were queued in SurfaceFlinger. Transactions are sent via binder so the
+ * caller should be aware of the order in which binder calls are executed in
+ * SurfaceFlinger. This along with the ApplyToken will determine the order
+ * in which Transactions are applied. Transactions with different apply tokens
+ * will be applied in arbitrary order regardless of when they were queued in
+ * SurfaceFlinger.
+ *
+ * Caller must keep track of the previous ApplyToken if they want to restore it.
+ *
+ * Note each buffer producer should have its own ApplyToken in order to ensure
+ * that Transactions are not delayed by Transactions from other buffer producers.
*
* @hide
*/
@@ -3088,6 +3103,7 @@ public final class SurfaceControl implements Parcelable {
}
/**
+ * Returns the default ApplyToken.
*
* @hide
*/
@@ -3096,8 +3112,10 @@ public final class SurfaceControl implements Parcelable {
}
/**
- * Apply the transaction, clearing it's state, and making it usable
+ * Apply the transaction, clearing its state, and making it usable
* as a new transaction.
+ *
+ * This method will also increment the transaction ID for debugging purposes.
*/
public void apply() {
apply(/*sync*/ false);
@@ -3116,7 +3134,7 @@ public final class SurfaceControl implements Parcelable {
/**
- * Clear the transaction object, without applying it.
+ * Clear the transaction object, without applying it. The transction ID is preserved.
*
* @hide
*/
@@ -3375,6 +3393,9 @@ public final class SurfaceControl implements Parcelable {
* If two siblings share the same Z order the ordering is undefined. Surfaces
* with a negative Z will be placed below the parent surface.
*
+ * Calling setLayer after setRelativeLayer will reset the relative layer
+ * in the same transaction.
+ *
* @param sc The SurfaceControl to set the Z order on
* @param z The Z-order
* @return This Transaction.
@@ -3392,6 +3413,22 @@ public final class SurfaceControl implements Parcelable {
}
/**
+ * Set the Z-order for a given SurfaceControl, relative to the specified SurfaceControl.
+ * The SurfaceControl with a negative z will be placed below the relativeTo
+ * SurfaceControl and the SurfaceControl with a positive z will be placed above the
+ * relativeTo SurfaceControl.
+ *
+ * Calling setLayer will reset the relative layer. Calling setRelativeLayer after setLayer
+ * will override the setLayer call.
+ *
+ * If a layer is set to be relative to a layer that is destroyed, the layer will be
+ * offscreen until setLayer is called or setRelativeLayer is called with a valid
+ * SurfaceControl.
+ *
+ * @param sc The SurfaceControl to set the Z order on
+ * @param relativeTo The SurfaceControl to set the Z order relative to
+ * @param z The Z-order
+ * @return This Transaction.
* @hide
*/
public Transaction setRelativeLayer(SurfaceControl sc, SurfaceControl relativeTo, int z) {
@@ -3405,6 +3442,9 @@ public final class SurfaceControl implements Parcelable {
}
/**
+ * The hint from the buffer producer as to what portion of the layer is
+ * transparent.
+ *
* @hide
*/
public Transaction setTransparentRegionHint(SurfaceControl sc, Region transparentRegion) {
@@ -3438,6 +3478,10 @@ public final class SurfaceControl implements Parcelable {
}
/**
+ * Sets the input channel for a given SurfaceControl. The position and order of the
+ * SurfaceControl in conjunction with the touchable region in the InputWindowHandle
+ * determines the hit region.
+ *
* @hide
*/
public Transaction setInputWindowInfo(SurfaceControl sc, InputWindowHandle handle) {
@@ -3549,6 +3593,8 @@ public final class SurfaceControl implements Parcelable {
* surface. If no crop is specified and the surface has no buffer, the surface bounds is
* only constrained by the size of its parent bounds.
*
+ * To unset the crop, pass in an invalid Rect (0, 0, -1, -1)
+ *
* @param sc SurfaceControl to set crop of.
* @param crop Bounds of the crop to apply.
* @hide
@@ -3578,6 +3624,8 @@ public final class SurfaceControl implements Parcelable {
* surface. If no crop is specified and the surface has no buffer, the surface bounds is
* only constrained by the size of its parent bounds.
*
+ * To unset the crop, pass in an invalid Rect (0, 0, -1, -1)
+ *
* @param sc SurfaceControl to set crop of.
* @param crop Bounds of the crop to apply.
* @return this This transaction for chaining
@@ -3625,6 +3673,8 @@ public final class SurfaceControl implements Parcelable {
* surface. If no crop is specified and the surface has no buffer, the surface bounds is
* only constrained by the size of its parent bounds.
*
+ * To unset the crop, pass in an invalid Rect (0, 0, -1, -1)
+ *
* @param sc SurfaceControl to set crop of.
* @param crop Bounds of the crop to apply.
* @return this This transaction for chaining
@@ -3643,7 +3693,12 @@ public final class SurfaceControl implements Parcelable {
}
/**
- * Sets the corner radius of a {@link SurfaceControl}.
+ * Sets the corner radius of a {@link SurfaceControl}. This corner radius is applied to the
+ * SurfaceControl and its children. The API expects a crop to be set on the SurfaceControl
+ * to ensure that the corner radius is applied to the correct region. If the crop does not
+ * intersect with the SurfaceControl's visible content, the corner radius will not be
+ * applied.
+ *
* @param sc SurfaceControl
* @param cornerRadius Corner radius in pixels.
* @return Itself.
@@ -3753,6 +3808,9 @@ public final class SurfaceControl implements Parcelable {
}
/**
+ * Associates a layer with a display. The layer will be drawn on the display with the
+ * specified layer stack. If the layer is not a root layer, this call has no effect.
+ *
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.O)
@@ -3791,6 +3849,7 @@ public final class SurfaceControl implements Parcelable {
/**
* Fills the surface with the specified color.
+ *
* @param color A float array with three values to represent r, g, b in range [0..1]. An
* invalid color will remove the color fill.
* @hide
@@ -3809,8 +3868,9 @@ public final class SurfaceControl implements Parcelable {
/**
* Removes color fill.
- * @hide
- */
+ *
+ * @hide
+ */
public Transaction unsetColor(SurfaceControl sc) {
checkPreconditions(sc);
if (SurfaceControlRegistry.sCallStackDebuggingEnabled) {
@@ -3898,6 +3958,8 @@ public final class SurfaceControl implements Parcelable {
}
/**
+ * Sets the surface to render contents of the display to.
+ *
* @hide
*/
public Transaction setDisplaySurface(IBinder displayToken, Surface surface) {
@@ -3916,6 +3978,9 @@ public final class SurfaceControl implements Parcelable {
}
/**
+ * Sets the layer stack of the display.
+ *
+ * All layers with the same layer stack will be drawn on this display.
* @hide
*/
public Transaction setDisplayLayerStack(IBinder displayToken, int layerStack) {
--
GitLab
From ad27226a4ec17bc33c5a44523833a4ad6dd64aac Mon Sep 17 00:00:00 2001
From: Ikram Gabiyev
Date: Thu, 20 Feb 2025 16:31:49 -0800
Subject: [PATCH 066/111] [PiP2] Properly scale corner radii while animating
If a task leash is scaled by some factor x,
we need to scale the corner raddi by a factor of (1/x)
to make the rounded corners look visually invariant.
We can enforce this during pinching (i.e. schedulerUserResizePip)
and during the resize animation in PipResizeAnimator.
Bug: 397958290
Flag: com.android.wm.shell.enable_pip2
Test: double tap to resize
Test: pinch PiP to resize
Change-Id: I3b4dcdea7e2e5362d2e6504a49de06d73895cb6a
---
.../wm/shell/pip2/PipSurfaceTransactionHelper.java | 12 ++++++++++++
.../wm/shell/pip2/animation/PipResizeAnimator.java | 2 +-
.../android/wm/shell/pip2/phone/PipScheduler.java | 4 ++++
3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/PipSurfaceTransactionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/PipSurfaceTransactionHelper.java
index c4d065f158a43..e0cae81920adb 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/PipSurfaceTransactionHelper.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/PipSurfaceTransactionHelper.java
@@ -133,6 +133,18 @@ public class PipSurfaceTransactionHelper {
return this;
}
+ /**
+ * Operates the round corner radius on a given transaction and leash, scaled by bounds
+ * @return same {@link PipSurfaceTransactionHelper} instance for method chaining
+ */
+ public PipSurfaceTransactionHelper round(SurfaceControl.Transaction tx, SurfaceControl leash,
+ Rect fromBounds, Rect toBounds) {
+ final float scale = (float) (Math.hypot(fromBounds.width(), fromBounds.height())
+ / Math.hypot(toBounds.width(), toBounds.height()));
+ tx.setCornerRadius(leash, mCornerRadius * scale);
+ return this;
+ }
+
/**
* Operates the shadow radius on a given transaction and leash
* @return same {@link PipSurfaceTransactionHelper} instance for method chaining
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/animation/PipResizeAnimator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/animation/PipResizeAnimator.java
index 06e8349259b47..eb5fe88648b36 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/animation/PipResizeAnimator.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/animation/PipResizeAnimator.java
@@ -173,7 +173,7 @@ public class PipResizeAnimator extends ValueAnimator {
transformTensor.postRotate(degrees, targetBounds.centerX(), targetBounds.centerY());
tx.setMatrix(leash, transformTensor, mMatrixTmp)
- .setCornerRadius(leash, cornerRadius)
+ .setCornerRadius(leash, cornerRadius / scaleX)
.setShadowRadius(leash, shadowRadius);
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java
index df7a25af83768..7805ec34e1050 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java
@@ -55,6 +55,7 @@ public class PipScheduler {
private PipTransitionController mPipTransitionController;
private PipSurfaceTransactionHelper.SurfaceControlTransactionFactory
mSurfaceControlTransactionFactory;
+ private final PipSurfaceTransactionHelper mPipSurfaceTransactionHelper;
@Nullable private Runnable mUpdateMovementBoundsRunnable;
@@ -75,6 +76,7 @@ public class PipScheduler {
mSurfaceControlTransactionFactory =
new PipSurfaceTransactionHelper.VsyncSurfaceControlTransactionFactory();
+ mPipSurfaceTransactionHelper = new PipSurfaceTransactionHelper(mContext);
mPipAlphaAnimatorSupplier = PipAlphaAnimator::new;
}
@@ -214,6 +216,8 @@ public class PipScheduler {
transformTensor.postTranslate(toBounds.left, toBounds.top);
transformTensor.postRotate(degrees, toBounds.centerX(), toBounds.centerY());
+ mPipSurfaceTransactionHelper.round(tx, leash, mPipBoundsState.getBounds(), toBounds);
+
tx.setMatrix(leash, transformTensor, mMatrixTmp);
tx.apply();
}
--
GitLab
From dbd9fa2f92da0b50ec3c0dda089ffe2c286a395c Mon Sep 17 00:00:00 2001
From: Ibrahim Yilmaz
Date: Thu, 20 Feb 2025 15:55:01 -0800
Subject: [PATCH 067/111] Revert "[RON] Fix LargeIcon alignment for RONs"
This reverts commit e31d5f3f482c2c4778e6bf318a25a9742aa43075.
Reason for revert: ag/31867278
Change-Id: I02fe60716d8aac56bbee59519215c62bb11608a1
---
.../notification_2025_template_header.xml | 26 +++----------------
.../layout/notification_template_header.xml | 24 +++--------------
core/res/res/values/symbols.xml | 2 --
.../NotificationHeaderViewWrapper.java | 10 -------
4 files changed, 8 insertions(+), 54 deletions(-)
diff --git a/core/res/res/layout/notification_2025_template_header.xml b/core/res/res/layout/notification_2025_template_header.xml
index 5aae67802af9b..72b3798e07806 100644
--- a/core/res/res/layout/notification_2025_template_header.xml
+++ b/core/res/res/layout/notification_2025_template_header.xml
@@ -59,7 +59,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
- android:layout_toStartOf="@id/expand_button_container"
+ android:layout_toStartOf="@id/expand_button"
android:layout_alignWithParentIfMissing="true"
android:layout_marginVertical="@dimen/notification_2025_margin"
android:clipChildren="false"
@@ -81,30 +81,12 @@
android:focusable="false"
/>
-
-
-
-
-
+ android:layout_gravity="top|end"
+ android:layout_alignParentEnd="true" />
-
-
-
+ android:layout_centerVertical="true"
+ android:layout_alignParentEnd="true" />
-
-
-
-
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
index e8affaa4b60fc..e9eecdd8a26f4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java
@@ -31,7 +31,6 @@ import android.view.ViewGroup;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;
import android.widget.DateTimeView;
-import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
@@ -42,7 +41,6 @@ import com.android.app.animation.Interpolators;
import com.android.internal.widget.CachingIconView;
import com.android.internal.widget.NotificationCloseButton;
import com.android.internal.widget.NotificationExpandButton;
-import com.android.systemui.Flags;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.TransformableView;
import com.android.systemui.statusbar.ViewTransformationHelper;
@@ -69,7 +67,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper imple
private CachingIconView mIcon;
private NotificationCloseButton mCloseButton;
private NotificationExpandButton mExpandButton;
- private FrameLayout mExpandButtonSpacer;
private View mAltExpandTarget;
private View mIconContainer;
protected NotificationHeaderView mNotificationHeader;
@@ -157,10 +154,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper imple
mHeaderText = mView.findViewById(com.android.internal.R.id.header_text);
mAppNameText = mView.findViewById(com.android.internal.R.id.app_name_text);
mExpandButton = mView.findViewById(com.android.internal.R.id.expand_button);
- if (Flags.uiRichOngoingForceExpanded()) {
- mExpandButtonSpacer =
- mView.findViewById(com.android.internal.R.id.expand_button_spacer);
- }
mAltExpandTarget = mView.findViewById(com.android.internal.R.id.alternate_expand_target);
mIconContainer = mView.findViewById(com.android.internal.R.id.conversation_icon_container);
mWorkProfileImage = mView.findViewById(com.android.internal.R.id.profile_badge);
@@ -302,9 +295,6 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper imple
boolean expandable,
View.OnClickListener onClickListener,
boolean requestLayout) {
- if (Flags.uiRichOngoingForceExpanded() && mExpandButtonSpacer != null) {
- mExpandButtonSpacer.setVisibility(expandable ? GONE : VISIBLE);
- }
mExpandButton.setVisibility(expandable ? VISIBLE : GONE);
mExpandButton.setOnClickListener(expandable ? onClickListener : null);
if (mAltExpandTarget != null) {
--
GitLab
From 1df6fc35fb4424b1ee8d13ea7c58010e0c39840d Mon Sep 17 00:00:00 2001
From: Bill Yi
Date: Thu, 20 Feb 2025 16:53:06 -0800
Subject: [PATCH 068/111] Import translations. DO NOT MERGE ANYWHERE
Auto-generated-cl: translation import
Change-Id: I8246cdd6e3fb666c7f403c8d838321da2f3ce3ea
---
packages/SystemUI/res/values-af/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-am/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-ar/strings.xml | 33 ++++++++++-----
packages/SystemUI/res/values-as/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-az/strings.xml | 31 +++++++++-----
.../SystemUI/res/values-b+sr+Latn/strings.xml | 25 ++++++-----
packages/SystemUI/res/values-be/strings.xml | 27 +++++++-----
packages/SystemUI/res/values-bg/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-bn/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-bs/strings.xml | 25 ++++++-----
packages/SystemUI/res/values-ca/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-cs/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-da/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-de/strings.xml | 33 ++++++++++-----
packages/SystemUI/res/values-el/strings.xml | 33 ++++++++++-----
.../SystemUI/res/values-en-rAU/strings.xml | 31 +++++++++-----
.../SystemUI/res/values-en-rCA/strings.xml | 13 ++++--
.../SystemUI/res/values-en-rGB/strings.xml | 31 +++++++++-----
.../SystemUI/res/values-en-rIN/strings.xml | 31 +++++++++-----
.../SystemUI/res/values-es-rUS/strings.xml | 37 +++++++++++------
packages/SystemUI/res/values-es/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-et/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-eu/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-fa/strings.xml | 33 ++++++++++-----
packages/SystemUI/res/values-fi/strings.xml | 33 ++++++++++-----
.../SystemUI/res/values-fr-rCA/strings.xml | 33 ++++++++++-----
packages/SystemUI/res/values-fr/strings.xml | 27 +++++++-----
packages/SystemUI/res/values-gl/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-gu/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-hi/strings.xml | 27 +++++++-----
packages/SystemUI/res/values-hr/strings.xml | 25 ++++++-----
packages/SystemUI/res/values-hu/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-hy/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-in/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-is/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-it/strings.xml | 25 ++++++-----
packages/SystemUI/res/values-iw/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-ja/strings.xml | 27 +++++++-----
packages/SystemUI/res/values-ka/strings.xml | 25 ++++++-----
packages/SystemUI/res/values-kk/strings.xml | 37 +++++++++++------
packages/SystemUI/res/values-km/strings.xml | 33 ++++++++++-----
packages/SystemUI/res/values-kn/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-ko/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-ky/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-lo/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-lt/strings.xml | 25 ++++++-----
packages/SystemUI/res/values-lv/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-mk/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-ml/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-mn/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-mr/strings.xml | 27 +++++++-----
packages/SystemUI/res/values-ms/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-my/strings.xml | 33 ++++++++++-----
packages/SystemUI/res/values-nb/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-ne/strings.xml | 35 ++++++++++------
packages/SystemUI/res/values-nl/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-or/strings.xml | 41 ++++++++++++-------
packages/SystemUI/res/values-pa/strings.xml | 25 ++++++-----
packages/SystemUI/res/values-pl/strings.xml | 31 +++++++++-----
.../SystemUI/res/values-pt-rBR/strings.xml | 31 +++++++++-----
.../SystemUI/res/values-pt-rPT/strings.xml | 27 +++++++-----
packages/SystemUI/res/values-pt/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-ro/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-ru/strings.xml | 33 ++++++++++-----
packages/SystemUI/res/values-si/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-sk/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-sl/strings.xml | 27 +++++++-----
packages/SystemUI/res/values-sq/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-sr/strings.xml | 25 ++++++-----
packages/SystemUI/res/values-sv/strings.xml | 35 ++++++++++------
packages/SystemUI/res/values-sw/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-ta/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-te/strings.xml | 33 ++++++++++-----
packages/SystemUI/res/values-th/strings.xml | 27 +++++++-----
packages/SystemUI/res/values-tl/strings.xml | 33 ++++++++++-----
packages/SystemUI/res/values-tr/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-uk/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-ur/strings.xml | 25 ++++++-----
packages/SystemUI/res/values-uz/strings.xml | 31 +++++++++-----
packages/SystemUI/res/values-vi/strings.xml | 31 +++++++++-----
.../SystemUI/res/values-zh-rCN/strings.xml | 31 +++++++++-----
.../SystemUI/res/values-zh-rHK/strings.xml | 25 ++++++-----
.../SystemUI/res/values-zh-rTW/strings.xml | 25 ++++++-----
packages/SystemUI/res/values-zu/strings.xml | 31 +++++++++-----
84 files changed, 1672 insertions(+), 868 deletions(-)
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 538d9e23e5c27..547a5b1e4fd33 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth gekoppel.""Bluetooth-toestelikoon""Klik om toestelbesonderhede op te stel."
- "Klik om alle toestelle te sien"
- "Klik om met nuwe toestel te koppel"
+
+
+
+
+
+ "Batterypersentasie is onbekend.""Gekoppel aan %s.""Gekoppel aan %s."
@@ -808,12 +812,9 @@
"%1$s steun nie gesprekskenmerke nie""Terugvoer""Maak toe"
-
-
-
-
-
-
+ "Moenie as vasgespeld wys nie"
+ "Wys tans regstreekse opdaterings"
+ "Vasgespelde kennisgewings wys regstreekse inligting vanaf apps en verskyn altyd op die statusbalk en sluitskerm""Hierdie kennisgewings kan nie gewysig word nie.""Oproepkennisgewings kan nie gewysig word nie.""Hierdie groep kennisgewings kan nie hier opgestel word nie"
@@ -900,7 +901,10 @@
"Verrigting van veelvuldige take""Gebruik verdeelde skerm met app aan die regterkant""Gebruik verdeelde skerm met app aan die linkerkant"
- "Skakel oor na volskerm"
+
+
+
+ "Skakel oor na app regs of onder terwyl jy verdeelde skerm gebruik""Skakel oor na app links of bo terwyl jy verdeelde skerm gebruik""Tydens verdeelde skerm: verplaas ’n app van een skerm na ’n ander"
@@ -987,6 +991,8 @@
"Wys laeprioriteit-kennisgewingikone""Ander"
+
+ "verwyder teël""voeg teël by die laaste posisie""Skuif teël"
@@ -1501,6 +1507,8 @@
"Bekyk onlangse apps""Wissel apps""Klaar"
+
+ "Probeer weer!""Gaan terug""Swiep links of regs met drie vingers op jou raakpaneel"
@@ -1538,7 +1546,10 @@
"Swiep op en hou met drie vingers op die raakpaneel om onlangse apps te bekyk""Druk die handelingsleutel op jou sleutelbord om al jou apps te bekyk""Gewysig"
- "Ontsluit om te kyk"
+
+
+
+ "Kontekstuele opvoeding""Gebruik jou raakpaneel om terug te gaan""Swiep links of regs met drie vingers. Tik om meer gebare te leer."
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index f1b9fca25975e..56ac2feac2525 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -245,8 +245,12 @@
"ብሉቱዝ ተያይዟል።""የብሉቱዝ መሣሪያ አዶ""የመሣሪያ ዝርዝርን ለማዋቀር ጠቅ ያድርጉ"
- "ሁሉንም መሣሪያዎች ለማየት ጠቅ ያድርጉ"
- "ከአዲስ መሣሪያ ጋር ለማጣመር ጠቅ ያድርጉ"
+
+
+
+
+
+ "የባትሪ መቶኛ አይታወቅም።""ከ%s ጋር ተገናኝቷል።""ከ%s ጋር ተገናኝቷል።"
@@ -808,12 +812,9 @@
"%1$s የውይይት ባህሪያትን አይደግፍም""ግብረመልስ""አሰናብት"
-
-
-
-
-
-
+ "ፒን እንደተደረገ አታሳይ"
+ "የቀጥታ ዝማኔዎችን በማሳየት ላይ"
+ "ፒን የተደረጉ ማሳወቂያዎች ከመተግበሪያዎች ላይ Live መረጃ ያሳያሉ እና በሁኔታ አሞሌ እና ማያ ገፅ ቁልፍ ላይ ሁልጊዜ ይታያሉ""እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።""የጥሪ ማሳወቂያዎች ሊቀየሩ አይችሉም።""የማሳወቂያዎች ይህ ቡድን እዚህ ላይ ሊዋቀር አይችልም"
@@ -900,7 +901,10 @@
"ብዙ ተግባራትን በተመሳሳይ ጊዜ ማከናወን""መተግበሪያ በስተቀኝ ላይ ሆኖ የተከፈለ ማያ ገፅን ይጠቀሙ""መተግበሪያ በስተግራ ላይ ሆኖ የተከፈለ ማያ ገፅን ይጠቀሙ"
- "ወደ ሙሉ ገፅ ዕይታ ይቀይሩ"
+
+
+
+ "የተከፈለ ማያ ገጽን ሲጠቀሙ በቀኝ ወይም ከታች ወዳለ መተግበሪያ ይቀይሩ""የተከፈለ ማያ ገጽን ሲጠቀሙ በቀኝ ወይም ከላይ ወዳለ መተግበሪያ ይቀይሩ""በተከፈለ ማያ ገጽ ወቅት፡- መተግበሪያን ከአንዱ ወደ ሌላው ተካ"
@@ -987,6 +991,8 @@
"አነስተኛ ቅድሚያ ያላቸው የማሳወቂያ አዶዎችን አሳይ""ሌላ"
+
+ "ሰቅ አስወግድ""በመጨረሻው ቦታ ላይ ሰቅ ያክሉ""ሰቁን ውሰድ"
@@ -1501,6 +1507,8 @@
"የቅርብ ጊዜ መተግበሪያዎችን አሳይ""መተግበሪያዎችን ይቀያይሩ""ተከናውኗል"
+
+ "እንደገና ይሞክሩ!""ወደኋላ ተመለስ""የመዳሰሻ ሰሌዳዎ ላይ ሦስት ጣቶችን በመጠቀም ወደ ግራ ወይም ወደ ቀኝ ያንሸራትቱ"
@@ -1538,7 +1546,10 @@
"የቅርብ ጊዜ መተግበሪያዎችን ለማየት የመዳሰሻ ሰሌዳው ላይ በሦስት ጣቶች ወደላይ ያንሸራትቱ እና ይያዙ""ሁሉንም መተግበሪያዎችዎን ለማየት በቁልፍ ሰሌዳዎ ላይ ያለውን የተግባር ቁልፍ ይጫኑ""ጽሁፍ ተቀይሯል"
- "ለመመልከት ይክፈቱ"
+
+
+
+ "የዓውድ ትምህርት""ለመመለስ የመዳሰሻ ሰሌዳዎን ይጠቀሙ""ሦስት ጣቶችን በመጠቀም ወደ ግራ ወይም ወደ ቀኝ ያንሸራትቱ። ምልክቶችን የበለጠ ለማወቅ መታ ያድርጉ።"
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 7d55b85db2bb9..65c4c04628593 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -245,8 +245,12 @@
"تم توصيل البلوتوث.""رمز الجهاز الذي يتضمّن بلوتوث""انقر هنا لضبط إعدادات الجهاز."
- "انقر لعرض جميع الأجهزة."
- "انقر لإقران جهاز جديد."
+
+
+
+
+
+ "نسبة شحن البطارية غير معروفة.""متصل بـ %s.""تم الاتصال بـ %s."
@@ -471,7 +475,7 @@
"سيؤدي هذا إلى حظر جميع الأصوات والاهتزازات، بما في ذلك ما يرد من التنبيهات والموسيقى والفيديو والألعاب.""انقر مرة أخرى للفتح""انقر مرة أخرى"
- "التمرير إلى الأعلى لفتح القفل"
+ "مرِّر إلى الأعلى لفتح القفل""اضغط على رمز فتح القفل لفتح قفل الشاشة.""تم فتح قفل جهازك عند تقريبه من وجهك. مرِّر سريعًا للأعلى لفتح الجهاز.""تم فتح القفل ببصمة وجهك. لفتح الجهاز، اضغط على رمز فتح القفل."
@@ -808,12 +812,9 @@
"لا يدعم تطبيق %1$s ميزات المحادثات.""الملاحظات""إغلاق"
-
-
-
-
-
-
+ "عدم العرض كإشعار مثبَّت"
+ "عرض تغطية مباشرة للأخبار"
+ "تعرِض الإشعارات المثبَّتة معلومات مباشرة من التطبيقات، وتظهر دائمًا في شريط الحالة وعلى شاشة القفل""يتعذّر تعديل هذه الإشعارات.""لا يمكن تعديل إشعارات المكالمات.""يتعذّر ضبط مجموعة الإشعارات هذه هنا."
@@ -900,7 +901,10 @@
"تعدُّد المهام""استخدام \"وضع تقسيم الشاشة\" مع تثبيت التطبيق على اليمين""استخدام \"وضع تقسيم الشاشة\" مع تثبيت التطبيق على اليسار"
- "التبديل إلى وضع ملء الشاشة"
+
+
+
+ "التبديل إلى التطبيق على اليسار أو الأسفل أثناء استخدام \"تقسيم الشاشة\"""التبديل إلى التطبيق على اليمين أو الأعلى أثناء استخدام \"تقسيم الشاشة\"""استبدال تطبيق بآخر في وضع \"تقسيم الشاشة\""
@@ -987,6 +991,8 @@
"إظهار رموز الإشعارات ذات الأولوية المنخفضة""غير ذلك"
+
+ "إزالة بطاقة""إضافة مربّع إلى الموضع الأخير""نقل بطاقة"
@@ -1501,6 +1507,8 @@
"عرض التطبيقات المستخدَمة مؤخرًا""التبديل بين التطبيقات""تم"
+
+ "يُرجى إعادة المحاولة""رجوع""مرِّر سريعًا لليمين أو لليسار باستخدام 3 أصابع على لوحة اللمس"
@@ -1538,7 +1546,10 @@
"لعرض التطبيقات المستخدَمة مؤخرًا، مرِّر سريعًا للأعلى مع استمرار الضغط على لوحة اللمس باستخدام 3 أصابع""لعرض جميع التطبيقات، اضغط على مفتاح الإجراء في لوحة المفاتيح""إشعار مخفي"
- "افتح القفل لعرض المعلومات"
+
+
+
+ "التعليم السياقي""استخدِم لوحة اللمس للرجوع""مرِّر سريعًا لليمين أو لليسار باستخدام 3 أصابع. انقر للتعرّف على المزيد من الإيماءات."
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
index 74c4e3e17982d..784dfeeaeb070 100644
--- a/packages/SystemUI/res/values-as/strings.xml
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -245,8 +245,12 @@
"ব্লুটুথ সংযোগ হ’ল।""ব্লুটুথ ডিভাইচৰ চিহ্ন""ডিভাইচৰ সবিশেষ কনফিগাৰ কৰিবলৈ ক্লিক কৰক"
- "আটাইবোৰ ডিভাইচ চাবলৈ ক্লিক কৰক"
- "নতুন ডিভাইচ পেয়াৰ কৰিবলৈ ক্লিক কৰক"
+
+
+
+
+
+ "বেটাৰীৰ চাৰ্জৰ শতাংশ অজ্ঞাত।""%sৰ লগত সংযোগ কৰা হ’ল।""%sত সংযোগ হ’ল।"
@@ -808,12 +812,9 @@
"%1$sএ বাৰ্তালাপৰ সুবিধাসমূহ সমৰ্থন নকৰে""মতামত""অগ্ৰাহ্য কৰক"
-
-
-
-
-
-
+ "পিন কৰা হিচাপে নেদেখুৱাব"
+ "লাইভ আপডে’ট দেখুওৱা"
+ "পিন কৰি থোৱা জাননীসমূহে এপৰ পৰা লাইভ তথ্য দেখুৱায় আৰু সেয়া সদায় স্থিতি দণ্ড আৰু লক স্ক্ৰীনত ওলায়""এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।""কলৰ জাননীসমূহ সংশোধন কৰিব নোৱাৰি।""এই ধৰণৰ জাননীবোৰ ইয়াত কনফিগাৰ কৰিব পৰা নাযায়"
@@ -900,7 +901,10 @@
"মাল্টিটাস্কিং""সোঁফালে থকা এপ্টোৰ সৈতে বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰক""বাওঁফালে থকা এপ্টোৰ সৈতে বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰক"
- "পূৰ্ণ স্ক্ৰীনলৈ সলনি কৰক"
+
+
+
+ "বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰাৰ সময়ত সোঁফালে অথবা তলত থকা এপলৈ সলনি কৰক""বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰাৰ সময়ত বাওঁফালে অথবা ওপৰত থকা এপলৈ সলনি কৰক""বিভাজিত স্ক্ৰীনৰ ব্যৱহাৰ কৰাৰ সময়ত: কোনো এপ্ এখন স্ক্ৰীনৰ পৰা আনখনলৈ নিয়ক"
@@ -987,6 +991,8 @@
"কম গুৰুত্বপূৰ্ণ জাননীৰ আইকনসমূহ দেখুৱাওক""অন্যান্য"
+
+ "টাইল আঁতৰাবলৈ""অন্তিম স্থানত টাইল যোগ দিয়ক""টাইল স্থানান্তৰ কৰক"
@@ -1501,6 +1507,8 @@
"শেহতীয়া এপ্সমূহ চাওক""এপ্সমূহ সলনি কৰক""হ’ল"
+
+ "পুনৰ চেষ্টা কৰক!""উভতি যাওক""আপোনাৰ টাচ্চপেডত তিনিটা আঙুলি ব্যৱহাৰ কৰি বাওঁফাললৈ বা সোঁফাললৈ ছোৱাইপ কৰক"
@@ -1538,7 +1546,10 @@
"শেহতীয়া এপ্সমূহ চাবলৈ টাচ্চপেডখনত তিনিটা আঙুলিৰে ওপৰলৈ ছোৱাইপ কৰি ধৰি ৰাখক""আপোনাৰ আটাইবোৰ এপ্ চাবলৈ আপোনাৰ কীব’ৰ্ডৰ কাৰ্য কীটোত টিপক""সম্পাদনা কৰা হৈছে"
- "চাবলৈ আনলক কৰক"
+
+
+
+ "প্ৰাসংগিক শিক্ষা""উভতি যাবলৈ আপোনাৰ টাচ্চপেড ব্যৱহাৰ কৰক""তিনিটা আঙুলি ব্যৱহাৰ কৰি বাওঁফাললৈ বা সোঁফাললৈ ছোৱাইপ কৰক। অধিক নিৰ্দেশ শিকিবলৈ টিপক।"
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index 4b316b67bb7ab..4df261ccaf8ba 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth qoşulub.""Bluetooth cihazı ikonası""Cihaz təfərrüatlarını konfiqurasiya etmək üçün klikləyin"
- "Bütün cihazları görmək üçün klikləyin"
- "Yeni cihazı birləşdirmək üçün klikləyin"
+
+
+
+
+
+ "Batareyanın faizi naməlumdur.""%s üzərindən qoşuldu.""%s cihazına qoşulub."
@@ -808,12 +812,9 @@
"%1$s söhbət funksiyalarını dəstəkləmir""Rəy""Rədd edin"
-
-
-
-
-
-
+ "Bərkidilmiş kimi göstərməyin"
+ "Canlı güncəlləmələr göstərilir"
+ "Bərkidilmiş bildirişlər tətbiqlərdəki canlı məlumatları göstərir, həmişə status panelində və kilidli ekranda görünür""Bu bildirişlər dəyişdirilə bilməz.""Zəng bildirişləri dəyişdirilə bilməz.""Bu bildiriş qrupunu burada konfiqurasiya etmək olmaz"
@@ -900,7 +901,10 @@
"Çoxsaylı tapşırıq icrası""Tətbiq sağda olmaqla bölünmüş ekranı istifadə edin""Tətbiq solda olmaqla bölünmüş ekranı istifadə edin"
- "Tam ekran rejiminə keçin"
+
+
+
+ "Bölünmüş ekran istifadə edərkən sağda və ya aşağıda tətbiqə keçin""Bölünmüş ekran istifadə edərkən solda və ya yuxarıda tətbiqə keçin""Bölünmüş ekran rejimində: tətbiqi birindən digərinə dəyişin"
@@ -987,6 +991,8 @@
"Aşağı prioritet bildiriş işarələrini göstərin""Digər"
+
+ "lövhəni silin""son mövqeyə mozaik əlavə edin""Lövhəni köçürün"
@@ -1501,6 +1507,8 @@
"Son tətbiqlərə baxın""Başqa tətbiqə keçin""Hazırdır"
+
+ "Yenidən cəhd edin!""Geri qayıdın""Taçpeddə üç barmaqla sola və ya sağa sürüşdürün"
@@ -1538,7 +1546,10 @@
"Son tətbiqlərə baxmaq üçün taçpeddə üç barmağınızla yuxarı çəkib saxlayın""Bütün tətbiqlərə baxmaq üçün klaviaturada fəaliyyət açarını basın""Çıxarılıb"
- "Baxmaq üçün kiliddən çıxarın"
+
+
+
+ "Kontekstual təhsil""Geri qayıtmaq üçün taçped istifadə edin""Üç barmaqla sola və ya sağa çəkin. Daha çox jest öyrənmək üçün toxunun."
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 9a5bc490764cd..0f03ee4513899 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -245,8 +245,9 @@
"Bluetooth je priključen.""Ikona Bluetooth uređaja""Kliknite da biste konfigurisali detalje o uređaju"
- "Kliknite da biste videli sve uređaje"
- "Kliknite da biste uparili nov uređaj"
+ "%s. Konfigurišite detalje o uređaju"
+ "Pogledajte sve uređaje"
+ "Uparite novi uređaj""Procenat napunjenosti baterije nije poznat.""Povezani ste sa %s.""Povezani smo sa uređajem %s."
@@ -808,12 +809,9 @@
"%1$s ne podržava funkcije konverzacije""Povratne informacije""Odbaci"
-
-
-
-
-
-
+ "Ne prikazuj kao zakačeno"
+ "Prikazuju se novosti uživo"
+ "Zakačena obaveštenja prikazuju informacije uživo iz aplikacija i uvek se pojavljuju na statusnoj traci i zaključanom ekranu""Ova obaveštenja ne mogu da se menjaju.""Obaveštenja o pozivima ne mogu da se menjaju.""Ova grupa obaveštenja ne može da se konfiguriše ovde"
@@ -900,7 +898,8 @@
"Obavljanje više zadataka istovremeno""Koristi podeljeni ekran sa aplikacijom s desne strane""Koristi podeljeni ekran sa aplikacijom s leve strane"
- "Pređi na režim preko celog ekrana"
+ "Koristi prikaz preko celog ekrana"
+ "Koristi prikaz za računare""Pređi u aplikaciju zdesna ili ispod dok je podeljen ekran""Pređite u aplikaciju sleva ili iznad dok koristite podeljeni ekran""U režimu podeljenog ekrana: zamena jedne aplikacije drugom"
@@ -987,6 +986,8 @@
"Prikaži ikone obaveštenja niskog prioriteta""Drugo"
+
+ "uklonili pločicu""dodali pločicu na poslednju poziciju""Premestite pločicu"
@@ -1501,6 +1502,7 @@
"Prikaži nedavno korišćene aplikacije""Pređi na drugu aplikaciju""Gotovo"
+ "Dalje""Probajte ponovo.""Nazad""Prevucite ulevo ili udesno sa tri prsta na tačpedu"
@@ -1538,7 +1540,10 @@
"Da biste pregledali nedavne aplikacije, prevucite nagore i zadržite sa tri prsta na tačpedu""Da biste pogledali sve aplikacije, pritisnite taster radnji na tastaturi""Redigovano"
- "Otključajte za prikaz"
+
+
+
+ "Kontekstualno obrazovanje""Koristite tačped za vraćanje nazad""Prevucite ulevo ili udesno sa tri prsta. Dodirnite da biste videli više pokreta."
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 5fc56bc798c8c..f952983052f2b 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -245,8 +245,9 @@
"Bluetooth-сувязь.""Значок прылады з Bluetooth""Націсніце, каб задаць падрабязныя налады прылады"
- "Націсніце, каб пабачыць усе прылады"
- "Націсніце, каб спалучыць новую прыладу"
+ "%s. Наладзіць звесткі пра прыладу"
+ "Паглядзець усе прылады"
+ "Спалучыць новую прыладу""Працэнт зараду акумулятара невядомы.""Падлучаны да %s.""Ёсць падключэнне да %s."
@@ -471,7 +472,7 @@
"Гэта заблакіруе ЎСЕ гукі і вібрацыі, у тым ліку ад будзільнікаў, музыкі, відэа і гульняў.""Дакраніцеся яшчэ раз, каб адкрыць""Націсніце яшчэ раз"
- "Каб адкрыць, прагарніце ўверх"
+ "Каб адкрыць, правядзіце пальцам уверх""Каб адкрыць, націсніце значок разблакіроўкі""Твар распазнаны. Каб адкрыць, прагарніце ўверх.""Твар распазнаны. Для адкрыцця націсніце значок разблакіроўкі"
@@ -808,12 +809,9 @@
"%1$s не падтрымлівае функцыі размовы""Водгук""Закрыць"
-
-
-
-
-
-
+ "Не паказваць як замацаванае"
+ "Паказ навін у рэальным часе"
+ "Замацаваныя апавяшчэнні паказваюць актуальную інфармацыю з праграм і заўсёды з’яўляюцца на панэлі стану і экране блакіроўкі""Гэтыя апавяшчэнні нельга змяніць.""Апавяшчэнні пра выклікі нельга змяніць.""Тут канфігурыраваць гэту групу апавяшчэнняў забаронена"
@@ -900,7 +898,8 @@
"Шматзадачнасць""Падзяліць экран і памясціць праграму справа""Падзяліць экран і памясціць праграму злева"
- "Уключыць поўнаэкранны рэжым"
+ "Выкарыстоўваць поўнаэкранны рэжым"
+ "Выкарыстоўваць версію для камп’ютараў""Пераключыцца на праграму справа або ўнізе на падзеленым экране""Пераключыцца на праграму злева або ўверсе на падзеленым экране""У рэжыме падзеленага экрана замяніць адну праграму на іншую"
@@ -987,6 +986,8 @@
"Паказваць значкі апавяшчэнняў з нізкім прыярытэтам""Іншае"
+
+ "выдаліць плітку""дадаць плітку ў апошнюю пазіцыю""Перамясціць плітку"
@@ -1501,6 +1502,7 @@
"Прагляд нядаўніх праграм""Пераключэнне праграм""Гатова"
+ "Далей""Паспрабуйце яшчэ раз!""Назад""Правядзіце па сэнсарнай панэлі трыма пальцамі ўлева ці ўправа"
@@ -1538,7 +1540,10 @@
"Для прагляду нядаўніх праграм правядзіце па сэнсарнай панэлі трыма пальцамі ўверх і затрымайцеся""Каб праглядзець усе праграмы, націсніце на клавішу дзеяння на клавіятуры""Схавана"
- "Разблакіруйце экран, каб праглядзець"
+
+
+
+ "Кантэкстнае навучанне""Выкарыстайце сэнсарную панэль для вяртання""Правядзіце ўлева ці ўправа трыма пальцамі. Націсніце, каб азнаёміцца з іншымі жэстамі."
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 339d751b15945..78b2d0b391e39 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth е включен.""Икона за устройство с Bluetooth""Кликнете, за да конфигурирате подробностите за устройството"
- "Кликнете, за да видите всички устройства"
- "Кликнете за сдвояване на ново устройство"
+
+
+
+
+
+ "Процентът на батерията е неизвестен.""Има връзка с %s.""Установена е връзка с/ъс %s."
@@ -808,12 +812,9 @@
"%1$s не поддържа функциите за разговор""Отзиви""Отхвърляне"
-
-
-
-
-
-
+ "Без показване като фиксирано"
+ "Показване на актуализации на живо"
+ "Фиксираните известия показват информация в реално време от приложенията и винаги се показват в лентата на състоянието и на заключения екран""Тези известия не могат да бъдат променяни.""Известията за обаждания не могат да бъдат променяни.""Тази група от известия не може да бъде конфигурирана тук"
@@ -900,7 +901,10 @@
"Няколко задачи едновременно""Използване на разделен екран с приложението вдясно""Използване на разделен екран с приложението вляво"
- "Превключване на цял екран"
+
+
+
+ "Превключване към приложението вдясно/отдолу в режима на разделен екран""Превключване към приложението вляво/отгоре в режима на разделен екран""При разделен екран: замяна на дадено приложение с друго"
@@ -987,6 +991,8 @@
"Показване на иконите за известията с нисък приоритет""Друго"
+
+ "премахване на панел""добавяне на панела на последната позиция""Преместване на панел"
@@ -1501,6 +1507,8 @@
"Преглед на скорошните приложения""Превключване на приложенията""Готово"
+
+ "Опитайте отново!""Назад""Плъзнете три пръста наляво или надясно по сензорния панел"
@@ -1538,7 +1546,10 @@
"За да прегледате скорошните приложения, плъзнете нагоре по сензорния панел с три пръста и задръжте""За да прегледате всичките си приложения, натиснете клавиша за действия на клавиатурата си""Скрито"
- "Отключете за преглед"
+
+
+
+ "Контекстуално обучение""Използвайте сензорния панел, за да се върнете назад""Плъзнете три пръста наляво или надясно. Докоснете, за да научите повече жестове."
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index ef1253b55de0c..abbfd69b289e0 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -245,8 +245,12 @@
"ব্লুটুথ সংযুক্ত হয়েছে৷""ব্লুটুথ ডিভাইসের আইকন""ডিভাইসের বিবরণ কনফিগার করতে ক্লিক করুন"
- "সব ডিভাইস দেখতে ক্লিক করুন"
- "নতুন ডিভাইস পেয়ার করতে ক্লিক করুন"
+
+
+
+
+
+ "ব্যাটারি কত শতাংশ আছে তা জানা যায়নি।""%sএ সংযুক্ত হয়ে আছে।""%s এর সাথে সংযুক্ত৷"
@@ -808,12 +812,9 @@
"%1$s-এ কথোপকথন ফিচার কাজ করে না""মতামত""বাতিল করুন"
-
-
-
-
-
-
+ "পিন করা হিসেবে দেখতে চাই না"
+ "লাইভ আপডেট দেখানো হচ্ছে"
+ "পিন করা বিজ্ঞপ্তিগুলি অ্যাপ থেকে লাইভ তথ্য দেখায় এবং তা সর্বদা স্ট্যাটাস বার ও লক স্ক্রিনে দেখানো হয়""এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।""কল বিজ্ঞপ্তি পরিবর্তন করা যাবে না।""এই সমস্ত বিজ্ঞপ্তিকে এখানে কনফিগার করা যাবে না"
@@ -900,7 +901,10 @@
"মাল্টিটাস্কিং""ডানদিকে বর্তমান অ্যাপে স্প্লিট স্ক্রিন ব্যবহার করুন""বাঁদিকে বর্তমান অ্যাপে স্প্লিট স্ক্রিন ব্যবহার করুন"
- "ফুল-স্ক্রিন মোডে সুইচ করুন"
+
+
+
+ "স্প্লিট স্ক্রিন ব্যবহার করার সময় ডানদিকের বা নিচের অ্যাপে পাল্টে নিন""স্প্লিট স্ক্রিন ব্যবহার করার সময় বাঁদিকের বা উপরের অ্যাপে পাল্টে নিন""\'স্প্লিট স্ক্রিন\' থাকাকালীন: একটি অ্যাপ থেকে অন্যটিতে পাল্টান"
@@ -987,6 +991,8 @@
"কম-গুরুত্বপূর্ণ বিজ্ঞপ্তির আইকন দেখুন""অন্যান্য"
+
+ "টাইল সরান""শেষ জায়গাতে টাইল যোগ করুন""টাইল সরান"
@@ -1501,6 +1507,8 @@
"সম্প্রতি ব্যবহার করা হয়েছে এমন অ্যাপ দেখুন""অ্যাপ পরিবর্তন করুন""হয়ে গেছে"
+
+ "আবার চেষ্টা করুন!""ফিরে যান""আপনার টাচপ্যাডে তিনটি আঙুল ব্যবহার করে বাঁদিকে বা ডানদিকে সোয়াইপ করুন"
@@ -1538,7 +1546,10 @@
"সম্প্রতি ব্যবহার করা অ্যাপ দেখতে, টাচপ্যাডে তিনটি আঙুল ব্যবহার করে উপরের দিকে সোয়াইপ করে ধরে রাখুন""আপনার সব অ্যাপ দেখতে, কীবোর্ডে অ্যাকশন কী প্রেস করুন""রিড্যাক্ট করা হয়েছে"
- "দেখার জন্য আনলক করুন"
+
+
+
+ "প্রাসঙ্গিক শিক্ষা""ফিরে যেতে টাচপ্যাড ব্যবহার করুন""তিনটি আঙুলের ব্যবহার করে ডান বা বাঁদিকে সোয়াইপ করুন। আরও জেসচার সম্পর্কে জানতে ট্যাপ করুন।"
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index aa036d4534283..3e1699142ab32 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -245,8 +245,9 @@
"Bluetooth je povezan.""Ikona Bluetooth uređaja""Kliknite da konfigurirate detalje uređaja"
- "Pregled svih uređaja klikom"
- "Uparivanje novog uređaja klikom"
+ "%s. Konfigurirajte pojedinosti o uređaju"
+ "Pogledajte sve uređaje"
+ "Upari novi uređaj""Postotak napunjenosti baterije nije poznat""Povezan na %s.""Povezan na %s."
@@ -808,12 +809,9 @@
"Aplikacija %1$s ne podržava funkcije razgovora""Povratne informacije""Odbaci"
-
-
-
-
-
-
+ "Ne prikazuj kao zakačeno"
+ "Prikazivanje novosti uživo"
+ "Zakačena obavještenja prikazuju informacije uživo iz aplikacija i uvijek se prikazuju na statusnoj traci i zaključanom ekranu""Ta obavještenja se ne mogu izmijeniti.""Nije moguće izmijeniti obavještenja o pozivima.""Ovu grupu obavještenja nije moguće konfigurirati ovdje"
@@ -900,7 +898,8 @@
"Multitasking""Korištenje podijeljenog ekrana s aplikacijom na desnoj strani""Korištenje podijeljenog ekrana s aplikacijom na lijevoj strani"
- "Prelazak na prikaz preko cijelog ekrana"
+ "Upotreba prikaza na cijelom zaslonu"
+ "Upotreba prikaza na računalu""Prelazak u aplikaciju desno ili ispod uz podijeljeni ekran""Pređite u aplikaciju lijevo ili iznad dok koristite podijeljeni ekran""Za vrijeme podijeljenog ekrana: zamjena jedne aplikacije drugom"
@@ -987,6 +986,8 @@
"Prikaži ikone obavještenja niskog prioriteta""Ostalo"
+
+ "uklanjanje kartice""dodavanje kartice na posljednji položaj""Pomjeranje kartice"
@@ -1501,6 +1502,7 @@
"Prikaži nedavne aplikacije""Promijenite aplikaciju""Gotovo"
+ "Dalje""Pokušajte ponovo!""Nazad""Prevucite ulijevo ili udesno s tri prsta na dodirnoj podlozi"
@@ -1538,7 +1540,10 @@
"Da pregledate nedavne aplikacije, prevucite nagore i zadržite s tri prsta na dodirnoj podlozi""Da pregledate sve aplikacije, pritisnite tipku radnji na tastaturi""Redigovano"
- "Otključajte da pregledate"
+
+
+
+ "Kontekstualno obrazovanje""Koristite dodirnu podlogu da se vratite""Prevucite ulijevo ili udesno s tri prsta. Dodirnite da naučite više pokreta."
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 15d928308e69f..ec363994016d7 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth connectat.""Icona de dispositiu Bluetooth""Fes clic per configurar els detalls del dispositiu"
- "Fes clic per veure tots els dispositius"
- "Fes clic per vincular un dispositiu nou"
+
+
+
+
+
+ "Es desconeix el percentatge de bateria.""S\'ha connectat a %s.""Està connectat amb %s."
@@ -808,12 +812,9 @@
"%1$s no admet les funcions de converses""Suggeriments""Ignora"
-
-
-
-
-
-
+ "No mostris com a fixat"
+ "S\'estan mostrant les actualitzacions en temps real"
+ "Les notificacions fixades mostren informació en temps real de les aplicacions i sempre es mostren a la barra d\'estat i a la pantalla de bloqueig""Aquestes notificacions no es poden modificar.""Les notificacions de trucades no es poden modificar.""Aquest grup de notificacions no es pot configurar aquí"
@@ -900,7 +901,10 @@
"Multitasca""Utilitzar la pantalla dividida amb l\'aplicació a la dreta""Utilitzar la pantalla dividida amb l\'aplicació a l\'esquerra"
- "Canviar a pantalla completa"
+
+
+
+ "Canvia a l\'aplicació de la dreta o de sota amb la pantalla dividida""Canvia a l\'aplicació de l\'esquerra o de dalt amb la pantalla dividida""Durant el mode de pantalla dividida: substitueix una app per una altra"
@@ -987,6 +991,8 @@
"Mostra les icones de notificació amb prioritat baixa""Altres"
+
+ "suprimir el mosaic""afegir una icona a la darrera posició""Mou el mosaic"
@@ -1501,6 +1507,8 @@
"Mostra les aplicacions recents""Canviar d\'aplicació""Fet"
+
+ "Torna-ho a provar""Torna""Llisca cap a l\'esquerra o cap a la dreta amb tres dits al ratolí tàctil"
@@ -1538,7 +1546,10 @@
"Per veure les aplicacions recents, llisca cap amunt amb tres dits i mantén premut al ratolí tàctil""Per veure totes les aplicacions, prem la tecla d\'acció al teclat""Emmascarat"
- "Desbloqueja per veure"
+
+
+
+ "Educació contextual""Utilitza el ratolí tàctil per tornar enrere""Fes lliscar tres dits cap a l\'esquerra o cap a la dreta. Toca per aprendre més gestos."
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 031e59d03bb0a..ca0b21bdc9105 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -245,8 +245,12 @@
"Rozhraní Bluetooth je připojeno.""Ikona zařízení Bluetooth""Kliknutím nakonfigurujete podrobnosti o zařízení"
- "Kliknutím zobrazíte všechna zařízení"
- "Kliknutím spárujete nové zařízení"
+
+
+
+
+
+ "Procento baterie není známé.""Připojeno k zařízení %s.""Jste připojeni k zařízení %s."
@@ -808,12 +812,9 @@
"Aplikace %1$s funkce konverzace nepodporuje""Zpětná vazba""Zavřít"
-
-
-
-
-
-
+ "Zobrazovat připnuté"
+ "Zobrazování aktualit živě"
+ "Připnutá oznámení zobrazují živé informace z aplikací a vždy se zobrazují na stavovém řádku a obrazovce uzamčení""Tato oznámení nelze upravit.""Upozornění na hovor nelze upravit.""Tuto skupinu oznámení tady nelze nakonfigurovat"
@@ -900,7 +901,10 @@
"Multitasking""Použít rozdělenou obrazovku s aplikací vpravo""Použít rozdělenou obrazovku s aplikací vlevo"
- "Přepnout na celou obrazovku"
+
+
+
+ "Přepnout na aplikaci vpravo nebo dole v režimu rozdělené obrazovky""Přepnout na aplikaci vlevo nebo nahoře v režimu rozdělené obrazovky""V režimu rozdělené obrazovky: nahradit jednu aplikaci druhou"
@@ -987,6 +991,8 @@
"Zobrazit ikony oznámení s nízkou prioritou""Jiné"
+
+ "odstranit dlaždici""přidat dlaždici na poslední pozici""Přesunout dlaždici"
@@ -1501,6 +1507,8 @@
"Zobrazit nedávné aplikace""Přepnout aplikace""Hotovo"
+
+ "Zkuste to znovu.""Zpět""Přejeďte po touchpadu třemi prsty doleva nebo doprava"
@@ -1538,7 +1546,10 @@
"Pokud chcete zobrazit poslední aplikace, přejeďte na touchpadu třemi prsty nahoru a podržte je""Pokud chcete zobrazit všechny aplikace, stiskněte na klávesnici akční klávesu""Odstraněno"
- "K zobrazení je potřeba zařízení odemknout"
+
+
+
+ "Kontextová výuka""Návrat zpět pomocí touchpadu""Přejeďte třemi prsty doleva nebo doprava. Další gesta zjistíte klepnutím."
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 1ddaf8c84cdf6..302e9c97d4690 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth tilsluttet.""Ikon for Bluetooth-enhed""Klik for at konfigurere enhedsoplysninger"
- "Klik for at se alle enheder"
- "Klik for at parre en ny enhed"
+
+
+
+
+
+ "Batteriniveauet er ukendt.""Forbundet med %s.""Forbundet til %s."
@@ -808,12 +812,9 @@
"%1$s understøtter ikke samtalefunktioner""Feedback""Luk"
-
-
-
-
-
-
+ "Vis ikke som fastgjort"
+ "Viser liveopdateringer"
+ "Fastgjorte notifikationer viser liveoplysninger fra apps og vises altid på statusbjælken og låseskærmen""Disse notifikationer kan ikke redigeres.""Opkaldsnotifikationer kan ikke redigeres.""Du kan ikke konfigurere denne gruppe notifikationer her"
@@ -900,7 +901,10 @@
"Multitasking""Brug opdelt skærm med appen til højre""Brug opdelt skærm med appen til venstre"
- "Skift til fuld skærm"
+
+
+
+ "Skift til en app til højre eller nedenfor, når du bruger opdelt skærm""Skift til en app til venstre eller ovenfor, når du bruger opdelt skærm""Ved opdelt skærm: Udskift én app med en anden"
@@ -987,6 +991,8 @@
"Vis ikoner for notifikationer med lav prioritet""Andet"
+
+ "fjern felt""føj handlingsfeltet til den sidste position""Flyt felt"
@@ -1501,6 +1507,8 @@
"Se seneste apps""Skift mellem apps""Udfør"
+
+ "Prøv igen!""Gå tilbage""Stryg til venstre eller højre med tre fingre på touchpladen"
@@ -1538,7 +1546,10 @@
"Du kan se nyligt brugte apps ved at stryge opad og holde tre fingre nede på touchpladen""Du kan se alle dine apps ved at trykke på handlingstasten på dit tastatur""Skjult"
- "Lås op for at se"
+
+
+
+ "Kontekstbaseret uddannelse""Brug din touchplade til at gå tilbage""Stryg til venstre eller højre med tre fingre. Tryk for at lære flere bevægelser."
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 16bbea1c4df2a..c08d47a1f99ca 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -245,8 +245,12 @@
"Mit Bluetooth verbunden""Symbol des Bluetooth-Geräts""Klicke, um das Gerätedetail zu konfigurieren"
- "Klicken, um alle Geräte anzeigen zu lassen"
- "Klicken, um neues Gerät zu koppeln"
+
+
+
+
+
+ "Akkustand unbekannt.""Mit %s verbunden""Verbunden mit %s."
@@ -506,7 +510,7 @@
"Wische nach links, um das gemeinsame Tutorial zu starten""Anpassen""Schließen"
- "Hier kannst du Widgets hinzufügen, entfernen und neu anordnen"
+ "Widgets hinzufügen, entfernen und neu anordnen""Weitere Widgets hinzufügen""Lange drücken, um Widgets anzupassen""Widgets anpassen"
@@ -808,12 +812,9 @@
"%1$s unterstützt keine Funktionen für Unterhaltungen""Feedback""Schließen"
-
-
-
-
-
-
+ "Nicht als angepinnt anzeigen"
+ "Livemeldungen werden angezeigt"
+ "Aktuelle Informationen aus Apps werden als angeheftete Benachrichtigungen angezeigt, die immer in der Statusleiste und auf dem Sperrbildschirm erscheinen""Diese Benachrichtigungen können nicht geändert werden.""Anrufbenachrichtigungen können nicht geändert werden.""Die Benachrichtigungsgruppe kann hier nicht konfiguriert werden"
@@ -900,7 +901,10 @@
"Multitasking""Splitscreen mit der App auf der rechten Seite nutzen""Splitscreen mit der App auf der linken Seite nutzen"
- "In den Vollbildmodus wechseln"
+
+
+
+ "Im Splitscreen-Modus zu einer App rechts oder unten wechseln""Im Splitscreen-Modus zu einer App links oder oben wechseln""Im Splitscreen: eine App durch eine andere ersetzen"
@@ -987,6 +991,8 @@
"Symbole für Benachrichtigungen mit einer niedrigen Priorität anzeigen""Sonstiges"
+
+ "Entfernen der Kachel""Kachel an letzter Position hinzufügen""Kachel verschieben"
@@ -1501,6 +1507,8 @@
"Letzte Apps aufrufen""Zwischen Apps wechseln""Fertig"
+
+ "Noch einmal versuchen""Zurück""Wische mit drei Fingern auf dem Touchpad nach links oder rechts"
@@ -1538,7 +1546,10 @@
"Um zuletzt verwendete Apps aufzurufen, wische mit 3 Fingern nach oben und halte das Touchpad gedrückt""Wenn du alle deine Apps aufrufen möchtest, drücke auf der Tastatur die Aktionstaste""Entfernt"
- "Zum Ansehen entsperren"
+
+
+
+ "Kontextbezogene Informationen""Zum Zurückgehen Touchpad verwenden""Wische mit drei Fingern nach links oder rechts. Tippe für mehr Infos zu Touch-Gesten."
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 89c2cd2db8765..736d3a3c1c8bd 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -245,8 +245,12 @@
"Το Bluetooth είναι συνδεδεμένο.""Εικονίδιο συσκευής Bluetooth""Κάντε κλικ για να διαμορφώσετε τις λεπτομέρειες συσκευής"
- "Κάντε κλικ για εμφάνιση όλων των συσκευών"
- "Κάντε κλικ για σύζευξη νέας συσκευής"
+
+
+
+
+
+ "Άγνωστο ποσοστό μπαταρίας.""Συνδέθηκε στο %s.""Συνδέθηκε σε %s."
@@ -808,12 +812,9 @@
"Η εφαρμογή %1$s δεν υποστηρίζει τις λειτουργίες συζήτησης""Σχόλια""Παράβλεψη"
-
-
-
-
-
-
+ "Να μην φαίνεται καρφιτσωμένο"
+ "Εμφανίζονται οι ενημερώσεις σε πραγματικό χρόνο"
+ "Οι καρφιτσωμένες ειδοποιήσεις προβάλλουν ζωντανές πληροφορίες από εφαρμογές και εμφανίζονται πάντα στη γραμμή κατάστασης και στην οθόνη κλειδώματος""Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων""Δεν είναι δυνατή η τροποποίηση των ειδοποιήσεων κλήσεων.""Δεν είναι δυνατή η διαμόρφωση αυτής της ομάδας ειδοποιήσεων εδώ"
@@ -900,7 +901,10 @@
"Πολυδιεργασία""Χρήση διαχωρισμού οθόνης με την εφαρμογή στα δεξιά""Χρήση διαχωρισμού οθόνης με την εφαρμογή στα αριστερά"
- "Εναλλαγή σε πλήρη οθόνη"
+
+
+
+ "Εναλλαγή στην εφαρμογή δεξιά ή κάτω κατά τη χρήση διαχωρισμού οθόνης""Εναλλαγή σε εφαρμογή αριστερά ή επάνω κατά τη χρήση διαχωρισμού οθόνης""Κατά τον διαχωρισμό οθόνης: αντικατάσταση μιας εφαρμογής με άλλη"
@@ -987,6 +991,8 @@
"Εμφάνιση εικονιδίων ειδοποιήσεων χαμηλής προτεραιότητας""Άλλο"
+
+ "κατάργηση πλακιδίου""προσθήκη πλακιδίου στην τελευταία θέση""Μετακίνηση πλακιδίου"
@@ -1377,7 +1383,7 @@
"Αλλαγή εξόδου""Άγνωστο""ώ:λλ"
- "kk:λλ"
+ "kk:mm""Να επιτρέπεται στο %s η πρόσβαση σε όλα τα αρχεία καταγραφής συσκευής;""Να επιτρέπεται η πρόσβαση για μία φορά""Να μην επιτρέπεται"
@@ -1501,6 +1507,8 @@
"Προβολή πρόσφατων εφαρμογών""Εναλλαγή μεταξύ εφαρμογών""Τέλος"
+
+ "Δοκιμάστε ξανά!""Επιστροφή""Σύρετε προς τα αριστερά ή τα δεξιά με τρία δάχτυλα στην επιφάνεια αφής"
@@ -1538,7 +1546,10 @@
"Για πρόσφατες εφαρμογές, σαρώστε προς τα πάνω με τρία δάχτυλα και κρατήστε τα στην επιφάνεια αφής""Για να δείτε όλες τις εφαρμογές, πιέστε το πλήκτρο ενέργειας στο πληκτρολόγιό σας""Αποκρύφτηκε"
- "Ξεκλείδωμα για προβολή"
+
+
+
+ "Εκπαίδευση με βάση τα συμφραζόμενα""Χρήση της επιφάνειας αφής για επιστροφή""Σύρετε προς τα αριστερά ή τα δεξιά με τρία δάχτυλα. Πατήστε για να μάθετε περισσότερες κινήσεις."
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index af0703cfcfd37..6c578f1b03e13 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth connected.""Bluetooth device icon""Click to configure device detail"
- "Click to see all devices"
- "Click to pair new device"
+
+
+
+
+
+ "Battery percentage unknown.""Connected to %s.""Connected to %s."
@@ -808,12 +812,9 @@
"%1$s doesn’t support conversation features""Feedback""Dismiss"
-
-
-
-
-
-
+ "Don\'t show as pinned"
+ "Showing live updates"
+ "Pinned notifications display live info from apps and always appear on the status bar and lock screen""These notifications can\'t be modified.""Call notifications can\'t be modified.""This group of notifications cannot be configured here"
@@ -900,7 +901,10 @@
"Multi-tasking""Use split screen with app on the right""Use split screen with app on the left"
- "Switch to full screen"
+
+
+
+ "Switch to the app on the right or below while using split screen""Switch to the app on the left or above while using split screen""During split screen: Replace an app from one to another"
@@ -987,6 +991,8 @@
"Show low-priority notification icons""Other"
+
+ "remove tile""add tile to the last position""Move tile"
@@ -1501,6 +1507,8 @@
"View recent apps""Switch apps""Done"
+
+ "Try again.""Go back""Swipe left or right using three fingers on your touchpad"
@@ -1538,7 +1546,10 @@
"To view recent apps, swipe up and hold with three fingers on the touchpad""To view all your apps, press the action key on your keyboard""Redacted"
- "Unlock to view"
+
+
+
+ "Contextual education""Use your touchpad to go back""Swipe left or right using three fingers. Tap to learn more gestures."
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index f171a78618e8a..d78708e95ad8a 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -245,8 +245,9 @@
"Bluetooth connected.""Bluetooth device icon""Click to configure device detail"
- "Click to see all devices"
- "Click to pair new device"
+ "%s. Configure device detail"
+ "See all devices"
+ "Pair new device""Battery percentage unknown.""Connected to %s.""Connected to %s."
@@ -897,7 +898,8 @@
"Multitasking""Use split screen with app on the right""Use split screen with app on the left"
- "Switch to full screen"
+ "Use full screen"
+ "Use desktop view""Switch to app on right or below while using split screen""Switch to app on left or above while using split screen""During split screen: replace an app from one to another"
@@ -984,6 +986,7 @@
"Show low-priority notification icons""Other"
+ "toggle the tile\'s size""remove tile""add tile to the last position""Move tile"
@@ -1498,6 +1501,7 @@
"View recent apps""Switch apps""Done"
+ "Next""Try again!""Go back""Swipe left or right using three fingers on your touchpad"
@@ -1535,7 +1539,8 @@
"To view recent apps, swipe up and hold with three fingers on the touchpad""To view all your apps, press the action key on your keyboard""Redacted"
- "Unlock to view"
+ "Unlock to view"
+ "Unlock to view code""Contextual education""Use your touchpad to go back""Swipe left or right using three fingers. Tap to learn more gestures."
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index af0703cfcfd37..6c578f1b03e13 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth connected.""Bluetooth device icon""Click to configure device detail"
- "Click to see all devices"
- "Click to pair new device"
+
+
+
+
+
+ "Battery percentage unknown.""Connected to %s.""Connected to %s."
@@ -808,12 +812,9 @@
"%1$s doesn’t support conversation features""Feedback""Dismiss"
-
-
-
-
-
-
+ "Don\'t show as pinned"
+ "Showing live updates"
+ "Pinned notifications display live info from apps and always appear on the status bar and lock screen""These notifications can\'t be modified.""Call notifications can\'t be modified.""This group of notifications cannot be configured here"
@@ -900,7 +901,10 @@
"Multi-tasking""Use split screen with app on the right""Use split screen with app on the left"
- "Switch to full screen"
+
+
+
+ "Switch to the app on the right or below while using split screen""Switch to the app on the left or above while using split screen""During split screen: Replace an app from one to another"
@@ -987,6 +991,8 @@
"Show low-priority notification icons""Other"
+
+ "remove tile""add tile to the last position""Move tile"
@@ -1501,6 +1507,8 @@
"View recent apps""Switch apps""Done"
+
+ "Try again.""Go back""Swipe left or right using three fingers on your touchpad"
@@ -1538,7 +1546,10 @@
"To view recent apps, swipe up and hold with three fingers on the touchpad""To view all your apps, press the action key on your keyboard""Redacted"
- "Unlock to view"
+
+
+
+ "Contextual education""Use your touchpad to go back""Swipe left or right using three fingers. Tap to learn more gestures."
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index af0703cfcfd37..6c578f1b03e13 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth connected.""Bluetooth device icon""Click to configure device detail"
- "Click to see all devices"
- "Click to pair new device"
+
+
+
+
+
+ "Battery percentage unknown.""Connected to %s.""Connected to %s."
@@ -808,12 +812,9 @@
"%1$s doesn’t support conversation features""Feedback""Dismiss"
-
-
-
-
-
-
+ "Don\'t show as pinned"
+ "Showing live updates"
+ "Pinned notifications display live info from apps and always appear on the status bar and lock screen""These notifications can\'t be modified.""Call notifications can\'t be modified.""This group of notifications cannot be configured here"
@@ -900,7 +901,10 @@
"Multi-tasking""Use split screen with app on the right""Use split screen with app on the left"
- "Switch to full screen"
+
+
+
+ "Switch to the app on the right or below while using split screen""Switch to the app on the left or above while using split screen""During split screen: Replace an app from one to another"
@@ -987,6 +991,8 @@
"Show low-priority notification icons""Other"
+
+ "remove tile""add tile to the last position""Move tile"
@@ -1501,6 +1507,8 @@
"View recent apps""Switch apps""Done"
+
+ "Try again.""Go back""Swipe left or right using three fingers on your touchpad"
@@ -1538,7 +1546,10 @@
"To view recent apps, swipe up and hold with three fingers on the touchpad""To view all your apps, press the action key on your keyboard""Redacted"
- "Unlock to view"
+
+
+
+ "Contextual education""Use your touchpad to go back""Swipe left or right using three fingers. Tap to learn more gestures."
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 0e15e45273138..f40ab32547c0f 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth conectado""Ícono de dispositivo Bluetooth""Haz clic para configurar los detalles del dispositivo"
- "Haz clic para ver todos los dispositivos"
- "Haz clic para vincular un dispositivo nuevo"
+
+
+
+
+
+ "Se desconoce el porcentaje de la batería.""Conectado a %s""Conectado a %s."
@@ -255,7 +259,7 @@
"No conectado""Roaming""Desactivados"
- "Modo de avión"
+ "Modo avión.""VPN activada""Batería %d por ciento""Batería: %1$d por ciento; %2$s"
@@ -754,7 +758,7 @@
"Escáner de código QR""Actualizando""Perfil de trabajo"
- "Modo de avión"
+ "Modo avión""Controles parentales""No oirás la próxima alarma a la(s) %1$s""a la(s) %1$s"
@@ -808,12 +812,9 @@
"%1$s no admite funciones de conversación""Comentarios""Descartar"
-
-
-
-
-
-
+ "No mostrar como fijado"
+ "Se muestran las novedades en tiempo real"
+ "Las notificaciones fijadas muestran información en tiempo real de las apps y siempre aparecen en la barra de estado y la pantalla de bloqueo""No se pueden modificar estas notificaciones.""No se pueden modificar las notificaciones de llamada.""No se puede configurar aquí este grupo de notificaciones"
@@ -900,7 +901,10 @@
"Tareas múltiples""Usar la pantalla dividida con la app a la derecha""Usar la pantalla dividida con la app a la izquierda"
- "Cambiar a pantalla completa"
+
+
+
+ "Ubicar la app a la derecha o abajo cuando usas la pantalla dividida""Ubicar la app a la izquierda o arriba cuando usas la pantalla dividida""Durante pantalla dividida: Reemplaza una app con otra"
@@ -987,6 +991,8 @@
"Mostrar íconos de notificaciones con prioridad baja""Otros"
+
+ "quitar tarjeta""agregar tarjeta a la última posición""Mover la tarjeta"
@@ -1329,7 +1335,7 @@
"Ver todo""Para cambiar de red, desconéctate de Ethernet""Para mejorar la experiencia con el dispositivo, las apps y los servicios pueden seguir buscando redes Wi-Fi en cualquier momento, incluso cuando la conexión Wi-Fi esté desactivada. Puedes cambiar este parámetro en la configuración de búsqueda de Wi-Fi. ""Cambiar"
- "Desactivar el modo de avión"
+ "Desactivar el modo avión""%1$s quiere agregar la siguiente tarjeta a la Configuración rápida""Agregar tarjeta""No agregar tarjeta"
@@ -1501,6 +1507,8 @@
"Ver apps recientes""Cambiar de app""Listo"
+
+ "Vuelve a intentarlo""Atrás""Desliza hacia la izquierda o la derecha con tres dedos en el panel táctil"
@@ -1538,7 +1546,10 @@
"Para ver las apps recientes, desliza hacia arriba con tres dedos y mantén presionado el panel táctil""Para ver todas las apps, presiona la tecla de acción en el teclado""Oculto"
- "Desbloquea el dispositivo para ver"
+
+
+
+ "Educación contextual""Usa el panel táctil para ir hacia atrás""Desliza hacia la izquierda o la derecha con tres dedos. Presiona para aprender más gestos."
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 1670ce6737b8e..166e01ccff450 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth conectado""Icono de dispositivo Bluetooth""Haz clic para configurar la información del dispositivo"
- "Haz clic para ver todos los dispositivos"
- "Haz clic para emparejar un nuevo dispositivo"
+
+
+
+
+
+ "Porcentaje de batería desconocido.""Conectado a %s.""Conectado a %s."
@@ -808,12 +812,9 @@
"%1$s no admite funciones de conversación""Comentarios""Cerrar"
-
-
-
-
-
-
+ "No mostrar como fijadas"
+ "Se mostrarán las novedades en directo"
+ "Las notificaciones fijadas muestran información en tiempo real de las aplicaciones y aparecen siempre en la barra de estado y en la pantalla de bloqueo""Estas notificaciones no se pueden modificar.""Las notificaciones de llamada no se pueden modificar.""Este grupo de notificaciones no se puede configurar aquí"
@@ -900,7 +901,10 @@
"Multitarea""Usar la pantalla dividida con la aplicación a la derecha""Usar la pantalla dividida con la aplicación a la izquierda"
- "Cambiar a pantalla completa"
+
+
+
+ "Cambiar a la aplicación de la derecha o de abajo en pantalla dividida""Cambiar a la app de la izquierda o de arriba en pantalla dividida""Con pantalla dividida: reemplazar una aplicación por otra"
@@ -987,6 +991,8 @@
"Mostrar iconos de notificaciones con prioridad baja""Otros"
+
+ "quitar recuadro""añadir el recuadro a la última posición""Mover recuadro"
@@ -1501,6 +1507,8 @@
"Ver aplicaciones recientes""Cambiar de aplicación""Hecho"
+
+ "Vuelve a intentarlo.""Atrás""Desliza hacia la izquierda o la derecha con tres dedos en el panel táctil"
@@ -1538,7 +1546,10 @@
"Para ver las aplicaciones recientes, desliza hacia arriba y mantén pulsado el panel táctil con tres dedos""Para ver todas tus aplicaciones, pulsa la tecla de acción de tu teclado""Oculta"
- "Desbloquea para ver"
+
+
+
+ "Educación contextual""Usa el panel táctil para volver atrás""Desliza hacia la izquierda o hacia la derecha con tres dedos. Toca para aprender a usar más gestos."
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 445b540ae3ebf..739fe85afd996 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth on ühendatud.""Bluetooth-seadme ikoon""Klõpsake seadme üksikasjade konfigureerimiseks"
- "Kõigi seadmete kuvamiseks klõpsake"
- "Uue seadme sidumiseks klõpsake"
+
+
+
+
+
+ "Aku laetuse protsent on teadmata.""Ühendatud: %s.""Ühendatud ülekandega %s."
@@ -808,12 +812,9 @@
"%1$s ei toeta vestlusfunktsioone""Tagasiside""Loobu"
-
-
-
-
-
-
+ "Ära kuva kinnitatuna"
+ "Kuvatakse reaalajas värskendusi"
+ "Kinnitatud märguanded näitavad rakendustest pärinevat reaalajas teavet ning kuvatakse alati olekuribal ja lukustuskuval""Neid märguandeid ei saa muuta.""Kõnemärguandeid ei saa muuta.""Seda märguannete rühma ei saa siin seadistada"
@@ -900,7 +901,10 @@
"Multitegumtöö""Jagatud ekraanikuva kasutamine, rakendus kuvatakse paremal""Jagatud ekraanikuva kasutamine, rakendus kuvatakse vasakul"
- "Täisekraanile lülitamine"
+
+
+
+ "Paremale või alumisele rakendusele lülitamine jagatud ekraani ajal""Vasakule või ülemisele rakendusele lülitamine jagatud ekraani ajal""Ekraanikuva jagamise ajal: ühe rakenduse asendamine teisega"
@@ -987,6 +991,8 @@
"Kuva madala prioriteediga märguande ikoonid""Muu"
+
+ "paani eemaldamiseks""lisage paan viimasesse asukohta""Teisalda paan"
@@ -1501,6 +1507,8 @@
"Hiljutiste rakenduste vaatamine""Rakenduste vahetamine""Valmis"
+
+ "Proovige uuesti!""Tagasi""Pühkige puuteplaadil kolme sõrmega vasakule või paremale"
@@ -1538,7 +1546,10 @@
"Hiljutiste rakenduste kuvamiseks pühkige puuteplaadil kolme sõrmega üles ja hoidke sõrmi puuteplaadil.""Kõigi oma rakenduste kuvamiseks vajutage klaviatuuril toiminguklahvi""Peidetud"
- "Vaatamiseks avage"
+
+
+
+ "Kontekstipõhised õpetused""Puuteplaadi kasutamine tagasiliikumiseks""Pühkige kolme sõrmega vasakule või paremale. Puudutage liigutuste kohta lisateabe saamiseks."
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 1f7d697ff2da4..8e2564ecc83a1 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -245,8 +245,12 @@
"Bluetootha konektatuta.""Bluetooth bidezko gailuaren ikonoa""Gailuaren xehetasuna konfiguratzeko, sakatu hau"
- "Egin klik gailu guztiak ikusteko"
- "Egin klik beste gailu bat parekatzeko"
+
+
+
+
+
+ "Bateriaren ehunekoa ezezaguna da.""%s gailura konektatuta.""Hona konektatuta: %s."
@@ -808,12 +812,9 @@
"%1$s aplikazioak ez ditu onartzen elkarrizketetarako eginbideak""Iritzia""Baztertu"
-
-
-
-
-
-
+ "Ez erakutsi ainguratutako gisa"
+ "Zuzeneko informazioa dago ikusgai"
+ "Ainguratutako jakinarazpenek istantean bistaratzen dute aplikazioetako informazioa, eta egoera-barran nahiz pantaila blokeatuan agertzen dira beti""Jakinarazpen horiek ezin dira aldatu.""Deien jakinarazpenak ezin dira aldatu.""Jakinarazpen talde hau ezin da konfiguratu hemen"
@@ -900,7 +901,10 @@
"Zeregin bat baino gehiago aldi berean exekutatzea""Erabili pantaila zatitua eta ezarri aplikazio hau eskuinean""Erabili pantaila zatitua eta ezarri aplikazio hau ezkerrean"
- "Aldatu pantaila osora"
+
+
+
+ "Aldatu eskuineko edo beheko aplikaziora pantaila zatitua erabiltzean""Aldatu ezkerreko edo goiko aplikaziora pantaila zatitua erabiltzean""Pantaila zatituan zaudela, ordeztu aplikazio bat beste batekin"
@@ -987,6 +991,8 @@
"Erakutsi lehentasun txikiko jakinarazpenen ikonoak""Beste bat"
+
+ "kendu lauza""gehitu lauza azken posizioan""Mugitu lauza"
@@ -1501,6 +1507,8 @@
"Ikusi azkenaldiko aplikazioak""Aldatu aplikazioa""Eginda"
+
+ "Saiatu berriro!""Egin atzera""Pasatu 3 hatz ezkerrera edo eskuinera ukipen-panelean"
@@ -1538,7 +1546,10 @@
"Azkenaldiko aplikazioak ikusteko, pasatu 3 hatz ukipen-panelean gora eta eduki sakatuta""Aplikazio guztiak ikusteko, sakatu teklatuko ekintza-tekla""Desitxuratuta"
- "Desblokeatu ikusteko"
+
+
+
+ "Testuinguruaren araberako hezkuntza""Erabili ukipen-panela atzera egiteko""Pasatu 3 hatz ezkerrera edo eskuinera. Sakatu keinu gehiago ikasteko."
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index c9392e32d6c1a..067cfce97653f 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -245,8 +245,12 @@
"بلوتوث متصل است.""نماد دستگاه بلوتوث""برای پیکربندی جزئیات دستگاه کلیک کنید"
- "برای دیدن همه دستگاهها، کلیک کنید"
- "برای جفت کردن دستگاه جدید، کلیک کنید"
+
+
+
+
+
+ "درصد شارژ باتری مشخص نیست.""به %s متصل شد.""به %s متصل شد."
@@ -306,7 +310,7 @@
"جفت کردن دستگاه جدید""دیدن همه""استفاده از بلوتوث"
- "متصل"
+ "وصلشده""اشتراک صدا""از اشتراک صدا پشتیبانی میکند""ذخیرهشده"
@@ -808,12 +812,9 @@
"%1$s از ویژگیهای مکالمه پشتیبانی نمیکند""بازخورد""بستن"
-
-
-
-
-
-
+ "سنجاقشده نشان داده نشود"
+ "نمایش «بهروزرسانیهای زنده»"
+ "اعلانهای سنجاقشده اطلاعات زنده را از برنامهها نمایش میدهند، و همیشه در نوار وضعیت و صفحه قفل نشان داده میشوند""این اعلانها قابل اصلاح نیستند.""این اعلانها قابلاصلاح نیستند.""نمیتوانید این گروه اعلانها را در اینجا پیکربندی کنید"
@@ -900,7 +901,10 @@
"چندوظیفگی""استفاده از صفحهٔ دونیمه با قرار گرفتن برنامه در سمت راست""استفاده از صفحهٔ دونیمه با قرار گرفتن برنامه در سمت چپ"
- "رفتن به حالت تمامصفحه"
+
+
+
+ "رفتن به برنامه سمت راست یا پایین درحین استفاده از صفحهٔ دونیمه""رفتن به برنامه سمت چپ یا بالا درحین استفاده از صفحهٔ دونیمه""درحین صفحهٔ دونیمه: برنامهای را با دیگری جابهجا میکند"
@@ -987,6 +991,8 @@
"نمایش نمادهای اعلان کماهمیت""موارد دیگر"
+
+ "برداشتن کاشی""افزودن کاشی به آخرین جایگاه""انتقال کاشی"
@@ -1501,6 +1507,8 @@
"مشاهده برنامههای اخیر""جابهجایی بین برنامهها""تمام"
+
+ "دوباره امتحان کنید!""برگشتن""با سه انگشت روی صفحه لمسی تند به چپ یا راست بکشید."
@@ -1538,7 +1546,10 @@
"برای مشاهده برنامههای اخیر، در صفحه لمسی با سه انگشت تند بهبالا بکشید و نگه دارید""برای مشاهده همه برنامهها، دکمه کنش در صفحهکلید را فشار دهید""محوشده"
- "برای مشاهده، قفل را باز کنید"
+
+
+
+ "آموزش زمینهای""برای برگشتن از صفحه لمسی استفاده کنید""با سه انگشت تند بهچپ یا راست بکشید. برای آشنایی با اشارههای بیشتر، تکضرب بزنید."
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 96162b211006f..b709e0275c0ee 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -247,8 +247,12 @@
"Bluetooth yhdistetty.""Bluetooth-laitekuvake""Määritä laitteen asetukset klikkaamalla"
- "Katso kaikki laitteet klikkaamalla"
- "Muodosta uusi laitepari klikkaamalla"
+
+
+
+
+
+ "Akun varaustaso ei tiedossa.""Yhteys: %s.""Yhdistetty kohteeseen %s"
@@ -810,12 +814,9 @@
"%1$s ei tue keskusteluominaisuuksia""Palaute""Hylkää"
-
-
-
-
-
-
+ "Älä näytä kiinnitettynä"
+ "Näytetään livepäivitykset"
+ "Kiinnitetyissä ilmoituksissa näytetään livetietoja sovelluksista, ja ilmoitukset näkyvät aina tilapalkissa ja lukitusnäytöllä""Näitä ilmoituksia ei voi muokata""Puheluilmoituksia ei voi muokata.""Tätä ilmoitusryhmää ei voi määrittää tässä"
@@ -902,7 +903,10 @@
"Multitaskaus""Käytä jaettua näyttöä niin, että sovellus on oikealla""Käytä jaettua näyttöä niin, että sovellus on vasemmalla"
- "Koko näytölle siirtyminen"
+
+
+
+ "Vaihda sovellukseen oikealla tai alapuolella jaetussa näytössä""Vaihda sovellukseen vasemmalla tai yläpuolella jaetussa näytössä""Jaetun näytön aikana: korvaa sovellus toisella"
@@ -989,6 +993,8 @@
"Näytä vähemmän tärkeät ilmoituskuvakkeet""Muu"
+
+ "poista kiekko""lisää laatta viimeiseen kohtaan""Siirrä kiekkoa"
@@ -1331,7 +1337,7 @@
"Näytä kaikki""Irrota Ethernet-johto, jos haluat vaihtaa verkkoa""Laitteen käyttökokemuksen parantamiseksi sovellukset ja palvelut voivat hakea Wi-Fi-verkkoja myös silloin, kun Wi-Fi on pois päältä. Voit muuttaa asetusta Wi-Fi-haun asetuksissa. ""Muuta"
- "Laita lentokonetila pois päältä"
+ "Lentokonetila pois""%1$s haluaa lisätä seuraavan laatan pika-asetuksiin""Lisää laatta""Älä lisää laattaa"
@@ -1503,6 +1509,8 @@
"Katso viimeisimmät sovellukset""Vaihda sovellusta""Valmis"
+
+ "Yritä uudelleen.""Takaisin""Pyyhkäise kosketuslevyllä vasemmalle tai oikealle kolmella sormella"
@@ -1540,7 +1548,10 @@
"Näet äskeiset sovellukset, kun pyyhkäiset ylös ja pidät kosketuslevyä painettuna kolmella sormella.""Jos haluat nähdä kaikki sovellukset, paina näppäimistön toimintonäppäintä""Sensuroitu"
- "Avaa lukitus ja katso tiedot"
+
+
+
+ "Kontekstuaalinen koulutus""Takaisin siirtyminen kosketuslevyn avulla""Pyyhkäise vasemmalle tai oikealle kolmella sormella. Lue lisää eleistä napauttamalla."
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 8fd2ed219953e..bed155a5a1833 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth connecté""Icône de l\'appareil Bluetooth""Cliquez pour configurer les détails de l\'appareil"
- "Cliquez ici pour voir tous les appareils"
- "Cliquez ici pour associer un nouvel appareil"
+
+
+
+
+
+ "Pourcentage de la pile inconnu.""Connecté à : %s""Connecté à %s."
@@ -506,7 +510,7 @@
"Balayer l\'écran vers la gauche pour démarrer le tutoriel communautaire""Personnaliser""Fermer"
- "Ajouter, retirer et réorganiser vos widgets dans cet espace"
+ "Ajouter, retirer et réorganiser vos widgets dans cet espace""Ajouter plus de widgets""Appuyez longuement pour personnaliser les widgets""Personnaliser les widgets"
@@ -808,12 +812,9 @@
"%1$s ne prend pas en charge les fonctionnalités de conversation""Commentaires""Fermer"
-
-
-
-
-
-
+ "Ne pas afficher comme épinglé"
+ "Affichage des mises à jour en direct"
+ "Les notifications épinglées affichent des informations en direct des applis et apparaissent toujours sur la barre d\'état et l\'écran de verrouillage""Ces notifications ne peuvent pas être modifiées""Les notifications d\'appel ne peuvent pas être modifiées.""Ce groupe de notifications ne peut pas être configuré ici"
@@ -900,7 +901,10 @@
"Multitâche""Utiliser l\'Écran divisé avec l\'appli à droite""Utiliser l\'Écran divisé avec l\'appli à gauche"
- "Passer au mode plein écran"
+
+
+
+ "Passer à l\'appli à droite ou en dessous avec l\'Écran divisé""Passer à l\'appli à gauche ou au-dessus avec l\'Écran divisé""En mode d\'écran divisé : remplacer une appli par une autre"
@@ -987,6 +991,8 @@
"Afficher les icônes de notification de faible priorité""Autre"
+
+ "retirer la tuile""Ajouter une tuile à la dernière position""Déplacer la tuile"
@@ -1501,6 +1507,8 @@
"Afficher les applis récentes""Changer d\'appli""OK"
+
+ "Réessayez!""Retour""Balayez votre pavé tactile vers la gauche ou vers la droite avec trois doigts"
@@ -1538,7 +1546,10 @@
"Pour afficher les applis récentes, balayez l\'écran vers le haut avec trois doigts sur le pavé tactile et maintenez-les en place""Pour afficher toutes vos applis, appuyez sur la touche d\'action de votre clavier""Supprimé"
- "Déverrouiller pour afficher"
+
+
+
+ "Enseignement contextuel""Utiliser votre pavé tactile pour revenir en arrière""Balayez vers la gauche ou vers la droite avec trois doigts. Touchez pour apprendre d\'autres gestes."
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 89002d4752b4e..046a270d7d084 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -245,8 +245,9 @@
"Bluetooth connecté""Icône de l\'appareil Bluetooth""Cliquer pour configurer les détails de l\'appareil"
- "Cliquer pour afficher tous les appareils"
- "Cliquer pour associer un nouvel appareil"
+ "%s. Configurez les détails de l\'appareil"
+ "Voir tous les appareils"
+ "Associer un nouvel appareil""Pourcentage de la batterie inconnu.""Connecté à : %s""Connecté à %s."
@@ -354,7 +355,7 @@
"Inversion des couleurs""Correction des couleurs""Taille de la police"
- "Gérer utilisateurs"
+ "Gérer les utilisateurs""OK""Fermer""Connecté"
@@ -808,12 +809,9 @@
"%1$s n\'est pas compatible avec les fonctionnalités de conversation""Commentaires""Ignorer"
-
-
-
-
-
-
+ "Ne pas afficher comme épinglé"
+ "Affichage des infos en direct"
+ "Les notifications épinglées affichent des informations en direct provenant d\'applis et apparaissent toujours dans la barre d\'état et sur l\'écran de verrouillage""Impossible de modifier ces notifications.""Impossible de modifier les notifications d\'appel.""Vous ne pouvez pas configurer ce groupe de notifications ici"
@@ -900,7 +898,8 @@
"Multitâche""Utiliser l\'écran partagé avec l\'appli sur la droite""Utiliser l\'écran partagé avec l\'appli sur la gauche"
- "Passer en plein écran"
+ "Utiliser le mode plein écran"
+ "Utiliser l\'affichage sur ordinateur""Passer à l\'appli à droite ou en dessous avec l\'écran partagé""Passez à l\'appli à gauche ou au-dessus avec l\'écran partagé""En mode écran partagé : Remplacer une appli par une autre"
@@ -987,6 +986,8 @@
"Afficher les icônes de notification à faible priorité""Autre"
+
+ "supprimer le bloc""ajouter le bloc à la dernière position""Déplacer le bloc"
@@ -1501,6 +1502,7 @@
"Afficher les applis récentes""Passer d\'une application à l\'autre""OK"
+ "Suivant""Essayez encore.""Retour""Balayez vers la gauche ou la droite avec trois doigts sur le pavé tactile"
@@ -1538,7 +1540,10 @@
"Pour afficher les applis récentes, balayez vers le haut avec trois doigts sur le pavé tactile et maintenez-les.""Pour afficher toutes vos applis, appuyez sur la touche d\'action de votre clavier""Masqué"
- "Déverrouiller pour afficher"
+
+
+
+ "Éducation contextuelle""Utilisez votre pavé tactile pour revenir en arrière""Balayez vers la gauche ou la droite en utilisant trois doigts. Appuyez pour apprendre d\'autres gestes."
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 4e801eebf317e..5a6e58340b1c4 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth conectado""Icona do dispositivo Bluetooth""Facer clic para configurar os detalles do dispositivo"
- "Facer clic para ver todos os dispositivos"
- "Facer clic para vincular un novo dispositivo"
+
+
+
+
+
+ "Descoñécese a porcentaxe da batería.""Conectado a %s.""Dispositivo conectado: %s."
@@ -808,12 +812,9 @@
"%1$s non admite funcións de conversa""Comentarios""Pechar"
-
-
-
-
-
-
+ "Non mostrar como fixadas"
+ "Mostrando novidades en tempo real"
+ "As notificacións fixadas mostrarán a información en tempo real das aplicacións e aparecerán sempre na barra de estado e na pantalla de bloqueo""Estas notificacións non se poden modificar.""As notificacións de chamadas non se poden modificar.""Aquí non se pode configurar este grupo de notificacións"
@@ -900,7 +901,10 @@
"Multitarefa""Usar pantalla dividida coa aplicación na dereita""Usar pantalla dividida coa aplicación na esquerda"
- "Cambiar a pantalla completa"
+
+
+
+ "Cambiar á aplicación da dereita ou de abaixo coa pantalla dividida""Cambiar á aplicación da esquerda ou de arriba coa pantalla dividida""En modo de pantalla dividida: Substituír unha aplicación por outra"
@@ -987,6 +991,8 @@
"Mostrar iconas das notificacións que teñan baixa prioridade""Outros"
+
+ "quitar tarxeta""engadir o atallo á última posición""Mover tarxeta"
@@ -1501,6 +1507,8 @@
"Consultar aplicacións recentes""Cambiar de aplicación""Feito"
+
+ "Téntao de novo.""Volver""Pasa tres dedos cara á esquerda ou cara á dereita no panel táctil"
@@ -1538,7 +1546,10 @@
"Para ver as aplicacións recentes, pasa tres dedos cara arriba no panel táctil e mantenos premidos""Para ver todas as aplicacións, preme a tecla de acción do teclado""Contido ocultado"
- "Desbloquea o dispositivo para ver o contido"
+
+
+
+ "Información contextual""Usa o panel táctil para volver""Pasa tres dedos cara á esquerda ou cara á dereita. Toca para obter máis información sobre os xestos."
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 08e139872a508..64fc0a9d8667f 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -245,8 +245,12 @@
"બ્લૂટૂથ કનેક્ટ થયું.""બ્લૂટૂથ ડિવાઇસનું આઇકન""ડિવાઇસની વિગત ગોઠવવા માટે ક્લિક કરો"
- "બધા ડિવાઇસ જોવા માટે ક્લિક કરો"
- "નવું ડિવાઇસ જોડવા માટે ક્લિક કરો"
+
+
+
+
+
+ "બૅટરીની ટકાવારી અજાણ છે.""%s થી કનેક્ટ થયાં.""%s થી કનેક્ટ કરેલ."
@@ -808,12 +812,9 @@
"%1$s વાતચીતની સુવિધાઓને સપોર્ટ આપતી નથી""પ્રતિસાદ""છોડી દો"
-
-
-
-
-
-
+ "પિન કરેલા તરીકે બતાવશો નહીં"
+ "લાઇવ અપડેટ બતાવી રહ્યાં છીએ"
+ "પિન કરેલા નોટિફિકેશન ઍપમાંથી લાઇવ નોટિફિકેશન બતાવે છે અને હંમેશાં સ્ટેટસ બાર અને લૉક સ્ક્રીન પર દેખાય છે""આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં.""કૉલના નોટિફિકેશનમાં કોઈ ફેરફાર કરી શકાતો નથી.""નોટિફિકેશનના આ ગ્રૂપની ગોઠવણી અહીં કરી શકાશે નહીં"
@@ -900,7 +901,10 @@
"એકસાથે એકથી વધુ કાર્યો કરવા""હાલની ઍપને જમણી બાજુએ રાખીને વિભાજિત સ્ક્રીનનો ઉપયોગ કરો""હાલની ઍપને ડાબી બાજુએ રાખીને વિભાજિત સ્ક્રીનનો ઉપયોગ કરો"
- "પૂર્ણ સ્ક્રીન પર સ્વિચ કરો"
+
+
+
+ "વિભાજિત સ્ક્રીનનો ઉપયોગ કરતી વખતે જમણી બાજુ કે નીચેની ઍપ પર સ્વિચ કરો""વિભાજિત સ્ક્રીનનો ઉપયોગ કરતી વખતે ડાબી બાજુની કે ઉપરની ઍપ પર સ્વિચ કરો""વિભાજિત સ્ક્રીન દરમિયાન: એક ઍપને બીજી ઍપમાં બદલો"
@@ -987,6 +991,8 @@
"ઓછી પ્રાધાન્યતાનું નોટિફિકેશન આઇકન બતાવો""અન્ય"
+
+ "ટાઇલ કાઢી નાખો""છેલ્લા સ્થાનમાં ટાઇલ ઉમેરો""ટાઇલ ખસેડો"
@@ -1501,6 +1507,8 @@
"તાજેતરની ઍપ જુઓ""ઍપ સ્વિચ કરો""થઈ ગયું"
+
+ "ફરી પ્રયાસ કરો!""પાછા જાઓ""તમારા ટચપૅડ પર ત્રણ આંગળીનો ઉપયોગ કરીને ડાબે કે જમણે સ્વાઇપ કરો"
@@ -1538,7 +1546,10 @@
"તાજેતરની ઍપ જોવા માટે, ટચપૅડ પર ત્રણ આંગળીઓ વડે ઉપર સ્વાઇપ કરો અને દબાવી રાખો""તમારી બધી ઍપ જોવા માટે, તમારા કીબોર્ડ પર ઍક્શન કી દબાવો""બદલાવેલું"
- "જોવા માટે અનલૉક કરો"
+
+
+
+ "સંદર્ભાત્મક શિક્ષણ""પાછા જવા માટે તમારા ટચપૅડનો ઉપયોગ કરો""ત્રણ આંગળીનો ઉપયોગ કરીને ડાબે અથવા જમણે સ્વાઇપ કરો. સંકેતો વિશે વધુ જાણવા માટે ટૅપ કરો."
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index d78158557756f..451a9af2cc018 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -245,8 +245,9 @@
"ब्लूटूथ कनेक्ट किया गया.""ब्लूटूथ डिवाइस का आइकॉन""डिवाइस की जानकारी कॉन्फ़िगर करने के लिए क्लिक करें"
- "\'सभी डिवाइस देखें\' पर क्लिक करें"
- "\'नया डिवाइस जोड़ें\' पर क्लिक करें"
+ "%s. डिवाइस की जानकारी कॉन्फ़िगर करें"
+ "सभी डिवाइस देखें"
+ "नया डिवाइस जोड़ें""इस बारे में जानकारी नहीं है कि अभी बैटरी कितने प्रतिशत चार्ज है.""%s से कनेक्ट किया गया.""%s से कनेक्ट है."
@@ -536,7 +537,7 @@
"ऊंचाई बढ़ाएं""अगला दिखाएं""पिछला दिखाएं"
- "लॉक स्क्रीन विजेट"
+ "लॉक स्क्रीन के विजेट""किसी विजेट से कोई ऐप्लिकेशन खोलने के लिए, आपको अपनी पहचान की पुष्टि करनी होगी. ध्यान रखें कि आपके टैबलेट के लॉक होने पर भी, कोई व्यक्ति विजेट देख सकता है. ऐसा हो सकता है कि कुछ विजेट, लॉक स्क्रीन पर दिखाने के लिए न बने हों. इन्हें लॉक स्क्रीन पर जोड़ना असुरक्षित हो सकता है.""ठीक है""स्क्रीन सेवर दिखाने का बटन"
@@ -808,12 +809,9 @@
"%1$s पर बातचीत की सुविधाएं काम नहीं करतीं""सुझाव/राय दें या शिकायत करें""खारिज करें"
-
-
-
-
-
-
+ "पिन किए गए लाइव अपडेट न दिखाएं"
+ "लाइव अपडेट दिखाए जा रहे हैं"
+ "पिन की गई सूचनाएं, ऐप्लिकेशन से मिलने वाली जानकारी रीयल-टाइम में दिखाती हैं. ये सूचनाएं, स्टेटस बार और लॉक स्क्रीन पर दिखती हैं""ये सूचनाएं नहीं बदली जा सकती हैं.""कॉल से जुड़ी सूचनाओं को ब्लॉक नहीं किया जा सकता.""सूचनाओं के इस समूह को यहां कॉन्फ़िगर नहीं किया जा सकता"
@@ -900,7 +898,8 @@
"मल्टीटास्किंग (एक साथ कई काम करना)""स्प्लिट स्क्रीन की सुविधा चालू करें और इस ऐप्लिकेशन को दाईं ओर दिखाएं""स्प्लिट स्क्रीन की सुविधा चालू करें और इस ऐप्लिकेशन को बाईं ओर दिखाएं"
- "फ़ुल स्क्रीन पर स्विच करें"
+ "फ़ुल स्क्रीन मोड का इस्तेमाल करें"
+ "डेस्कटॉप व्यू मोड का इस्तेमाल करें""स्प्लिट स्क्रीन पर, दाईं ओर या नीचे के ऐप पर स्विच करने के लिए""स्प्लिट स्क्रीन पर, बाईं ओर या ऊपर के ऐप पर स्विच करने के लिए""स्प्लिट स्क्रीन के दौरान: एक ऐप्लिकेशन को दूसरे ऐप्लिकेशन से बदलें"
@@ -987,6 +986,8 @@
"कम प्राथमिकता वाली सूचना के आइकॉन दिखाएं""अन्य"
+
+ "टाइल हटाएं""आखिरी जगह पर टाइल जोड़ें""टाइल को किसी और पोज़िशन पर ले जाएं"
@@ -1501,6 +1502,7 @@
"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन देखें""ऐप्लिकेशन के बीच स्विच करें""हो गया"
+ "आगे बढ़ें""फिर से कोशिश करें!""वापस जाएं""अपने टचपैड पर तीन उंगलियों से बाईं या दाईं ओर स्वाइप करें"
@@ -1538,7 +1540,10 @@
"हाल ही में इस्तेमाल हुए ऐप देखने के लिए, टचपैड पर तीन उंगलियों से ऊपर की ओर स्वाइप करके दबाकर रखें""सभी ऐप्लिकेशन देखने के लिए, कीबोर्ड पर ऐक्शन बटन दबाएं""जानकारी छिपाने के लिए सूचना में बदलाव किया गया"
- "देखने के लिए डिवाइस अनलॉक करें"
+
+
+
+ "कॉन्टेक्स्ट के हिसाब से जानकारी""वापस जाने के लिए, अपने डिवाइस के टचपैड का इस्तेमाल करें""तीन उंगलियों से बाईं या दाईं ओर स्वाइप करें. ज़्यादा जेस्चर के बारे में जानने के लिए टैप करें."
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 3a985a9f5a17c..8991285742bdc 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -245,8 +245,9 @@
"Bluetooth povezan.""Ikona Bluetooth uređaja""Kliknite da biste konfigurirali pojedinosti o uređaju"
- "Kliknite za prikaz svih uređaja"
- "Kliknite da biste uparili novi uređaj"
+ "%s. Konfigurirajte pojedinosti o uređaju"
+ "Pogledajte sve uređaje"
+ "Upari novi uređaj""Postotak baterije nije poznat.""Spojen na %s .""Povezani ste sa sljedećim uređajem: %s."
@@ -808,12 +809,9 @@
"Aplikacija %1$s ne podržava značajke razgovora""Povratne informacije""Odbaci"
-
-
-
-
-
-
+ "Ne prikazuj kao prikvačeno"
+ "Prikazivanje obavijesti uživo"
+ "Prikvačene obavijesti prikazuju informacije uživo iz aplikacija i uvijek se prikazuju na traci statusa i zaključanom zaslonu""Te se obavijesti ne mogu izmijeniti.""Obavijesti o pozivima ne mogu se izmijeniti.""Ta se grupa obavijesti ne može konfigurirati ovdje"
@@ -900,7 +898,8 @@
"Obavljanje više zadataka""Upotreba podijeljenog zaslona s aplikacijom s desne strane""Upotreba podijeljenog zaslona s aplikacijom s lijeve strane"
- "Prebacivanje na cijeli zaslon"
+ "Upotreba prikaza na cijelom zaslonu"
+ "Upotreba prikaza na računalu""Prelazak na aplikaciju zdesna ili ispod uz podijeljeni zaslon""Prelazak na aplikaciju slijeva ili iznad uz podijeljeni zaslon""Tijekom podijeljenog zaslona: zamijeni aplikaciju drugom"
@@ -987,6 +986,8 @@
"Prikaži ikone obavijesti niskog prioriteta""Ostalo"
+
+ "uklanjanje kartice""dodavanje kartice na posljednji položaj""Premještanje kartice"
@@ -1501,6 +1502,7 @@
"Pregled nedavnih aplikacija""Promjena aplikacije""Gotovo"
+ "Dalje""Pokušajte ponovno!""Natrag""Prijeđite ulijevo ili udesno trima prstima na dodirnoj podlozi"
@@ -1538,7 +1540,10 @@
"Za prikaz nedavnih aplikacija prijeđite prema gore trima prstima i zadržite pritisak na dodirnoj podlozi""Za prikaz svojih svih aplikacija pritisnite tipku za radnju na tipkovnici""Redaktirano"
- "Otključajte za prikaz"
+
+
+
+ "Kontekstualno obrazovanje""Upotrijebite dodirnu podlogu za povratak""Prijeđite ulijevo ili udesno trima prstima. Dodirnite da biste naučili više pokreta."
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 9b1756703895d..332d8ef57f7e3 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth csatlakoztatva.""Bluetooth-eszköz ikon""Kattintson az eszköz beállításainak megadásához"
- "Kattintson az összes eszköz megtekintéséhez"
- "Kattintson új eszköz párosításához"
+
+
+
+
+
+ "Az akkumulátor töltöttségi szintje ismeretlen.""Csatlakoztatva a következőhöz: %s.""Csatlakozva a következőhöz: %s."
@@ -808,12 +812,9 @@
"A(z) %1$s nem támogatja a beszélgetési funkciókat""Visszajelzés""Elvetés"
-
-
-
-
-
-
+ "Ne jelenjen meg kitűzöttként"
+ "Friss hírek megjelenítése…"
+ "A kitűzött értesítések alkalmazásokból származó élő információkat jelenítenek meg, és mindig az állapotsoron és a lezárási képernyőn jelennek meg""Ezeket az értesítéseket nem lehet módosítani.""A hívásértesítéseket nem lehet módosítani.""Az értesítések jelen csoportját itt nem lehet beállítani"
@@ -900,7 +901,10 @@
"Multitasking""Osztott képernyő használata, az alkalmazás a jobb oldalon van""Osztott képernyő használata, az alkalmazás a bal oldalon van"
- "Váltás teljes képernyőre"
+
+
+
+ "Váltás a jobb oldalt, illetve lent lévő appra osztott képernyő esetén""Váltás a bal oldalt, illetve fent lévő appra osztott képernyő esetén""Osztott képernyőn: az egyik alkalmazás lecserélése egy másikra"
@@ -987,6 +991,8 @@
"Alacsony prioritású értesítési ikonok mutatása""Egyéb"
+
+ "mozaik eltávolításához""mozaik hozzáadása az utolsó pozícióhoz""Mozaik áthelyezése"
@@ -1501,6 +1507,8 @@
"Legutóbbi alkalmazások megtekintése""Váltás az alkalmazások között""Kész"
+
+ "Próbálja újra""Vissza""Csúsztassa gyorsan három ujját balra vagy jobbra az érintőpadon."
@@ -1538,7 +1546,10 @@
"A legutóbbi appokért csúsztasson lefelé három ujjal az érintőpadon, és tartsa lenyomva ujjait.""Az összes alkalmazás megtekintéséhez nyomja meg a billentyűzet műveletbillentyűjét.""Törölve"
- "Oldja fel a megtekintéshez"
+
+
+
+ "Kontextusfüggő tájékoztató párbeszédpanel""A visszalépéshez használja az érintőpadot""Csúsztatasson gyorsan három ujjal balra vagy jobbra. Koppintson a további kézmozdulatokért."
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 2aa72cc66e8a9..a6627402e89cc 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth-ը միացված է:""Bluetooth սարքի պատկերակ""Սեղմեք՝ սարքի մանրամասները կազմաձևելու համար"
- "Սեղմեք՝ բոլոր սարքերը տեսնելու համար"
- "Սեղմեք՝ նոր սարք զուգակցելու համար"
+
+
+
+
+
+ "Մարտկոցի լիցքի մակարդակն անհայտ է։""Միացված է %s-ին:""Միացված է %s-ին:"
@@ -808,12 +812,9 @@
"%1$s հավելվածը զրույցի գործառույթներ չի աջակցում""Կարծիք հայտնել""Փակել"
-
-
-
-
-
-
+ "Ցույց չտալ որպես ամրացված"
+ "Ցուցադրվում են թարմացումներ իրական ժամանակում"
+ "Ամրացված ծանուցումները ցուցադրում են հավելվածների ընթացիկ տեղեկությունները և միշտ հայտնվում են կարգավիճակի գոտում և կողպէկրանին""Այս ծանուցումները չեն կարող փոփոխվել:""Զանգերի մասին ծանուցումները հնարավոր չէ փոփոխել։""Ծանուցումների տվյալ խումբը հնարավոր չէ կարգավորել այստեղ"
@@ -900,7 +901,10 @@
"Բազմախնդրություն""Տրոհել էկրանը և տեղավորել այս հավելվածը աջ կողմում""Տրոհել էկրանը և տեղավորել այս հավելվածը ձախ կողմում"
- "Անցնել լիաէկրան ռեժիմի"
+
+
+
+ "Անցեք աջ կողմի կամ ներքևի հավելվածին տրոհված էկրանի միջոցով""Անցեք աջ կողմի կամ վերևի հավելվածին տրոհված էկրանի միջոցով""Տրոհված էկրանի ռեժիմում մեկ հավելվածը փոխարինել մյուսով"
@@ -987,6 +991,8 @@
"Ցուցադրել ցածր առաջնահերթության ծանուցումների պատկերակները""Այլ"
+
+ "հեռացնել սալիկը""ավելացնել սալիկը վերջին դիրքում""Տեղափոխել սալիկը"
@@ -1501,6 +1507,8 @@
"Դիտել վերջին հավելվածները""Անցում մեկ հավելվածից մյուսին""Պատրաստ է"
+
+ "Նորից փորձեք։""Հետ գնալ""Հպահարթակի վրա երեք մատով սահեցրեք ձախ կամ աջ"
@@ -1538,7 +1546,10 @@
"Վերջերս օգտագործված հավելվածները դիտելու համար երեք մատը սահեցրեք վերև և սեղմած պահեք""Բոլոր հավելվածները դիտելու համար սեղմեք գործողության ստեղնը ստեղնաշարի վրա""Կոդավորված"
- "Ապակողպել դիտելու համար"
+
+
+
+ "Համատեքստային ուսուցում""Օգտագործեք ձեր հպահարթակը՝ վերադառնալու համար""Երեք մատը սահեցրեք ձախ կամ աջ։ Հպեք՝ ավելի շատ ժեստերի ծանոթանալու համար։"
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index c57f40f4b69d6..a7d95a3930dd0 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth terhubung.""Ikon perangkat Bluetooth""Klik untuk mengonfigurasi detail perangkat"
- "Klik untuk melihat semua perangkat"
- "Klik untuk menyambungkan perangkat baru"
+
+
+
+
+
+ "Persentase baterai tidak diketahui.""Terhubung ke %s.""Terhubung ke %s."
@@ -808,12 +812,9 @@
"%1$s tidak mendukung fitur percakapan""Masukan""Tutup"
-
-
-
-
-
-
+ "Jangan tampilkan sebagai tersemat"
+ "Menampilkan Info Terbaru Langsung"
+ "Notifikasi yang disematkan menampilkan info terbaru dari aplikasi, serta selalu muncul di status bar dan layar kunci""Notifikasi ini tidak dapat diubah.""Notifikasi panggilan tidak dapat diubah.""Grup notifikasi ini tidak dapat dikonfigurasi di sini"
@@ -900,7 +901,10 @@
"Multitasking""Gunakan layar terpisah dengan aplikasi di sebelah kanan""Gunakan layar terpisah dengan aplikasi di sebelah kiri"
- "Beralih ke layar penuh"
+
+
+
+ "Beralih ke aplikasi di bagian kanan atau bawah saat menggunakan layar terpisah""Beralih ke aplikasi di bagian kiri atau atas saat menggunakan layar terpisah""Dalam layar terpisah: ganti salah satu aplikasi dengan yang lain"
@@ -987,6 +991,8 @@
"Tampilkan ikon notifikasi prioritas rendah""Lainnya"
+
+ "menghapus kartu""menambahkan kartu ke posisi terakhir""Pindahkan kartu"
@@ -1501,6 +1507,8 @@
"Lihat aplikasi terbaru""Beralih aplikasi""Selesai"
+
+ "Coba lagi""Kembali""Geser ke kiri atau kanan menggunakan tiga jari di touchpad"
@@ -1538,7 +1546,10 @@
"Untuk melihat aplikasi terkini, geser ke atas dan tahan menggunakan tiga jari di touchpad""Untuk melihat semua aplikasi, tekan tombol tindakan di keyboard""Disamarkan"
- "Buka kunci untuk melihat"
+
+
+
+ "Pendidikan kontekstual""Gunakan touchpad untuk kembali""Geser ke kiri atau kanan menggunakan tiga jari. Ketuk untuk mempelajari gestur lainnya."
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index ec284c24499ec..abd3952c1b4d7 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth tengt.""Tákn Bluetooth-tækis""Smelltu til að stilla tækjaupplýsingar"
- "Smelltu til að sjá öll tæki"
- "Smelltu til að para nýtt tæki"
+
+
+
+
+
+ "Staða rafhlöðu óþekkt.""Tengt við %s.""Tengt við %s."
@@ -808,12 +812,9 @@
"%1$s styður ekki samtalseiginleika""Ábendingar""Loka"
-
-
-
-
-
-
+ "Ekki sýna sem fest"
+ "Sýna uppfærslur í beinni"
+ "Festar tilkynningar sýna upplýsingar frá forritum í rauntíma og birtast ávallt á stöðustikunni og lásskjánum""Ekki er hægt að breyta þessum tilkynningum.""Ekki er hægt að breyta tilkynningum um símtöl.""Ekki er hægt að stilla þessar tilkynningar hér"
@@ -900,7 +901,10 @@
"Fjölvinnsla""Notaðu skjáskiptingu fyrir forritið til hægri""Notaðu skjáskiptingu fyrir forritið til vinstri"
- "Skipta yfir í allan skjáinn"
+
+
+
+ "Skiptu í forrit til hægri eða fyrir neðan þegar skjáskipting er notuð""Skiptu í forrit til vinstri eða fyrir ofan þegar skjáskipting er notuð""Í skjáskiptingu: Skipta forriti út fyrir annað forrit"
@@ -987,6 +991,8 @@
"Sýna tákn fyrir tilkynningar með litlum forgangi""Annað"
+
+ "fjarlægja flís""bæta reit við síðustu stöðu""Færa flís"
@@ -1501,6 +1507,8 @@
"Sjá nýleg forrit""Að skipta á milli forrita""Lokið"
+
+ "Reyndu aftur!""Til baka""Strjúktu til hægri eða vinstri á snertifletinum með þremur fingrum"
@@ -1538,7 +1546,10 @@
"Strjúktu upp og haltu með þremur fingrum á snertifletinum til að sjá nýleg forrit""Ýttu á aðgerðalykilinn á lyklaborðinu til að sjá öll forritin þín""Ritskoðað"
- "Taktu úr lás til að skoða"
+
+
+
+ "Samhengismiðuð menntun""Notaðu snertiflötinn til að fara til baka""Strjúktu til vinstri eða hægri með þremur fingrum. Ýttu til að læra fleiri bendingar."
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 2391fe262ab85..0251d975cbe72 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -245,8 +245,9 @@
"Bluetooth collegato.""Icona del dispositivo Bluetooth""Fai clic per configurare i dettagli del dispositivo"
- "Fai clic per vedere tutti i dispositivi"
- "Fai clic per accoppiare un nuovo dispositivo"
+ "%s. Configura i dettagli del dispositivo"
+ "Visualizza tutti i dispositivi"
+ "Accoppia nuovo dispositivo""Percentuale della batteria sconosciuta.""Connesso a %s.""Connesso a: %s."
@@ -808,12 +809,9 @@
"%1$s non supporta le funzionalità delle conversazioni""Feedback""Ignora"
-
-
-
-
-
-
+ "Non mostrare come fissata"
+ "Visualizzare gli aggiornamenti in tempo reale"
+ "Le notifiche fissate mostrano informazioni in tempo reale provenienti dalle app e vengono sempre visualizzate nella barra di stato e nella schermata di blocco""Impossibile modificare queste notifiche.""Impossibile modificare gli avvisi di chiamata.""Qui non è possibile configurare questo gruppo di notifiche"
@@ -900,7 +898,8 @@
"Multitasking""Utilizza lo schermo diviso con l\'app a destra""Utilizza lo schermo diviso con l\'app a sinistra"
- "Passa alla modalità a schermo intero"
+ "Utilizza la modalità a schermo intero"
+ "Utilizza la visualizzazione desktop""Passa all\'app a destra o sotto mentre usi lo schermo diviso""Passa all\'app a sinistra o sopra mentre usi lo schermo diviso""Con lo schermo diviso: sostituisci un\'app con un\'altra"
@@ -987,6 +986,8 @@
"Mostra icone di notifiche con priorità bassa""Altro"
+
+ "rimuovere il riquadro""aggiungere il riquadro all\'ultima posizione""Sposta riquadro"
@@ -1501,6 +1502,7 @@
"Visualizza app recenti""Cambia app""Fine"
+ "Avanti""Riprova.""Indietro""Scorri verso sinistra o destra con tre dita sul touchpad"
@@ -1538,7 +1540,10 @@
"Per visualizzare le app recenti, scorri verso l\'alto e tieni premuto con tre dita sul touchpad""Per visualizzare tutte le tue app, premi il tasto azione sulla tastiera""Oscurata"
- "Sblocca per visualizzare"
+
+
+
+ "Istruzione contestuale""Usa il touchpad per tornare indietro""Scorri verso sinistra o destra con tre dita. Tocca per scoprire altri gesti."
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 0d7a620e7f92f..0600bf4f21db7 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth מחובר.""סמל של מכשיר Bluetooth""יש ללחוץ כדי להגדיר את פרטי המכשיר"
- "אפשר ללחוץ כדי לראות את כל המכשירים"
- "צריך ללחוץ כדי להתאים מכשיר חדש"
+
+
+
+
+
+ "אחוז טעינת הסוללה לא ידוע.""התבצע חיבור אל %s.""מחובר אל %s."
@@ -808,12 +812,9 @@
"האפליקציה %1$s לא תומכת בתכונות השיחה""משוב""סגירה"
-
-
-
-
-
-
+ "לא להצמיד"
+ "מוצגים עדכונים בזמן אמת"
+ "בהתראות המוצמדות מוצג מידע בזמן אמת מאפליקציות, והן תמיד מופיעות בשורת הסטטוס ובמסך הנעילה""לא ניתן לשנות את ההתראות האלה.""לא ניתן לשנות את התראות השיחה.""לא ניתן להגדיר כאן את קבוצת ההתראות הזו"
@@ -900,7 +901,10 @@
"ריבוי משימות""שימוש במסך מפוצל כשהאפליקציה בצד ימין""שימוש במסך מפוצל כשהאפליקציה בצד שמאל"
- "למסך מלא"
+
+
+
+ "מעבר לאפליקציה משמאל או למטה בזמן שימוש במסך מפוצל""מעבר לאפליקציה מימין או למעלה בזמן שימוש במסך מפוצל""כשהמסך מפוצל: החלפה בין אפליקציה אחת לאחרת"
@@ -987,6 +991,8 @@
"הצגת סמלי התראות בעדיפות נמוכה""אחר"
+
+ "הסרת הלחצן""הוספת הלחצן במיקום האחרון""העברת הלחצן"
@@ -1501,6 +1507,8 @@
"הצגת האפליקציות האחרונות""מעבר בין אפליקציות""סיום"
+
+ "צריך לנסות שוב.""חזרה""מחליקים שמאלה או ימינה עם שלוש אצבעות על לוח המגע"
@@ -1538,7 +1546,10 @@
"כדי לראות את האפליקציות האחרונות, מחליקים למעלה לוחצים לחיצה ארוכה עם שלוש אצבעות על לוח המגע""כדי לראות את כל האפליקציות, מקישים על מקש הפעולה במקלדת""מצונזר"
- "צריך לבטל את הנעילה כדי לראות"
+
+
+
+ "חינוך בהתאם להקשר""אפשר להשתמש בלוח המגע כדי לחזור אחורה""מחליקים ימינה או שמאלה עם שלוש אצבעות. ניתן ללחוץ כדי לקבל מידע נוסף על התנועות."
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 786763366fd4b..23194096bc0d3 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -245,8 +245,9 @@
"Bluetoothに接続済み。""Bluetooth デバイスのアイコン""クリックしてデバイスの詳細を設定します"
- "クリックすると、すべてのデバイスが表示されます"
- "クリックすると、新しいデバイスをペア設定できます"
+ "%s。デバイスの詳細を設定してください"
+ "すべてのデバイスを表示"
+ "新しいデバイスとペア設定""バッテリー残量は不明です。""%sに接続しました。""%sに接続されています。"
@@ -530,7 +531,7 @@
"ウィジェットを削除""選択したウィジェットを配置""ロック画面ウィジェット"
- "タブレットがロックされていても、ロック画面のウィジェットは誰でも確認できます。"
+ "タブレットがロックされていても、ロック画面のウィジェットは誰でも見ることができます。""ウィジェットの選択を解除する""高さを低くする""高さを高くする"
@@ -808,12 +809,9 @@
"%1$sは会話機能に対応していません""フィードバック""閉じる"
-
-
-
-
-
-
+ "固定表示しない"
+ "ライブ情報が表示されます"
+ "固定した通知にアプリのライブ情報が表示され、常にステータスバーとロック画面に表示されます""これらの通知は変更できません。""着信通知は変更できません。""このグループの通知はここでは設定できません"
@@ -900,7 +898,8 @@
"マルチタスク""分割画面の使用(アプリを右側に表示)""分割画面の使用(アプリを左側に表示)"
- "全画面表示に切り替える"
+ "全画面表示に切り替える"
+ "デスクトップ ビューを使用する""分割画面の使用時に右側または下部のアプリに切り替える""分割画面の使用時に左側または上部のアプリに切り替える""分割画面中: アプリを順に置換する"
@@ -987,6 +986,8 @@
"優先度の低い通知アイコンを表示""その他"
+
+ "タイルを削除""タイルを最後の位置に追加する""タイルを移動"
@@ -1501,6 +1502,7 @@
"最近使ったアプリを表示する""アプリの切り替え""完了"
+ "次へ""もう一度お試しください。""戻る""タッチパッドを 3 本の指で左または右にスワイプします"
@@ -1538,7 +1540,10 @@
"最近使ったアプリを表示するには、3 本の指でタッチパッドを上にスワイプして長押しします""すべてのアプリを表示するには、キーボードのアクションキーを押してください""削除済み"
- "表示するにはロックを解除してください"
+
+
+
+ "コンテキスト メニューに関する説明""タッチパッドを使用して、前の画面に戻る""3 本の指で左または右にスワイプします。ジェスチャーの詳細を確認するにはタップしてください。"
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index b599220a3cc02..3877fe76ad21b 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -245,8 +245,9 @@
"Bluetooth დაკავშირებულია.""Bluetooth მოწყობილობის ხატულა""დააწკაპუნეთ მოწყობილობის დეტალების კონფიგურირებისთვის"
- "დააწკაპუნეთ ყველა მოწყობილობის სანახავად"
- "დააწკაპუნეთ ახალი მოწყობილობის დასაწყვილებლად"
+ "%s. მოწყობილობის დეტალის კონფიგურაცია"
+ "ყველა მოწყობილობის ნახვა"
+ "ახალი მოწყობილობის დაწყვილება""ბატარეის პროცენტული მაჩვენებელი უცნობია.""დაკავშირებულია %s-თან.""დაკავშირებულია მოწყობილობასთან: %s."
@@ -808,12 +809,9 @@
"%1$s-ს არ აქვს მიმოწერის ფუნქციების მხარდაჭერა""გამოხმაურება""დახურვა"
-
-
-
-
-
-
+ "არ გამოჩნდეს ჩამაგრებულად"
+ "აჩვენებს განახლებებს რეალურ დროში"
+ "ჩამაგრებული შეტყობინებები რეალურ დროში აჩვენებს ინფორმაციას აპებიდან და ყოველთვის ჩანს სტატუსის ზოლსა და ჩაკეტილ ეკრანზე""ამ შეტყობინებების შეცვლა შეუძლებელია.""ზარის შეტყობინებების შეცვლა შეუძლებელია.""შეტყობინებების ამ ჯგუფის კონფიგურირება აქ შეუძლებელია"
@@ -900,7 +898,8 @@
"მრავალამოცანიანი რეჟიმი""ეკრანის გაყოფის გამოყენება აპზე მარჯვნივ""ეკრანის გაყოფის გამოყენება აპზე მარცხნივ"
- "სრულ ეკრანზე გადართვა"
+ "სრული ეკრანის გამოყენება"
+ "დესკტოპის ხედის გამოყენება""ეკრანის გაყოფის გამოყენებისას აპზე მარჯვნივ ან ქვემოთ გადართვა""ეკრანის გაყოფის გამოყენებისას აპზე მარცხნივ ან ზემოთ გადართვა""ეკრანის გაყოფის დროს: ერთი აპის მეორით ჩანაცვლება"
@@ -987,6 +986,8 @@
"დაბალი პრიორიტეტის მქონე შეტყობინებების ხატულების ჩვენება""სხვა"
+
+ "მოზაიკის ფილის წაშლა""მოზაიკის ფილის ბოლო პოზიციაზე დამატება""მოზაიკის გადატანა"
@@ -1501,6 +1502,7 @@
"ბოლო აპების ნახვა""აპების გადართვა""მზადაა"
+ "შემდეგი""ცადეთ ხელახლა!""უკან დაბრუნება""თქვენს სენსორულ პანელზე სამი თითით გადაფურცლეთ მარცხნივ ან მარჯვნივ"
@@ -1538,7 +1540,10 @@
"ბოლო აპების სანახავად სენსორულ პანელზე სამი თითით გადაფურცლეთ ზემოთ და მოიცადეთ""ყველა აპის სანახავად დააჭირეთ მოქმედების კლავიშს თქვენს კლავიატურაზე""ტექსტს ადევს ცენზურა"
- "განბლოკვა სანახავად"
+
+
+
+ "კონტექსტური განათლება""უკან დასაბრუნებლად გამოიყენეთ სენსორული პანელი""გადაფურცლეთ მარცხნივ ან მარჯვნივ სამი თითით. შეეხეთ მეტი ჟესტის შესასწავლად."
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index bf12aca88d5dd..68cc7692c356d 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth қосылған.""Bluetooth құрылғысы белгішесі""Құрылғы деректерін конфигурациялау үшін басыңыз."
- "Барлық құрылғыны көру үшін басыңыз."
- "Жаңа құрылғы жұптау үшін басыңыз."
+
+
+
+
+
+ "Батарея зарядының мөлшері белгісіз.""%s қосылған.""%s трансляциясына қосылды."
@@ -689,11 +693,11 @@
"Жоқ, рақмет""Қолданба бекітілді.""Қолданба босатылды."
- "Қоңырау шалу"
+ "Сөйлесу кезіндегі дыбыс""Жүйе"
- "Шылдыр"
+ "Қоңырау сигналы""Мультимедиа"
- "Дабыл"
+ "Оятқыш""Хабарландыру""Bluetooth""Қос үнді көп жиілік"
@@ -808,12 +812,9 @@
"%1$s әңгіме функцияларын қолдамайды.""Пікір""Жабу"
-
-
-
-
-
-
+ "Бекітілген ретінде көрсетпеу"
+ "Нақты уақыттағы жаңартуларды көрсету"
+ "Бекітілген хабарландырулар қолданбалардың нақты уақыттағы ақпаратын көрсетеді және әрдайым күй жолағында және құлып экранында көрсетіледі.""Бұл хабарландыруларды өзгерту мүмкін емес.""Қоңырау туралы хабарландыруларды өзгерту мүмкін емес.""Мұндай хабарландырулар бұл жерде конфигурацияланбайды."
@@ -900,7 +901,10 @@
"Мультитаскинг""Қолданбаны бөлінген экранның оң жағынан пайдалану""Қолданбаны бөлінген экранның сол жағынан пайдалану"
- "Толық экранға ауысу"
+
+
+
+ "Бөлінген экранда оң не төмен жақтағы қолданбаға ауысу""Бөлінген экранда сол не жоғары жақтағы қолданбаға ауысу""Экранды бөлу кезінде: бір қолданбаны басқасымен алмастыру"
@@ -987,6 +991,8 @@
"Маңызды емес хабарландыру белгішелерін көрсету""Басқа"
+
+ "бөлшекті өшіру""соңғы позицияға бөлшек қосу""Бөлшекті жылжыту"
@@ -1501,6 +1507,8 @@
"Соңғы қолданбаларды көру""Қолданба ауыстыру""Дайын"
+
+ "Қайталап көріңіз""Артқа""Сенсорлық тақтада үш саусақпен оңға немесе солға сырғытыңыз."
@@ -1538,7 +1546,10 @@
"Сенсорлық тақтада үш саусақпен жоғары сырғытып, басып тұрсаңыз, соңғы ашылған қолданбаларды көресіз.""Пернетақтада әрекет пернесін басып, барлық қолданбаны көре аласыз.""Жасырылған"
- "Көру үшін құлыпты ашыңыз."
+
+
+
+ "Контекстік білім""Артқа қайту үшін сенсорлық тақтаны қолданыңыз""Үш саусақпен солға не оңға сырғытыңыз. Басқа қимылдарды үйрену үшін түртіңіз."
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index e12fd13156360..b9adf221caca3 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -245,8 +245,12 @@
"បានតភ្ជាប់ប៊្លូធូស។""រូបឧបករណ៍ប៊្លូធូស""ចុចដើម្បីកំណត់រចនាសម្ព័ន្ធព័ត៌មានលម្អិតអំពីឧបករណ៍"
- "ចុច ដើម្បីមើលឃើញឧបករណ៍ទាំងអស់"
- "ចុច ដើម្បីផ្គូផ្គងឧបករណ៍ថ្មី"
+
+
+
+
+
+ "មិនដឹងអំពីភាគរយថ្មទេ។""បានភ្ជាប់ទៅ %s ។""បានភ្ជាប់ទៅ %s"
@@ -689,7 +693,7 @@
"ទេ អរគុណ""បានខ្ទាស់កម្មវិធី""បានដកខ្ទាស់កម្មវិធី"
- "ហៅ"
+ "ការហៅទូរសព្ទ""ប្រព័ន្ធ""រោទ៍""មេឌៀ"
@@ -808,12 +812,9 @@
"%1$s មិនអាចប្រើមុខងារសន្ទនាបានទេ""មតិកែលម្អ""ច្រានចោល"
-
-
-
-
-
-
+ "កុំបង្ហាញដូចអ្វីដែលបានខ្ទាស់"
+ "ការបង្ហាញព័ត៌មានបន្តផ្ទាល់"
+ "ការជូនដំណឹងដែលបានខ្ទាស់បង្ហាញព័ត៌មានបន្តផ្ទាល់ពីកម្មវិធី និងតែងតែបង្ហាញនៅលើរបារស្ថានភាព និងអេក្រង់ចាក់សោ""មិនអាចកែប្រែការជូនដំណឹងទាំងនេះបានទេ។""មិនអាចកែប្រែការជូនដំណឹងអំពីការហៅទូរសព្ទបានទេ។""មិនអាចកំណត់រចនាសម្ព័ន្ធក្រុមការជូនដំណឹងនេះនៅទីនេះបានទេ"
@@ -900,7 +901,10 @@
"ការដំណើរការបានច្រើន""ប្រើមុខងារបំបែកអេក្រង់ជាមួយកម្មវិធីនៅខាងស្ដាំ""ប្រើមុខងារបំបែកអេក្រង់ជាមួយកម្មវិធីនៅខាងឆ្វេង"
- "ប្ដូរទៅអេក្រង់ពេញ"
+
+
+
+ "ប្ដូរទៅកម្មវិធីនៅខាងស្ដាំ ឬខាងក្រោម ពេលកំពុងប្រើមុខងារបំបែកអេក្រង់""ប្ដូរទៅកម្មវិធីនៅខាងឆ្វេង ឬខាងលើ ពេលកំពុងប្រើមុខងារបំបែកអេក្រង់""ក្នុងអំឡុងពេលប្រើមុខងារបំបែកអេក្រង់៖ ជំនួសកម្មវិធីពីមួយទៅមួយទៀត"
@@ -987,6 +991,8 @@
"បង្ហាញរូបការជូនដំណឹងដែលមានអាទិភាពទាប""ផ្សេងៗ"
+
+ "ដកប្រអប់ចេញ""បញ្ចូលប្រអប់ទៅទីតាំងចុងក្រោយ""ផ្លាស់ទីប្រអប់"
@@ -1501,6 +1507,8 @@
"មើលកម្មវិធីថ្មីៗ""ប្ដូរកម្មវិធី""រួចរាល់"
+
+ "សូមព្យាយាមម្ដងទៀត!""ថយក្រោយ""អូសទៅឆ្វេង ឬស្ដាំដោយប្រើម្រាមដៃបីនៅលើផ្ទាំងប៉ះរបស់អ្នក"
@@ -1538,7 +1546,10 @@
"ដើម្បីមើលកម្មវិធីថ្មីៗ សូមអូសឡើងលើ ហើយសង្កត់ឱ្យជាប់ដោយប្រើម្រាមដៃបីនៅលើផ្ទាំងប៉ះ""ដើម្បីមើលកម្មវិធីទាំងអស់របស់អ្នក សូមចុចគ្រាប់ចុចសកម្មភាពនៅលើក្ដារចុចរបស់អ្នក""បានកែលម្អពាក្យពេចន៍"
- "ដោះសោដើម្បីមើល"
+
+
+
+ "ការអប់រំតាមបរិបទ""ប្រើផ្ទាំងប៉ះរបស់អ្នក ដើម្បីថយក្រោយ""អូសទៅឆ្វេង ឬស្ដាំដោយប្រើម្រាមដៃបី។ ចុច ដើម្បីស្វែងយល់បន្ថែមអំពីចលនា។"
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 3bb4e4de91ea4..4a2682f252345 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -245,8 +245,12 @@
"ಬ್ಲೂಟೂತ್ ಸಂಪರ್ಕಗೊಂಡಿದೆ.""ಬ್ಲೂಟೂತ್ ಸಾಧನ ಐಕಾನ್""ಸಾಧನದ ವಿವರಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ"
- "ಎಲ್ಲಾ ಸಾಧನಗಳನ್ನು ನೋಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ"
- "ಹೊಸ ಸಾಧನವನ್ನು ಪೇರ್ ಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ"
+
+
+
+
+
+ "ಬ್ಯಾಟರಿ ಶೇಕಡಾವಾರು ತಿಳಿದಿಲ್ಲ.""%s ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ.""%s ಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ."
@@ -808,12 +812,9 @@
"ಸಂವಾದ ಫೀಚರ್ಗಳನ್ನು %1$s ಬೆಂಬಲಿಸುವುದಿಲ್ಲ""ಫೀಡ್ಬ್ಯಾಕ್""ವಜಾಗೊಳಿಸಿ"
-
-
-
-
-
-
+ "ಪಿನ್ ಮಾಡಿದ ಹಾಗೆ ತೋರಿಸಬೇಡಿ"
+ "ಲೈವ್ ಅಪ್ಡೇಟ್ಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ"
+ "ಪಿನ್ ಮಾಡಲಾದ ನೋಟಿಫಿಕೇಶನ್ಗಳು ಆ್ಯಪ್ಗಳಿಂದ ಲೈವ್ ಮಾಹಿತಿಯನ್ನು ಪ್ರದರ್ಶಿಸುತ್ತವೆ ಹಾಗೂ ಅವುಗಳು ಯಾವಾಗಲೂ ಸ್ಥಿತಿ ಪಟ್ಟಿ ಮತ್ತು ಲಾಕ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ""ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.""ಕರೆ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.""ಈ ಗುಂಪಿನ ಅಧಿಸೂಚನೆಗಳನ್ನು ಇಲ್ಲಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗಿರುವುದಿಲ್ಲ"
@@ -900,7 +901,10 @@
"ಮಲ್ಟಿಟಾಸ್ಕಿಂಗ್""ಬಲಭಾಗದಲ್ಲಿ ಆ್ಯಪ್ ಮೂಲಕ ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಬಳಸಿ""ಎಡಭಾಗದಲ್ಲಿ ಆ್ಯಪ್ ಮೂಲಕ ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಬಳಸಿ"
- "ಫುಲ್ಸ್ಕ್ರೀನ್ ಮೋಡ್ಗೆ ಬದಲಿಸಿ"
+
+
+
+ "ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ಬಳಸುವಾಗ ಬಲಭಾಗ ಅಥವಾ ಕೆಳಭಾಗದಲ್ಲಿರುವ ಆ್ಯಪ್ಗೆ ಬದಲಿಸಿ""ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ ಮೋಡ್ ಬಳಸುವಾಗ ಎಡಭಾಗ ಅಥವಾ ಮೇಲ್ಭಾಗದಲ್ಲಿರುವ ಆ್ಯಪ್ಗೆ ಬದಲಿಸಿ""ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸುವ ಸಮಯದಲ್ಲಿ: ಒಂದು ಆ್ಯಪ್ನಿಂದ ಮತ್ತೊಂದು ಆ್ಯಪ್ಗೆ ಬದಲಿಸಿ"
@@ -987,6 +991,8 @@
"ಕಡಿಮೆ-ಆದ್ಯತೆ ಸೂಚನೆಯ ಐಕಾನ್ಗಳನ್ನು ತೋರಿಸಿ""ಇತರ"
+
+ "ಟೈಲ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ""ಕೊನೆಯ ಸ್ಥಾನಕ್ಕೆ ಟೈಲ್ ಅನ್ನು ಸೇರಿಸಿ""ಟೈಲ್ ಸರಿಸಿ"
@@ -1501,6 +1507,8 @@
"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಿ""ಆ್ಯಪ್ಗಳನ್ನು ಬದಲಿಸಿ""ಮುಗಿದಿದೆ"
+
+ "ಪುನಃ ಪ್ರಯತ್ನಿಸಿ!""ಹಿಂತಿರುಗಿ""ನಿಮ್ಮ ಟಚ್ಪ್ಯಾಡ್ನಲ್ಲಿ ಮೂರು ಬೆರಳುಗಳನ್ನು ಬಳಸಿ ಎಡ ಅಥವಾ ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"
@@ -1538,7 +1546,10 @@
"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳನ್ನು ನೋಡಲು, ಟಚ್ಪ್ಯಾಡ್ನಲ್ಲಿ ಮೂರು ಬೆರಳುಗಳಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಹಾಗೂ ಹೋಲ್ಡ್ ಮಾಡಿ""ನಿಮ್ಮ ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಲು, ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ನಲ್ಲಿರುವ ಆ್ಯಕ್ಷನ್ ಕೀಯನ್ನು ಒತ್ತಿರಿ""ಅರ್ಥಬದ್ಧವಾಗಿಸಲಾಗಿದೆ"
- "ನೋಡಲು ಅನ್ಲಾಕ್ ಮಾಡಿ"
+
+
+
+ "ಸಂದರ್ಭೋಚಿತ ಶಿಕ್ಷಣ""ಹಿಂತಿರುಗಲು ನಿಮ್ಮ ಟಚ್ಪ್ಯಾಡ್ ಅನ್ನು ಬಳಸಿ""ಮೂರು ಬೆರಳುಗಳಿಂದ ಎಡಕ್ಕೆ ಅಥವಾ ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ. ಇನ್ನಷ್ಟು ಗೆಸ್ಚರ್ಗಳನ್ನು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ."
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 33f54b69b4d5f..95b5131abe632 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -245,8 +245,12 @@
"블루투스가 연결되었습니다.""블루투스 기기 아이콘""기기 세부정보를 구성하려면 클릭하세요."
- "모든 기기를 보려면 클릭하세요"
- "새 기기를 페어링하려면 클릭하세요"
+
+
+
+
+
+ "배터리 잔량을 알 수 없습니다.""%s에 연결되었습니다.""%s에 연결됨"
@@ -808,12 +812,9 @@
"%1$s 앱은 대화 기능을 지원하지 않습니다.""의견""닫기"
-
-
-
-
-
-
+ "고정된 것으로 표시 안함"
+ "실시간 소식 표시"
+ "고정된 알림은 앱의 실시간 정보를 표시하며, 항상 상태 표시줄과 잠금 화면에 표시됩니다.""이 알림은 수정할 수 없습니다.""전화 알림은 수정할 수 없습니다.""이 알림 그룹은 여기에서 설정할 수 없습니다."
@@ -900,7 +901,10 @@
"멀티태스킹""앱이 오른쪽에 오도록 화면 분할 사용""앱이 왼쪽에 오도록 화면 분할 사용"
- "전체 화면으로 전환"
+
+
+
+ "화면 분할을 사용하는 중에 오른쪽 또는 아래쪽에 있는 앱으로 전환""화면 분할을 사용하는 중에 왼쪽 또는 위쪽에 있는 앱으로 전환하기""화면 분할 중: 다른 앱으로 바꾸기"
@@ -987,6 +991,8 @@
"우선순위가 낮은 알림 아이콘 표시""기타"
+
+ "타일 삭제""마지막 위치에 타일 추가""타일 이동"
@@ -1501,6 +1507,8 @@
"최근 앱 보기""앱 전환""완료"
+
+ "다시 시도해 보세요""뒤로""세 손가락을 사용해 터치패드에서 왼쪽 또는 오른쪽으로 스와이프하세요."
@@ -1538,7 +1546,10 @@
"최근 앱을 보려면 터치패드에서 세 손가락으로 위로 스와이프한 후 잠시 기다리세요""모든 앱을 보려면 키보드의 작업 키를 누르세요""수정됨"
- "잠금 해제하여 보기"
+
+
+
+ "컨텍스트 교육""터치패드를 사용하여 돌아가기""세 손가락을 사용해 왼쪽 또는 오른쪽으로 스와이프하세요. 더 많은 동작을 알아보려면 탭하세요."
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index e764badc2d373..365c9bc559b2e 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth байланышта""Bluetooth түзмөгүнүн сүрөтчөсү""Түзмөктүн чоо-жайын конфигурациялоо үчүн чыкылдатыңыз"
- "Бардык түзмөктөрдү көрүү үчүн чыкылдатыңыз"
- "Жаңы түзмөк кошуу үчүн чыкылдатыңыз"
+
+
+
+
+
+ "Батареянын деңгээли белгисиз.""%s менен туташкан.""%s менен туташты."
@@ -808,12 +812,9 @@
"%1$s колдонмосунда оозеки сүйлөшкөнгө болбойт""Пикир билдирүү""Жабуу"
-
-
-
-
-
-
+ "Билдирмелерди бошотуу"
+ "Анык убакыттагы билдирмелерди көрсөтүү"
+ "Кадалган билдирмелер ар дайым абал тилкесинде жана кулпуланган экранда көрсөтүлүп, колдонмолордогу маалыматты анык убакытта көрсөтөт""Бул билдирмелерди өзгөртүүгө болбойт.""Чалуу билдирмелерин өзгөртүүгө болбойт.""Бул билдирмелердин тобун бул жерде конфигурациялоого болбойт"
@@ -900,7 +901,10 @@
"Бир нече тапшырма аткаруу""Колдонмону оңго жылдырып, экранды бөлүү""Колдонмону солго жылдырып, экранды бөлүү"
- "Толук экранга которулуу"
+
+
+
+ "Бөлүнгөн экранда сол же төмөн жактагы колдонмого которулуу""Бөлүнгөн экранды колдонуп жатканда сол же жогору жактагы колдонмого которулуңуз""Экранды бөлүү режиминде бир колдонмону экинчисине алмаштыруу"
@@ -987,6 +991,8 @@
"Анча маанилүү эмес билдирменин сүрөтчөлөрүн көрсөтүү""Башка"
+
+ "ыкчам баскычты өчүрүү""аягына карта кошуу""Ыкчам баскычты жылдыруу"
@@ -1501,6 +1507,8 @@
"Акыркы колдонмолорду көрүү""Колдонмолорду которуштуруу""Бүттү"
+
+ "Кайталап көрүңүз!""Артка кайтуу""Сенсордук тактаны үч манжаңыз менен солго же оңго сүрүңүз"
@@ -1538,7 +1546,10 @@
"Акыркы колдонмолорду көрүү үчүн сенсордук тактаны үч манжаңыз менен өйдө сүрүп, кармап туруңуз""Бардык колдонмолоруңузду көрүү үчүн баскычтобуңуздагы аракет баскычын басыңыз""Жашырылды"
- "Көрүү үчүн кулпусун ачыңыз"
+
+
+
+ "Контексттик билим берүү""Артка кайтуу үчүн сенсордук тактаны колдонуңуз""Үч манжаңыз менен солго же оңго сүрүңүз. Башка жаңсоолорду үйрөнүү үчүн таптаңыз."
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 3236b2e2faada..3b86e4b2c3cca 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -245,8 +245,12 @@
"ເຊື່ອມຕໍ່ Bluetooth ແລ້ວ.""ໄອຄອນອຸປະກອນ Bluetooth""ຄລິກເພື່ອຕັ້ງຄ່າລາຍລະອຽດອຸປະກອນ"
- "ຄລິກເພື່ອເບິ່ງອຸປະກອນທັງໝົດ"
- "ຄລິກເພື່ອຈັບຄູ່ອຸປະກອນໃໝ່"
+
+
+
+
+
+ "ບໍ່ຮູ້ເປີເຊັນແບັດເຕີຣີ.""ເຊື່ອມຕໍ່ຫາ %s ແລ້ວ.""ເຊື່ອມຕໍ່ຫາ %s ແລ້ວ."
@@ -808,12 +812,9 @@
"%1$s ບໍ່ຮອງຮັບຄຸນສົມບັດການສົນທະນາ""ຄຳຕິຊົມ""ປິດໄວ້"
-
-
-
-
-
-
+ "ຢ່າສະແດງເປັນປັກໝຸດ"
+ "ກຳລັງສະແດງອັບເດດສົດ"
+ "ການແຈ້ງເຕືອນທີ່ປັກໝຸດໄວ້ຈະສະແດງຂໍ້ມູນສົດຈາກແອັບຕ່າງໆ ແລະ ຈະປາກົດຢູ່ແຖບສະຖານະ ແລະ ໜ້າຈໍລັອກສະເໝີ""ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້.""ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນການໂທໄດ້.""ບໍ່ສາມາດຕັ້ງຄ່າກຸ່ມການແຈ້ງເຕືອນນີ້ຢູ່ບ່ອນນີ້ໄດ້"
@@ -900,7 +901,10 @@
"ການເຮັດຫຼາຍໜ້າວຽກພ້ອມກັນ""ໃຊ້ໂໝດແບ່ງໜ້າຈໍໂດຍໃຫ້ແອັບຢູ່ເບື້ອງຂວາ""ໃຊ້ໂໝດແບ່ງໜ້າຈໍໂດຍໃຫ້ແອັບຢູ່ເບື້ອງຊ້າຍ"
- "ສະຫຼັບໄປໃຊ້ໂໝດເຕັມຈໍ"
+
+
+
+ "ສະຫຼັບໄປໃຊ້ແອັບຢູ່ຂວາ ຫຼື ທາງລຸ່ມໃນຂະນະທີ່ໃຊ້ແບ່ງໜ້າຈໍ""ສະຫຼັບໄປໃຊ້ແອັບຢູ່ຊ້າຍ ຫຼື ທາງເທິງໃນຂະນະທີ່ໃຊ້ແບ່ງໜ້າຈໍ""ໃນລະຫວ່າງແບ່ງໜ້າຈໍ: ໃຫ້ປ່ຽນຈາກແອັບໜຶ່ງເປັນອີກແອັບໜຶ່ງ"
@@ -987,6 +991,8 @@
"ສະແດງໄອຄອນການແຈ້ງເຕືອນຄວາມສຳຄັນຕ່ຳ""ອື່ນໆ"
+
+ "ລຶບແຜ່ນອອກ""ເພີ່ມແຜ່ນໃສ່ຕຳແໜ່ງສຸດທ້າຍ""ຍ້າຍແຜ່ນ"
@@ -1501,6 +1507,8 @@
"ເບິ່ງແອັບຫຼ້າສຸດ""ສະຫຼັບແອັບ""ແລ້ວໆ"
+
+ "ກະລຸນາລອງໃໝ່!""ກັບຄືນ""ປັດຊ້າຍ ຫຼື ຂວາໂດຍໃຊ້ມືສາມນິ້ວຢູ່ແຜ່ນສໍາຜັດຂອງທ່ານ"
@@ -1538,7 +1546,10 @@
"ເພື່ອເບິ່ງແອັບຫຼ້າສຸດ, ໃຫ້ໃຊ້ 3 ນິ້ວປັດຂຶ້ນ ແລ້ວຄ້າງໄວ້ເທິງແຜ່ນສໍາຜັດ""ເພື່ອເບິ່ງແອັບທັງໝົດຂອງທ່ານ, ໃຫ້ກົດປຸ່ມຄຳສັ່ງຢູ່ແປ້ນພິມຂອງທ່ານ""ປົກປິດໄວ້ແລ້ວ"
- "ປົດລັອກເພື່ອເບິ່ງ"
+
+
+
+ "ການສຶກສາຕາມບໍລິບົດ""ໃຊ້ແຜ່ນສໍາຜັດຂອງທ່ານເພື່ອກັບຄືນ""ໃຊ້ 3 ນິ້ວປັດຊ້າຍ ຫຼື ຂວາ. ແຕະເພື່ອສຶກສາທ່າທາງເພີ່ມເຕີມ."
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 25208b0ca6e2c..8758a1e5e053b 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -245,8 +245,9 @@
"„Bluetooth“ prijungtas.""„Bluetooth“ įrenginio piktograma""Spustelėkite, jei norite konfigūruoti išsamią įrenginio informaciją"
- "Spustelėkite, kad peržiūrėtumėte visus įrenginius"
- "Spustelėkite, kad susietumėte naują įrenginį"
+ "„%s“. Konfigūruoti išsamią įrenginio informaciją"
+ "Žr. visus įrenginius"
+ "Susieti naują įrenginį""Akumuliatoriaus energija procentais nežinoma.""Prisijungta prie „%s“.""Prisijungta prie %s."
@@ -808,12 +809,9 @@
"Programa „%1$s“ nepalaiko pokalbių funkcijų""Atsiliepimai""Uždaryti"
-
-
-
-
-
-
+ "Nerodyti kaip prisegtą"
+ "Rodomos tiesioginės naujienos"
+ "Prisegti pranešimai rodo tiesioginę informaciją iš programų ir visada rodomi būsenos juostoje bei užrakinimo ekrane""Šių pranešimų keisti negalima.""Skambučių pranešimų keisti negalima.""Šios grupės pranešimai čia nekonfigūruojami"
@@ -900,7 +898,8 @@
"Kelių užduočių atlikimas""Naudokite išskaidyto ekrano režimą su programa dešinėje""Naudokite išskaidyto ekrano režimą su programa kairėje"
- "Perjunkite į viso ekrano režimą"
+ "Naudoti viso ekrano režimą"
+ "Naudoti rodinio versiją staliniams kompiuteriams""Perjunkite į programą dešinėje arba apačioje išskaidyto ekrano režimu""Perjunkite į programą kairėje arba viršuje išskaidyto ekrano režimu""Išskaidyto ekrano režimu: pakeisti iš vienos programos į kitą"
@@ -987,6 +986,8 @@
"Rodyti mažo prioriteto pranešimų piktogramas""Kita"
+
+ "pašalintumėte išklotinės elementą""pridėti išklotinės elementą paskutinėje pozicijoje""Perkelti išklotinės elementą"
@@ -1501,6 +1502,7 @@
"Peržiūrėti naujausias programas""Perjungti programas""Atlikta"
+ "Kitas""Bandykite dar kartą!""Grįžti""Braukite kairėn arba dešinėn trimis pirštais bet kur jutiklinėje dalyje"
@@ -1538,7 +1540,10 @@
"Peržiūrėkite naujausias programas, jutiklinėje dalyje perbraukę aukštyn trimis pirštais ir palaikę""Jei norite peržiūrėti visas programas, paspauskite klaviatūros veiksmų klavišą""Paslėpta"
- "Atrakinkite, kad peržiūrėtumėte"
+
+
+
+ "Kontekstinis švietimas""Naudokite klaviatūrą, kad grįžtumėte atgal""Perbraukite į kairę ar dešinę trimis pirštais. Palieskite, kad sužinotumėte daugiau gestų."
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index bf1ef9692c711..43419b19c89b4 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth savienojums ir izveidots.""Bluetooth ierīces ikona""Lai konfigurētu ierīces informāciju, noklikšķiniet"
- "Noklikšķiniet, lai skatītu visas ierīces"
- "Noklikšķiniet, lai savienotu pārī jaunu ierīci"
+
+
+
+
+
+ "Akumulatora uzlādes līmenis procentos nav zināms.""Ir izveidots savienojum ar %s.""Savienots ar ierīci %s."
@@ -808,12 +812,9 @@
"Lietotnē %1$s netiek atbalstītas sarunu funkcijas.""Atsauksmes""Nerādīt"
-
-
-
-
-
-
+ "Nerādīt kā piespraustu"
+ "Reāllaika jaunumu rādīšana"
+ "Piespraustajos paziņojumos tiek rādīta reāllaika informācija no lietotnēm, un tie vienmēr tiek rādīti statusa joslā un bloķēšanas ekrānā.""Šos paziņojumus nevar modificēt.""Paziņojumus par zvaniem nevar modificēt.""Šeit nevar konfigurēt šo paziņojumu grupu."
@@ -900,7 +901,10 @@
"Vairākuzdevumu režīms""Izmantot ekrāna sadalīšanu ar lietotni labajā pusē""Izmantot ekrāna sadalīšanu ar lietotni kreisajā pusē"
- "Pārslēgšana pilnekrāna režīmā"
+
+
+
+ "Pāriet uz lietotni pa labi/lejā, kamēr izmantojat sadalīto ekrānu.""Pāriet uz lietotni pa kreisi/augšā, kamēr izmantojat sadalīto ekrānu.""Ekrāna sadalīšanas režīmā: pārvietot lietotni no viena ekrāna uz otru"
@@ -987,6 +991,8 @@
"Rādīt zemas prioritātes paziņojumu ikonas""Citi"
+
+ "noņemt elementu""pievienotu elementu pēdējā pozīcijā""Pārvietot elementu"
@@ -1501,6 +1507,8 @@
"Skatīt nesen izmantotās lietotnes""Pārslēgties starp lietotnēm""Gatavs"
+
+ "Mēģiniet vēlreiz.""Atpakaļ""Skārienpaliktnī ar trīs pirkstiem velciet pa kreisi vai pa labi."
@@ -1538,7 +1546,10 @@
"Lai skatītu nesenās lietotnes, ar trīs pirkstiem uz skārienpaliktņa velciet augšup un turiet.""Lai skatītu visas savas lietotnes, tastatūrā nospiediet darbību taustiņu.""Rediģēts"
- "Lai skatītu, atbloķējiet"
+
+
+
+ "Kontekstuāla pamācība""Atgriešanās, izmantojot skārienpaliktni""Ar trīs pirkstiem velciet pa kreisi vai pa labi. Lai apgūtu citus žestus, pieskarieties šeit."
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index e34d9d88cc82f..48358746f571c 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth е поврзан.""Икона за уред со Bluetooth""Кликнете за да ги конфигурирате деталите за уредот"
- "Кликнете за да се прикажат сите уреди"
- "Кликнете за да спарите нов уред"
+
+
+
+
+
+ "Процентот на батеријата е непознат.""Поврзано со %s.""Поврзано со %s."
@@ -808,12 +812,9 @@
"%1$s не поддржува функции за разговор""Повратни информации""Отфрли"
-
-
-
-
-
-
+ "Не прикажувај како закачено"
+ "Прикажува новости во живо"
+ "Закачените известувања прикажуваат информации во живо од апликациите и секогаш се појавуваат на статусната лента и на заклучениот екран""Овие известувања не може да се изменат""Известувањата за повици не може да се изменат.""Оваа група известувања не може да се конфигурира тука"
@@ -900,7 +901,10 @@
"Мултитаскинг""Користете поделен екран со апликацијата оддесно""Користете поделен екран со апликацијата одлево"
- "Префрлете се на цел екран"
+
+
+
+ "Префрлете се на апликацијата десно или долу при користењето поделен екран""Префрлете се на апликацијата лево или горе при користењето поделен екран""При поделен екран: префрлете ги аплик. од едната на другата страна"
@@ -987,6 +991,8 @@
"Прикажувај икони за известувања со низок приоритет""Друго"
+
+ "отстранување на плочката""додајте плочка на последната позиција""Преместување на плочката"
@@ -1501,6 +1507,8 @@
"Прикажи ги неодамнешните апликации""Сменете ги апликациите""Готово"
+
+ "Обидете се повторно!""Назад""Повлечете налево или надесно со три прста на допирната подлога"
@@ -1538,7 +1546,10 @@
"За да ги видите скорешните апликации, повлечете нагоре и задржете со три прста на допирната подлога""Притиснете го копчето за дејство на тастатурата за да ги видите сите апликации""Редактирано"
- "Отклучете за приказ"
+
+
+
+ "Контекстуално образование""Користете ја допирната подлога за да се вратите назад""Повлечете налево или надесно со три прста. Допрете за да научите повеќе движења."
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 226822a606bfe..c9f938738d38c 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -245,8 +245,12 @@
"ബ്ലൂടൂത്ത് കണക്റ്റുചെയ്തു.""Bluetooth ഉപകരണ ഐക്കൺ""ഉപകരണത്തിന്റെ വിശദാംശങ്ങൾ കോൺഫിഗർ ചെയ്യാൻ ക്ലിക്ക് ചെയ്യുക"
- "എല്ലാ ഉപകരണങ്ങളും കാണാൻ ക്ലിക്ക് ചെയ്യുക"
- "പുതിയ ഉപകരണം ജോടിയാക്കാൻ ക്ലിക്ക് ചെയ്യുക"
+
+
+
+
+
+ "ബാറ്ററി ശതമാനം അജ്ഞാതമാണ്.""%s എന്നതിലേക്ക് കണക്റ്റുചെയ്തു.""%s എന്നതിലേക്ക് കണക്റ്റുചെയ്തു."
@@ -808,12 +812,9 @@
"സംഭാഷണ ഫീച്ചറുകളെ %1$s പിന്തുണയ്ക്കുന്നില്ല""ഫീഡ്ബാക്ക്""ഡിസ്മിസ് ചെയ്യുക"
-
-
-
-
-
-
+ "പിൻ ചെയ്തതായി കാണിക്കരുത്"
+ "തത്സമയ അപ്ഡേറ്റുകൾ കാണിക്കുന്നു"
+ "പിൻ ചെയ്ത അറിയിപ്പുകൾ, ആപ്പുകളിൽ നിന്നുള്ള തത്സമയ വിവരങ്ങൾ പ്രദർശിപ്പിക്കും, അവ എപ്പോഴും സ്റ്റാറ്റസ് ബാറിലും ലോക്ക് സ്ക്രീനിലും ദൃശ്യമാകും""ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല.""കോൾ അറിയിപ്പുകൾ പരിഷ്കരിക്കാനാകുന്നില്ല.""അറിയിപ്പുകളുടെ ഈ ഗ്രൂപ്പ് ഇവിടെ കോണ്ഫിഗര് ചെയ്യാൻ കഴിയില്ല"
@@ -900,7 +901,10 @@
"മൾട്ടിടാസ്കിംഗ്""വലതുവശത്തുള്ള ആപ്പിനൊപ്പം സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കുക""ഇടതുവശത്തുള്ള ആപ്പിനൊപ്പം സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കുക"
- "പൂർണ്ണ സ്ക്രീനിലേക്ക് മാറുക"
+
+
+
+ "സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കുമ്പോൾ വലതുവശത്തെ/താഴത്തെ ആപ്പിലേക്ക് മാറുക""സ്ക്രീൻ വിഭജന മോഡ് ഉപയോഗിക്കുമ്പോൾ ഇടതുവശത്തെ/മുകളിലെ ആപ്പിലേക്ക് മാറൂ""സ്ക്രീൻ വിഭജന മോഡിൽ: ഒരു ആപ്പിൽ നിന്ന് മറ്റൊന്നിലേക്ക് മാറുക"
@@ -987,6 +991,8 @@
"പ്രാധാന്യം കുറഞ്ഞ അറിയിപ്പ് ചിഹ്നങ്ങൾ""മറ്റുള്ളവ"
+
+ "ടൈൽ നീക്കം ചെയ്യുക""അവസാന ഭാഗത്ത് ടൈൽ ചേർക്കുക""ടൈൽ നീക്കുക"
@@ -1501,6 +1507,8 @@
"അടുത്തിടെയുള്ള ആപ്പുകൾ കാണുക""ആപ്പുകൾ മാറുക""പൂർത്തിയായി"
+
+ "വീണ്ടും ശ്രമിക്കുക!""മടങ്ങുക""ടച്ച്പാഡിൽ മൂന്ന് വിരലുകൾ കൊണ്ട് ഇടത്തേക്കോ വലത്തേക്കോ സ്വൈപ്പ് ചെയ്യുക"
@@ -1538,7 +1546,10 @@
"അടുത്തിടെ ഉപയോഗിച്ച ആപ്പുകൾ കാണാൻ, മൂന്ന് വിരലുകൾ ഉപയോഗിച്ച് ടച്ച്പാഡിൽ സ്വൈപ്പ് ചെയ്ത് പിടിക്കുക""എല്ലാ ആപ്പുകളും കാണാൻ, നിങ്ങളുടെ കീബോർഡിലെ ആക്ഷൻ കീ അമർത്തുക""മറച്ചത്"
- "കാണാൻ, അൺലോക്ക് ചെയ്യുക"
+
+
+
+ "സന്ദർഭോചിത വിദ്യാഭ്യാസം""തിരികെ പോകാൻ നിങ്ങളുടെ ടച്ച്പാഡ് ഉപയോഗിക്കുക""മൂന്ന് വിരലുകൾ കൊണ്ട് ഇടത്തേക്കോ വലത്തേക്കോ സ്വൈപ്പ് ചെയ്യൂ. കൂടുതൽ ജെസ്ച്ചറുകളറിയാൻ ടാപ്പ് ചെയ്യൂ."
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 06b62e9ae8eb3..f137f74181e04 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth холбогдсон.""Bluetooth төхөөрөмжийн дүрс тэмдэг""Төхөөрөмжийн дэлгэрэнгүйг тохируулахын тулд товшино уу"
- "Бүх төхөөрөмжийг харахын тулд товшино уу"
- "Шинэ төхөөрөмж хослуулахын тулд товшино уу"
+
+
+
+
+
+ "Батарейн хувь тодорхойгүй байна.""%s-тай холбогдсон.""%s-д холбогдсон."
@@ -808,12 +812,9 @@
"%1$s нь харилцан ярианы онцлогуудыг дэмждэггүй""Санал хүсэлт""Хаах"
-
-
-
-
-
-
+ "Бэхэлсэн байдлаар бүү харуул"
+ "Шууд шинэчлэлтийг харуулж байна"
+ "Бэхэлсэн мэдэгдэл нь аппуудын шууд мэдээллийг харуулдаг бөгөөд статусын мөр, түгжээтэй дэлгэц дээр үргэлж харагдана""Эдгээр мэдэгдлийг өөрчлөх боломжгүй.""Дуудлагын мэдэгдлийг өөрчлөх боломжгүй.""Энэ бүлэг мэдэгдлийг энд тохируулах боломжгүй байна"
@@ -900,7 +901,10 @@
"Олон ажил зэрэг хийх""Аппыг баруун талд байгаагаар дэлгэцийг хуваахыг ашиглах""Аппыг зүүн талд байгаагаар дэлгэцийг хуваахыг ашиглах"
- "Бүтэн дэлгэц рүү сэлгэх"
+
+
+
+ "Дэлгэц хуваахыг ашиглаж байхдаа баруун талд эсвэл доор байх апп руу сэлгэ""Дэлгэц хуваахыг ашиглаж байхдаа зүүн талд эсвэл дээр байх апп руу сэлгэ""Дэлгэц хуваах үеэр: аппыг нэгээс нөгөөгөөр солих"
@@ -987,6 +991,8 @@
"Бага ач холбогдолтой мэдэгдлийн дүрс тэмдгийг харуулах""Бусад"
+
+ "хавтанг хасна уу""хавтанг сүүлийн байрлалд нэмэх""Хавтанг зөөх"
@@ -1501,6 +1507,8 @@
"Саяхны аппуудыг харах""Апп сэлгэх""Болсон"
+
+ "Дахин оролдоно уу!""Буцах""Мэдрэгч самбар дээрээ гурван хуруугаа ашиглан зүүн эсвэл баруун тийш шударна уу"
@@ -1538,7 +1546,10 @@
"Саяхны аппуудыг харахын тулд мэдрэгч самбар дээр гурван хуруугаараа дээш шудраад, удаан дарна уу""Бүх аппаа харахын тулд гар дээр тань байх тусгай товчлуурыг дарна уу""Хассан"
- "Харахын тулд түгжээг тайлна уу"
+
+
+
+ "Хам сэдэвт боловсрол""Буцахын тулд мэдрэгч самбараа ашиглах""Гурван хуруугаараа зүүн эсвэл баруун тийш шударна уу. Илүү олон зангаа сурахын тулд товшино уу."
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index 4c2fd29355ce5..f2bfe39ef83f2 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -245,8 +245,9 @@
"ब्लूटूथ कनेक्ट केले.""ब्लूटूथ डिव्हाइस आयकन""डिव्हाइसचे तपशील कॉन्फिगर करण्यासाठी क्लिक करा"
- "सर्व डिव्हाइस पाहण्यासाठी क्लिक करा"
- "नवीन डिव्हाइस पेअर करण्यासाठी क्लिक करा"
+ "%s. डिव्हाइसचे तपशील कॉन्फिगर करा"
+ "सर्व डिव्हाइस पहा"
+ "नवीन डिव्हाइस पेअर करा""बॅटरीच्या चार्जिंगची टक्केवारी माहित नाही.""%s शी कनेक्ट केले.""%s शी कनेक्ट केले."
@@ -417,7 +418,7 @@
"प्रीसेट अपडेट करता आले नाही""प्रीसेट""निवडला आहे"
- "जवळपासचे आवाज"
+ "जवळपासचे""डावे""उजवे""डाव्या आणि उजव्या स्वतंत्र नियंत्रणांचा विस्तार करा"
@@ -808,12 +809,9 @@
"%1$s हे संभाषण वैशिष्ट्यांना सपोर्ट करत नाही""फीडबॅक""डिसमिस करा"
-
-
-
-
-
-
+ "पिन केलेले म्हणून दाखवू नका"
+ "लाइव्ह अपडेट दाखवत आहे"
+ "पिन केलेली नोटिफिकेशन अॅप्समधील लाइव्ह माहिती दाखवतात आणि नेहमी स्टेटस बार व लॉक स्क्रीनवर दिसतात""या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही.""कॉलशी संबंधित सूचनांमध्ये फेरबदल केला जाऊ शकत नाही.""या सूचनांचा संच येथे कॉन्फिगर केला जाऊ शकत नाही"
@@ -900,7 +898,8 @@
"मल्टिटास्किंग""ॲप उजवीकडे ठेवून स्प्लिट स्क्रीन वापरा""ॲप डावीकडे ठेवून स्प्लिट स्क्रीन वापरा"
- "फुल स्क्रीनवर स्विच करणे"
+ "फुल स्क्रीन वापरा"
+ "डेस्कटॉप दृश्य पहा""स्प्लिट स्क्रीन वापरताना उजवीकडील किंवा खालील अॅपवर स्विच करा""स्प्लिट स्क्रीन वापरताना डावीकडील किंवा वरील अॅपवर स्विच करा""स्प्लिट स्क्रीनदरम्यान: एक अॅप दुसऱ्या अॅपने बदला"
@@ -987,6 +986,8 @@
"कमी प्राधान्य सूचना आयकन दर्शवा""अन्य"
+
+ "टाइल काढून टाका""टाइल शेवटच्या स्थानावर जोडा""टाइल हलवा"
@@ -1501,6 +1502,7 @@
"अलीकडील अॅप्स पहा""अॅप्स स्विच करा""पूर्ण झाले"
+ "पुढील""पुन्हा प्रयत्न करा!""मागे जा""तुमच्या टचपॅडवर तीन बोटांनी डावीकडे किंवा उजवीकडे स्वाइप करा"
@@ -1538,7 +1540,10 @@
"अलीकडील ॲप्स पाहण्यासाठी, टचपॅडवर तीन बोटांनी वरती स्वाइप करा आणि धरून ठेवा""तुमची सर्व ॲप्स पाहण्यासाठी, तुमच्या कीबोर्डवरील अॅक्शन की प्रेस करा""रिडॅक्ट केलेले"
- "पाहण्यासाठी अनलॉक करा"
+
+
+
+ "संदर्भीय शिक्षण""मागे जाण्यासाठी तुमचा टचपॅड वापरा""तीन बोटांनी डावीकडे किंवा उजवीकडे स्वाइप करा. आणखी जेश्चर जाणून घेण्यासाठी टॅप करा."
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 93f25ffc012e2..e66af4e322d43 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth disambungkan.""Ikon peranti Bluetooth""Klik untuk mengkonfigurasi butiran peranti"
- "Klik untuk melihat semua peranti"
- "Klik untuk menggandingkan peranti baharu"
+
+
+
+
+
+ "Peratusan kuasa bateri tidak diketahui.""Disambungkan kepada %s.""Disambungkan ke %s."
@@ -808,12 +812,9 @@
"%1$s tidak menyokong ciri perbualan""Maklum balas""Ketepikan"
-
-
-
-
-
-
+ "Jangan papar sebagai disemat"
+ "Menunjukkan Kemaskinian Langsung"
+ "Pemberitahuan yang disematkan memaparkan maklumat langsung daripada apl dan sentiasa dipaparkan pada bar status dan skrin kunci""Pemberitahuan ini tidak boleh diubah suai.""Pemberitahuan panggilan tidak boleh diubah suai.""Kumpulan pemberitahuan ini tidak boleh dikonfigurasikan di sini"
@@ -900,7 +901,10 @@
"Berbilang tugas""Gunakan skrin pisah dengan apl pada sebelah kanan""Gunakan skrin pisah dengan apl pada sebelah kiri"
- "Beralih kepada skrin penuh"
+
+
+
+ "Tukar kepada apl di sebelah kanan/bawah semasa menggunakan skrin pisah""Tukar kepada apl di sebelah kiri/atas semasa menggunakan skrin pisah""Semasa skrin pisah: gantikan apl daripada satu apl kepada apl lain"
@@ -987,6 +991,8 @@
"Tunjukkan ikon pemberitahuan keutamaan rendah""Lain-lain"
+
+ "alih keluar jubin""tambahkan jubin pada kedudukan terakhir""Alihkan jubin"
@@ -1501,6 +1507,8 @@
"Lihat apl terbaharu""Tukar apl""Selesai"
+
+ "Cuba lagi!""Kembali""Leret ke kiri atau ke kanan menggunakan tiga jari pada pad sentuh"
@@ -1538,7 +1546,10 @@
"Untuk melihat apl terbaharu, leret ke atas dan tahan dengan tiga jari pada pad sentuh""Untuk melihat semua apl, tekan kekunci tindakan pada papan kekunci""Disunting"
- "Buka kunci untuk melihat"
+
+
+
+ "Pendidikan kontekstual""Gunakan pad sentuh anda untuk kembali""Leret ke kiri atau ke kanan dengan tiga jari. Ketik dan ketahui lebih lanjut tentang gerak isyarat."
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index bed07ef4cf492..b7aeb45e2458c 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -245,8 +245,12 @@
"ဘလူးတုသ်ချိတ်ဆက်ထားမှု""ဘလူးတုသ်သုံးစက် သင်္ကေတ""စက်အသေးစိတ်ကို စီစဉ်သတ်မှတ်ရန် နှိပ်ပါ"
- "စက်အားလုံးကြည့်ရန် နှိပ်ပါ"
- "စက်အသစ် တွဲချိတ်ရန် နှိပ်ပါ"
+
+
+
+
+
+ "ဘက်ထရီရာခိုင်နှုန်းကို မသိပါ။""%sသို့ ချိတ်ဆက်ထား""%s သို့ချိတ်ဆက်ထားပါသည်။"
@@ -530,7 +534,7 @@
"ဝိဂျက် ဖယ်ရှားရန်""ရွေးချယ်ထားသော ဝိဂျက်ကို တင်ရန်""လော့ခ်မျက်နှာပြင် ဝိဂျက်များ"
- "တက်ဘလက်လော့ခ်ချထားသော်လည်း မည်သူမဆို လော့ခ်မျက်နှာပြင်ဝိဂျက်ကို ကြည့်နိုင်သည်။"
+ "တက်ဘလက်လော့ခ်ချထားစဉ် မည်သူမဆို လော့ခ်မျက်နှာပြင်ရှိ ဝိဂျက်များကို မြင်နိုင်သည်။""ဝိဂျက် ပြန်ဖြုတ်ရန်""အမြင့်ကို လျှော့ရန်""အမြင့်ကို တိုးရန်"
@@ -808,12 +812,9 @@
"%1$s က စကားဝိုင်းဝန်ဆောင်မှုများကို မပံ့ပိုးပါ""အကြံပြုချက်""ပယ်ရန်"
-
-
-
-
-
-
+ "ပင်ထိုးထားသည့်အတိုင်း မပြရ"
+ "တိုက်ရိုက် အပ်ဒိတ်များ ပြနေသည်"
+ "ပင်ထိုးထားသော အကြောင်းကြားချက်များသည် အက်ပ်များမှ တိုက်ရိုက်အချက်အလက်များကိုပြပြီး ၎င်းတို့ကို အခြေအနေပြဘားနှင့် လော့ခ်မျက်နှာပြင်တို့တွင် အမြဲမြင်ရသည်""ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။""ခေါ်ဆိုမှုအကြောင်းကြားချက်များကို ပြင်၍မရပါ။""ဤအကြောင်းကြားချက်အုပ်စုကို ဤနေရာတွင် စီစဉ်သတ်မှတ်၍ မရပါ"
@@ -900,7 +901,10 @@
"တစ်ပြိုင်နက် များစွာလုပ်ခြင်း""အက်ပ်ကို ညာ၌ထားကာ မျက်နှာပြင် ခွဲ၍ပြသခြင်း သုံးရန်""အက်ပ်ကို ဘယ်၌ထားကာ မျက်နှာပြင် ခွဲ၍ပြသခြင်း သုံးရန်"
- "ဖန်သားပြင်အပြည့် ပြောင်းရန်"
+
+
+
+ "မျက်နှာပြင်ခွဲ၍ပြသခြင်း သုံးစဉ် ညာ (သို့) အောက်ရှိအက်ပ်သို့ ပြောင်းရန်""မျက်နှာပြင် ခွဲ၍ပြသခြင်းသုံးစဉ် ဘယ် (သို့) အထက်ရှိအက်ပ်သို့ ပြောင်းရန်""မျက်နှာပြင် ခွဲ၍ပြသစဉ်- အက်ပ်တစ်ခုကို နောက်တစ်ခုနှင့် အစားထိုးရန်"
@@ -987,6 +991,8 @@
"အရေးမကြီးသော အကြောင်းကြားချက် သင်္ကေတများ ပြရန်""အခြား"
+
+ "အကွက်ငယ်ကို ဖယ်ရှားရန်""နောက်ဆုံးနေရာတွင် အကွက်ငယ် ထည့်ရန်""အကွက်ငယ်ကို ရွှေ့ရန်"
@@ -1501,6 +1507,8 @@
"မကြာသေးမီကအက်ပ်များကို ကြည့်ရန်""အက်ပ်များကူးပြောင်းခြင်း""ပြီးပြီ"
+
+ "ထပ်စမ်းကြည့်ပါ။""ပြန်သွားရန်""သင့်တာ့ချ်ပက်တွင် လက်သုံးချောင်းဖြင့် ဘယ် (သို့) ညာသို့ ပွတ်ဆွဲပါ"
@@ -1538,7 +1546,10 @@
"လတ်တလောအက်ပ်များကို ကြည့်ရန် တာ့ချ်ပက်ပေါ်တွင် လက်သုံးချောင်းဖြင့် အပေါ်သို့ပွတ်ဆွဲပြီး ဖိထားပါ""သင့်အက်ပ်အားလုံးကြည့်ရန် ကီးဘုတ်ပေါ်ရှိ လုပ်ဆောင်ချက်ကီးကို နှိပ်ပါ""အစားထိုးထားသည်"
- "ကြည့်ရန် ဖွင့်ပါ"
+
+
+
+ "အကြောင်းအရာအလိုက် ပညာရေး""နောက်ပြန်သွားရန် သင့်တာ့ချ်ပက်ကို သုံးပါ""လက်သုံးချောင်းဖြင့် ဘယ် (သို့) ညာသို့ ပွတ်ဆွဲပါ။ လက်ဟန်များ ပိုမိုလေ့လာရန် တို့ပါ။"
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 7e87efc4f0dc9..d85bf86167cc7 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth er tilkoblet.""Ikon for Bluetooth-enheter""Klikk for å konfigurere enhetsdetaljer"
- "Klikk for å se alle enhetene"
- "Klikk for å koble sammen en ny enhet"
+
+
+
+
+
+ "Batteriprosenten er ukjent.""Koblet til %s.""Koblet til %s."
@@ -808,12 +812,9 @@
"%1$s støtter ikke samtalefunksjoner""Tilbakemelding""Lukk"
-
-
-
-
-
-
+ "Ikke vis som festet"
+ "Viser direkteoppdateringer"
+ "Festede varsler viser sanntidsinformasjon fra apper og vises alltid i statusfeltet og på låseskjermen""Disse varslene kan ikke endres.""Anropsvarsler kan ikke endres.""Denne varselgruppen kan ikke konfigureres her"
@@ -900,7 +901,10 @@
"Multitasking""Bruk delt skjerm med appen til høyre""Bruk delt skjerm med appen til venstre"
- "Bytt til fullskjerm"
+
+
+
+ "Bytt til appen til høyre eller under mens du bruker delt skjerm""Bytt til appen til venstre eller over mens du bruker delt skjerm""I delt skjerm: Bytt ut en app"
@@ -987,6 +991,8 @@
"Vis ikoner for varsler med lav prioritet""Annet"
+
+ "fjerne infobrikken""legge til en brikke på den siste posisjonen""Flytt infobrikken"
@@ -1501,6 +1507,8 @@
"Se nylige apper""Bytt app""Ferdig"
+
+ "Prøv på nytt.""Gå tilbake""Sveip til venstre eller høyre med tre fingre på styreflaten"
@@ -1538,7 +1546,10 @@
"For å se nylige apper, sveip opp og hold med tre fingre på styreflaten""For å se alle appene dine, trykk på handlingstasten på tastaturet""Fjernet"
- "Lås opp for å se"
+
+
+
+ "Kontekstuell opplæring""Bruk styreflaten for å gå tilbake""Sveip til venstre eller høyre med tre fingre. Trykk for å lære flere bevegelser."
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index cc07b7fa1001c..90776281ba3d0 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -245,8 +245,12 @@
"ब्लुटुथ जडान भयो।""ब्लुटुथ डिभाइस जनाउने आइकन""डिभाइसको विवरण कन्फिगर गर्न क्लिक गर्नुहोस्"
- "सबै डिभाइसहरू हेर्न क्लिक गर्नुहोस्"
- "नयाँ डिभाइसमा कनेक्ट गर्न क्लिक गर्नुहोस्"
+
+
+
+
+
+ "ब्याट्रीमा कति प्रतिशत चार्ज छ भन्ने कुराको जानाकरी छैन।""%s मा जडित।""%s मा कनेक्ट गरियो।"
@@ -424,7 +428,7 @@
"कोल्याप्स गरी एउटै कन्ट्रोल बनाउनुहोस्""वरपरका आवाज म्युट गर्नुहोस्""वरपरका आवाज अनम्युट गर्नुहोस्"
- "टुल"
+ "टुलहरू""लाइभ क्याप्सन""नोट""डिभाइसको माइक्रोफोन अनब्लक गर्ने हो?"
@@ -506,7 +510,7 @@
"कम्युनल ट्युटोरियल सुरु गर्न बायाँतिर स्वाइप गर्नुहोस्""कस्टमाइज गर्नुहोस्""खारेज गर्नुहोस्"
- "यो स्पेसमा आफ्ना विजेटहरू हाल्नुहोस्, हटाउनुहोस् र तिनका क्रम फेरि मिलाउनुहोस्"
+ "यो स्पेसमा विजेटहरू हाल्नुहोस्, हटाउनुहोस् र तिनको क्रम मिलाउनुहोस्""थप विजेटहरू हाल्नुहोस्""विजेटहरू कस्टमाइज गर्न केही बेरसम्म थिच्नुहोस्""विजेटहरू कस्टमाइज गर्नुहोस्"
@@ -808,12 +812,9 @@
"%1$s मा वार्तालापसम्बन्धी सुविधा प्रयोग गर्न मिल्दैन""प्रतिक्रिया""हटाउनुहोस्"
-
-
-
-
-
-
+ "पिन गरिएका अपडेटका रूपमा नदेखाउनुहोस्"
+ "लाइभ अपडेटहरू देखाइँदै छन्"
+ "पिन गरिएका नोटिफिकेसनमा एपहरूबाट प्राप्त हालको जानकारी देखाइन्छ र ती नोटिफिकेसन सधैँ स्ट्याटस बार र लक स्क्रिनमा देखिन्छन्""यी सूचनाहरू परिमार्जन गर्न मिल्दैन।""कलसम्बन्धी सूचनाहरू परिमार्जन गर्न मिल्दैन।""यहाँबाट सूचनाहरूको यो समूह कन्फिगर गर्न सकिँदैन"
@@ -900,7 +901,10 @@
"मल्टिटास्किङ""हालको एप दायाँ भागमा पारेर स्प्लिट स्क्रिन प्रयोग गर्नुहोस्""हालको एप बायाँ भागमा पारेर स्प्लिट स्क्रिन प्रयोग गर्नुहोस्"
- "फुल स्क्रिन प्रयोग गर्नुहोस्"
+
+
+
+ "स्प्लिट स्क्रिन प्रयोग गर्दै गर्दा दायाँ वा तलको एप चलाउनुहोस्""स्प्लिट स्क्रिन प्रयोग गर्दै गर्दा बायाँ वा माथिको एप चलाउनुहोस्""स्प्लिट स्क्रिन प्रयोग गरिएका बेला: एउटा स्क्रिनमा भएको एप अर्कोमा लैजानुहोस्"
@@ -987,6 +991,8 @@
"कम प्राथमिकताका सूचना आइकनहरू देखाउनुहोस्""अन्य"
+
+ "टाइल हटाउनुहोस्""अन्तिम स्थानमा टाइल हाल्नुहोस्""टाइल सार्नुहोस्"
@@ -1501,6 +1507,8 @@
"हालसालै चलाइएका एपहरू हेर्नुहोस्""एपहरू बदल्नुहोस्""सम्पन्न भयो"
+
+ "फेरि प्रयास गर्नुहोस्!""पछाडि जानुहोस्""तीन वटा औँला प्रयोग गरी टचप्याडमा बायाँ वा दायाँतिर स्वाइप गर्नुहोस्"
@@ -1538,7 +1546,10 @@
"आफूले हालसालै चलाएका एपहरू हेर्न तीन वटा औँलाले टचप्याडमा माथितिर स्वाइप गर्नुहोस् र होल्ड गर्नुहोस्""आफ्ना सबै एपहरू हेर्न आफ्नो किबोर्डमा भएको एक्सन की थिच्नुहोस्""जानकारी लुकाउन सम्पादन गरिएको"
- "हेर्नका लागि अनलक गर्नुहोस्"
+
+
+
+ "सान्दर्भिक शिक्षा""पछाडि जान आफ्नो टचप्याड प्रयोग गर्नुहोस्""तीन वटा औँला प्रयोग गरी बायाँ वा दायाँतिर स्वाइप गर्नुहोस्। थप जेस्चर प्रयोग गर्ने तरिका सिक्न ट्याप गर्नुहोस्।"
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index b778cecfee224..6d72a126a3ebd 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth-verbinding ingesteld.""Icoon voor bluetooth-apparaat""Klik om de apparaatgegevens in te stellen"
- "Klik om alle apparaten te bekijken"
- "Klik om nieuw apparaat te koppelen"
+
+
+
+
+
+ "Batterijpercentage onbekend.""Verbonden met %s.""Verbonden met %s."
@@ -808,12 +812,9 @@
"%1$s ondersteunt geen gespreksfuncties""Feedback""Sluiten"
-
-
-
-
-
-
+ "Niet tonen als vastgezet"
+ "Live updates worden getoond"
+ "Vastgezette meldingen tonen live informatie van apps en verschijnen altijd in de statusbalk en op het vergrendelscherm""Deze meldingen kunnen niet worden aangepast.""Gespreksmeldingen kunnen niet worden aangepast.""Deze groep meldingen kan hier niet worden ingesteld"
@@ -900,7 +901,10 @@
"Multitasken""Gesplitst scherm gebruiken met de app aan de rechterkant""Gesplitst scherm gebruiken met de app aan de linkerkant"
- "Overschakelen naar volledig scherm"
+
+
+
+ "Naar de app rechts of onderaan gaan als je een gesplitst scherm gebruikt""Naar de app links of bovenaan gaan als je een gesplitst scherm gebruikt""Tijdens gesplitst scherm: een app vervangen door een andere"
@@ -987,6 +991,8 @@
"Iconen voor meldingen met lage prioriteit tonen""Overig"
+
+ "tegel verwijderen""tegel toevoegen op de laatste positie""Tegel verplaatsen"
@@ -1501,6 +1507,8 @@
"Recente apps bekijken""Wisselen tussen apps""Klaar"
+
+ "Probeer het nog eens.""Terug""Swipe met 3 vingers naar links of rechts op de touchpad"
@@ -1538,7 +1546,10 @@
"Als je recente apps wilt bekijken, swipe je met 3 vingers omhoog op de touchpad en houd je vast""Als je alle apps wilt bekijken, druk je op de actietoets op je toetsenbord""Verborgen"
- "Ontgrendelen om te bekijken"
+
+
+
+ "Contextuele educatie""Je touchpad gebruiken om terug te gaan""Swipe met 3 vingers naar links of rechts. Tik voor meer gebaren."
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 0ef622b6b6ebd..699191ca7a653 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -245,8 +245,12 @@
"ବ୍ଲୁଟୂଥ୍ ସଂଯୋଗ କରାଯାଇଛି।""ବ୍ଲୁଟୁଥ ଡିଭାଇସ ଆଇକନ""ଡିଭାଇସ ବିବରଣୀକୁ କନଫିଗର କରିବା ପାଇଁ କ୍ଲିକ କରନ୍ତୁ"
- "ସମସ୍ତ ଡିଭାଇସ ଦେଖିବାକୁ କ୍ଲିକ କରନ୍ତୁ"
- "ନୂଆ ଡିଭାଇସ ପେୟାର କରିବାକୁ କ୍ଲିକ କରନ୍ତୁ"
+
+
+
+
+
+ "ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଅଜଣା ଅଟେ।""%s ସହ ସଂଯୁକ୍ତ""%s ସହିତ ସଂଯୁକ୍ତ।"
@@ -354,7 +358,7 @@
"କଲର ଇନଭର୍ସନ""ରଙ୍ଗ ସଂଶୋଧନ""ଫଣ୍ଟର ଆକାର"
- "ୟୁଜରମାନଙ୍କୁ ପରିଚାଳନା କରନ୍ତୁ"
+ "ୟୁଜରଙ୍କୁ ପରିଚାଳନା""ହୋଇଗଲା""ବନ୍ଦ କରନ୍ତୁ""ସଂଯୁକ୍ତ"
@@ -808,12 +812,9 @@
"%1$s ବାର୍ତ୍ତାଳାପ ଫିଚରଗୁଡ଼ିକୁ ସମର୍ଥନ କରେ ନାହିଁ""ମତାମତ""ଖାରଜ କରନ୍ତୁ"
-
-
-
-
-
-
+ "ପିନ ଥିବା ଭାବେ ଦେଖାନ୍ତୁ ନାହିଁ"
+ "ଲାଇଭ ଅପଡେଟଗୁଡ଼ିକୁ ଦେଖାଉଛି"
+ "ପିନ କରାଯାଇଥିବା ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଆପ୍ସରୁ ଲାଇଭ ସୂଚନା ଡିସପ୍ଲେ କରେ ଏବଂ ସର୍ବଦା ଷ୍ଟାଟସ ବାର ଓ ଲକ ସ୍କ୍ରିନରେ ଦେଖାଯାଏ""ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।""କଲ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ପରିବର୍ତ୍ତନ କରାଯାଇପାରିବ ନାହିଁ।""ଏଠାରେ ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଗ୍ରୁପ୍ କନଫ୍ୟୁଗର୍ କରାଯାଇପାରିବ ନାହିଁ"
@@ -835,7 +836,7 @@
"ବିଜ୍ଞପ୍ତି ନିୟନ୍ତ୍ରଣ""ବିଜ୍ଞପ୍ତି ସ୍ନୁଜ୍ ବିକଳ୍ପ""ମୋତେ ରିମାଇଣ୍ଡର୍ କରନ୍ତୁ"
- "ପୂର୍ବବତ୍ କରନ୍ତୁ"
+ "ଅନଡୁ କରନ୍ତୁ""ବିଜ୍ଞପ୍ତି ସ୍ନୁଜକୁ ପୂର୍ବବତ କରନ୍ତୁ""%1$s ପାଇଁ ସ୍ନୁଜ୍ କରାଗଲା""{count,plural, =1{# ଘଣ୍ଟା}=2{# ଘଣ୍ଟା}other{# ଘଣ୍ଟା}}"
@@ -900,7 +901,10 @@
"ମଲ୍ଟିଟାସ୍କିଂ""ଡାହାଣରେ ଆପ ସହିତ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ବ୍ୟବହାର କରନ୍ତୁ""ବାମରେ ଆପ ସହିତ ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ବ୍ୟବହାର କରନ୍ତୁ"
- "ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନକୁ ସୁଇଚ କରନ୍ତୁ"
+
+
+
+ "ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ବ୍ୟବହାର କରିବା ସମୟରେ ଡାହାଣପଟର ବା ତଳର ଆପକୁ ସୁଇଚ କରନ୍ତୁ""ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ବ୍ୟବହାର କରିବା ସମୟରେ ବାମପଟର ବା ଉପରର ଆପକୁ ସୁଇଚ କରନ୍ତୁ""ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ସମୟରେ: କୌଣସି ଆପକୁ ଗୋଟିଏରୁ ଅନ୍ୟ ଏକ ଆପରେ ବଦଳାନ୍ତୁ"
@@ -987,6 +991,8 @@
"କମ୍-ଅଗ୍ରାଧିକାର ବିଜ୍ଞପ୍ତି ଆଇକନ୍ ଦେଖାନ୍ତୁ""ଅନ୍ୟ"
+
+ "ଟାଇଲ୍ କାଢ଼ି ଦିଅନ୍ତୁ""ଶେଷ ପୋଜିସନରେ ଟାଇଲ ଯୋଗ କରିବା""ଟାଇଲ୍ ମୁଭ୍ କରନ୍ତୁ"
@@ -1132,7 +1138,7 @@
"ମ୍ୟାଗ୍ନିଫାୟର ୱିଣ୍ଡୋର ସେଟିଂସ""ଆକ୍ସେସିବିଲିଟୀ ଫିଚର ଖୋଲିବାକୁ ଟାପ କରନ୍ତୁ। ସେଟିଂସରେ ଏହି ବଟନକୁ କଷ୍ଟମାଇଜ କର କିମ୍ବା ବଦଳାଅ।\n\n""ସେଟିଂସ ଦେଖନ୍ତୁ""ବଟନକୁ ଅସ୍ଥାୟୀ ଭାବେ ଲୁଚାଇବା ପାଇଁ ଏହାକୁ ଗୋଟିଏ ଧାରକୁ ମୁଭ୍ କରନ୍ତୁ"
- "ପୂର୍ବବତ୍ କରନ୍ତୁ"
+ "ଅନଡୁ କରନ୍ତୁ""ଆକ୍ସେସିବିଲିଟୀ ବଟନକୁ ଲୁଚାଯାଇଛି""ଆକ୍ସେସିବିଲିଟୀ ବଟନ ଦେଖାଇବାକୁ ଟାପ କରନ୍ତୁ""%s ସର୍ଟକଟକୁ କାଢ଼ି ଦିଆଯାଇଛି"
@@ -1210,7 +1216,7 @@
"%3$sରୁ %2$sଙ୍କ %1$s ଚଲାନ୍ତୁ""%2$sରୁ %1$s ଚଲାନ୍ତୁ""ଆପଣଙ୍କ ପାଇଁ"
- "ପୂର୍ବବତ୍ କରନ୍ତୁ"
+ "ଅନଡୁ କରନ୍ତୁ""%1$sରେ ପ୍ଲେ କରିବା ପାଇଁ ପାଖକୁ ମୁଭ କରନ୍ତୁ""ଏଠାରେ ପ୍ଲେ କରିବା ପାଇଁ %1$s ପାଖକୁ ମୁଭ କରନ୍ତୁ""%1$sରେ ପ୍ଲେ ହେଉଛି"
@@ -1356,7 +1362,7 @@
"ଇମେଜ ପ୍ରିଭ୍ୟୁ""ଏଡିଟ କରନ୍ତୁ""ଯୋଗ କରନ୍ତୁ"
- "ୟୁଜରମାନଙ୍କୁ ପରିଚାଳନା କରନ୍ତୁ"
+ "ୟୁଜରଙ୍କୁ ପରିଚାଳନା""ଏହି ବିଜ୍ଞପ୍ତି ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନକୁ ଟାଣିବାକୁ ସମର୍ଥନ କରେ ନାହିଁ""ଲୋକେସନ ସକ୍ରିୟ ଅଛି""ୱାଇ-ଫାଇ ଉପଲବ୍ଧ ନାହିଁ"
@@ -1501,6 +1507,8 @@
"ବର୍ତ୍ତମାନର ଆପ୍ସ ଭ୍ୟୁ କରନ୍ତୁ""ଆପ୍ସକୁ ସୁଇଚ କରନ୍ତୁ""ହୋଇଗଲା"
+
+ "ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ!""ପଛକୁ ଫେରନ୍ତୁ""ଆପଣଙ୍କ ଟଚପେଡରେ ତିନୋଟି ଆଙ୍ଗୁଠି ବ୍ୟବହାର କରି ବାମ କିମ୍ବା ଡାହାଣକୁ ସ୍ୱାଇପ କରନ୍ତୁ"
@@ -1538,7 +1546,10 @@
"ବର୍ତ୍ତମାନର ଆପ୍ସ ଭ୍ୟୁ କରିବାକୁ, ଟଚପେଡରେ ତିନୋଟି ଆଙ୍ଗୁଠିରେ ଉପରକୁ ସ୍ୱାଇପ କରି ଧରି ରଖନ୍ତୁ""ଆପଣଙ୍କ ସମସ୍ତ ଆପ୍ସ ଭ୍ୟୁ କରିବା ପାଇଁ ଆପଣଙ୍କ କୀବୋର୍ଡରେ ଆକ୍ସନ କୀ\'କୁ ଦବାନ୍ତୁ""ଲୁଚା ଯାଇଥିବା"
- "ଭ୍ୟୁ କରିବାକୁ ଅନଲକ କରନ୍ତୁ"
+
+
+
+ "ପ୍ରାସଙ୍ଗିକ ଶିକ୍ଷା""ପଛକୁ ଫେରିବା ପାଇଁ ଆପଣଙ୍କ ଟଚପେଡକୁ ବ୍ୟବହାର କରନ୍ତୁ""ତିନୋଟି ଆଙ୍ଗୁଠିରେ ବାମ ବା ଡାହାଣକୁ ସ୍ୱାଇପ କରନ୍ତୁ। ଜେଶ୍ଚରଗୁଡ଼ିକ ବିଷୟରେ ଅଧିକ ଜାଣିବାକୁ ଟାପ କରନ୍ତୁ।"
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 4be78a32282c0..5f7fff1d359d0 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -245,8 +245,9 @@
"Bluetooth ਕਨੈਕਟ ਕੀਤੀ।""ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਤੀਕ""ਡੀਵਾਈਸ ਦੇ ਵੇਰਵੇ ਦਾ ਸੰਰੂਪਣ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ"
- "\'ਸਾਰੇ ਡੀਵਾਈਸ ਦੇਖੋ\' \'ਤੇ ਕਲਿੱਕ ਕਰੋ"
- "\'ਨਵਾਂ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧ ਕਰੋ\' \'ਤੇ ਕਲਿੱਕ ਕਰੋ"
+ "%s. ਡੀਵਾਈਸ ਦੇ ਵੇਰਵੇ ਦਾ ਸੰਰੂਪਣ ਕਰੋ"
+ "ਸਾਰੇ ਡੀਵਾਈਸ ਦੇਖੋ"
+ "ਨਵਾਂ ਡੀਵਾਈਸ ਜੋੜਾਬੱਧ ਕਰੋ""ਬੈਟਰੀ ਪ੍ਰਤੀਸ਼ਤ ਅਗਿਆਤ ਹੈ।""%s ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ।""%s ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ।"
@@ -808,12 +809,9 @@
"%1$s ਐਪ ਗੱਲਬਾਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ""ਵਿਚਾਰ""ਖਾਰਜ ਕਰੋ"
-
-
-
-
-
-
+ "ਪਿੰਨ ਕੀਤੇ ਵਜੋਂ ਨਾ ਦਿਖਾਓ"
+ "ਲਾਈਵ ਅੱਪਡੇਟ ਦਿਖਾਏ ਜਾ ਰਹੇ ਹਨ"
+ "ਪਿੰਨ ਕੀਤੀਆਂ ਸੂਚਨਾਵਾਂ ਐਪਾਂ ਤੋਂ ਲਾਈਵ ਜਾਣਕਾਰੀ ਦਿਖਾਉਂਦੀਆਂ ਹਨ ਅਤੇ ਇਹ ਜਾਣਕਾਰੀ ਹਮੇਸ਼ਾਂ ਸਥਿਤੀ ਪੱਟੀ ਅਤੇ ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਦਿਖਦੀ ਹੈ""ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।""ਕਾਲ ਸੰਬੰਧੀ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।""ਇਹ ਸੂਚਨਾਵਾਂ ਦਾ ਗਰੁੱਪ ਇੱਥੇ ਸੰਰੂਪਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"
@@ -900,7 +898,8 @@
"ਮਲਟੀਟਾਸਕਿੰਗ""ਸੱਜੇ ਪਾਸੇ ਵਾਲੀ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰੋ""ਖੱਬੇ ਪਾਸੇ ਵਾਲੀ ਐਪ ਨਾਲ ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰੋ"
- "ਪੂਰੀ-ਸਕ੍ਰੀਨ \'ਤੇ ਸਵਿੱਚ ਕਰੋ"
+ "ਪੂਰੀ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰੋ"
+ "ਡੈਸਕਟਾਪ ਦ੍ਰਿਸ਼ ਦੀ ਵਰਤੋਂ ਕਰੋ""ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵੇਲੇ ਸੱਜੇ ਜਾਂ ਹੇਠਾਂ ਮੌਜੂਦ ਐਪ \'ਤੇ ਸਵਿੱਚ ਕਰੋ""ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵੇਲੇ ਖੱਬੇ ਜਾਂ ਉੱਪਰ ਮੌਜੂਦ ਐਪ \'ਤੇ ਸਵਿੱਚ ਕਰੋ""ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੌਰਾਨ: ਇੱਕ ਐਪ ਨਾਲ ਦੂਜੀ ਐਪ ਨੂੰ ਬਦਲੋ"
@@ -987,6 +986,8 @@
"ਘੱਟ ਤਰਜੀਹ ਵਾਲੇ ਸੂਚਨਾ ਪ੍ਰਤੀਕਾਂ ਨੂੰ ਦਿਖਾਓ""ਹੋਰ"
+
+ "ਟਾਇਲ ਹਟਾਓ""ਪਿਛਲੀ ਸਥਿਤੀ \'ਤੇ ਟਾਇਲ ਸ਼ਾਮਲ ਕਰੋ""ਟਾਇਲ ਨੂੰ ਲਿਜਾਓ"
@@ -1501,6 +1502,7 @@
"ਹਾਲੀਆ ਐਪਾਂ ਦੇਖੋ""ਐਪਾਂ ਵਿਚਕਾਰ ਸਵਿੱਚ ਕਰੋ""ਹੋ ਗਿਆ"
+ "ਅੱਗੇ""ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ!""ਵਾਪਸ ਜਾਓ""ਆਪਣੇ ਟੱਚਪੈਡ \'ਤੇ ਤਿੰਨ ਉਂਗਲਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਖੱਬੇ ਜਾਂ ਸੱਜੇ ਪਾਸੇ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"
@@ -1538,7 +1540,10 @@
"ਹਾਲੀਆ ਐਪਾਂ ਨੂੰ ਦੇਖਣ ਲਈ, ਟੱਚਪੈਡ \'ਤੇ ਤਿੰਨ ਉਂਗਲਾਂ ਨਾਲ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰ ਕੇ ਦਬਾਈ ਰੱਖੋ""ਆਪਣੀਆਂ ਸਾਰੀਆਂ ਐਪਾਂ ਨੂੰ ਦੇਖਣ ਲਈ, ਆਪਣੇ ਕੀ-ਬੋਰਡ \'ਤੇ ਕਾਰਵਾਈ ਕੁੰਜੀ ਨੂੰ ਦਬਾਓ""ਅਸਪਸ਼ਟ ਬਣਾਇਆ ਗਿਆ"
- "ਦੇਖਣ ਲਈ ਅਣਲਾਕ ਕਰੋ"
+
+
+
+ "ਸੰਦਰਭੀ ਸਿੱਖਿਆ""ਪਿੱਛੇ ਜਾਣ ਲਈ ਆਪਣੇ ਟੱਚਪੈਡ ਦੀ ਵਰਤੋਂ ਕਰੋ""ਤਿੰਨ ਉਂਗਲਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਖੱਬੇ ਜਾਂ ਸੱਜੇ ਪਾਸੇ ਵੱਲ ਸਵਾਈਪ ਕਰੋ। ਹੋਰ ਇਸ਼ਾਰਿਆਂ ਨੂੰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।"
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index d358b9f708b51..9d6117db22575 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth połączony.""Ikona urządzenia Bluetooth""Kliknij, aby skonfigurować szczegóły urządzenia"
- "Kliknij, aby zobaczyć wszystkie urządzenia"
- "Kliknij, aby sparować nowe urządzenie"
+
+
+
+
+
+ "Poziom naładowania baterii jest nieznany.""Połączono z %s.""Połączono z urządzeniem %s."
@@ -808,12 +812,9 @@
"Aplikacja %1$s nie obsługuje funkcji rozmów""Opinia""Zamknij"
-
-
-
-
-
-
+ "Nie pokazuj jako przypiętych"
+ "Wyświetlanie aktualizacji na żywo"
+ "Przypięte powiadomienia wyświetlają na żywo informacje z aplikacji i zawsze pojawiają się na pasku stanu oraz na ekranie blokady""Tych powiadomień nie można zmodyfikować.""Powiadomień o połączeniach nie można modyfikować.""Tej grupy powiadomień nie można tu skonfigurować"
@@ -900,7 +901,10 @@
"Wielozadaniowość""Podziel ekran z aplikacją widoczną po prawej""Podziel ekran z aplikacją widoczną po lewej"
- "Włącz pełny ekran"
+
+
+
+ "Przełącz się na aplikację po prawej lub poniżej na podzielonym ekranie""Przełącz się na aplikację po lewej lub powyżej na podzielonym ekranie""Podczas podzielonego ekranu: zastępowanie aplikacji"
@@ -987,6 +991,8 @@
"Pokazuj ikony powiadomień o niskim priorytecie""Inne"
+
+ "usunąć kartę""dodaj kafelek do ostatniej pozycji""Przenieś kartę"
@@ -1501,6 +1507,8 @@
"Wyświetlanie ostatnich aplikacji""Przełączanie aplikacji""Gotowe"
+
+ "Spróbuj jeszcze raz""Wróć""Przesuń 3 palcami w prawo lub w lewo na touchpadzie"
@@ -1538,7 +1546,10 @@
"Aby wyświetlić ostatnie aplikacje, przesuń w górę za pomocą 3 palców na touchpadzie i przytrzymaj.""Aby wyświetlić wszystkie swoje aplikacje, naciśnij klawisz działania na klawiaturze""Usunięto"
- "Odblokuj, aby zobaczyć"
+
+
+
+ "Edukacja kontekstowa""Przechodzenie wstecz za pomocą touchpada""Przesuń trzema palcami w prawo lub lewo. Kliknij, aby poznać więcej gestów."
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 3a7d1f2db002e..a422e02f6aa0b 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth conectado.""Ícone de dispositivo Bluetooth""Clique para configurar os detalhes do dispositivo"
- "Clique para conferir todos os dispositivos"
- "Clique para parear o novo dispositivo"
+
+
+
+
+
+ "Porcentagem da bateria desconhecida.""Conectado a %s.""Conectado a %s."
@@ -808,12 +812,9 @@
"O app %1$s não é compatível com recursos de conversa""Enviar feedback""Dispensar"
-
-
-
-
-
-
+ "Não mostrar como fixadas"
+ "Mostrar atualizações em tempo real"
+ "As notificações fixadas mostram informações em tempo real dos apps e sempre aparecem na barra de status e na tela de bloqueio""Não é possível modificar essas notificações.""Não é possível modificar as notificações de chamada.""Não é possível configurar esse grupo de notificações aqui"
@@ -900,7 +901,10 @@
"Multitarefas""Usar a tela dividida com o app à direita""Usar a tela dividida com o app à esquerda"
- "Mudar para tela cheia"
+
+
+
+ "Mudar para o app à direita ou abaixo ao usar a tela dividida""Mudar para o app à esquerda ou acima ao usar a tela dividida""Com a tela dividida: substituir um app por outro"
@@ -987,6 +991,8 @@
"Mostrar ícones de notificações de baixa prioridade""Outros"
+
+ "remover o bloco""adicionar o bloco à última posição""Mover bloco"
@@ -1501,6 +1507,8 @@
"Ver os apps recentes""Mudar de app""Concluído"
+
+ "Tente de novo""Voltar""Deslize para a esquerda ou direita com 3 dedos no touchpad"
@@ -1538,7 +1546,10 @@
"Se quiser ver os apps recentes, deslize para cima e pressione o touchpad com três dedos""Para ver todos os apps, pressione a tecla de ação no teclado""Encoberto"
- "Desbloquear para visualizar"
+
+
+
+ "Educação contextual""Use o touchpad para voltar""Deslize para a esquerda ou direita usando três dedos. Toque para aprender outros gestos."
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index ff0ba3666efe9..378c4158d61bc 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -245,8 +245,9 @@
"Bluetooth ligado.""Ícone de dispositivo Bluetooth""Clique para configurar o detalhe do dispositivo"
- "Clique para ver todos os dispositivos"
- "Clique para sincronizar um novo dispositivo"
+ "%s. Configure o detalhe do dispositivo"
+ "Veja todos os dispositivos"
+ "Sincronize um novo dispositivo""Percentagem da bateria desconhecida.""Ligado a %s.""Ligado a %s."
@@ -506,7 +507,7 @@
"Deslize rapidamente para a esquerda para iniciar o tutorial coletivo""Personalizar""Ignorar"
- "Adicionar, remover e reordenar widgets neste espaço"
+ "Adicione, remova e reordene widgets aqui""Adicionar mais widgets""Mantenha pressionado para personalizar os widgets""Personalizar widgets"
@@ -808,12 +809,9 @@
"A app %1$s não suporta funcionalidades de conversa.""Feedback""Ignorar"
-
-
-
-
-
-
+ "Não mostrar como afixada"
+ "A mostrar atualizações em direto"
+ "As notificações afixadas apresentam informações em direto das apps e aparecem sempre na barra de estado e no ecrã de bloqueio""Não é possível modificar estas notificações.""Não é possível modificar as notificações de chamadas.""Não é possível configurar este grupo de notificações aqui."
@@ -900,7 +898,8 @@
"Execução de várias tarefas em simultâneo""Use o ecrã dividido com a app à direita""Use o ecrã dividido com a app à esquerda"
- "Mude para ecrã inteiro"
+ "Use o ecrã inteiro"
+ "Use a vista de computador""Mudar para a app à direita ou abaixo enquanto usa o ecrã dividido""Mude para a app à esquerda ou acima enquanto usa o ecrã dividido""Durante o ecrã dividido: substituir uma app por outra"
@@ -987,6 +986,8 @@
"Mostrar ícones de notificações de prioridade baixa""Outro"
+
+ "remover o cartão""adicionar o mosaico à última posição""Mover cartão"
@@ -1501,6 +1502,7 @@
"Ver apps recentes""Mudar de app""Concluir"
+ "Seguinte""Tente novamente!""Voltar""Deslize rapidamente para a esquerda ou direita com 3 dedos no touchpad"
@@ -1538,7 +1540,10 @@
"Para ver as apps recentes, deslize rapidamente para cima e mantenha premido com 3 dedos no touchpad""Para ver todas as suas apps, prima a tecla de ação no teclado""Revisto"
- "Desbloqueie para ver"
+
+
+
+ "Educação contextual""Use o touchpad para retroceder""Deslize rapidamente para a esquerda ou direita com 3 dedos. Toque para aprender mais gestos."
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 3a7d1f2db002e..a422e02f6aa0b 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth conectado.""Ícone de dispositivo Bluetooth""Clique para configurar os detalhes do dispositivo"
- "Clique para conferir todos os dispositivos"
- "Clique para parear o novo dispositivo"
+
+
+
+
+
+ "Porcentagem da bateria desconhecida.""Conectado a %s.""Conectado a %s."
@@ -808,12 +812,9 @@
"O app %1$s não é compatível com recursos de conversa""Enviar feedback""Dispensar"
-
-
-
-
-
-
+ "Não mostrar como fixadas"
+ "Mostrar atualizações em tempo real"
+ "As notificações fixadas mostram informações em tempo real dos apps e sempre aparecem na barra de status e na tela de bloqueio""Não é possível modificar essas notificações.""Não é possível modificar as notificações de chamada.""Não é possível configurar esse grupo de notificações aqui"
@@ -900,7 +901,10 @@
"Multitarefas""Usar a tela dividida com o app à direita""Usar a tela dividida com o app à esquerda"
- "Mudar para tela cheia"
+
+
+
+ "Mudar para o app à direita ou abaixo ao usar a tela dividida""Mudar para o app à esquerda ou acima ao usar a tela dividida""Com a tela dividida: substituir um app por outro"
@@ -987,6 +991,8 @@
"Mostrar ícones de notificações de baixa prioridade""Outros"
+
+ "remover o bloco""adicionar o bloco à última posição""Mover bloco"
@@ -1501,6 +1507,8 @@
"Ver os apps recentes""Mudar de app""Concluído"
+
+ "Tente de novo""Voltar""Deslize para a esquerda ou direita com 3 dedos no touchpad"
@@ -1538,7 +1546,10 @@
"Se quiser ver os apps recentes, deslize para cima e pressione o touchpad com três dedos""Para ver todos os apps, pressione a tecla de ação no teclado""Encoberto"
- "Desbloquear para visualizar"
+
+
+
+ "Educação contextual""Use o touchpad para voltar""Deslize para a esquerda ou direita usando três dedos. Toque para aprender outros gestos."
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 2417c840a2cda..9144b564773ec 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -245,8 +245,12 @@
"Conectat prin Bluetooth.""Pictograma de dispozitiv Bluetooth""Dă clic pentru a configura detaliile dispozitivului"
- "Dă clic pentru a vedea toate dispozitivele"
- "Dă clic pentru a asocia noul dispozitiv"
+
+
+
+
+
+ "Procentajul bateriei este necunoscut.""Conectat la %s.""S-a stabilit conexiunea la %s."
@@ -808,12 +812,9 @@
"%1$s nu acceptă funcții pentru conversații""Feedback""Închide"
-
-
-
-
-
-
+ "Nu le afișa ca fixate"
+ "Se afișează actualizări live"
+ "Notificările fixate afișează informații live din aplicații și apar întotdeauna în bara de stare și pe ecranul de blocare""Aceste notificări nu pot fi modificate.""Notificările pentru apeluri nu pot fi modificate.""Acest grup de notificări nu poate fi configurat aici"
@@ -900,7 +901,10 @@
"Multitasking""Folosește ecranul împărțit cu aplicația în dreapta""Folosește ecranul împărțit cu aplicația în stânga"
- "Treci la ecran complet"
+
+
+
+ "Treci la aplicația din dreapta sau de mai jos cu ecranul împărțit""Treci la aplicația din stânga sau de mai sus cu ecranul împărțit""În modul ecran împărțit: înlocuiește o aplicație cu alta"
@@ -987,6 +991,8 @@
"Afișează pictogramele de notificare cu prioritate redusă""Altele"
+
+ "elimină cardul""adaugă cardul în ultima poziție""Mută cardul"
@@ -1501,6 +1507,8 @@
"Vezi aplicațiile recente""Comută între aplicații""Gata"
+
+ "Încearcă din nou!""Înapoi""Glisează la stânga sau la dreapta cu trei degete pe touchpad"
@@ -1538,7 +1546,10 @@
"Ca să vezi aplicațiile recente, glisează în sus și ține apăsat cu trei degete pe touchpad""Ca să vezi toate aplicațiile, apasă tasta de acțiuni de pe tastatură""Ascunsă"
- "Deblochează pentru a afișa"
+
+
+
+ "Educație contextuală""Folosește-ți touchpadul ca să revii""Glisează la stânga sau la dreapta cu trei degete. Atinge ca să înveți mai multe gesturi."
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index f6968d5315357..5407a5e314e22 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth-соединение установлено.""Значок устройства Bluetooth""Нажмите, чтобы изменить информацию об устройстве"
- "Нажмите, чтобы показать все устройства"
- "Нажмите, чтобы подключить устройство"
+
+
+
+
+
+ "Уровень заряда батареи в процентах неизвестен.""%s: подключено.""Подключено к: %s."
@@ -471,7 +475,7 @@
"В этом режиме будут отключены вибросигнал и все звуки (в том числе для будильника, музыкального проигрывателя, игр и видео).""Нажмите ещё раз, чтобы открыть""Нажмите ещё раз"
- "Проведите вверх, чтобы открыть"
+ "Проведите вверх, чтобы открыть.""Нажмите на значок разблокировки.""Сканирование выполнено. Чтобы открыть, проведите вверх.""Сканирование выполнено. Нажмите на значок разблокировки."
@@ -808,12 +812,9 @@
"Приложение \"%1$s\" не поддерживает функции разговоров.""Оставить отзыв""Закрыть"
-
-
-
-
-
-
+ "Открепить уведомления"
+ "Показывать уведомления в реальном времени"
+ "Закрепленные уведомления с текущей информацией из приложений всегда показываются в строке состояния и на заблокированном экране""Эти уведомления нельзя изменить.""Уведомления о звонках нельзя изменить.""Эту группу уведомлений нельзя настроить здесь."
@@ -900,7 +901,10 @@
"Многозадачность""Разделить экран и поместить открытое приложение справа""Разделить экран и поместить открытое приложение слева"
- "Включить полноэкранный режим"
+
+
+
+ "Перейти к приложению справа или внизу на разделенном экране""Перейти к приложению слева или вверху на разделенном экране""В режиме разделения экрана заменить одно приложение другим"
@@ -987,6 +991,8 @@
"Показывать значки уведомлений с низким приоритетом""Другое"
+
+ "удалить панель""добавить параметр в конец""Переместить панель"
@@ -1501,6 +1507,8 @@
"Просмотр недавних приложений""Переход в другое приложение""Готово"
+
+ "Попробуйте ещё раз""Назад""Проведите тремя пальцами влево или вправо по сенсорной панели."
@@ -1538,7 +1546,10 @@
"Чтобы увидеть недавние приложения, проведите по сенсорной панели тремя пальцами вверх и удерживайте.""Чтобы открыть список всех своих приложений, нажмите клавишу действия.""Скрыто"
- "Разблокируйте экран, чтобы посмотреть."
+
+
+
+ "Контекстные подсказки""Используйте сенсорную панель, чтобы возвращаться назад""Для этого проведите тремя пальцами влево или вправо. Чтобы посмотреть другие жесты, нажмите здесь."
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index eb816b804c688..0eeb5d193d5de 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -245,8 +245,12 @@
"බ්ලූටූත් සම්බන්ධිතයි.""බ්ලූටූත් උපාංග නිරූපකය""උපාංග විස්තර වින්යාස කිරීමට ක්ලික් කරන්න"
- "සියලු උපාංග බැලීමට ක්ලික් කරන්න"
- "නව උපාංගය යුගල කිරීමට ක්ලික් කරන්න"
+
+
+
+
+
+ "බැටරි ප්රතිශතය නොදනී.""%s වෙත සම්බන්ධ කරන ලදි.""%s වෙත සම්බන්ධ විය."
@@ -808,12 +812,9 @@
"%1$s සංවාද විශේෂාංගවලට සහාය නොදක්වයි""ප්රතිපෝෂණය""අස් කරන්න"
-
-
-
-
-
-
+ "අමුණන ලද ලෙස නොපෙන්වන්න"
+ "සජීවී යාවත්කාලීන කිරීම් පෙන්වමින්"
+ "ඇමුණුම් කළ දැනුම්දීම් යෙදුම් වලින් සජීවී තතු පෙන්වන අතර, සෑම විට ම තත්ත්ව තීරුවේ සහ අගුළු තිරයේ දිස් වේ""මෙම දැනුම්දීම් වෙනස් කළ නොහැක.""ඇමතුම් දැනුම්දීම් වෙනස් කළ නොහැකිය.""මෙම දැනුම්දීම් සමූහය මෙහි වින්යාස කළ නොහැක"
@@ -900,7 +901,10 @@
"බහුකාර්ය""දකුණේ යෙදුම සමග බෙදීම් තිරය භාවිතා කරන්න""වම් පැත්තේ යෙදුම සමග බෙදීම් තිරය භාවිතා කරන්න"
- "සම්පූර්ණ තිරයට මාරු වන්න"
+
+
+
+ "බෙදුම් තිරය භාවිත කරන අතරතුර දකුණේ හෝ පහළින් ඇති යෙදුමට මාරු වන්න""බෙදුම් තිරය භාවිත කරන අතරතුර වමේ හෝ ඉහළ ඇති යෙදුමට මාරු වන්න""බෙදුම් තිරය අතරතුර: යෙදුමක් එකකින් තවත් එකක් ප්රතිස්ථාපනය කරන්න"
@@ -987,6 +991,8 @@
"අඩු ප්රමුඛතා දැනුම්දීම් අයිකන පෙන්වන්න""වෙනත්"
+
+ "ටයිල් ඉවත් කරන්න""ටයිල් එක අවසාන ස්ථානයට එක් කරන්න""ටයිල් ගෙන යන්න"
@@ -1501,6 +1507,8 @@
"මෑත යෙදුම් බලන්න""යෙදුම් මාරු කරන්න""නිමයි"
+
+ "නැවත උත්සාහ කරන්න!""ආපස්සට යන්න""ඔබේ ස්පර්ශ පුවරුව මත ඇඟිලි තුනක් භාවිතයෙන් වමට හෝ දකුණට ස්වයිප් කරන්න"
@@ -1538,7 +1546,10 @@
"මෑත යෙදුම් බැලීමට, ඉහළට ස්වයිප් කර ස්පර්ශ පුවරුව මත ඇඟිලි තුනකින් අල්ලාගෙන සිටින්න""ඔබේ සියලුම යෙදුම් බැලීමට, ඔබේ යතුරුපුවරුවේ ක්රියාකාරී යතුර ඔබන්න""නැවත සකස් කරන ලද"
- "බැලීමට අගුළු හරින්න"
+
+
+
+ "සන්දර්භීය අධ්යාපනය""ආපසු යාමට ඔබේ ස්පර්ශ පුවරුව භාවිත කරන්න""ඇඟිලි තුනක් භාවිතයෙන් වමට හෝ දකුණට ස්වයිප් කරන්න. තව ඉංගිත දැන ගැනීමට තට්ටු කරන්න."
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index fcb281d3bf594..7c998ccb6c864 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth pripojené.""Ikona zariadenia s rozhraním Bluetooth""Kliknutím nakonfigurujte podrobnosti o zariadení"
- "Kliknutím zobrazíte všetky zariadenia"
- "Kliknutím spárujete nové zariadenie"
+
+
+
+
+
+ "Percento batérie nie je známe.""Pripojené k zariadeniu %s.""Pripojené k zariadeniu %s."
@@ -808,12 +812,9 @@
"%1$s nepodporuje funkcie konverzácie""Spätná väzba""Zavrieť"
-
-
-
-
-
-
+ "Nezobrazovať ako pripnuté"
+ "Zobrazovanie aktualít naživo"
+ "Pripnuté upozornenia zobrazujú aktuálne informácie z aplikácií a vždy sa zobrazujú v stavovom riadku a na uzamknutej obrazovke""Tieto upozornenia sa nedajú upraviť.""Upozornenia na hovory sa nedajú upraviť.""Túto skupinu upozornení nejde na tomto mieste konfigurovať"
@@ -900,7 +901,10 @@
"Multitasking""Rozdelenie obrazovky, aktuálna aplikácia vpravo""Rozdelenie obrazovky, aktuálna aplikácia vľavo"
- "Prepnutie na celú obrazovku"
+
+
+
+ "Prechod na aplikáciu vpravo alebo dole pri rozdelenej obrazovke""Prechod na aplikáciu vľavo alebo hore pri rozdelenej obrazovke""Počas rozdelenej obrazovky: nahradenie aplikácie inou"
@@ -987,6 +991,8 @@
"Zobraziť ikony upozornení s nízkou prioritou""Ďalšie"
+
+ "odstrániť kartu""pridáte kartu na poslednú pozíciu""Presunúť kartu"
@@ -1501,6 +1507,8 @@
"Zobraziť nedávne aplikácie""Prepínanie aplikácií""Hotovo"
+
+ "Skúste to znova.""Späť""Potiahnite troma prstami na touchpade doľava alebo doprava"
@@ -1538,7 +1546,10 @@
"Ak si chcete zobraziť nedávne aplikácie, potiahnite po touchpade troma prstami nahor a pridržte ich.""Ak si chcete zobraziť všetky aplikácie, stlačte na klávesnici akčný kláves""Zamaskované"
- "Zobrazíte odomknutím"
+
+
+
+ "Kontextová náuka""Prechádzajte späť pomocou touchpadu""Potiahnite troma prstami doľava alebo doprava. Viac o gestách sa dozviete klepnutím."
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index e99906546861a..8ff65a80e4820 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -245,8 +245,9 @@
"Povezava Bluetooth vzpostavljena.""Ikona naprave Bluetooth""Kliknite za konfiguriranje podrobnosti o napravi"
- "Kliknite za ogled vseh naprav"
- "Kliknite za seznanitev nove naprave"
+ "%s. Konfiguriranje podrobnosti o napravi"
+ "Ogled vseh naprav"
+ "Seznanitev nove naprave""Neznan odstotek napolnjenosti baterije.""Povezava vzpostavljena z: %s.""Vzpostavljena povezava: %s."
@@ -691,7 +692,7 @@
"Aplikacija je odpeta.""Klic""Sistem"
- "Sprožitev zvonjenja"
+ "Zvonjenje""Predstavnost""Alarm""Obvestilo"
@@ -808,12 +809,9 @@
"Aplikacija %1$s ne podpira pogovornih funkcij.""Povratne informacije""Opusti"
-
-
-
-
-
-
+ "Ne prikaži kot pripeto"
+ "Prikaz sprotnih obvestil"
+ "Pripeta obvestila prikazujejo sprotne podatke iz aplikacij ter so vedno prikazana v vrstici stanja in na zaklenjenem zaslonu""Za ta obvestila ni mogoče spremeniti nastavitev.""Obvestil o klicih ni mogoče spreminjati.""Te skupine obvestil ni mogoče konfigurirati tukaj"
@@ -900,7 +898,8 @@
"Večopravilnost""Uporaba razdeljenega zaslona z aplikacijo na desni""Uporaba razdeljenega zaslona z aplikacijo na levi"
- "Preklop na celozaslonski način"
+ "Uporaba celozaslonskega načina"
+ "Uporaba pogleda za namizni računalnik""Preklop na aplikacijo desno ali spodaj med uporabo razdeljenega zaslona""Preklop na aplikacijo levo ali zgoraj med uporabo razdeljenega zaslona""Pri razdeljenem zaslonu: medsebojna zamenjava aplikacij"
@@ -987,6 +986,8 @@
"Pokaži ikone obvestil z nizko stopnjo prednosti""Drugo"
+
+ "odstranitev ploščice""dodajanje ploščice na zadnji položaj""Premik ploščice"
@@ -1501,6 +1502,7 @@
"Ogled nedavnih aplikacij""Preklop aplikacij""Končano"
+ "Naprej""Poskusite znova""Nazaj""Na sledilni ploščici s tremi prsti povlecite levo ali desno"
@@ -1538,7 +1540,10 @@
"Za ogled nedavnih aplikacij povlecite s tremi prsti navzgor po sledilni ploščici in pridržite""Za ogled vseh aplikacij pritisnite tipko za dejanja na tipkovnici""Zakrito"
- "Odklenite za ogled"
+
+
+
+ "Kontekstualno izobraževanje""Uporaba sledilne ploščice za pomik nazaj""S tremi prsti povlecite levo ali desno. Dotaknite se, če želite spoznati več potez."
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 7e2b6980b61cb..ed83da8ef4562 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -245,8 +245,12 @@
"Pajisja është lidhur me \"bluetooth\".""Ikona e pajisjes me Bluetooth""Kliko për të konfiguruar detajet e pajisjes"
- "Kliko për të shikuar të gjitha pajisjet"
- "Kliko për të çiftuar një pajisje të re"
+
+
+
+
+
+ "Përqindja e baterisë e panjohur.""Lidhur me %s""Është lidhur me %s."
@@ -808,12 +812,9 @@
"%1$s nuk mbështet veçoritë e bisedës""Koment""Hiq"
-
-
-
-
-
-
+ "Mos shfaq si të gozhduar"
+ "Po shfaqen përditësimet drejtpërdrejt"
+ "Njoftimet e gozhduara shfaqin informacione të drejtpërdrejta nga aplikacionet dhe shfaqen gjithmonë në shiritin e statusit dhe ekranin e kyçjes""Këto njoftime nuk mund të modifikohen.""Njoftimet e telefonatave nuk mund të modifikohen.""Ky grup njoftimesh nuk mund të konfigurohet këtu"
@@ -900,7 +901,10 @@
"Kryerja e shumë detyrave""Përdor ekranin e ndarë me aplikacionin në të djathtë""Përdor ekranin e ndarë me aplikacionin në të majtë"
- "Kalo në ekran të plotë"
+
+
+
+ "Kalo tek aplikacioni djathtas ose poshtë kur përdor ekranin e ndarë""Kalo tek aplikacioni në të majtë ose sipër kur përdor ekranin e ndarë""Gjatë ekranit të ndarë: zëvendëso një aplikacion me një tjetër"
@@ -987,6 +991,8 @@
"Shfaq ikonat e njoftimeve me përparësi të ulët""Të tjera"
+
+ "hiq pllakëzën""shtuar pllakëzën në pozicionin e fundit""Zhvendos pllakëzën"
@@ -1501,6 +1507,8 @@
"Shiko aplikacionet e fundit""Ndërro aplikacionet""U krye"
+
+ "Provo përsëri!""Kthehu prapa""Rrëshqit shpejt majtas ose djathtas duke përdorur tre gishta në bllokun me prekje"
@@ -1538,7 +1546,10 @@
"Për aplikacionet e fundit, rrëshqit shpejt lart dhe mbaj shtypur me tre gishta në bllokun me prekje""Për të shikuar të gjitha aplikacionet, shtyp tastin e veprimit në tastierë""Redaktuar"
- "Shkyçe për ta parë"
+
+
+
+ "Edukimi kontekstual""Përdor bllokun me prekje për t\'u kthyer prapa""Rrëshqit shpejt majtas ose djathtas duke përdorur tre gishta. Trokit për të mësuar më shumë gjeste."
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 1e44e0c2799d9..400c1d420123c 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -245,8 +245,9 @@
"Bluetooth је прикључен.""Икона Bluetooth уређаја""Кликните да бисте конфигурисали детаље о уређају"
- "Кликните да бисте видели све уређаје"
- "Кликните да бисте упарили нов уређај"
+ "%s. Конфигуришите детаље о уређају"
+ "Погледајте све уређаје"
+ "Упарите нови уређај""Проценат напуњености батерије није познат.""Повезани сте са %s.""Повезани смо са уређајем %s."
@@ -808,12 +809,9 @@
"%1$s не подржава функције конверзације""Повратне информације""Одбаци"
-
-
-
-
-
-
+ "Не приказуј као закачено"
+ "Приказују се новости уживо"
+ "Закачена обавештења приказују информације уживо из апликација и увек се појављују на статусној траци и закључаном екрану""Ова обавештења не могу да се мењају.""Обавештења о позивима не могу да се мењају.""Ова група обавештења не може да се конфигурише овде"
@@ -900,7 +898,8 @@
"Обављање више задатака истовремено""Користи подељени екран са апликацијом с десне стране""Користи подељени екран са апликацијом с леве стране"
- "Пређи на режим преко целог екрана"
+ "Користи приказ преко целог екрана"
+ "Користи приказ за рачунаре""Пређи у апликацију здесна или испод док је подељен екран""Пређите у апликацију слева или изнад док користите подељени екран""У режиму подељеног екрана: замена једне апликације другом"
@@ -987,6 +986,8 @@
"Прикажи иконе обавештења ниског приоритета""Друго"
+
+ "уклонили плочицу""додали плочицу на последњу позицију""Преместите плочицу"
@@ -1501,6 +1502,7 @@
"Прикажи недавно коришћене апликације""Пређи на другу апликацију""Готово"
+ "Даље""Пробајте поново.""Назад""Превуците улево или удесно са три прста на тачпеду"
@@ -1538,7 +1540,10 @@
"Да бисте прегледали недавне апликације, превуците нагоре и задржите са три прста на тачпеду""Да бисте погледали све апликације, притисните тастер радњи на тастатури""Редиговано"
- "Откључајте за приказ"
+
+
+
+ "Контекстуално образовање""Користите тачпед за враћање назад""Превуците улево или удесно са три прста. Додирните да бисте видели више покрета."
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index d613922318dbc..f38379fed6838 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth ansluten.""Enhetsikon för Bluetooth""Klicka för att konfigurera enhetsinformation"
- "Klicka för att se alla enheter"
- "Klicka för att parkoppla en ny enhet"
+
+
+
+
+
+ "Okänd batterinivå.""Ansluten till %s.""Ansluten till %s."
@@ -506,7 +510,7 @@
"Svep åt vänster för att börja med gruppguiden""Anpassa""Ignorera"
- "Lägg till, ta bort och ordna om dina widgetar i det här rummet"
+ "Lägg till, ta bort och ordna om dina widgetar här""Lägg till fler widgetar""Tryck länge för att anpassa widgetar""Anpassa widgetar"
@@ -808,12 +812,9 @@
"%1$s har inte stöd för konversationsfunktioner""Feedback""Stäng"
-
-
-
-
-
-
+ "Visa inte som fäst"
+ "Visar liveuppdateringar"
+ "Fästa aviseringar visar liveinformation från appar och visas alltid i statusfältet och på låsskärmen""Det går inte att ändra de här aviseringarna.""Det går inte att ändra samtalsaviseringarna.""Den här aviseringsgruppen kan inte konfigureras här"
@@ -900,7 +901,10 @@
"Multikörning""Använd delad skärm med appen till höger""Använd delad skärm med appen till vänster"
- "Byt till helskärm"
+
+
+
+ "Byt till appen till höger eller nedanför när du använder delad skärm""Byt till appen till vänster eller ovanför när du använder delad skärm""Med delad skärm: ersätt en app med en annan"
@@ -987,6 +991,8 @@
"Visa ikoner för aviseringar med låg prioritet""Annat"
+
+ "ta bort ruta""lägg till en ruta på den sista platsen""Flytta ruta"
@@ -1377,7 +1383,7 @@
"Byt ljudutgång""Okänt""h.mm"
- "kk.mm"
+ "kk:mm""Vill du tillåta att %s får åtkomst till alla enhetsloggar?""Tillåt engångsåtkomst""Tillåt inte"
@@ -1501,6 +1507,8 @@
"Se de senaste apparna""Byta app""Klar"
+
+ "Försök igen!""Tillbaka""Svep åt vänster eller höger med tre fingrar på styrplattan"
@@ -1538,7 +1546,10 @@
"Svep uppåt på styrplattan med tre fingrar och håll kvar för att se nyligen använda appar""Tryck på åtgärdstangenten på tangentbordet för att se alla appar""Anonymiserad"
- "Lås upp för att visa"
+
+
+
+ "Kontextuell utbildning""Använd styrplattan för att gå tillbaka""Svep åt vänster eller höger med tre fingrar. Tryck för att lära dig fler rörelser."
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 33d8511edf962..68935d66cb58e 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth imeunganishwa.""Aikoni ya Kifaa chenye Bluetooth""Bofya ili uweke mipangilio ya maelezo ya kifaa"
- "Bofya ili uone vifaa vyote"
- "Bofya ili uoanishe kifaa kipya"
+
+
+
+
+
+ "Asilimia ya betri haijulikani.""Imeunganishwa kwenye %s.""Imeunganishwa kwenye %s."
@@ -808,12 +812,9 @@
"%1$s haitumii vipengele vya mazungumzo""Maoni""Ondoa"
-
-
-
-
-
-
+ "Usionyeshe kama zilizobandikwa"
+ "Inaonyesha Taarifa za Moja kwa Moja"
+ "Arifa zilizobandikwa zinaonyesha maelezo ya moja kwa moja kutoka kwenye programu na huonekana kwenye sehemu ya arifa na skrini iliyofungwa""Arifa hizi haziwezi kubadilishwa.""Arifa za simu haziwezi kubadilishwa.""Kikundi hiki cha arifa hakiwezi kuwekewa mipangilio hapa"
@@ -900,7 +901,10 @@
"Majukumu mengi""Tumia hali ya kugawa skrini na programu ya sasa iwe upande wa kulia""Tumia hali ya kugawa skrini na programu ya sasa iwe upande wa kushoto"
- "Badilisha utumie skrini nzima"
+
+
+
+ "Badilisha ili uende kwenye programu iliyo kulia au chini unapotumia hali ya kugawa skrini""Badilisha uende kwenye programu iliyo kushoto au juu unapotumia hali ya kugawa skrini""Ukigawanya skrini: badilisha kutoka programu moja hadi nyingine"
@@ -987,6 +991,8 @@
"Onyesha aikoni za arifa zisizo muhimu""Nyingine"
+
+ "ondoa kigae""weka kigae kwenye nafasi ya mwisho""Hamisha kigae"
@@ -1501,6 +1507,8 @@
"Angalia programu za hivi majuzi""Badilisha programu""Nimemaliza"
+
+ "Jaribu tena!""Rudi nyuma""Telezesha vidole vitatu kushoto au kulia kwenye padi yako ya kugusa"
@@ -1538,7 +1546,10 @@
"Telezesha vidole vitatu juu na ushikilie kwenye padi ya kugusa ili uangalie programu za hivi majuzi""Bonyeza kitufe cha vitendo kwenye kibodi yako ili uangalie programu zako zote""Maandishi yameondolewa"
- "Fungua ili uone"
+
+
+
+ "Elimu inayolingana na muktadha""Kutumia padi yako ya kugusa ili kurudi nyuma""Telezesha vidole vitatu kulia au kushoto. Gusa ili upate maelezo kuhusu miguso zaidi."
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index aa312c713a5d5..b304a5eaf0057 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -245,8 +245,12 @@
"புளூடூத் இணைக்கப்பட்டது.""புளூடூத் சாதன ஐகான்""சாதன விவரத்தை உள்ளமைக்க கிளிக் செய்யலாம்"
- "அனைத்துச் சாதனங்களையும் பார்க்க கிளிக் செய்யவும்"
- "புதிய சாதனத்தை இணைக்க கிளிக் செய்யவும்"
+
+
+
+
+
+ "பேட்டரி சதவீதம் தெரியவில்லை.""%sக்கு இணைக்கப்பட்டது.""%s உடன் இணைக்கப்பட்டுள்ளது."
@@ -808,12 +812,9 @@
"உரையாடல் அம்சங்களை %1$s ஆதரிக்காது""கருத்து""மூடுக"
-
-
-
-
-
-
+ "பின் செய்யப்பட்டதாகக் காட்டாதே"
+ "நேரலை அறிவிப்புகளைக் காட்டுகிறது"
+ "பின் செய்யப்பட்ட அறிவிப்புகள் ஆப்ஸிலிருந்து நேரலைத் தகவல்களைக் காட்டும், அத்துடன் அவை எப்போதும் நிலைப் பட்டியிலும் பூட்டுத் திரையிலும் காட்டப்படும்""இந்த அறிவிப்புகளை மாற்ற இயலாது.""அழைப்பு அறிவிப்புகளை மாற்ற முடியாது.""இந்த அறிவுப்புக் குழுக்களை இங்கே உள்ளமைக்க இயலாது"
@@ -900,7 +901,10 @@
"பல வேலைகளைச் செய்தல்""ஆப்ஸ் வலதுபுறம் வரும்படி திரைப் பிரிப்பைப் பயன்படுத்துதல்""ஆப்ஸ் இடதுபுறம் வரும்படி திரைப் பிரிப்பைப் பயன்படுத்துதல்"
- "முழுத்திரைக்கு மாற்றுதல்"
+
+
+
+ "திரைப் பிரிப்பைப் பயன்படுத்தும்போது வலது/கீழ் உள்ள ஆப்ஸுக்கு மாறுதல்""திரைப் பிரிப்பைப் பயன்படுத்தும்போது இடது/மேலே உள்ள ஆப்ஸுக்கு மாறுதல்""திரைப் பிரிப்பின்போது: ஓர் ஆப்ஸுக்குப் பதிலாக மற்றொன்றை மாற்றுதல்"
@@ -987,6 +991,8 @@
"குறைந்த முன்னுரிமை உள்ள அறிவிப்பு ஐகான்களைக் காட்டு""மற்றவை"
+
+ "கட்டத்தை அகற்றும்""கடைசி இடத்தில் கட்டத்தைச் சேர்க்கலாம்""கட்டத்தை நகர்த்து"
@@ -1501,6 +1507,8 @@
"சமீபத்திய ஆப்ஸைக் காட்டுதல்""ஆப்ஸுக்கிடையில் மாறுங்கள்""முடிந்தது"
+
+ "மீண்டும் முயலவும்!""பின்செல்""உங்கள் டச்பேடில் மூன்று விரல்களால் இடது அல்லது வலதுபுறம் ஸ்வைப் செய்யவும்"
@@ -1538,7 +1546,10 @@
"சமீபத்திய ஆப்ஸைப் பார்க்க, டச்பேடில் மூன்று விரல்களால் மேல்நோக்கி ஸ்வைப் செய்து பிடிக்கவும்""அனைத்து ஆப்ஸையும் பார்க்க, உங்கள் கீபோர்டில் உள்ள ஆக்ஷன் பட்டனை அழுத்தவும்""அர்த்தம் புரியாதபடி திருத்தப்பட்டது"
- "பார்ப்பதற்கு அன்லாக் செய்யவும்"
+
+
+
+ "சூழல் சார்ந்த கல்வி""பின்செல்ல, உங்கள் டச்பேடைப் பயன்படுத்துங்கள்""மூன்று விரல்களால் இடது அல்லது வலதுபுறம் ஸ்வைப் செய்யவும். சைகைகள் குறித்து மேலும் அறிய தட்டவும்."
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index fc5361b54628c..8557dde028305 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -245,8 +245,12 @@
"బ్లూటూత్ కనెక్ట్ చేయబడింది.""బ్లూటూత్ పరికర చిహ్నం""పరికర వివరాలను కాన్ఫిగర్ చేయడానికి క్లిక్ చేయండి"
- "అన్ని పరికరాలను చూడటానికి క్లిక్ చేయండి"
- "కొత్త పరికరాన్ని పెయిర్ చేయడానికి క్లిక్ చేయండి"
+
+
+
+
+
+ "బ్యాటరీ శాతం తెలియదు.""%sకి కనెక్ట్ చేయబడింది.""%sకి కనెక్ట్ చేయబడింది."
@@ -506,7 +510,7 @@
"కమ్యూనల్ ట్యుటోరియల్ను ప్రారంభించడానికి ఎడమ వైపునకు స్వైప్ చేయండి""అనుకూలంగా మార్చండి""విస్మరించండి"
- "ఈ స్పేస్లో మీ విడ్జెట్లను జోడించండి, తీసివేయండి, క్రమపద్ధతిలో అమర్చండి"
+ "ఈ స్పేస్లోని విడ్జెట్ల జోడింపు, తీసివేత, అమరిక""మరిన్ని విడ్జెట్లను జోడించండి""విడ్జెట్లను అనుకూలీకరించడానికి, నొక్కి, ఉంచండి""విడ్జెట్లను అనుకూలంగా మార్చండి"
@@ -808,12 +812,9 @@
"%1$s సంభాషణ ఫీచర్లను సపోర్ట్ చేయదు""ఫీడ్బ్యాక్""విస్మరించండి"
-
-
-
-
-
-
+ "పిన్ చేసినట్లు చూపవద్దు"
+ "లైవ్ అప్డేట్లు చూపబడుతున్నాయి"
+ "పిన్ చేయబడిన నోటిఫికేషన్లు, యాప్ల నుండి ఎప్పటికప్పుడు తాజా సమాచారాన్ని చూపిస్తాయి, ఇంకా ఇవి ఎల్లప్పుడూ స్టేటస్ బార్, లాక్ స్క్రీన్లో కనిపిస్తాయి""ఈ నోటిఫికేషన్లను ఎడిట్ చేయడం వీలుపడదు.""కాల్ నోటిఫికేషన్లను ఎడిట్ చేయడం సాధ్యం కాదు.""ఈ నోటిఫికేషన్ల గ్రూప్ను ఇక్కడ కాన్ఫిగర్ చేయలేము"
@@ -900,7 +901,10 @@
"మల్టీ-టాస్కింగ్""కుడి వైపు ప్రస్తుత యాప్తో స్ప్లిట్ స్క్రీన్ను ఉపయోగించండి""ఎడమ వైపు ప్రస్తుత యాప్తో స్ప్లిట్ స్క్రీన్ను ఉపయోగించండి"
- "ఫుల్ స్క్రీన్కు మారండి"
+
+
+
+ "స్ప్లిట్ స్క్రీన్ ఉపయోగిస్తున్నప్పుడు కుడి లేదా కింద యాప్నకు మారండి""స్ప్లిట్ స్క్రీన్ ఉపయోగిస్తున్నప్పుడు ఎడమ లేదా పైన యాప్నకు మారండి""స్ప్లిట్ స్క్రీన్ సమయంలో: ఒక దాన్నుండి మరో దానికి యాప్ రీప్లేస్ చేయండి"
@@ -987,6 +991,8 @@
"తక్కువ ప్రాధాన్యత నోటిఫికేషన్ చిహ్నాలను చూపించు""ఇతరం"
+
+ "టైల్ను తీసివేయండి""చివరి పొజిషన్కు టైల్ను జోడించండి""టైల్ను తరలించండి"
@@ -1501,6 +1507,8 @@
"ఇటీవలి యాప్లను చూడండి""యాప్ల మధ్య మారండి""పూర్తయింది"
+
+ "మళ్లీ ట్రై చేయండి!""వెనుకకు""మీ టచ్ప్యాడ్లో మూడు వేళ్లను ఉపయోగించి ఎడమ వైపునకు లేదా కుడి వైపునకు స్వైప్ చేయండి"
@@ -1538,7 +1546,10 @@
"ఇటీవలి యాప్లను చూడటానికి, టచ్ప్యాడ్లో మూడు వేళ్లతో పైకి స్వైప్ చేసి, హోల్డ్ చేయండి""మీ యాప్లన్నింటినీ చూడటానికి, మీ కీబోర్డ్లో యాక్షన్ కీని నొక్కండి""దాచిపెట్టినది"
- "చూడటానికి అన్లాక్ చేయండి"
+
+
+
+ "సందర్భోచిత విద్య""వెనుకకు వెళ్లడానికి మీ టచ్ప్యాడ్ను ఉపయోగించండి""మూడు వేళ్లతో ఎడమ / కుడి వైపునకు స్వైప్ చేయండి. మరిన్ని సంజ్ఞల గురించి తెలుసుకోవడానికి ట్యాప్ చేయండి."
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 873635d6add5e..8aa70e1959ac7 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -245,8 +245,9 @@
"เชื่อมต่อบลูทูธแล้ว""ไอคอนอุปกรณ์บลูทูธ""คลิกเพื่อกำหนดค่ารายละเอียดอุปกรณ์"
- "คลิกเพื่อดูอุปกรณ์ทั้งหมด"
- "คลิกเพื่อจับคู่อุปกรณ์ใหม่"
+ "%s กำหนดค่ารายละเอียดอุปกรณ์"
+ "ดูอุปกรณ์ทั้งหมด"
+ "จับคู่อุปกรณ์ใหม่""ไม่ทราบเปอร์เซ็นต์แบตเตอรี่""เชื่อมต่อกับ %s แล้ว""เชื่อมต่อกับ %s"
@@ -506,7 +507,7 @@
"ปัดไปทางซ้ายเพื่อเริ่มบทแนะนำส่วนกลาง""ปรับแต่ง""ปิด"
- "เพิ่ม นำออก และจัดลำดับวิดเจ็ตในพื้นที่นี้ใหม่"
+ "เพิ่ม นำออก และจัดลำดับวิดเจ็ตในพื้นที่นี้ใหม่""เพิ่มวิดเจ็ตอีก""กดค้างเพื่อปรับแต่งวิดเจ็ต""ปรับแต่งวิดเจ็ต"
@@ -808,12 +809,9 @@
"%1$s ไม่รองรับฟีเจอร์การสนทนา""ความคิดเห็น""ปิด"
-
-
-
-
-
-
+ "ไม่แสดงเป็นรายการที่ปักหมุด"
+ "กำลังแสดงข้อมูลอัปเดตแบบเรียลไทม์"
+ "การแจ้งเตือนที่ปักหมุดไว้จะแสดงข้อมูลแบบเรียลไทม์จากแอป และจะปรากฏในแถบสถานะและหน้าจอล็อกเสมอ""แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้""แก้ไขการแจ้งเตือนสายเรียกเข้าไม่ได้""การแจ้งเตือนกลุ่มนี้กำหนดค่าที่นี่ไม่ได้"
@@ -900,7 +898,8 @@
"การทํางานหลายอย่างพร้อมกัน""ใช้โหมดแยกหน้าจอโดยให้แอปอยู่ด้านขวา""ใช้โหมดแยกหน้าจอโดยให้แอปอยู่ด้านซ้าย"
- "เปลี่ยนเป็นแบบเต็มหน้าจอ"
+ "ใช้โหมดเต็มหน้าจอ"
+ "ใช้มุมมองบนเดสก์ท็อป""เปลี่ยนไปใช้แอปทางด้านขวาหรือด้านล่างขณะใช้โหมดแยกหน้าจอ""เปลี่ยนไปใช้แอปทางด้านซ้ายหรือด้านบนขณะใช้โหมดแยกหน้าจอ""ระหว่างใช้โหมดแยกหน้าจอ: เปลี่ยนแอปหนึ่งเป็นอีกแอปหนึ่ง"
@@ -987,6 +986,8 @@
"แสดงไอคอนการแจ้งเตือนลำดับความสำคัญต่ำ""อื่นๆ"
+
+ "นำชิ้นส่วนออก""เพิ่มการ์ดไปยังตำแหน่งสุดท้าย""ย้ายชิ้นส่วน"
@@ -1501,6 +1502,7 @@
"ดูแอปล่าสุด""เปลี่ยนแอป""เสร็จสิ้น"
+ "ถัดไป""ลองอีกครั้งนะ""ย้อนกลับ""ใช้ 3 นิ้วปัดไปทางซ้ายหรือขวาบนทัชแพด"
@@ -1538,7 +1540,10 @@
"หากต้องการดูแอปล่าสุด ให้ใช้ 3 นิ้วปัดขึ้นแล้วค้างไว้บนทัชแพด""หากต้องการดูแอปทั้งหมด ให้กดปุ่มดำเนินการบนแป้นพิมพ์""ปกปิดไว้"
- "ปลดล็อกเพื่อดู"
+
+
+
+ "การศึกษาตามบริบท""ใช้ทัชแพดเพื่อย้อนกลับ""ใช้ 3 นิ้วปัดไปทางซ้ายหรือขวา แตะเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับท่าทางสัมผัสต่างๆ"
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index e6aa410c269b6..e11a63aeb00cc 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -245,8 +245,12 @@
"Nakakonekta ang Bluetooth.""Icon ng Bluetooth device""I-click para i-configure ang detalye ng device"
- "I-click para tingnan ang lahat ng device"
- "I-click para magpares ng bagong device"
+
+
+
+
+
+ "Hindi alam ang porsyento ng baterya.""Nakakonekta sa %s.""Nakakonekta sa %s."
@@ -623,7 +627,7 @@
"Pagmamay-ari ng iyong organisasyon ang device na ito""Pagmamay-ari ng %1$s ang device na ito""Pag-aari ng organisasyon mo ang device na ito at nakakonekta ito sa internet sa pamamagitan ng VPN"
- "Pagmamay-ari ng %1$s ang device na ito at nakakoenekta ito sa internet sa pamamagitan ng mga VPN"
+ "Pagmamay-ari ng %1$s ang device na ito at nakakonekta ito sa internet sa pamamagitan ng mga VPN""Maaaring sumubaybay ang iyong organisasyon ng trapiko sa network sa profile sa trabaho mo""Maaaring subaybayan ng %1$s ang trapiko sa network sa iyong profile sa trabaho""Nakikita ng IT admin ang aktibidad sa network"
@@ -808,12 +812,9 @@
"Hindi sinusuportahan ng %1$s ang mga feature ng pag-uusap""Feedback""I-dismiss"
-
-
-
-
-
-
+ "Huwag ipakita bilang naka-pin"
+ "Ipinapakita ang Mga Live na Update"
+ "Nagpapakita ang mga naka-pin na notification ng live na impormasyon mula sa mga app, at palagi itong nasa status bar at lock screen""Hindi puwedeng baguhin ang mga notification na ito.""Hindi mabago ang mga notification ng tawag.""Hindi mako-configure dito ang pangkat na ito ng mga notification"
@@ -900,7 +901,10 @@
"Pag-multitask""Gumamit ng split screen nang nasa kanan ang app""Gumamit ng split screen nang nasa kaliwa ang app"
- "Lumipat sa full screen"
+
+
+
+ "Lumipat sa app sa kanan o ibaba habang ginagamit ang split screen""Lumipat sa app sa kaliwa o itaas habang ginagamit ang split screen""Habang nasa split screen: magpalit-palit ng app"
@@ -987,6 +991,8 @@
"Ipakita ang mga icon ng notification na may mababang priority""Iba pa"
+
+ "alisin ang tile""magdagdag ng tile sa huling posisyon""Ilipat ang tile"
@@ -1501,6 +1507,8 @@
"Tingnan ang mga kamakailang app""Lumipat ng app""Tapos na"
+
+ "Subukan ulit!""Bumalik""Mag-swipe pakaliwa o pakanan gamit ang tatlong daliri sa iyong touchpad"
@@ -1538,7 +1546,10 @@
"Para tingnan ang kamakailang app, mag-swipe pataas at i-hold gamit ang tatlong daliri sa touchpad""Para tingnan ang lahat ng iyong app, pindutin ang action key sa keyboard mo""Na-redact"
- "I-unlock para tingnan"
+
+
+
+ "Edukasyon ayon sa konteksto""Gamitin ang iyong touchpad para bumalik""Mag-swipe pakaliwa o pakanan gamit ang tatlong daliri. I-tap para matuto pa tungkol sa mga galaw."
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 05fc1f23a24cb..d18446b566f6e 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth bağlandı.""Bluetooth cihaz simgesi""Cihaz ayrıntılarını yapılandırmak için tıklayın"
- "Tüm cihazları görmek için tıklayın"
- "Yeni cihaz eşlemek için tıklayın"
+
+
+
+
+
+ "Pil yüzdesi bilinmiyor.""%s ile bağlı.""%s bağlantısı kuruldu."
@@ -808,12 +812,9 @@
"%1$s, sohbet özelliklerini desteklemiyor""Geri bildirim""Kapat"
-
-
-
-
-
-
+ "Sabitlenmiş olarak gösterme"
+ "Canlı haberlerin gösterilmesi"
+ "Sabitlenmiş bildirimler, uygulamalardan gelen canlı bilgileri gösterir ve durum çubuğu ile kilit ekranında her zaman görünür""Bu bildirimler değiştirilemez.""Arama bildirimleri değiştirilemez.""Bu bildirim grubu burada yapılandırılamaz"
@@ -900,7 +901,10 @@
"Çoklu görev""Sağdaki uygulamayla birlikte bölünmüş ekranı kullan""Soldaki uygulamayla birlikte bölünmüş ekranı kullan"
- "Tam ekran moduna geç"
+
+
+
+ "Bölünmüş ekran kullanırken sağdaki veya alttaki uygulamaya geçiş yap""Bölünmüş ekran kullanırken soldaki veya üstteki uygulamaya geçiş yapın""Bölünmüş ekran etkinken: Bir uygulamayı başkasıyla değiştir"
@@ -987,6 +991,8 @@
"Düşük öncelikli bildirim simgelerini göster""Diğer"
+
+ "Kutuyu kaldırmak için""kutuyu son konuma ekleyin""Kutuyu taşı"
@@ -1501,6 +1507,8 @@
"Son uygulamaları görüntüle""Uygulamalar arasında geçiş yapma""Bitti"
+
+ "Tekrar deneyin.""Geri dön""Dokunmatik alanda üç parmağınızla sola veya sağa kaydırın"
@@ -1538,7 +1546,10 @@
"Son uygulamaları görüntülemek için dokunmatik alanda üç parmağınızla yukarı kaydırıp basılı tutun""Tüm uygulamalarınızı görüntülemek için klavyenizdeki eylem tuşuna basın""Çıkartıldı"
- "Görüntülemek için kilidi açın"
+
+
+
+ "Bağlama dayalı eğitim""Geri dönmek için dokunmatik alanınızı kullanın""Üç parmağınızla sola veya sağa kaydırın. Daha fazla hareket öğrenmek için dokunun."
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 0b0d6dc15c623..e6b787ec0cf87 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth під’єднано.""Значок пристрою з Bluetooth""Натисніть, щоб змінити налаштування пристрою"
- "Натисніть, щоб переглянути всі пристрої"
- "Натисніть, щоб підключити новий пристрій"
+
+
+
+
+
+ "Відсоток заряду акумулятора невідомий.""Підключено до %s.""Під’єднано до пристрою %s."
@@ -808,12 +812,9 @@
"%1$s не підтримує функції розмов""Надіслати відгук""Закрити"
-
-
-
-
-
-
+ "Не показувати як закріплені"
+ "Показ інформації в реальному часі"
+ "Закріплені сповіщення з актуальною інформацією від додатків. Завжди показуються в рядку стану й на заблокованому екрані.""Ці сповіщення не можна змінити.""Сповіщення про виклик не можна змінити.""Цю групу сповіщень не можна налаштувати тут"
@@ -900,7 +901,10 @@
"Багатозадачність""Розділити екран і показувати додаток праворуч""Розділити екран і показувати додаток ліворуч"
- "Перейти в повноекранний режим"
+
+
+
+ "Перейти до додатка праворуч або внизу на розділеному екрані""Під час розділення екрана перемикатися на додаток ліворуч або вгорі""Під час розділення екрана: замінити додаток іншим"
@@ -987,6 +991,8 @@
"Показувати значки сповіщень із низьким пріоритетом""Інше"
+
+ "вилучити опцію""додати панель на останню позицію""Перемістити опцію"
@@ -1501,6 +1507,8 @@
"Переглянути нещодавні додатки""Перемикання між додатками""Готово"
+
+ "Спробуйте ще""Назад""Проведіть трьома пальцями вліво чи вправо по сенсорній панелі"
@@ -1538,7 +1546,10 @@
"Щоб переглянути останні додатки, проведіть трьома пальцями вгору по сенсорній панелі й утримуйте їх""Щоб переглянути всі додатки, натисніть клавішу дії на клавіатурі""Замасковано"
- "Розблокуйте, щоб переглянути"
+
+
+
+ "Контекстне навчання""Щоб повернутися, використовуйте сенсорну панель""Проведіть трьома пальцями вліво чи вправо. Натисніть, щоб дізнатися про інші жести."
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index ab4dd77380305..604562af30b44 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -245,8 +245,9 @@
"بلوٹوتھ مربوط ہے۔""بلوٹوتھ آلے کا آئیکن""آلہ کی تفصیل کو کنفیگر کرنے کے لیے کلک کریں"
- "تمام آلات دیکھنے کے لیے کلک کریں"
- "نئے آلے کا جوڑا بنانے کے لیے کلک کریں"
+ "%s۔ آلہ کی تفصیل کنفیگر کریں"
+ "تمام آلات دیکھیں"
+ "نئے آلے کا جوڑا بنائیں""بیٹری کی فیصد نامعلوم ہے۔""%s سے منسلک ہیں۔""%s سے منسلک ہے۔"
@@ -808,12 +809,9 @@
"%1$s ایپ گفتگو کی خصوصیات کو سپورٹ نہیں کرتی ہے""تاثرات""برخاست کریں"
-
-
-
-
-
-
+ "پن کردہ کے طور پر نہ دکھائیں"
+ "لائیو اپ ڈیٹس کو دکھایا جا رہا ہے"
+ "پن کردہ اطلاعات ایپس سے لائیو معلومات ڈسپلے کرتی ہیں اور ہمیشہ اسٹیٹس بار اور مقفل اسکرین پر ظاہر ہوتی ہیں""ان اطلاعات کی ترمیم نہیں کی جا سکتی۔""کال کی اطلاعات میں ترمیم نہیں کی جا سکتی۔""اطلاعات کے اس گروپ کو یہاں کنفیگر نہیں کیا جا سکتا"
@@ -900,7 +898,8 @@
"ملٹی ٹاسکنگ""بائیں جانب ایپ کے ساتھ اسپلٹ اسکرین کا استعمال کریں""دائیں جانب ایپ کے ساتھ اسپلٹ اسکرین کا استعمال کریں"
- "فُل اسکرین پر سوئچ کریں"
+ "فُل اسکرین استعمال کریں"
+ "ڈیسک ٹاپ منظر استعمال کریں""اسپلٹ اسکرین کا استعمال کرتے ہوئے دائیں یا نیچے ایپ پر سوئچ کریں""اسپلٹ اسکرین کا استعمال کرتے ہوئے بائیں یا اوپر ایپ پر سوئچ کریں""اسپلٹ اسکرین کے دوران: ایک ایپ کو دوسرے سے تبدیل کریں"
@@ -987,6 +986,8 @@
"کم ترجیحی اطلاع کے آئیکنز دکھائیں""دیگر"
+
+ "ٹائل ہٹائیں""ٹائل کو آخری پوزیشن پر شامل کریں""ٹائل منتقل کریں"
@@ -1501,6 +1502,7 @@
"حالیہ ایپس دیکھیں""ایپس سوئچ کریں""ہو گیا"
+ "اگلا""دوبارہ کوشش کریں!""واپس جائیں""اپنے ٹچ پیڈ پر تین انگلیوں کا استعمال کرتے ہوئے دائیں یا بائیں طرف سوائپ کریں"
@@ -1538,7 +1540,10 @@
"حالیہ ایپس دیکھنے کے لیے، ٹچ پیڈ پر تین انگلیوں سے اوپر سوائپ کریں اور دبائے رکھیں""اپنی سبھی ایپس دیکھنے کے لیے، اپنے کی بورڈ پر ایکشن کلید دبائیں""چھپانے کیلئے تبدیل کردہ"
- "دیکھنے کے لیے غیر مقفل کریں"
+
+
+
+ "سیاق و سباق کی تعلیم""واپس جانے کے لیے اپنے ٹچ پیڈ کا استعمال کریں""تین انگلیوں سے دائیں یا بائیں طرف سوائپ کریں۔ مزید اشارے جاننے کے لیے تھپتھپائیں۔"
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 55caf257c2557..a9c7ec66f9bcb 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -245,8 +245,12 @@
"Bluetooth ulandi.""Bluetooth qurilma belgisi""Qurilma haqida tafsilotlarni oʻzgartirish uchun bosing"
- "Barcha qurilmalarni koʻrish uchun bosing"
- "Yangi qurilmani ulash uchun bosing"
+
+
+
+
+
+ "Batareya quvvati foizi nomaʼlum.""Ulangan: %s.""Bunga ulangan: %s."
@@ -808,12 +812,9 @@
"%1$s ilovasida suhbat funksiyalari ishlamaydi""Fikr-mulohaza""Yopish"
-
-
-
-
-
-
+ "Qadalgan sifatida chiqmasin"
+ "Jonli yangiliklar koʻrsatilmoqda"
+ "Qadalgan bildirishnomalar ilovalardagi jonli efir maʼlumotlarini koʻrsatadi va har doim holat qatori va ekran qulfida chiqadi""Bu bildirishnomalarni tahrirlash imkonsiz.""Chaqiruv bildirishnomalarini tahrirlash imkonsiz.""Ushbu bildirishnomalar guruhi bu yerda sozlanmaydi"
@@ -900,7 +901,10 @@
"Multi-vazifalilik""Ekranni ajratib, joriy ilovani oʻngga joylash""Ekranni ajratib, joriy ilovani chapga joylash"
- "Butun ekran rejimiga kirish"
+
+
+
+ "Ajratilgan ekranda oʻngdagi yoki pastdagi ilovaga almashish""Ajratilgan ekranda chapdagi yoki yuqoridagi ilovaga almashish""Ajratilgan rejimda ilovalarni oʻzaro almashtirish"
@@ -987,6 +991,8 @@
"Muhim boʻlmagan bildirishnoma ikonkalarini koʻrsatish""Boshqa"
+
+ "katakchani olib tashlash""kartochkani oxirgi oʻringa qoʻshish""Katakchani boshqa joyga olish"
@@ -1501,6 +1507,8 @@
"Oxirgi ilovalarni koʻrish""Ilovalarni almashtirish""Tayyor"
+
+ "Qayta urining!""Orqaga qaytish""Sensorli panelda uchta barmoq bilan chapga yoki oʻngga suring"
@@ -1538,7 +1546,10 @@
"Oxirgi ilovalarni koʻrish uchun sensorli panelda uchta barmoq bilan tepaga surib, bosib turing""Barcha ishoralarni koʻrish uchun klaviaturadagi amal tugmasini bosing""Chiqarildi"
- "Koʻrish uchun qulfdan chiqaring"
+
+
+
+ "Kontekstual taʼlim""Sensorli panel orqali orqaga qaytish""Uchta barmoq bilan chapga yoki oʻngga suring. Boshqa ishoralar bilan tanishish uchun bosing."
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 35fe2f2428d4d..deb9c0c943971 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -245,8 +245,12 @@
"Đã kết nối bluetooth.""Biểu tượng thiết bị Bluetooth""Nhấp để định cấu hình thông tin thiết bị"
- "Nhấp để xem tất cả các thiết bị"
- "Nhấp để ghép nối thiết bị mới"
+
+
+
+
+
+ "Tỷ lệ phần trăm pin không xác định.""Đã kết nối với %s.""Đã kết nối với %s."
@@ -808,12 +812,9 @@
"%1$s không hỗ trợ các tính năng trò chuyện""Phản hồi""Đóng"
-
-
-
-
-
-
+ "Không hiện dưới dạng đã ghim"
+ "Đang hiện thông tin cập nhật trực tiếp"
+ "Thông báo được ghim sẽ hiện thông tin trực tiếp từ ứng dụng và luôn xuất hiện trên thanh trạng thái cũng như màn hình khoá""Không thể sửa đổi các thông báo này.""Không thể sửa đổi các thông báo cuộc gọi.""Không thể định cấu hình nhóm thông báo này tại đây"
@@ -900,7 +901,10 @@
"Đa nhiệm""Dùng tính năng chia đôi màn hình với ứng dụng ở bên phải""Dùng tính năng chia đôi màn hình với ứng dụng ở bên trái"
- "Chuyển sang chế độ toàn màn hình"
+
+
+
+ "Chuyển sang ứng dụng bên phải hoặc ở dưới khi đang chia đôi màn hình""Chuyển sang ứng dụng bên trái hoặc ở trên khi đang chia đôi màn hình""Trong chế độ chia đôi màn hình: thay một ứng dụng bằng ứng dụng khác"
@@ -987,6 +991,8 @@
"Hiển thị biểu tượng thông báo có mức ưu tiên thấp""Khác"
+
+ "xóa ô""thêm ô vào vị trí cuối cùng""Di chuyển ô"
@@ -1501,6 +1507,8 @@
"Xem các ứng dụng gần đây""Chuyển đổi ứng dụng""Xong"
+
+ "Hãy thử lại!""Quay lại""Dùng 3 ngón tay vuốt sang trái hoặc sang phải trên bàn di chuột"
@@ -1538,7 +1546,10 @@
"Để xem các ứng dụng gần đây, hãy dùng 3 ngón tay vuốt lên và giữ trên bàn di chuột""Để xem tất cả ứng dụng của bạn, hãy nhấn phím hành động trên bàn phím""Bị loại bỏ"
- "Mở khoá để xem"
+
+
+
+ "Hướng dẫn theo bối cảnh""Dùng bàn di chuột để quay lại""Dùng 3 ngón tay vuốt sang trái hoặc sang phải. Hãy nhấn để tìm hiểu các cử chỉ khác."
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 530017cd087e6..2dd8f72b66b8c 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -245,8 +245,12 @@
"蓝牙已连接。""蓝牙设备图标""点击以配置设备详情"
- "点击即可查看所有设备"
- "点击即可配对新设备"
+
+
+
+
+
+ "电池电量百分比未知。""已连接到%s。""已连接到 %s。"
@@ -808,12 +812,9 @@
"%1$s不支持对话功能""反馈""关闭"
-
-
-
-
-
-
+ "请勿显示在固定的通知中"
+ "显示实时动态"
+ "固定的通知会显示应用的实时信息,并始终显示在状态栏和锁定屏幕上""无法修改这些通知。""无法修改来电通知。""您无法在此处配置这组通知"
@@ -900,7 +901,10 @@
"多任务处理""使用分屏模式,并将应用置于右侧""使用分屏模式,并将应用置于左侧"
- "切换到全屏模式"
+
+
+
+ "使用分屏模式时,切换到右侧或下方的应用""使用分屏模式时,切换到左侧或上方的应用""在分屏期间:将一个应用替换为另一个应用"
@@ -987,6 +991,8 @@
"显示低优先级的通知图标""其他"
+
+ "移除功能块""将功能块添加到最后一个位置""移动功能块"
@@ -1501,6 +1507,8 @@
"查看最近用过的应用""切换应用""完成"
+
+ "再试一次!""返回""在触控板上用三根手指向左或向右滑动"
@@ -1538,7 +1546,10 @@
"如要查看最近用过的应用,请用三根手指在触控板上向上滑动并按住""如要查看所有应用,请按下键盘上的快捷操作按键""已隐去"
- "解锁即可查看"
+
+
+
+ "内容相关指导""使用触控板返回""用三根手指向左或向右滑动。点按即可了解更多手势。"
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 496cbdb7b5cfb..9dd3f5b2672ce 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -245,8 +245,9 @@
"藍牙連線已建立。""藍牙裝置圖示""按一下即可設定裝置詳情"
- "㩒一下就可以睇所有裝置"
- "㩒一下就可以配對新裝置"
+ "%s。設定裝置詳細資料"
+ "查看所有裝置"
+ "配對新裝置""電量百分比不明。""已連線至%s。""已連接至 %s。"
@@ -808,12 +809,9 @@
"「%1$s」不支援對話功能""意見反映""關閉"
-
-
-
-
-
-
+ "不要置頂顯示"
+ "顯示即時消息"
+ "置頂通知顯示應用程式的即時資訊,並且一律在狀態列和上鎖畫面顯示""無法修改這些通知。""無法修改通話通知。""無法在此設定這組通知"
@@ -900,7 +898,8 @@
"多工處理""使用分割螢幕,並在右側顯示應用程式""使用分割螢幕,並在左側顯示應用程式"
- "切換至全螢幕"
+ "使用全螢幕模式"
+ "使用電腦檢視畫面""使用分割螢幕時,切換至右邊或下方的應用程式""使用分割螢幕時,切換至左邊或上方的應用程式""使用分割螢幕期間:更換應用程式"
@@ -987,6 +986,8 @@
"顯示低優先順序通知圖示""其他"
+
+ "移除圖塊""加圖塊去上一個位置""移動圖塊"
@@ -1501,6 +1502,7 @@
"查看最近使用的應用程式""切換應用程式""完成"
+ "繼續""請再試一次!""返回""在觸控板上用三隻手指向左或向右滑動"
@@ -1538,7 +1540,10 @@
"如要查看最近使用的應用程式,請用三隻手指在觸控板上向上滑動並按住""如要查看所有應用程式,請在鍵盤上按下快捷操作鍵""已剔除"
- "解鎖即可查看"
+
+
+
+ "內容教學""使用觸控板返回""用三隻手指向左或向右滑動。輕按即可瞭解更多手勢。"
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index c63473fa01977..430e0e675e33b 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -245,8 +245,9 @@
"藍牙連線已建立。""「藍牙裝置」圖示""按一下即可設定裝置詳細資料"
- "按一下即可查看所有裝置"
- "按一下即可配對新裝置"
+ "%s。設定裝置詳細資料"
+ "查看所有裝置"
+ "配對新裝置""電池電量不明。""已連線至%s。""已連線至 %s。"
@@ -808,12 +809,9 @@
"「%1$s」不支援對話功能""意見回饋""關閉"
-
-
-
-
-
-
+ "不要顯示在固定的通知中"
+ "顯示最新即時資訊"
+ "固定的通知會提供應用程式即時資訊,並一律顯示在狀態列和螢幕鎖定畫面上""無法修改這些通知。""無法修改來電通知。""無法在這裡設定這個通知群組"
@@ -900,7 +898,8 @@
"多工處理""使用分割畫面,並在右側顯示應用程式""使用分割畫面,並在左側顯示應用程式"
- "切換至全螢幕模式"
+ "使用全螢幕模式"
+ "使用電腦檢視畫面""使用分割畫面時,切換到右邊或上方的應用程式""使用分割畫面時,切換到左邊或上方的應用程式""使用分割畫面期間:更換應用程式"
@@ -987,6 +986,8 @@
"顯示低優先順序通知圖示""其他"
+
+ "移除圖塊""將設定方塊新增到最後一個位置""移動圖塊"
@@ -1501,6 +1502,7 @@
"查看最近使用的應用程式""切換應用程式""完成"
+ "繼續""請再試一次!""返回""在觸控板上用三指向左或向右滑動"
@@ -1538,7 +1540,10 @@
"如要查看最近使用的應用程式,請在觸控板上向上滑動並按住""如要查看所有應用程式,請按下鍵盤上的快捷操作鍵""已遮蓋"
- "解鎖即可查看"
+
+
+
+ "內容教學""使用觸控板返回""用三指向左或向右滑動。輕觸即可進一步瞭解手勢。"
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 2aad788b3cf4f..952e23a19fc86 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -247,8 +247,12 @@
"Bluetooth ixhunyiwe""Isithonjana sedivayisi ye-Bluetooth""Chofoza ukuze ulungiselele imininingwane yedivayisi"
- "Chofoza ukuze ubone wonke amadivayisi"
- "Chofoza ukuze ubhangqe idivayisi entsha"
+
+
+
+
+
+ "Iphesenti lebhethri alaziwa.""Xhuma ku-%s.""Ixhumeke ku-%s."
@@ -810,12 +814,9 @@
"I-%1$s ayisekeli izici zengxoxo""Impendulo""Chitha"
-
-
-
-
-
-
+ "Ungabonisi njengophiniwe"
+ "Ibonisa Izibuyekezo Ezibukhoma"
+ "Izaziso eziphiniwe zibonisa ulwazi olubukhoma oluvela kuma-app, futhi oluhlala luvela kubha yesimo nasekukhiyeni isikrini""Lezi zaziso azikwazi ukushintshwa.""Izaziso zekholi azikwazi ukushintshwa.""Leli qembu lezaziso alikwazi ukulungiselelwa lapha"
@@ -902,7 +903,10 @@
"Ukwenza imisebenzi eminingi""Sebenzisa ukuhlukanisa isikrini nge-app kwesokudla""Sebenzisa ukuhlukanisa isikrini nge-app kwesokunxele"
- "Shintshela esikrinini esigcwele"
+
+
+
+ "Shintshela ku-app ngakwesokudla noma ngezansi ngenkathi usebenzisa uhlukanisa isikrini""Shintshela ku-app ngakwesokunxele noma ngaphezulu ngenkathi usebenzisa ukuhlukanisa isikrini""Ngesikhathi sokuhlukaniswa kwesikrini: shintsha i-app ngenye"
@@ -989,6 +993,8 @@
"Bonisa izithonjana zesaziso zokubaluleka okuncane""Okunye"
+
+ "susa ithayela""faka ithayela endaweni yokugcina""Hambisa ithayela"
@@ -1503,6 +1509,8 @@
"Buka ama-app akamuva""Shintsha ama-app""Kwenziwe"
+
+ "Zama futhi!""Buyela emuva""Swayiphela kwesokunxele noma kwesokudla usebenzisa iminwe emithathu kuphedi yokuthinta"
@@ -1540,7 +1548,10 @@
"Ukuze ubuke ama-app akamuva, swayiphela phezulu bese ubambe ngeminwe emithathu ephedini yokuthinta""Ukuze ubuke wonke ama-app wakho, cindezela inkinobho yokufinyelela kukhibhodi yakho""Kwenziwe iredact"
- "Vula ukuze ubuke"
+
+
+
+ "Imfundo yokuqukethwe""Sebenzisa iphedi yokuthinta ukuze ubuyele emuva""Swayiphela kwesokunxele noma kwesokudla usebenzisa iminwe emithathu. Thepha ukuze ufunde kabanzi ngokunyakazisa umzimba."
--
GitLab
From 9a271a951b9eacf66b63436ea04b8a0263ace03a Mon Sep 17 00:00:00 2001
From: Bill Yi
Date: Thu, 20 Feb 2025 16:59:59 -0800
Subject: [PATCH 069/111] Import translations. DO NOT MERGE ANYWHERE
Auto-generated-cl: translation import
Change-Id: I55132c9e342b73d2e1ec425961e53f7a7d7a7e39
---
.../SystemUI/res/values-af/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-am/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-as/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-az/tiles_states_strings.xml | 8 +++++---
.../res/values-b+sr+Latn/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-be/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-bg/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-bn/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-bs/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-ca/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-cs/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-da/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-de/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-el/tiles_states_strings.xml | 12 +++++++-----
.../res/values-en-rAU/tiles_states_strings.xml | 8 +++++---
.../res/values-en-rCA/tiles_states_strings.xml | 8 +++++---
.../res/values-en-rGB/tiles_states_strings.xml | 8 +++++---
.../res/values-en-rIN/tiles_states_strings.xml | 8 +++++---
.../res/values-es-rUS/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-es/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-et/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-eu/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-fa/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-fi/tiles_states_strings.xml | 8 +++++---
.../res/values-fr-rCA/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-fr/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-gl/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-gu/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-hi/tiles_states_strings.xml | 10 ++++++----
.../SystemUI/res/values-hr/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-hu/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-hy/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-in/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-is/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-it/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-ja/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-ka/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-kk/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-km/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-kn/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-ko/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-ky/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-lo/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-lt/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-lv/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-mk/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-ml/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-mn/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-mr/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-ms/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-my/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-nb/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-ne/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-nl/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-or/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-pa/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-pl/tiles_states_strings.xml | 8 +++++---
.../res/values-pt-rBR/tiles_states_strings.xml | 8 +++++---
.../res/values-pt-rPT/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-pt/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-ro/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-ru/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-si/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-sk/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-sl/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-sr/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-sv/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-sw/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-ta/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-te/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-th/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-tl/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-tr/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-uk/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-ur/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-uz/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-vi/tiles_states_strings.xml | 8 +++++---
.../res/values-zh-rCN/tiles_states_strings.xml | 8 +++++---
.../res/values-zh-rHK/tiles_states_strings.xml | 8 +++++---
.../res/values-zh-rTW/tiles_states_strings.xml | 8 +++++---
.../SystemUI/res/values-zu/tiles_states_strings.xml | 8 +++++---
81 files changed, 408 insertions(+), 246 deletions(-)
diff --git a/packages/SystemUI/res/values-af/tiles_states_strings.xml b/packages/SystemUI/res/values-af/tiles_states_strings.xml
index 3d0dbb59ddaf3..fde914fa292cd 100644
--- a/packages/SystemUI/res/values-af/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-af/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Af""Aan"
-
-
-
+
+ "Onbeskikbaar"
+ "Af"
+ "Aan"
+
diff --git a/packages/SystemUI/res/values-am/tiles_states_strings.xml b/packages/SystemUI/res/values-am/tiles_states_strings.xml
index 31a7d962f39a5..f8e7a4387411c 100644
--- a/packages/SystemUI/res/values-am/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-am/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"ጠፍቷል""በርቷል"
-
-
-
+
+ "አይገኝም"
+ "ጠፍቷል"
+ "በርቷል"
+
diff --git a/packages/SystemUI/res/values-as/tiles_states_strings.xml b/packages/SystemUI/res/values-as/tiles_states_strings.xml
index 68212e0163b66..ba30c1e7db0a5 100644
--- a/packages/SystemUI/res/values-as/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-as/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"অফ আছে""অন আছে"
-
-
-
+
+ "উপলব্ধ নহয়"
+ "অফ আছে"
+ "অন আছে"
+
diff --git a/packages/SystemUI/res/values-az/tiles_states_strings.xml b/packages/SystemUI/res/values-az/tiles_states_strings.xml
index 696fad22a991c..74b95e2842e29 100644
--- a/packages/SystemUI/res/values-az/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-az/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Deaktiv""Aktiv"
-
-
-
+
+ "Əlçatan deyil"
+ "Sönülü"
+ "Yanılı"
+
diff --git a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
index 3b9901937dd37..51b667c3fafd0 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Isključeno""Uključeno"
-
-
-
+
+ "Nedostupno"
+ "Isključeno"
+ "Uključeno"
+
diff --git a/packages/SystemUI/res/values-be/tiles_states_strings.xml b/packages/SystemUI/res/values-be/tiles_states_strings.xml
index 9f520da995ff3..cbbfe925c8935 100644
--- a/packages/SystemUI/res/values-be/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-be/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Выключана""Уключана"
-
-
-
+
+ "Недаступна"
+ "Выключана"
+ "Уключана"
+
diff --git a/packages/SystemUI/res/values-bg/tiles_states_strings.xml b/packages/SystemUI/res/values-bg/tiles_states_strings.xml
index e598f928aad13..636585d2a22b8 100644
--- a/packages/SystemUI/res/values-bg/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bg/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Изкл.""Вкл."
-
-
-
+
+ "Не е налице"
+ "Изкл."
+ "Вкл."
+
diff --git a/packages/SystemUI/res/values-bn/tiles_states_strings.xml b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
index 38d9ee72e56da..08231e4f8649d 100644
--- a/packages/SystemUI/res/values-bn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bn/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"বন্ধ আছে""চালু আছে"
-
-
-
+
+ "উপলভ্য নেই"
+ "বন্ধ আছে"
+ "চালু আছে"
+
diff --git a/packages/SystemUI/res/values-bs/tiles_states_strings.xml b/packages/SystemUI/res/values-bs/tiles_states_strings.xml
index 3b9901937dd37..51b667c3fafd0 100644
--- a/packages/SystemUI/res/values-bs/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-bs/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Isključeno""Uključeno"
-
-
-
+
+ "Nedostupno"
+ "Isključeno"
+ "Uključeno"
+
diff --git a/packages/SystemUI/res/values-ca/tiles_states_strings.xml b/packages/SystemUI/res/values-ca/tiles_states_strings.xml
index e0c3fb9c7c735..3b0b9d7cc4344 100644
--- a/packages/SystemUI/res/values-ca/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ca/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Desactivat""Activat"
-
-
-
+
+ "No disponible"
+ "Desactivat"
+ "Activat"
+
diff --git a/packages/SystemUI/res/values-cs/tiles_states_strings.xml b/packages/SystemUI/res/values-cs/tiles_states_strings.xml
index ea62773166f39..49770328c94d2 100644
--- a/packages/SystemUI/res/values-cs/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-cs/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Vypnuto""Zapnuto"
-
-
-
+
+ "Nedostupné"
+ "Vypnuto"
+ "Zapnuto"
+
diff --git a/packages/SystemUI/res/values-da/tiles_states_strings.xml b/packages/SystemUI/res/values-da/tiles_states_strings.xml
index 2b1dbcfe0d73b..af6dafbc614e1 100644
--- a/packages/SystemUI/res/values-da/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-da/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Fra""Til"
-
-
-
+
+ "Ikke tilgængelig"
+ "Fra"
+ "Til"
+
diff --git a/packages/SystemUI/res/values-de/tiles_states_strings.xml b/packages/SystemUI/res/values-de/tiles_states_strings.xml
index ded7efd39cf0e..44734aec80e9d 100644
--- a/packages/SystemUI/res/values-de/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-de/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Aus""An"
-
-
-
+
+ "Nicht verfügbar"
+ "Aus"
+ "An"
+
diff --git a/packages/SystemUI/res/values-el/tiles_states_strings.xml b/packages/SystemUI/res/values-el/tiles_states_strings.xml
index 398bf13563fb7..b649db4c7e3be 100644
--- a/packages/SystemUI/res/values-el/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-el/tiles_states_strings.xml
@@ -47,7 +47,7 @@
"Ενεργό"
- "Μη διαθέσιμο"
+ "Μη διαθέσιμη""Ανενεργό""Ενεργό"
@@ -118,7 +118,7 @@
"Μη διαθέσιμο"
- "Ανενεργό"
+ "Ανενεργός""Ενεργό"
@@ -196,7 +196,9 @@
"Ανενεργό""Ενεργό"
-
-
-
+
+ "Μη διαθέσιμο"
+ "Ανενεργό"
+ "Ενεργό"
+
diff --git a/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
index d62f2e514fbbf..e17eeb2b60236 100644
--- a/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Off""On"
-
-
-
+
+ "Unavailable"
+ "Off"
+ "On"
+
diff --git a/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
index d62f2e514fbbf..e17eeb2b60236 100644
--- a/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Off""On"
-
-
-
+
+ "Unavailable"
+ "Off"
+ "On"
+
diff --git a/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
index d62f2e514fbbf..e17eeb2b60236 100644
--- a/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Off""On"
-
-
-
+
+ "Unavailable"
+ "Off"
+ "On"
+
diff --git a/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml b/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
index d62f2e514fbbf..e17eeb2b60236 100644
--- a/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Off""On"
-
-
-
+
+ "Unavailable"
+ "Off"
+ "On"
+
diff --git a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
index d8354833f91b4..91f5f886bc9b9 100644
--- a/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Desactivado""Activado"
-
-
-
+
+ "No disponible"
+ "No"
+ "Sí"
+
diff --git a/packages/SystemUI/res/values-es/tiles_states_strings.xml b/packages/SystemUI/res/values-es/tiles_states_strings.xml
index ea75e5296ca91..c5b6c2e7d994c 100644
--- a/packages/SystemUI/res/values-es/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-es/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Desactivado""Activado"
-
-
-
+
+ "No disponible"
+ "Desactivado"
+ "Activado"
+
diff --git a/packages/SystemUI/res/values-et/tiles_states_strings.xml b/packages/SystemUI/res/values-et/tiles_states_strings.xml
index a9f0880c36284..e9949bf5726a1 100644
--- a/packages/SystemUI/res/values-et/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-et/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Väljas""Sees"
-
-
-
+
+ "Pole saadaval"
+ "Väljas"
+ "Sees"
+
diff --git a/packages/SystemUI/res/values-eu/tiles_states_strings.xml b/packages/SystemUI/res/values-eu/tiles_states_strings.xml
index 62bbc27010a9f..e47b658d0fae2 100644
--- a/packages/SystemUI/res/values-eu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-eu/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Desaktibatuta""Aktibatuta"
-
-
-
+
+ "Ez dago erabilgarri"
+ "Desaktibatuta"
+ "Aktibatuta"
+
diff --git a/packages/SystemUI/res/values-fa/tiles_states_strings.xml b/packages/SystemUI/res/values-fa/tiles_states_strings.xml
index edc2d412405a2..1025f3d0812a0 100644
--- a/packages/SystemUI/res/values-fa/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fa/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"خاموش""روشن"
-
-
-
+
+ "دردسترس نیست"
+ "خاموش"
+ "روشن"
+
diff --git a/packages/SystemUI/res/values-fi/tiles_states_strings.xml b/packages/SystemUI/res/values-fi/tiles_states_strings.xml
index 6b1a8eddec63e..5452f2630668d 100644
--- a/packages/SystemUI/res/values-fi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fi/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Pois päältä""Päällä"
-
-
-
+
+ "Ei saatavilla"
+ "Pois päältä"
+ "Päällä"
+
diff --git a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
index 4734d860e27ac..e9d3c487009a7 100644
--- a/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Désactivée""Activée"
-
-
-
+
+ "Non accessible"
+ "Désactivé"
+ "Activé"
+
diff --git a/packages/SystemUI/res/values-fr/tiles_states_strings.xml b/packages/SystemUI/res/values-fr/tiles_states_strings.xml
index cefc9a2af3edd..52c7c0c09fd78 100644
--- a/packages/SystemUI/res/values-fr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-fr/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Désactivé""Activé"
-
-
-
+
+ "Indisponible"
+ "Désactivé"
+ "Activé"
+
diff --git a/packages/SystemUI/res/values-gl/tiles_states_strings.xml b/packages/SystemUI/res/values-gl/tiles_states_strings.xml
index bfd6a121da736..7cf5f8295fe84 100644
--- a/packages/SystemUI/res/values-gl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-gl/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Opción desactivada""Opción activada"
-
-
-
+
+ "Non dispoñible"
+ "Desactivado"
+ "Activado"
+
diff --git a/packages/SystemUI/res/values-gu/tiles_states_strings.xml b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
index c6e204d127455..a003106597c55 100644
--- a/packages/SystemUI/res/values-gu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-gu/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"બંધ છે""ચાલુ"
-
-
-
+
+ "અનુપલબ્ધ"
+ "બંધ"
+ "ચાલુ"
+
diff --git a/packages/SystemUI/res/values-hi/tiles_states_strings.xml b/packages/SystemUI/res/values-hi/tiles_states_strings.xml
index 65046cc4216d5..ae08316516070 100644
--- a/packages/SystemUI/res/values-hi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hi/tiles_states_strings.xml
@@ -152,7 +152,7 @@
"चालू है"
- "उपलब्ध नहीं है"
+ "उपलब्ध नहीं हैं""बंद है""चालू है"
@@ -196,7 +196,9 @@
"बंद है""चालू है"
-
-
-
+
+ "उपलब्ध नहीं है"
+ "बंद है"
+ "चालू है"
+
diff --git a/packages/SystemUI/res/values-hr/tiles_states_strings.xml b/packages/SystemUI/res/values-hr/tiles_states_strings.xml
index 3b9901937dd37..51b667c3fafd0 100644
--- a/packages/SystemUI/res/values-hr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hr/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Isključeno""Uključeno"
-
-
-
+
+ "Nedostupno"
+ "Isključeno"
+ "Uključeno"
+
diff --git a/packages/SystemUI/res/values-hu/tiles_states_strings.xml b/packages/SystemUI/res/values-hu/tiles_states_strings.xml
index 06bf4f26ab842..c8f7b0f2fef8c 100644
--- a/packages/SystemUI/res/values-hu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hu/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Ki""Be"
-
-
-
+
+ "Nem áll rendelkezésre"
+ "Ki"
+ "Be"
+
diff --git a/packages/SystemUI/res/values-hy/tiles_states_strings.xml b/packages/SystemUI/res/values-hy/tiles_states_strings.xml
index dc8bbb14c0cf2..e7eee796f91d5 100644
--- a/packages/SystemUI/res/values-hy/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-hy/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Անջատված է""Միացված է"
-
-
-
+
+ "Հասանելի չէ"
+ "Անջատված է"
+ "Միացված է"
+
diff --git a/packages/SystemUI/res/values-in/tiles_states_strings.xml b/packages/SystemUI/res/values-in/tiles_states_strings.xml
index b48a5873095bc..182924dff630d 100644
--- a/packages/SystemUI/res/values-in/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-in/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Nonaktif""Aktif"
-
-
-
+
+ "Tidak tersedia"
+ "Nonaktif"
+ "Aktif"
+
diff --git a/packages/SystemUI/res/values-is/tiles_states_strings.xml b/packages/SystemUI/res/values-is/tiles_states_strings.xml
index 92f07b68389a4..58ce0ae7c4432 100644
--- a/packages/SystemUI/res/values-is/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-is/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Slökkt""Kveikt"
-
-
-
+
+ "Ekki tiltækt"
+ "Slökkt"
+ "Kveikt"
+
diff --git a/packages/SystemUI/res/values-it/tiles_states_strings.xml b/packages/SystemUI/res/values-it/tiles_states_strings.xml
index 7e11d0becfea8..5c56d085652f7 100644
--- a/packages/SystemUI/res/values-it/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-it/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Off""On"
-
-
-
+
+ "Non disponibile"
+ "Off"
+ "On"
+
diff --git a/packages/SystemUI/res/values-ja/tiles_states_strings.xml b/packages/SystemUI/res/values-ja/tiles_states_strings.xml
index 1282f57024831..cce5ceb7945d2 100644
--- a/packages/SystemUI/res/values-ja/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ja/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"OFF""ON"
-
-
-
+
+ "使用不可"
+ "OFF"
+ "ON"
+
diff --git a/packages/SystemUI/res/values-ka/tiles_states_strings.xml b/packages/SystemUI/res/values-ka/tiles_states_strings.xml
index 81fc54d8381e5..7a2298143e4cd 100644
--- a/packages/SystemUI/res/values-ka/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ka/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"გამორთული""ჩართული"
-
-
-
+
+ "მიუწვდომელი"
+ "გამორთული"
+ "ჩართული"
+
diff --git a/packages/SystemUI/res/values-kk/tiles_states_strings.xml b/packages/SystemUI/res/values-kk/tiles_states_strings.xml
index 32562c652750a..2b839c89a6e3e 100644
--- a/packages/SystemUI/res/values-kk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kk/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Өшірулі""Қосулы"
-
-
-
+
+ "Қолжетімді емес"
+ "Өшірулі"
+ "Қосулы"
+
diff --git a/packages/SystemUI/res/values-km/tiles_states_strings.xml b/packages/SystemUI/res/values-km/tiles_states_strings.xml
index 0e47250b8f336..7085509a596a3 100644
--- a/packages/SystemUI/res/values-km/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-km/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"បិទ""បើក"
-
-
-
+
+ "មិនមានទេ"
+ "បិទ"
+ "បើក"
+
diff --git a/packages/SystemUI/res/values-kn/tiles_states_strings.xml b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
index b3543f9d26387..487be133293fb 100644
--- a/packages/SystemUI/res/values-kn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"ಆಫ್ ಆಗಿದೆ""ಆನ್ ಆಗಿದೆ"
-
-
-
+
+ "ಲಭ್ಯವಿಲ್ಲ"
+ "ಆಫ್ ಆಗಿದೆ"
+ "ಆನ್ ಆಗಿದೆ"
+
diff --git a/packages/SystemUI/res/values-ko/tiles_states_strings.xml b/packages/SystemUI/res/values-ko/tiles_states_strings.xml
index c512435020dd8..dfdcefe0ca0f6 100644
--- a/packages/SystemUI/res/values-ko/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ko/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"사용 안함""사용"
-
-
-
+
+ "사용할 수 없음"
+ "사용 안함"
+ "사용"
+
diff --git a/packages/SystemUI/res/values-ky/tiles_states_strings.xml b/packages/SystemUI/res/values-ky/tiles_states_strings.xml
index 47e36da6126f2..6077f6647ca9b 100644
--- a/packages/SystemUI/res/values-ky/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ky/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Өчүк""Күйүк"
-
-
-
+
+ "Жеткиликсиз"
+ "Өчүк"
+ "Күйүк"
+
diff --git a/packages/SystemUI/res/values-lo/tiles_states_strings.xml b/packages/SystemUI/res/values-lo/tiles_states_strings.xml
index 71e084a21b7cc..294d6af2b8638 100644
--- a/packages/SystemUI/res/values-lo/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lo/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"ປິດ""ເປີດ"
-
-
-
+
+ "ບໍ່ພ້ອມໃຫ້ນຳໃຊ້"
+ "ປິດ"
+ "ເປີດ"
+
diff --git a/packages/SystemUI/res/values-lt/tiles_states_strings.xml b/packages/SystemUI/res/values-lt/tiles_states_strings.xml
index 893d6aef3069a..46c6f6904875e 100644
--- a/packages/SystemUI/res/values-lt/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lt/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Išjungta""Įjungta"
-
-
-
+
+ "Nepasiekiama"
+ "Išjungta"
+ "Įjungta"
+
diff --git a/packages/SystemUI/res/values-lv/tiles_states_strings.xml b/packages/SystemUI/res/values-lv/tiles_states_strings.xml
index 732975135494a..8e9268a97f6eb 100644
--- a/packages/SystemUI/res/values-lv/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-lv/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Izslēgts""Ieslēgts"
-
-
-
+
+ "Nav pieejams"
+ "Izslēgts"
+ "Ieslēgts"
+
diff --git a/packages/SystemUI/res/values-mk/tiles_states_strings.xml b/packages/SystemUI/res/values-mk/tiles_states_strings.xml
index 67baf7c305cee..752c386113ed5 100644
--- a/packages/SystemUI/res/values-mk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mk/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Исклучено""Вклучено"
-
-
-
+
+ "Недостапно"
+ "Исклучено"
+ "Вклучено"
+
diff --git a/packages/SystemUI/res/values-ml/tiles_states_strings.xml b/packages/SystemUI/res/values-ml/tiles_states_strings.xml
index 8639c1030cbed..e197c928e98ab 100644
--- a/packages/SystemUI/res/values-ml/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ml/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"ഓഫാണ്""ഓണാണ്"
-
-
-
+
+ "ലഭ്യമല്ല"
+ "ഓഫാണ്"
+ "ഓണാണ്"
+
diff --git a/packages/SystemUI/res/values-mn/tiles_states_strings.xml b/packages/SystemUI/res/values-mn/tiles_states_strings.xml
index 678033cf4a07e..7ca88e97777bc 100644
--- a/packages/SystemUI/res/values-mn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mn/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Унтраалттай""Асаалттай"
-
-
-
+
+ "Боломжгүй"
+ "Унтраалттай"
+ "Асаалттай"
+
diff --git a/packages/SystemUI/res/values-mr/tiles_states_strings.xml b/packages/SystemUI/res/values-mr/tiles_states_strings.xml
index ec876598a95db..58c4d06e39dde 100644
--- a/packages/SystemUI/res/values-mr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-mr/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"बंद आहे""सुरू आहे"
-
-
-
+
+ "उपलब्ध नाही"
+ "बंद आहे"
+ "सुरू आहे"
+
diff --git a/packages/SystemUI/res/values-ms/tiles_states_strings.xml b/packages/SystemUI/res/values-ms/tiles_states_strings.xml
index 6dc9827997f7e..5a55b76feb5a6 100644
--- a/packages/SystemUI/res/values-ms/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ms/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Mati""Hidup"
-
-
-
+
+ "Tidak tersedia"
+ "Mati"
+ "Hidup"
+
diff --git a/packages/SystemUI/res/values-my/tiles_states_strings.xml b/packages/SystemUI/res/values-my/tiles_states_strings.xml
index 424b4b9ef33ee..778920506f03b 100644
--- a/packages/SystemUI/res/values-my/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-my/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"ပိတ်""ဖွင့်"
-
-
-
+
+ "မရနိုင်ပါ"
+ "ပိတ်"
+ "ဖွင့်"
+
diff --git a/packages/SystemUI/res/values-nb/tiles_states_strings.xml b/packages/SystemUI/res/values-nb/tiles_states_strings.xml
index bbeafd86ecc09..25b22052ea8d4 100644
--- a/packages/SystemUI/res/values-nb/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-nb/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Av""På"
-
-
-
+
+ "Utilgjengelig"
+ "Av"
+ "På"
+
diff --git a/packages/SystemUI/res/values-ne/tiles_states_strings.xml b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
index de3baa0a33cf4..fe812f846e416 100644
--- a/packages/SystemUI/res/values-ne/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ne/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"अफ छ""अन छ"
-
-
-
+
+ "उपलब्ध छैन"
+ "अफ छ"
+ "अन छ"
+
diff --git a/packages/SystemUI/res/values-nl/tiles_states_strings.xml b/packages/SystemUI/res/values-nl/tiles_states_strings.xml
index 90572b674ab49..bb8fbe0604dcb 100644
--- a/packages/SystemUI/res/values-nl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-nl/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Uit""Aan"
-
-
-
+
+ "Niet beschikbaar"
+ "Uit"
+ "Aan"
+
diff --git a/packages/SystemUI/res/values-or/tiles_states_strings.xml b/packages/SystemUI/res/values-or/tiles_states_strings.xml
index c9c319892ab8f..eae984b6c1f3f 100644
--- a/packages/SystemUI/res/values-or/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-or/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"ବନ୍ଦ ଅଛି""ଚାଲୁ ଅଛି"
-
-
-
+
+ "ଅନୁପଲବ୍ଧ"
+ "ବନ୍ଦ ଅଛି"
+ "ଚାଲୁ ଅଛି"
+
diff --git a/packages/SystemUI/res/values-pa/tiles_states_strings.xml b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
index eeb9a5beba7ab..2baff30ad6d6e 100644
--- a/packages/SystemUI/res/values-pa/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pa/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"ਬੰਦ""ਚਾਲੂ"
-
-
-
+
+ "ਉਪਲਬਧ ਨਹੀਂ"
+ "ਬੰਦ ਹੈ"
+ "ਚਾਲੂ ਹੈ"
+
diff --git a/packages/SystemUI/res/values-pl/tiles_states_strings.xml b/packages/SystemUI/res/values-pl/tiles_states_strings.xml
index bc59a90576188..bd3a828c868f5 100644
--- a/packages/SystemUI/res/values-pl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pl/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Wyłączony""Włączony"
-
-
-
+
+ "Niedostępne"
+ "Wyłączone"
+ "Włączone"
+
diff --git a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
index 3e75cdd2bd098..b16d6f2b94e9f 100644
--- a/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Desativado""Ativado"
-
-
-
+
+ "Indisponível"
+ "Desativado"
+ "Ativado"
+
diff --git a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
index 7e7e6734f57e7..3beca27a1d293 100644
--- a/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Desativado""Ativado"
-
-
-
+
+ "Indisponível"
+ "Desativado"
+ "Ativado"
+
diff --git a/packages/SystemUI/res/values-pt/tiles_states_strings.xml b/packages/SystemUI/res/values-pt/tiles_states_strings.xml
index 3e75cdd2bd098..b16d6f2b94e9f 100644
--- a/packages/SystemUI/res/values-pt/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-pt/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Desativado""Ativado"
-
-
-
+
+ "Indisponível"
+ "Desativado"
+ "Ativado"
+
diff --git a/packages/SystemUI/res/values-ro/tiles_states_strings.xml b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
index 6dcb0d3c16359..b55598725a0fe 100644
--- a/packages/SystemUI/res/values-ro/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ro/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Dezactivat""Activat"
-
-
-
+
+ "Indisponibil"
+ "Dezactivat"
+ "Activat"
+
diff --git a/packages/SystemUI/res/values-ru/tiles_states_strings.xml b/packages/SystemUI/res/values-ru/tiles_states_strings.xml
index e7ff74d61ce3b..8279183345a83 100644
--- a/packages/SystemUI/res/values-ru/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ru/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Отключено""Включено"
-
-
-
+
+ "Недоступно"
+ "Отключено"
+ "Включено"
+
diff --git a/packages/SystemUI/res/values-si/tiles_states_strings.xml b/packages/SystemUI/res/values-si/tiles_states_strings.xml
index 710e9aa1893d3..9397ca7221e91 100644
--- a/packages/SystemUI/res/values-si/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-si/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"ක්රියාවිරහිතයි""ක්රියාත්මකයි"
-
-
-
+
+ "නොමැත"
+ "ක්රියාවිරහිතයි"
+ "ක්රියාත්මකයි"
+
diff --git a/packages/SystemUI/res/values-sk/tiles_states_strings.xml b/packages/SystemUI/res/values-sk/tiles_states_strings.xml
index 83235060a6128..3e618846a6c32 100644
--- a/packages/SystemUI/res/values-sk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sk/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Vypnuté""Zapnuté"
-
-
-
+
+ "Nedostupné"
+ "Vypnuté"
+ "Zapnuté"
+
diff --git a/packages/SystemUI/res/values-sl/tiles_states_strings.xml b/packages/SystemUI/res/values-sl/tiles_states_strings.xml
index d644038f9a8d1..814680254a8c3 100644
--- a/packages/SystemUI/res/values-sl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sl/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Izklopljeno""Vklopljeno"
-
-
-
+
+ "Ni na voljo"
+ "Izklopljeno"
+ "Vklopljeno"
+
diff --git a/packages/SystemUI/res/values-sr/tiles_states_strings.xml b/packages/SystemUI/res/values-sr/tiles_states_strings.xml
index e1bd7b1740da1..df9e574fe0537 100644
--- a/packages/SystemUI/res/values-sr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sr/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Искључено""Укључено"
-
-
-
+
+ "Недоступно"
+ "Искључено"
+ "Укључено"
+
diff --git a/packages/SystemUI/res/values-sv/tiles_states_strings.xml b/packages/SystemUI/res/values-sv/tiles_states_strings.xml
index 37d757e93f49d..76822d0736680 100644
--- a/packages/SystemUI/res/values-sv/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sv/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Av""På"
-
-
-
+
+ "Inte tillgänglig"
+ "Av"
+ "På"
+
diff --git a/packages/SystemUI/res/values-sw/tiles_states_strings.xml b/packages/SystemUI/res/values-sw/tiles_states_strings.xml
index fae42c3980b00..4070260456fed 100644
--- a/packages/SystemUI/res/values-sw/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-sw/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Limezimwa""Limewashwa"
-
-
-
+
+ "Hakipatikani"
+ "Kimezimwa"
+ "Kimewashwa"
+
diff --git a/packages/SystemUI/res/values-ta/tiles_states_strings.xml b/packages/SystemUI/res/values-ta/tiles_states_strings.xml
index b09b17f40cd39..dc1c514c559d4 100644
--- a/packages/SystemUI/res/values-ta/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ta/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"முடக்கப்பட்டுள்ளது""இயக்கப்பட்டுள்ளது"
-
-
-
+
+ "கிடைக்கவில்லை"
+ "முடக்கப்பட்டுள்ளது"
+ "இயக்கப்பட்டுள்ளது"
+
diff --git a/packages/SystemUI/res/values-te/tiles_states_strings.xml b/packages/SystemUI/res/values-te/tiles_states_strings.xml
index 7562aaec0118e..d118429e7c553 100644
--- a/packages/SystemUI/res/values-te/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-te/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"ఆఫ్లో ఉంది""ఆన్లో ఉంది"
-
-
-
+
+ "అందుబాటులో లేదు"
+ "ఆఫ్లో ఉంది"
+ "ఆన్లో ఉంది"
+
diff --git a/packages/SystemUI/res/values-th/tiles_states_strings.xml b/packages/SystemUI/res/values-th/tiles_states_strings.xml
index 6d360367fac73..9fba3bdd9d6b3 100644
--- a/packages/SystemUI/res/values-th/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-th/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"ปิด""เปิด"
-
-
-
+
+ "ไม่พร้อมใช้งาน"
+ "ปิด"
+ "เปิด"
+
diff --git a/packages/SystemUI/res/values-tl/tiles_states_strings.xml b/packages/SystemUI/res/values-tl/tiles_states_strings.xml
index 112c0bf11e736..03cca6df05bd0 100644
--- a/packages/SystemUI/res/values-tl/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-tl/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Naka-off""Naka-on"
-
-
-
+
+ "Hindi available"
+ "Naka-off"
+ "Naka-on"
+
diff --git a/packages/SystemUI/res/values-tr/tiles_states_strings.xml b/packages/SystemUI/res/values-tr/tiles_states_strings.xml
index f3c51c093c4ae..7c17ace16d104 100644
--- a/packages/SystemUI/res/values-tr/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-tr/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Kapalı""Açık"
-
-
-
+
+ "Yok"
+ "Kapalı"
+ "Açık"
+
diff --git a/packages/SystemUI/res/values-uk/tiles_states_strings.xml b/packages/SystemUI/res/values-uk/tiles_states_strings.xml
index 4fac740d1693f..8b50c085ddb41 100644
--- a/packages/SystemUI/res/values-uk/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uk/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Вимкнено""Увімкнено"
-
-
-
+
+ "Недоступно"
+ "Вимкнено"
+ "Увімкнено"
+
diff --git a/packages/SystemUI/res/values-ur/tiles_states_strings.xml b/packages/SystemUI/res/values-ur/tiles_states_strings.xml
index 06e213b36a99f..fea05338be7cd 100644
--- a/packages/SystemUI/res/values-ur/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-ur/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"آف""آن"
-
-
-
+
+ "دستیاب نہیں ہے"
+ "آف"
+ "آن"
+
diff --git a/packages/SystemUI/res/values-uz/tiles_states_strings.xml b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
index f636bc61bb99c..9b8ca80c2feef 100644
--- a/packages/SystemUI/res/values-uz/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-uz/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Yoqilmagan""Yoniq"
-
-
-
+
+ "Mavjud emas"
+ "Yoqilmagan"
+ "Yoniq"
+
diff --git a/packages/SystemUI/res/values-vi/tiles_states_strings.xml b/packages/SystemUI/res/values-vi/tiles_states_strings.xml
index d8e68875f07e4..afbf477ebcd48 100644
--- a/packages/SystemUI/res/values-vi/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-vi/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Đang tắt""Đang bật"
-
-
-
+
+ "Không có"
+ "Đang tắt"
+ "Đang bật"
+
diff --git a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
index 6f3606578a48d..a3922e5168c94 100644
--- a/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"关闭""开启"
-
-
-
+
+ "不可用"
+ "已关闭"
+ "已开启"
+
diff --git a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
index 25548e2d3c35b..26bec2c5f0d71 100644
--- a/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"關閉""開啟"
-
-
-
+
+ "無法使用"
+ "關閉"
+ "開啟"
+
diff --git a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
index 3a192ba951b9d..6e272f2135263 100644
--- a/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"關閉""開啟"
-
-
-
+
+ "無法使用"
+ "已關閉"
+ "已開啟"
+
diff --git a/packages/SystemUI/res/values-zu/tiles_states_strings.xml b/packages/SystemUI/res/values-zu/tiles_states_strings.xml
index f9f27bdbe2516..13ffe042c07ee 100644
--- a/packages/SystemUI/res/values-zu/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-zu/tiles_states_strings.xml
@@ -196,7 +196,9 @@
"Valiwe""Vuliwe"
-
-
-
+
+ "Ayitholakali"
+ "Ivaliwe"
+ "Ivuliwe"
+
--
GitLab
From fba79d86ed01fc40e9cf55d44819f6c8f3ff9583 Mon Sep 17 00:00:00 2001
From: Hiroki Sato
Date: Wed, 19 Feb 2025 10:36:30 +0900
Subject: [PATCH 070/111] Simplify MouseEventHandler construction
This simplifies MouseEventHandler construction so that it's
created inside FullScreenMagnificationGestureHandler, and there's no
need for A11yInputFilter to know about it.
Bug: 361817142
Test: FullScreenMagnificationGestureHandlerTest AccessibilityInputFilterTest
Flag: EXEMPT refactor
Change-Id: Iba9ec12c8e9afacaf4522533292967c8e59b549d
---
.../accessibility/AccessibilityInputFilter.java | 4 +---
.../FullScreenMagnificationGestureHandler.java | 13 +++++--------
.../FullScreenMagnificationGestureHandlerTest.java | 11 +++++------
3 files changed, 11 insertions(+), 17 deletions(-)
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
index 9b5f22afb81d2..4e41808626b4f 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java
@@ -53,7 +53,6 @@ import com.android.server.accessibility.magnification.FullScreenMagnificationGes
import com.android.server.accessibility.magnification.FullScreenMagnificationVibrationHelper;
import com.android.server.accessibility.magnification.MagnificationGestureHandler;
import com.android.server.accessibility.magnification.MagnificationKeyHandler;
-import com.android.server.accessibility.magnification.MouseEventHandler;
import com.android.server.accessibility.magnification.WindowMagnificationGestureHandler;
import com.android.server.accessibility.magnification.WindowMagnificationPromptController;
import com.android.server.policy.WindowManagerPolicy;
@@ -899,8 +898,7 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo
triggerable,
new WindowMagnificationPromptController(displayContext, mUserId),
displayId,
- fullScreenMagnificationVibrationHelper,
- new MouseEventHandler(controller));
+ fullScreenMagnificationVibrationHelper);
}
return magnificationGestureHandler;
}
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
index c86c6df56d53e..e0dd8b601a3dc 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java
@@ -182,7 +182,7 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
private final int mMinimumVelocity;
private final int mMaximumVelocity;
- private MouseEventHandler mMouseEventHandler;
+ private final MouseEventHandler mMouseEventHandler;
public FullScreenMagnificationGestureHandler(
@UiContext Context context,
@@ -194,8 +194,7 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
boolean detectShortcutTrigger,
@NonNull WindowMagnificationPromptController promptController,
int displayId,
- FullScreenMagnificationVibrationHelper fullScreenMagnificationVibrationHelper,
- MouseEventHandler mouseEventHandler) {
+ FullScreenMagnificationVibrationHelper fullScreenMagnificationVibrationHelper) {
this(
context,
fullScreenMagnificationController,
@@ -210,8 +209,7 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
/* magnificationLogger= */ null,
ViewConfiguration.get(context),
new OneFingerPanningSettingsProvider(
- context, Flags.enableMagnificationOneFingerPanningGesture()),
- mouseEventHandler);
+ context, Flags.enableMagnificationOneFingerPanningGesture()));
}
/** Constructor for tests. */
@@ -229,8 +227,7 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
FullScreenMagnificationVibrationHelper fullScreenMagnificationVibrationHelper,
MagnificationLogger magnificationLogger,
ViewConfiguration viewConfiguration,
- OneFingerPanningSettingsProvider oneFingerPanningSettingsProvider,
- MouseEventHandler mouseEventHandler) {
+ OneFingerPanningSettingsProvider oneFingerPanningSettingsProvider) {
super(displayId, detectSingleFingerTripleTap, detectTwoFingerTripleTap,
detectShortcutTrigger, trace, callback);
if (DEBUG_ALL) {
@@ -316,7 +313,7 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH
mOverscrollEdgeSlop = context.getResources().getDimensionPixelSize(
R.dimen.accessibility_fullscreen_magnification_gesture_edge_slop);
mIsWatch = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
- mMouseEventHandler = mouseEventHandler;
+ mMouseEventHandler = new MouseEventHandler(mFullScreenMagnificationController);
if (mDetectShortcutTrigger) {
mScreenStateReceiver = new ScreenStateReceiver(context, this);
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java
index 0debb907b5602..15017404791b4 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java
@@ -311,8 +311,7 @@ public class FullScreenMagnificationGestureHandlerTest {
mMockFullScreenMagnificationVibrationHelper,
mMockMagnificationLogger,
ViewConfiguration.get(mContext),
- mMockOneFingerPanningSettingsProvider,
- new MouseEventHandler(mFullScreenMagnificationController));
+ mMockOneFingerPanningSettingsProvider);
// OverscrollHandler is only supported on watches.
// @See config_enable_a11y_fullscreen_magnification_overscroll_handler
if (isWatch()) {
@@ -482,8 +481,8 @@ public class FullScreenMagnificationGestureHandlerTest {
@Test
@RequiresFlagsDisabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void testDisablingTripleTap_removesInputLag() {
- mMgh = newInstance(/* detectSingleFingerTripleTap */ false,
- /* detectTwoFingerTripleTap */ true, /* detectShortcut */ true);
+ mMgh = newInstance(/* detectSingleFingerTripleTap= */ false,
+ /* detectTwoFingerTripleTap= */ true, /* detectShortcutTrigger= */ true);
goFromStateIdleTo(STATE_IDLE);
allowEventDelegation();
tap();
@@ -494,8 +493,8 @@ public class FullScreenMagnificationGestureHandlerTest {
@Test
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_MAGNIFICATION_MULTIPLE_FINGER_MULTIPLE_TAP_GESTURE)
public void testDisablingSingleFingerTripleTapAndTwoFingerTripleTap_removesInputLag() {
- mMgh = newInstance(/* detectSingleFingerTripleTap */ false,
- /* detectTwoFingerTripleTap */ false, /* detectShortcut */ true);
+ mMgh = newInstance(/* detectSingleFingerTripleTap= */ false,
+ /* detectTwoFingerTripleTap= */ false, /* detectShortcutTrigger= */ true);
goFromStateIdleTo(STATE_IDLE);
allowEventDelegation();
tap();
--
GitLab
From 0c2eb35f9df2c2b2817d0bdbe50fc1a8015702c7 Mon Sep 17 00:00:00 2001
From: Bill Yi
Date: Thu, 20 Feb 2025 17:10:19 -0800
Subject: [PATCH 071/111] Import translations. DO NOT MERGE ANYWHERE
Auto-generated-cl: translation import
Change-Id: Ib4952e450d4c8106ceaaef52445702951c75cda5
---
.../res-keyguard/values-es-rUS/strings.xml | 14 +++++++-------
.../SystemUI/res-keyguard/values-es/strings.xml | 6 +++---
.../res-keyguard/values-fr-rCA/strings.xml | 6 +++---
.../SystemUI/res-keyguard/values-hi/strings.xml | 6 +++---
.../SystemUI/res-keyguard/values-km/strings.xml | 4 ++--
.../SystemUI/res-keyguard/values-ky/strings.xml | 6 +++---
.../SystemUI/res-keyguard/values-mn/strings.xml | 6 +++---
.../SystemUI/res-keyguard/values-ne/strings.xml | 2 +-
.../SystemUI/res-keyguard/values-pa/strings.xml | 2 +-
.../SystemUI/res-keyguard/values-ru/strings.xml | 2 +-
.../SystemUI/res-keyguard/values-sk/strings.xml | 6 +++---
.../SystemUI/res-keyguard/values-te/strings.xml | 4 ++--
.../res-keyguard/values-zh-rCN/strings.xml | 2 +-
13 files changed, 33 insertions(+), 33 deletions(-)
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index e7116d63d5fce..7e5ff8c017d2d 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -21,11 +21,11 @@
"Ingresa tu PIN"
- "Ingresar PIN"
+ "Ingresa el PIN""Ingresa tu patrón"
- "Dibujar patrón"
+ "Dibuja el patrón""Ingresa tu contraseña"
- "Ingresar contraseña"
+ "Ingresa la contraseña""Tarjeta no válida""Cargada""%s • Cargando de manera inalámbrica"
@@ -62,9 +62,9 @@
"Vuelve a intentarlo o ingresa el PIN""Vuelve a intentarlo o ingresa la contraseña""Vuelve a intentarlo o dibuja el patrón"
- "Se requiere PIN luego de demasiados intentos"
- "Se requiere contraseña luego de demasiados intentos"
- "Se requiere patrón luego de demasiados intentos"
+ "Debes ingresar un PIN luego de demasiados intentos"
+ "Debes ingresar una contraseña luego de demasiados intentos"
+ "Debes ingresar un patrón luego de demasiados intentos""Desbloquear con PIN o huella dactilar""Desbloq. contraseña/huella""Desbloq. patrón/huella"
@@ -104,7 +104,7 @@
"Se produjo un error al desbloquear la tarjeta SIM con el PIN.""Se produjo un error al desbloquear la tarjeta SIM con el PUK.""Cambiar método de entrada"
- "Modo de avión"
+ "Modo avión""Se requiere patrón tras reiniciar dispositivo""Se requiere PIN tras reiniciar dispositivo""Se requiere contraseña tras reiniciar dispositivo"
diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml
index 33a7346b3769c..0e0f9ebe7eca9 100644
--- a/packages/SystemUI/res-keyguard/values-es/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es/strings.xml
@@ -62,9 +62,9 @@
"Vuelve a intentarlo o introduce el PIN""Vuelve a intentarlo o escribe la contraseña""Vuelve a intentarlo o dibuja el patrón"
- "Demasiados intentos, se necesita el PIN"
- "Demasiados intentos, se necesita la contraseña"
- "Demasiados intentos, se necesita el patrón"
+ "Tras demasiados intentos, es necesario introducir el PIN"
+ "Tras demasiados intentos, es necesario introducir la contraseña"
+ "Tras demasiados intentos, es necesario dibujar el patrón""Desbloquea con PIN o huella digital""Desbloquea con contraseña o huella digital""Desbloquea con tu patrón o huella digital"
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index 82a553cea0583..cb6f5b4c8fa8c 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -62,9 +62,9 @@
"Réessayez ou entrez le NIP""Réessayez ou entrez le mot de passe""Réessayez ou dessinez le schéma"
- "Le NIP est requis (trop de tentatives)"
- "Le mot de passe est requis (trop de tentatives)"
- "Le schéma est requis (trop de tentatives)"
+ "Le NIP est requis après trop de tentatives"
+ "Le mot de passe est requis après trop de tentatives"
+ "Le schéma est requis après trop de tentatives""Déverr. par NIP ou empr. dig.""Déverr. par MDP ou empr. dig.""Déverr. par schéma ou empr. dig."
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index d9055817a7648..9eb89b67fdde4 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -62,9 +62,9 @@
"फिर से कोशिश करें या पिन डालें""फिर से कोशिश करें या पासवर्ड डालें""फिर से कोशिश करें या पैटर्न ड्रॉ करें"
- "कई बार कोशिश की जा चुकी है, इसलिए पिन डालें"
- "कई बार कोशिश की जा चुकी है, इसलिए पासवर्ड डालें"
- "कई बार कोशिश की जा चुकी है, इसलिए पैटर्न ड्रा करें"
+ "कई बार कोशिश करने के बाद पिन डालना ज़रूरी है"
+ "कई बार कोशिश करने के बाद पासवर्ड डालना ज़रूरी है"
+ "कई बार कोशिश करने के बाद पैटर्न ड्रा करना ज़रूरी है""पिन/फ़िंगरप्रिंट से अनलॉक करें""पासवर्ड/फ़िंगरप्रिंट से अनलॉक करें""पैटर्न/फ़िंगरप्रिंट से अनलॉक करें"
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index 733e29c75de74..5f2bffbdc94ea 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -62,9 +62,9 @@
"ព្យាយាមម្ដងទៀត ឬបញ្ចូលកូដ PIN""ព្យាយាមម្ដងទៀត ឬបញ្ចូលពាក្យសម្ងាត់""ព្យាយាមម្ដងទៀត ឬគូរលំនាំ"
- "ត្រូវការកូដ PIN បន្ទាប់ពីព្យាយាមច្រើនដងពេក"
+ "តម្រូវឱ្យមាន PIN បន្ទាប់ពីព្យាយាមច្រើនដងពេក""ត្រូវការពាក្យសម្ងាត់ បន្ទាប់ពីព្យាយាមច្រើនដងពេក"
- "ត្រូវការលំនាំ បន្ទាប់ពីព្យាយាមច្រើនដងពេក"
+ "តម្រូវឱ្យមានលំនាំ បន្ទាប់ពីព្យាយាមច្រើនដងពេក""ដោះសោដោយប្រើកូដ PIN ឬស្នាមម្រាមដៃ""ដោះសោដោយប្រើពាក្យសម្ងាត់ ឬស្នាមម្រាមដៃ""ដោះសោដោយប្រើលំនាំ ឬស្នាមម្រាមដៃ"
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index 544adee82152f..addb01ead30e8 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -62,9 +62,9 @@
"Кайталап көрүңүз же PIN кодду киргизиңиз""Кайра аракет кылыңыз же сырсөздү киргизиңиз""Кайра аракет кылыңыз же графикалык ачкычты тартыңыз"
- "Өтө көп аракеттен кийин PIN код талап кылынат"
- "Өтө көп аракеттен кийин сырсөз талап кылынат"
- "Өтө көп аракеттен кийин графикалык ачкыч талап клынт"
+ "Өтө көп жолу аракет кылдыңыз. PIN кодду киргизиңиз."
+ "Өтө көп жолу аракет кылдыңыз. Сырсөздү киргизиңиз."
+ "Өтө көп жолу аракет кылдыңыз. Графикалык ачкычты киргизиңиз.""PIN кд же мнжа изи мнен клпусн ачңыз""Срсөз же мнжа изи мнен клпусн ачңз""Грфиклык ачкч же мнжа изи менн клпусн ачңз"
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 83ce6988ec4eb..cd187bc07cbc2 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -62,9 +62,9 @@
"Дахин оролдох эсвэл ПИН оруулна уу""Дахин оролдох эсвэл нууц үг оруулна уу""Дахин оролдох эсвэл хээ зурна уу"
- "Хэт олон оролдлогын дараа ПИН шаардлагатай"
- "Хэт олон оролдлогын дараа нууц үг шаардлагатай"
- "Хэт олон оролдлогын дараа хээ шаардлагатай"
+ "Хэт олон оролдлогын дараа ПИН оруулахыг шаардана"
+ "Хэт олон оролдлогын дараа нууц үг оруулахыг шаардана"
+ "Хэт олон оролдлогын дараа хээ оруулахыг шаардана""ПИН эсвэл хурууны хээгээр түгжээ тайл""Нууц үг эсвэл хурууны хээгээр түгжээ тайл""Хээ эсвэл хурууны хээгээр түгжээ тайл"
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index 2fd42f4b52abd..502c42d205606 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -23,7 +23,7 @@
"आफ्नो PIN हाल्नुहोस्""PIN हाल्नुहोस्""प्याटर्न हाल्नुहोस्"
- "प्याटर्न हाल्नुहोस्"
+ "प्याटर्न कोर्नुहोस्""पासवर्ड हाल्नुहोस्""पासवर्ड हाल्नुहोस्""अमान्य कार्ड।"
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index 3411571a99f74..ea958e5ed1ec7 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -64,7 +64,7 @@
"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ ਪੈਟਰਨ ਬਣਾਓ""ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਅਦ ਪਿੰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ""ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਅਦ ਪਾਸਵਰਡ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ"
- "ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਅਦ ਪੈਟਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ"
+ "ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ ਤੋਂ ਬਾਅਦ ਪੈਟਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ""ਪਿੰਨ ਜਾਂ ਫਿੰਗਰਪ੍ਰਿੰਟ ਨਾਲ ਅਣਲਾਕ ਕਰੋ""ਪਾਸਵਰਡ ਜਾਂ ਫਿੰਗਰਪ੍ਰਿੰਟ ਨਾਲ ਅਣਲਾਕ ਕਰੋ""ਪੈਟਰਨ ਜਾਂ ਫਿੰਗਰਪ੍ਰਿੰਟ ਨਾਲ ਅਣਲਾਕ ਕਰੋ"
diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml
index cab9cb950169c..d066292bde7a1 100644
--- a/packages/SystemUI/res-keyguard/values-ru/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml
@@ -64,7 +64,7 @@
"Повторите попытку или введите графический ключ.""Слишком много попыток. Необходимо ввести PIN-код.""Слишком много попыток. Необходимо ввести пароль."
- "Слишком много попыток. Необходимо ввести граф. ключ."
+ "Слишком много попыток. Необходимо ввести графический ключ.""Используйте PIN-код или отпечаток пальца""Используйте пароль или отпечаток пальца""Используйте граф. ключ или отпечаток пальца"
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index 4dffd971dd275..3cccb9c1b1dff 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -62,9 +62,9 @@
"Skúste to znova alebo zadajte PIN""Skúste to znova alebo zadajte heslo""Skúste to znova alebo nakreslite vzor"
- "Príliš veľký počet pokusov. Vyžaduje sa PIN."
- "Príliš veľký počet pokusov. Vyžaduje sa heslo."
- "Príliš veľký počet pokusov. Vyžaduje sa vzor."
+ "Príliš veľa pokusov. Vyžaduje sa PIN."
+ "Príliš veľa pokusov. Vyžaduje sa heslo."
+ "Príliš veľa pokusov. Vyžaduje sa vzor.""Odomknúť kódom PIN/odtlačkom""Odomknúť heslom/odtlačkom""Odomknúť vzorom/odtlačkom"
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index 0a6476fcc4389..b0beca68f66a4 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -57,14 +57,14 @@
"PIN తప్పు""PIN తప్పు. రీట్రై చేయండి.""లేదా వేలిముద్రతో అన్లాక్ చేయండి"
- "వేలిముద్ర గుర్తించబడలేదు"
+ "వేలిముద్ర (ఫింగర్-ప్రింట్) మ్యాచ్ కాలేదు""ముఖం గుర్తించబడలేదు""మళ్లీ ట్రై చేయండి లేదా PINని ఎంటర్ చేయండి""మళ్లీ ట్రై చేయండి లేదా పాస్వర్డ్ను ఎంటర్ చేయండి""మళ్లీ ట్రై చేయండి లేదా ఆకృతిని గీయండి""చాలా సార్లు ట్రై చేసిన తర్వాత PIN అవసరం అవుతుంది""చాలా సార్లు ట్రై చేసిన తర్వాత పాస్వర్డ్ అవసరం"
- "చాలా సార్లు ట్రై చేసిన తర్వాత ఆకృతి అవసరం అవుతుంది"
+ "చాలా సార్లు ట్రై చేసిన తర్వాత ఆకృతి (ప్యాటర్న్) అవసరం అవుతుంది""PIN/వేలిముద్రతో తెరవండి""పాస్వర్డ్/వేలిముద్రతో తెరవండి""ఆకృతి/వేలిముద్రతో తెరవండి"
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index 196df2889944b..6b08a3a420cc6 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -63,7 +63,7 @@
"请重试,或输入密码""请重试,或绘制解锁图案""如果出错的尝试次数太多,必须输入 PIN 码才能解锁"
- "如果出错的尝试次数太多,必须输入密码才能解锁"
+ "如果多次尝试失败,必须输入密码才能解锁""如果出错的尝试次数太多,必须绘制图案才能解锁""请使用 PIN 码或指纹解锁""请使用密码或指纹解锁"
--
GitLab
From 5c90f1153b8ac678ecc3a79f0fe87331cb226626 Mon Sep 17 00:00:00 2001
From: Ahmed Fakhry
Date: Wed, 19 Feb 2025 03:40:41 +0000
Subject: [PATCH 072/111] Shell: Make `RecentTasksController.getRecentTasks()`
multi-desks aware
This CL changes `GroupedTaskInfo` and `RecentTasksController.getRecentTasks()`
such that multiple desktops are supported.
A companion Launcher CL is at ag/31825875, and a Car Launcher CL is at
ag/31837924.
Bug: 395911284
Test: m
Flag: com.android.window.flags.enable_multiple_desktops_frontend
Flag: com.android.window.flags.enable_multiple_desktops_backend
Change-Id: Ifc422e4a14f897170adb16572ce172a06c0b5304
---
.../wm/shell/shared/GroupedTaskInfo.java | 62 ++++++---
.../wm/shell/desktopmode/DesktopRepository.kt | 3 +
.../shell/recents/RecentTasksController.java | 128 +++++++++++++++---
.../wm/shell/recents/GroupedTaskInfoTest.kt | 51 +++----
.../recents/RecentTasksControllerTest.java | 8 +-
5 files changed, 187 insertions(+), 65 deletions(-)
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.java
index 0a1e3b9495a05..25b9f8ccc6ae7 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.java
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/GroupedTaskInfo.java
@@ -47,20 +47,26 @@ public class GroupedTaskInfo implements Parcelable {
public static final int TYPE_FULLSCREEN = 1;
public static final int TYPE_SPLIT = 2;
- public static final int TYPE_FREEFORM = 3;
+ public static final int TYPE_DESK = 3;
public static final int TYPE_MIXED = 4;
@IntDef(prefix = {"TYPE_"}, value = {
TYPE_FULLSCREEN,
TYPE_SPLIT,
- TYPE_FREEFORM,
+ TYPE_DESK,
TYPE_MIXED
})
public @interface GroupType {}
+ /**
+ * The ID of the desk that this `GroupedTaskInfo` represents (when the type is `TYPE_DESK`). The
+ * value is -1 if this is not a desk.
+ */
+ private final int mDeskId;
+
/**
* The type of this particular task info, can be one of TYPE_FULLSCREEN, TYPE_SPLIT or
- * TYPE_FREEFORM.
+ * TYPE_DESK.
*/
@GroupType
protected final int mType;
@@ -69,7 +75,7 @@ public class GroupedTaskInfo implements Parcelable {
* The list of tasks associated with this single recent task info.
* TYPE_FULLSCREEN: Contains the stack of tasks associated with a single "task" in overview
* TYPE_SPLIT: Contains the two split roots of each side
- * TYPE_FREEFORM: Contains the set of tasks currently in freeform mode
+ * TYPE_DESK: Contains the set of tasks currently in freeform mode contained in desk.
*/
@Nullable
protected final List mTasks;
@@ -83,7 +89,7 @@ public class GroupedTaskInfo implements Parcelable {
protected final SplitBounds mSplitBounds;
/**
- * Only set for TYPE_FREEFORM.
+ * Only set for TYPE_DESK.
*
* TODO(b/348332802): move isMinimized inside each Task object instead once we have a
* replacement for RecentTaskInfo
@@ -103,8 +109,8 @@ public class GroupedTaskInfo implements Parcelable {
* Create new for a stack of fullscreen tasks
*/
public static GroupedTaskInfo forFullscreenTasks(@NonNull TaskInfo task) {
- return new GroupedTaskInfo(List.of(task), null, TYPE_FULLSCREEN,
- null /* minimizedFreeformTasks */);
+ return new GroupedTaskInfo(/* deskId = */ -1, List.of(task), null, TYPE_FULLSCREEN,
+ /* minimizedFreeformTaskIds = */ null);
}
/**
@@ -112,18 +118,19 @@ public class GroupedTaskInfo implements Parcelable {
*/
public static GroupedTaskInfo forSplitTasks(@NonNull TaskInfo task1,
@NonNull TaskInfo task2, @NonNull SplitBounds splitBounds) {
- return new GroupedTaskInfo(List.of(task1, task2), splitBounds, TYPE_SPLIT,
- null /* minimizedFreeformTasks */);
+ return new GroupedTaskInfo(/* deskId = */ -1, List.of(task1, task2), splitBounds,
+ TYPE_SPLIT, /* minimizedFreeformTaskIds = */ null);
}
/**
- * Create new for a group of freeform tasks
+ * Create new for a group of freeform tasks that belong to a single desk.
*/
- public static GroupedTaskInfo forFreeformTasks(
- @NonNull List tasks,
- @NonNull Set minimizedFreeformTasks) {
- return new GroupedTaskInfo(tasks, null /* splitBounds */, TYPE_FREEFORM,
- minimizedFreeformTasks.stream().mapToInt(i -> i).toArray());
+ public static GroupedTaskInfo forDeskTasks(
+ int deskId,
+ @NonNull List tasks,
+ @NonNull Set minimizedFreeformTaskIds) {
+ return new GroupedTaskInfo(deskId, tasks, /* splitBounds = */ null, TYPE_DESK,
+ minimizedFreeformTaskIds.stream().mapToInt(i -> i).toArray());
}
/**
@@ -141,10 +148,12 @@ public class GroupedTaskInfo implements Parcelable {
}
private GroupedTaskInfo(
+ int deskId,
@NonNull List tasks,
@Nullable SplitBounds splitBounds,
@GroupType int type,
@Nullable int[] minimizedFreeformTaskIds) {
+ mDeskId = deskId;
mTasks = tasks;
mGroupedTasks = null;
mSplitBounds = splitBounds;
@@ -154,6 +163,7 @@ public class GroupedTaskInfo implements Parcelable {
}
private GroupedTaskInfo(@NonNull List groupedTasks) {
+ mDeskId = -1;
mTasks = null;
mGroupedTasks = groupedTasks;
mSplitBounds = null;
@@ -174,6 +184,7 @@ public class GroupedTaskInfo implements Parcelable {
}
protected GroupedTaskInfo(@NonNull Parcel parcel) {
+ mDeskId = parcel.readInt();
mTasks = new ArrayList();
final int numTasks = parcel.readInt();
for (int i = 0; i < numTasks; i++) {
@@ -273,6 +284,16 @@ public class GroupedTaskInfo implements Parcelable {
return mSplitBounds;
}
+ /**
+ * Returns the ID of the desk represented by `this` if the type is `TYPE_DESK`, or -1 otherwise.
+ */
+ public int getDeskId() {
+ if (mType == TYPE_MIXED) {
+ throw new IllegalStateException("No desk ID for a mixed task");
+ }
+ return mDeskId;
+ }
+
/**
* Get type of this recents entry. One of {@link GroupType}.
* Note: This is deprecated, callers should use `isBaseType()` and not make assumptions about
@@ -285,7 +306,7 @@ public class GroupedTaskInfo implements Parcelable {
}
/**
- * Returns the set of minimized task ids, only valid for TYPE_FREEFORM.
+ * Returns the set of minimized task ids, only valid for TYPE_DESK.
*/
@Nullable
public int[] getMinimizedTaskIds() {
@@ -301,7 +322,8 @@ public class GroupedTaskInfo implements Parcelable {
return false;
}
GroupedTaskInfo other = (GroupedTaskInfo) obj;
- return mType == other.mType
+ return mDeskId == other.mDeskId
+ && mType == other.mType
&& Objects.equals(mTasks, other.mTasks)
&& Objects.equals(mGroupedTasks, other.mGroupedTasks)
&& Objects.equals(mSplitBounds, other.mSplitBounds)
@@ -310,7 +332,7 @@ public class GroupedTaskInfo implements Parcelable {
@Override
public int hashCode() {
- return Objects.hash(mType, mTasks, mGroupedTasks, mSplitBounds,
+ return Objects.hash(mDeskId, mType, mTasks, mGroupedTasks, mSplitBounds,
Arrays.hashCode(mMinimizedTaskIds));
}
@@ -322,6 +344,7 @@ public class GroupedTaskInfo implements Parcelable {
.map(GroupedTaskInfo::toString)
.collect(Collectors.joining(",\n\t", "[\n\t", "\n]")));
} else {
+ taskString.append("Desk ID= ").append(mDeskId).append(", ");
taskString.append("Tasks=" + mTasks.stream()
.map(taskInfo -> getTaskInfoDumpString(taskInfo))
.collect(Collectors.joining(", ", "[", "]")));
@@ -353,6 +376,7 @@ public class GroupedTaskInfo implements Parcelable {
@Override
public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeInt(mDeskId);
// We don't use the parcel list methods because we want to only write the TaskInfo state
// and not the subclasses (Recents/RunningTaskInfo) whose fields are all deprecated
final int tasksSize = mTasks != null ? mTasks.size() : 0;
@@ -375,7 +399,7 @@ public class GroupedTaskInfo implements Parcelable {
return switch (type) {
case TYPE_FULLSCREEN -> "FULLSCREEN";
case TYPE_SPLIT -> "SPLIT";
- case TYPE_FREEFORM -> "FREEFORM";
+ case TYPE_DESK -> "DESK";
case TYPE_MIXED -> "MIXED";
default -> "UNKNOWN";
};
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt
index 7c6cf4a8b37f4..926e0f2878699 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt
@@ -217,6 +217,9 @@ class DesktopRepository(
fun getDeskIds(displayId: Int): Set =
desktopData.desksSequence(displayId).map { desk -> desk.deskId }.toSet()
+ /** Returns all the ids of all desks in all displays. */
+ fun getAllDeskIds(): Set = desktopData.desksSequence().map { desk -> desk.deskId }.toSet()
+
/** Returns the id of the default desk in the given display. */
fun getDefaultDeskId(displayId: Int): Int? = getDefaultDesk(displayId)?.deskId
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java
index 2fa09664b73f2..bb5b5cec1b4a1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java
@@ -44,6 +44,7 @@ import android.os.Bundle;
import android.os.RemoteException;
import android.util.Slog;
import android.util.SparseIntArray;
+import android.window.DesktopExperienceFlags;
import android.window.DesktopModeFlags;
import android.window.WindowContainerToken;
@@ -92,6 +93,11 @@ public class RecentTasksController implements TaskStackListenerCallback,
TaskStackTransitionObserver.TaskStackTransitionObserverListener, UserChangeListener {
private static final String TAG = RecentTasksController.class.getSimpleName();
+ // When the multiple desktops feature is disabled, all freeform tasks are lumped together into
+ // a single `GroupedTaskInfo` whose type is `TYPE_DESK`, and its `mDeskId` doesn't matter, so
+ // we pick the below arbitrary value.
+ private static final int INVALID_DESK_ID = -1;
+
private final Context mContext;
private final ShellController mShellController;
private final ShellCommandHandler mShellCommandHandler;
@@ -128,6 +134,7 @@ public class RecentTasksController implements TaskStackListenerCallback,
// Temporary vars used in `generateList()`
private final Map mTmpRemaining = new HashMap<>();
+ private final Map mTmpDesks = new HashMap<>();
/**
* Creates {@link RecentTasksController}, returns {@code null} if the feature is not
@@ -528,6 +535,78 @@ public class RecentTasksController implements TaskStackListenerCallback,
return false;
}
+ /**
+ * Represents a desk whose ID is `mDeskId` and contains the tasks in `mDeskTasks`. Some of these
+ * tasks are minimized and their IDs are contained in the `mMinimizedDeskTasks` set.
+ */
+ private static class Desk {
+ final int mDeskId;
+ boolean mHasVisibleTasks = false;
+ final ArrayList mDeskTasks = new ArrayList<>();
+ final Set mMinimizedDeskTasks = new HashSet<>();
+
+ Desk(int deskId) {
+ mDeskId = deskId;
+ }
+
+ void addTask(TaskInfo taskInfo, boolean isMinimized, boolean isVisible) {
+ mDeskTasks.add(taskInfo);
+ if (isMinimized) {
+ mMinimizedDeskTasks.add(taskInfo.taskId);
+ }
+ mHasVisibleTasks |= isVisible;
+ }
+
+ boolean hasTasks() {
+ return !mDeskTasks.isEmpty();
+ }
+
+ GroupedTaskInfo createDeskTaskInfo() {
+ return GroupedTaskInfo.forDeskTasks(mDeskId, mDeskTasks, mMinimizedDeskTasks);
+ }
+ }
+
+ /**
+ * Clears the `mTmpDesks` map, and re-initializes it with the current state of desks from all
+ * displays, without adding any desk tasks. This is a preparation step so that tasks can be
+ * added to these desks in `generateList()`.
+ *
+ * This is needed since with the `ENABLE_MULTIPLE_DESKTOPS_BACKEND` flag, we want to include
+ * desk even if they're empty (i.e. have no tasks).
+ *
+ * @param multipleDesktopsEnabled whether the multiple desktops backend feature is enabled.
+ */
+ private void initializeDesksMap(boolean multipleDesktopsEnabled) {
+ mTmpDesks.clear();
+
+ if (DesktopModeStatus.canEnterDesktopMode(mContext)
+ && mDesktopUserRepositories.isPresent()) {
+ if (multipleDesktopsEnabled) {
+ for (var deskId : mDesktopUserRepositories.get().getCurrent().getAllDeskIds()) {
+ getOrCreateDesk(deskId);
+ }
+ } else {
+ // When the multiple desks feature is disabled, we lump all freeform windows in a
+ // single `GroupedTaskInfo` regardless of their display. The `deskId` in this case
+ // doesn't matter and can be any arbitrary value.
+ getOrCreateDesk(/* deskId = */ INVALID_DESK_ID);
+ }
+ }
+ }
+
+ /**
+ * Returns the `Desk` whose ID is `deskId` from the `mTmpDesks` map if it exists, or it creates
+ * one and adds it to the map and then returns it.
+ */
+ private Desk getOrCreateDesk(int deskId) {
+ var desk = mTmpDesks.get(deskId);
+ if (desk == null) {
+ desk = new Desk(deskId);
+ mTmpDesks.put(deskId, desk);
+ }
+ return desk;
+ }
+
/**
* Generates a list of GroupedTaskInfos for the given raw list of tasks (either recents or
* running tasks).
@@ -555,6 +634,14 @@ public class RecentTasksController implements TaskStackListenerCallback,
ProtoLog.v(WM_SHELL_TASK_OBSERVER, "RecentTasksController.generateList(%s)", reason);
}
+ final boolean multipleDesktopsEnabled =
+ DesktopExperienceFlags.ENABLE_MULTIPLE_DESKTOPS_BACKEND.isTrue();
+ initializeDesksMap(multipleDesktopsEnabled);
+
+ // When the multiple desktops feature is enabled, we include all desks even if they're
+ // empty.
+ final boolean shouldIncludeEmptyDesktops = multipleDesktopsEnabled;
+
// Make a mapping of task id -> task info for the remaining tasks to be processed, this
// mapping is used to keep track of split tasks that may exist later in the task list that
// should be ignored because they've already been grouped
@@ -566,11 +653,7 @@ public class RecentTasksController implements TaskStackListenerCallback,
ArrayList groupedTasks = new ArrayList<>(tasks.size());
ArrayList visibleGroupedTasks = new ArrayList<>();
- // Phase 1: Extract the desktop and visible fullscreen/split tasks. We make new collections
- // here as the GroupedTaskInfo can store them without copying
- ArrayList desktopTasks = new ArrayList<>();
- Set minimizedDesktopTasks = new HashSet<>();
- boolean desktopTasksVisible = false;
+ // Phase 1: Extract the desktops and visible fullscreen/split tasks.
for (int i = 0; i < tasks.size(); i++) {
final TaskInfo taskInfo = tasks.get(i);
final int taskId = taskInfo.taskId;
@@ -600,11 +683,15 @@ public class RecentTasksController implements TaskStackListenerCallback,
taskInfo.positionInParent = new Point(taskInfo.lastNonFullscreenBounds.left,
taskInfo.lastNonFullscreenBounds.top);
}
- desktopTasks.add(taskInfo);
- if (mDesktopUserRepositories.get().getCurrent().isMinimizedTask(taskId)) {
- minimizedDesktopTasks.add(taskId);
- }
- desktopTasksVisible |= mVisibleTasksMap.containsKey(taskId);
+ // Lump all freeform tasks together as if they were all in a single desk whose ID is
+ // `INVALID_DESK_ID` when the multiple desktops feature is disabled.
+ final int deskId = multipleDesktopsEnabled
+ ? mDesktopUserRepositories.get().getCurrent().getDeskIdForTask(taskId)
+ : INVALID_DESK_ID;
+ final Desk desk = getOrCreateDesk(deskId);
+ desk.addTask(taskInfo,
+ mDesktopUserRepositories.get().getCurrent().isMinimizedTask(taskId),
+ mVisibleTasksMap.containsKey(taskId));
mTmpRemaining.remove(taskId);
continue;
}
@@ -636,9 +723,10 @@ public class RecentTasksController implements TaskStackListenerCallback,
if (enableShellTopTaskTracking()) {
// Phase 2: If there were desktop tasks and they are visible, add them to the visible
// list as well (the actual order doesn't matter for Overview)
- if (!desktopTasks.isEmpty() && desktopTasksVisible) {
- visibleGroupedTasks.add(
- GroupedTaskInfo.forFreeformTasks(desktopTasks, minimizedDesktopTasks));
+ for (var desk : mTmpDesks.values()) {
+ if (desk.mHasVisibleTasks) {
+ visibleGroupedTasks.add(desk.createDeskTaskInfo());
+ }
}
if (!visibleGroupedTasks.isEmpty()) {
@@ -674,16 +762,18 @@ public class RecentTasksController implements TaskStackListenerCallback,
// Phase 5: If there were desktop tasks and they are not visible (ie. weren't added
// above), add them to the end of the final list (the actual order doesn't
// matter for Overview)
- if (!desktopTasks.isEmpty() && !desktopTasksVisible) {
- groupedTasks.add(
- GroupedTaskInfo.forFreeformTasks(desktopTasks, minimizedDesktopTasks));
+ for (var desk : mTmpDesks.values()) {
+ if (!desk.mHasVisibleTasks && (desk.hasTasks() || shouldIncludeEmptyDesktops)) {
+ groupedTasks.add(desk.createDeskTaskInfo());
+ }
}
dumpGroupedTasks(groupedTasks, "Phase 5");
} else {
// Add the desktop tasks at the end of the list
- if (!desktopTasks.isEmpty()) {
- groupedTasks.add(
- GroupedTaskInfo.forFreeformTasks(desktopTasks, minimizedDesktopTasks));
+ for (var desk : mTmpDesks.values()) {
+ if (desk.hasTasks() || shouldIncludeEmptyDesktops) {
+ groupedTasks.add(desk.createDeskTaskInfo());
+ }
}
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedTaskInfoTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedTaskInfoTest.kt
index 32096645aea77..6ecebd76a9510 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedTaskInfoTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/GroupedTaskInfoTest.kt
@@ -26,7 +26,7 @@ import android.window.WindowContainerToken
import androidx.test.filters.SmallTest
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.shared.GroupedTaskInfo
-import com.android.wm.shell.shared.GroupedTaskInfo.TYPE_FREEFORM
+import com.android.wm.shell.shared.GroupedTaskInfo.TYPE_DESK
import com.android.wm.shell.shared.GroupedTaskInfo.TYPE_FULLSCREEN
import com.android.wm.shell.shared.GroupedTaskInfo.TYPE_SPLIT
import com.android.wm.shell.shared.split.SplitBounds
@@ -87,14 +87,14 @@ class GroupedTaskInfoTest : ShellTestCase() {
}
@Test
- fun testFreeformTasks_hasCorrectType() {
- assertThat(freeformTasksGroupInfo(freeformTaskIds = arrayOf(1)).isBaseType(TYPE_FREEFORM))
+ fun testDeskTasks_hasCorrectType() {
+ assertThat(deskTasksGroupInfo(deskId = 0, freeformTaskIds = arrayOf(1)).isBaseType(TYPE_DESK))
.isTrue()
}
@Test
- fun testCreateFreeformTasks_hasCorrectNumberOfTasks() {
- val list = freeformTasksGroupInfo(freeformTaskIds = arrayOf(1, 2, 3)).taskInfoList
+ fun testCreateDeskTasks_hasCorrectNumberOfTasks() {
+ val list = deskTasksGroupInfo(deskId = 0, freeformTaskIds = arrayOf(1, 2, 3)).taskInfoList
assertThat(list).hasSize(3)
assertThat(list[0].taskId).isEqualTo(1)
assertThat(list[1].taskId).isEqualTo(2)
@@ -102,9 +102,9 @@ class GroupedTaskInfoTest : ShellTestCase() {
}
@Test
- fun testCreateFreeformTasks_nonExistentMinimizedTaskId_throwsException() {
+ fun testCreateDeskTasks_nonExistentMinimizedTaskId_throwsException() {
assertThrows(IllegalArgumentException::class.java) {
- freeformTasksGroupInfo(
+ deskTasksGroupInfo(deskId = 0,
freeformTaskIds = arrayOf(1, 2, 3),
minimizedTaskIds = arrayOf(1, 4)
)
@@ -122,8 +122,8 @@ class GroupedTaskInfoTest : ShellTestCase() {
}
@Test
- fun testMixedWithFreeformBase_hasCorrectType() {
- assertThat(mixedTaskGroupInfoWithFreeformBase().isBaseType(TYPE_FREEFORM)).isTrue()
+ fun testMixedWithDeskBase_hasCorrectType() {
+ assertThat(mixedTaskGroupInfoWithDeskBase().isBaseType(TYPE_DESK)).isTrue()
}
@Test
@@ -190,15 +190,16 @@ class GroupedTaskInfoTest : ShellTestCase() {
}
@Test
- fun testParcelling_freeformTasks() {
- val taskInfo = freeformTasksGroupInfo(freeformTaskIds = arrayOf(1, 2, 3))
+ fun testParcelling_DeskTasks() {
+ val taskInfo = deskTasksGroupInfo(deskId = 50, freeformTaskIds = arrayOf(1, 2, 3))
val parcel = Parcel.obtain()
taskInfo.writeToParcel(parcel, 0)
parcel.setDataPosition(0)
// Read the object back from the parcel
val taskInfoFromParcel: GroupedTaskInfo =
GroupedTaskInfo.CREATOR.createFromParcel(parcel)
- assertThat(taskInfoFromParcel.isBaseType(TYPE_FREEFORM)).isTrue()
+ assertThat(taskInfoFromParcel.deskId).isEqualTo(taskInfo.deskId)
+ assertThat(taskInfoFromParcel.isBaseType(TYPE_DESK)).isTrue()
assertThat(taskInfoFromParcel.taskInfoList).hasSize(3)
// Only compare task ids
val taskIdComparator = Correspondence.transforming(
@@ -209,8 +210,8 @@ class GroupedTaskInfoTest : ShellTestCase() {
}
@Test
- fun testParcelling_freeformTasks_minimizedTasks() {
- val taskInfo = freeformTasksGroupInfo(
+ fun testParcelling_DeskTasks_minimizedTasks() {
+ val taskInfo = deskTasksGroupInfo(deskId = 0,
freeformTaskIds = arrayOf(1, 2, 3), minimizedTaskIds = arrayOf(2))
val parcel = Parcel.obtain()
@@ -220,14 +221,14 @@ class GroupedTaskInfoTest : ShellTestCase() {
// Read the object back from the parcel
val taskInfoFromParcel: GroupedTaskInfo =
GroupedTaskInfo.CREATOR.createFromParcel(parcel)
- assertThat(taskInfoFromParcel.isBaseType(TYPE_FREEFORM)).isTrue()
+ assertThat(taskInfoFromParcel.isBaseType(TYPE_DESK)).isTrue()
assertThat(taskInfoFromParcel.minimizedTaskIds).isEqualTo(arrayOf(2).toIntArray())
}
@Test
fun testParcelling_mixedTasks() {
val taskInfo = GroupedTaskInfo.forMixed(listOf(
- freeformTasksGroupInfo(freeformTaskIds = arrayOf(4, 5, 6),
+ deskTasksGroupInfo(deskId = 0, freeformTaskIds = arrayOf(4, 5, 6),
minimizedTaskIds = arrayOf(5)),
splitTasksGroupInfo(firstId = 2, secondId = 3),
singleTaskGroupInfo(id = 1)))
@@ -239,7 +240,7 @@ class GroupedTaskInfoTest : ShellTestCase() {
// Read the object back from the parcel
val taskInfoFromParcel: GroupedTaskInfo =
GroupedTaskInfo.CREATOR.createFromParcel(parcel)
- assertThat(taskInfoFromParcel.isBaseType(TYPE_FREEFORM)).isTrue()
+ assertThat(taskInfoFromParcel.isBaseType(TYPE_DESK)).isTrue()
assertThat(taskInfoFromParcel.baseGroupedTask.minimizedTaskIds).isEqualTo(
arrayOf(5).toIntArray())
for (i in 1..6) {
@@ -275,12 +276,14 @@ class GroupedTaskInfoTest : ShellTestCase() {
}
@Test
- fun testTaskProperties_freeformTasks() {
+ fun testTaskProperties_DeskTasks() {
val task1 = createTaskInfo(id = 1)
val task2 = createTaskInfo(id = 2)
- val taskInfo = GroupedTaskInfo.forFreeformTasks(listOf(task1, task2), setOf())
+ val taskInfo = GroupedTaskInfo.forDeskTasks(
+ /* deskId = */ 500, listOf(task1, task2), setOf())
+ assertThat(taskInfo.deskId).isEqualTo(500)
assertThat(taskInfo.getTaskById(1)).isEqualTo(task1)
assertThat(taskInfo.getTaskById(2)).isEqualTo(task2)
assertThat(taskInfo.containsTask(1)).isTrue()
@@ -325,11 +328,13 @@ class GroupedTaskInfoTest : ShellTestCase() {
return GroupedTaskInfo.forSplitTasks(task1, task2, splitBounds)
}
- private fun freeformTasksGroupInfo(
+ private fun deskTasksGroupInfo(
+ deskId: Int,
freeformTaskIds: Array,
minimizedTaskIds: Array = emptyArray()
): GroupedTaskInfo {
- return GroupedTaskInfo.forFreeformTasks(
+ return GroupedTaskInfo.forDeskTasks(
+ deskId,
freeformTaskIds.map { createTaskInfo(it) }.toList(),
minimizedTaskIds.toSet())
}
@@ -346,9 +351,9 @@ class GroupedTaskInfoTest : ShellTestCase() {
singleTaskGroupInfo(id = 1)))
}
- private fun mixedTaskGroupInfoWithFreeformBase(): GroupedTaskInfo {
+ private fun mixedTaskGroupInfoWithDeskBase(): GroupedTaskInfo {
return GroupedTaskInfo.forMixed(listOf(
- freeformTasksGroupInfo(freeformTaskIds = arrayOf(2, 3, 4)),
+ deskTasksGroupInfo(deskId = 0, freeformTaskIds = arrayOf(2, 3, 4)),
singleTaskGroupInfo(id = 1)))
}
}
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java
index a546b3ea7d8f1..bf65caec88c78 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/RecentTasksControllerTest.java
@@ -24,7 +24,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE;
-import static com.android.wm.shell.shared.GroupedTaskInfo.TYPE_FREEFORM;
+import static com.android.wm.shell.shared.GroupedTaskInfo.TYPE_DESK;
import static com.android.wm.shell.shared.GroupedTaskInfo.TYPE_FULLSCREEN;
import static com.android.wm.shell.shared.GroupedTaskInfo.TYPE_SPLIT;
import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50;
@@ -349,7 +349,7 @@ public class RecentTasksControllerTest extends ShellTestCase {
GroupedTaskInfo freeformGroup = recentTasks.get(2);
// Check that groups have expected types
- assertTrue(freeformGroup.isBaseType(TYPE_FREEFORM));
+ assertTrue(freeformGroup.isBaseType(TYPE_DESK));
assertTrue(singleGroup1.isBaseType(TYPE_FULLSCREEN));
assertTrue(singleGroup2.isBaseType(TYPE_FULLSCREEN));
@@ -389,7 +389,7 @@ public class RecentTasksControllerTest extends ShellTestCase {
// Check that groups have expected types
assertTrue(splitGroup.isBaseType(TYPE_SPLIT));
- assertTrue(freeformGroup.isBaseType(TYPE_FREEFORM));
+ assertTrue(freeformGroup.isBaseType(TYPE_DESK));
assertTrue(singleGroup.isBaseType(TYPE_FULLSCREEN));
// Check freeform group entries
@@ -460,7 +460,7 @@ public class RecentTasksControllerTest extends ShellTestCase {
GroupedTaskInfo freeformGroup = recentTasks.get(2);
// Check that groups have expected types
- assertTrue(freeformGroup.isBaseType(TYPE_FREEFORM));
+ assertTrue(freeformGroup.isBaseType(TYPE_DESK));
assertTrue(singleGroup1.isBaseType(TYPE_FULLSCREEN));
assertTrue(singleGroup2.isBaseType(TYPE_FULLSCREEN));
--
GitLab
From 48bf7540a3261a4f862667fae9499c58429889a3 Mon Sep 17 00:00:00 2001
From: Harshit Mahajan
Date: Thu, 20 Feb 2025 10:59:07 -0800
Subject: [PATCH 073/111] Add module controller for mts crashrecovery tests
Bug: 397182559
Change-Id: Ia235e10f0af28eb509e669d6e5f9247bff5e3944
Test: TH
Flag: EXEMPT not possible
---
.../server/crashrecovery/AndroidTest.xml | 5 +++
.../android/server/rollback/AndroidTest.xml | 5 +++
tests/PackageWatchdog/Android.bp | 1 +
tests/PackageWatchdog/AndroidManifest.xml | 6 ++--
tests/PackageWatchdog/AndroidTest.xml | 36 +++++++++++++++++++
5 files changed, 50 insertions(+), 3 deletions(-)
create mode 100644 tests/PackageWatchdog/AndroidTest.xml
diff --git a/services/tests/mockingservicestests/src/com/android/server/crashrecovery/AndroidTest.xml b/services/tests/mockingservicestests/src/com/android/server/crashrecovery/AndroidTest.xml
index 7b06ebec654df..5043c47b05e8e 100644
--- a/services/tests/mockingservicestests/src/com/android/server/crashrecovery/AndroidTest.xml
+++ b/services/tests/mockingservicestests/src/com/android/server/crashrecovery/AndroidTest.xml
@@ -31,4 +31,9 @@
+
+
+
diff --git a/services/tests/mockingservicestests/src/com/android/server/rollback/AndroidTest.xml b/services/tests/mockingservicestests/src/com/android/server/rollback/AndroidTest.xml
index 635183c553bfe..6f6b017b9b1e7 100644
--- a/services/tests/mockingservicestests/src/com/android/server/rollback/AndroidTest.xml
+++ b/services/tests/mockingservicestests/src/com/android/server/rollback/AndroidTest.xml
@@ -31,4 +31,9 @@
+
+
+
diff --git a/tests/PackageWatchdog/Android.bp b/tests/PackageWatchdog/Android.bp
index 44e545bac0cef..16c6e3baf0512 100644
--- a/tests/PackageWatchdog/Android.bp
+++ b/tests/PackageWatchdog/Android.bp
@@ -28,6 +28,7 @@ android_test {
static_libs: [
"PlatformProperties",
"androidx.test.rules",
+ "androidx.test.runner",
"flag-junit",
"frameworks-base-testutils",
"junit",
diff --git a/tests/PackageWatchdog/AndroidManifest.xml b/tests/PackageWatchdog/AndroidManifest.xml
index 540edb41f66f1..334d50fe6d100 100644
--- a/tests/PackageWatchdog/AndroidManifest.xml
+++ b/tests/PackageWatchdog/AndroidManifest.xml
@@ -15,7 +15,7 @@
-->
+ package="com.android.server" >
@@ -23,6 +23,6 @@
+ android:targetPackage="com.android.server"
+ android:label="PackageWatchdog Test"/>
diff --git a/tests/PackageWatchdog/AndroidTest.xml b/tests/PackageWatchdog/AndroidTest.xml
new file mode 100644
index 0000000000000..45a88cdf5abea
--- /dev/null
+++ b/tests/PackageWatchdog/AndroidTest.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--
GitLab
From eff5e9a1dfd847f0e68c6ca0ed5539294b988988 Mon Sep 17 00:00:00 2001
From: Shawn Lee
Date: Fri, 31 Jan 2025 18:05:29 -0800
Subject: [PATCH 074/111] [Flexiglass] Convert Bouncer scene into an overlay
Tasklist:
- All references to Scenes.Bouncer translated to use Overlays.Bouncer
- KTF virtual edges now take ContentKeys
- SceneContainerStartable hides Bouncer overlay after unlock status changes
- NotificationScrollViewModel sets NSSL expansion fraction to 0 when on Notification scene with Bouncer overlay
- Added to ObservableTransitionState API to permit checking if we are idle on an overlay
Bug: 390503464
Test: existing tests updated
Flag: com.android.systemui.scene_container
Change-Id: I44c2b84ea9cb3b5af338abcb4f8533ebbf58c043
---
...SceneModule.kt => BouncerOverlayModule.kt} | 11 +-
.../bouncer/ui/composable/BouncerContent.kt | 42 +--
.../{BouncerScene.kt => BouncerOverlay.kt} | 32 +--
...SceneLayout.kt => BouncerOverlayLayout.kt} | 30 +--
.../composable/NotificationLockscreenScrim.kt | 5 +-
.../qs/ui/composable/QuickSettings.kt | 3 +-
.../SceneContainerInterruptionHandler.kt | 8 +-
.../composable/SceneContainerTransitions.kt | 29 ++-
.../FromBouncerToGoneTransition.kt | 4 +-
.../scene/ObservableTransitionState.kt | 61 ++++-
.../animation/scene/SceneTransitionLayout.kt | 18 +-
...KeyguardSecurityContainerControllerTest.kt | 86 ++++---
.../BouncerActionButtonInteractorTest.kt | 4 +-
...outTest.kt => BouncerOverlayLayoutTest.kt} | 18 +-
.../composable/BouncerPredictiveBackTest.kt | 38 ++-
... => BouncerOverlayContentViewModelTest.kt} | 6 +-
.../BouncerUserActionsViewModelTest.kt | 7 +-
.../viewmodel/PasswordBouncerViewModelTest.kt | 42 +--
.../viewmodel/PatternBouncerViewModelTest.kt | 34 +--
.../ui/viewmodel/PinBouncerViewModelTest.kt | 40 +--
.../CommunalUserActionsViewModelTest.kt | 9 +-
.../DeviceEntryFaceAuthRepositoryTest.kt | 83 +++---
.../DeviceEntryFaceAuthInteractorTest.kt | 8 +-
.../interactor/DeviceEntryInteractorTest.kt | 24 +-
.../DeviceEntrySourceInteractorTest.kt | 35 ++-
.../dreams/DreamOverlayServiceTest.kt | 5 +-
.../DreamUserActionsViewModelTest.kt | 9 +-
...DeviceEntrySideFpsOverlayInteractorTest.kt | 21 +-
.../KeyguardDismissActionInteractorTest.kt | 11 +-
.../KeyguardTransitionInteractorTest.kt | 43 +++-
...nagerLockscreenVisibilityInteractorTest.kt | 52 ++--
...LockscreenSceneTransitionInteractorTest.kt | 16 +-
...ToPrimaryBouncerTransitionViewModelTest.kt | 14 +-
.../LockscreenUserActionsViewModelTest.kt | 41 +--
...cationsShadeOverlayContentViewModelTest.kt | 14 -
...ettingsShadeOverlayContentViewModelTest.kt | 14 -
.../scene/SceneFrameworkIntegrationTest.kt | 240 ++++++++++++------
.../interactor/SceneBackInteractorTest.kt | 35 +--
.../startable/SceneContainerStartableTest.kt | 187 ++++++++------
.../domain/startable/ScrimStartableTest.kt | 101 +++-----
.../startable/StatusBarStartableTest.kt | 21 +-
.../model/SceneDataSourceDelegatorTest.kt | 14 +-
.../scene/ui/view/SceneJankMonitorTest.kt | 13 +-
.../SceneContainerHapticsViewModelTest.kt | 4 +-
.../PanelExpansionInteractorImplTest.kt | 4 +-
.../NotificationShadeWindowModelTest.kt | 13 +-
.../StatusBarStateControllerImplTest.kt | 12 +-
...haredNotificationContainerViewModelTest.kt | 5 +-
.../KeyguardBypassInteractorTest.kt | 8 +-
.../HomeStatusBarViewModelImplTest.kt | 8 +-
.../KeyguardStatusBarViewModelTest.kt | 3 +-
.../keyguard/KeyguardUpdateMonitor.java | 6 +-
.../domain/interactor/BouncerInteractor.kt | 4 +-
.../bouncer/ui/binder/BouncerViewBinder.kt | 4 +-
.../ui/binder/ComposeBouncerViewBinder.kt | 6 +-
.../bouncer/ui/composable/BouncerContainer.kt | 4 +-
...l.kt => BouncerOverlayContentViewModel.kt} | 6 +-
.../viewmodel/BouncerUserActionsViewModel.kt | 23 +-
.../ui/viewmodel/CommunalEditModeViewModel.kt | 2 +-
.../viewmodel/CommunalUserActionsViewModel.kt | 9 +-
.../ui/viewmodel/CommunalViewModel.kt | 4 +-
.../DeviceEntryFaceAuthRepository.kt | 66 ++---
.../interactor/DeviceEntryInteractor.kt | 5 +-
.../interactor/DeviceEntrySourceInteractor.kt | 26 +-
.../SystemUIDeviceEntryFaceAuthInteractor.kt | 3 +-
.../DreamOverlayContainerViewController.java | 4 +-
.../systemui/dreams/DreamOverlayService.java | 15 +-
.../ui/viewmodel/DreamUserActionsViewModel.kt | 9 +-
.../systemui/keyguard/ResourceTrimmer.kt | 4 +-
.../DeviceEntrySideFpsOverlayInteractor.kt | 11 +-
.../interactor/KeyguardBypassInteractor.kt | 5 +-
.../KeyguardDismissActionInteractor.kt | 2 +-
.../domain/interactor/KeyguardInteractor.kt | 2 +-
.../interactor/KeyguardOcclusionInteractor.kt | 2 +-
.../KeyguardSurfaceBehindInteractor.kt | 21 +-
.../KeyguardTransitionInteractor.kt | 60 +++--
...owManagerLockscreenVisibilityInteractor.kt | 37 +--
.../systemui/keyguard/shared/model/Edge.kt | 25 +-
.../keyguard/shared/model/KeyguardState.kt | 7 +-
...ncerToPrimaryBouncerTransitionViewModel.kt | 4 +-
.../AodToPrimaryBouncerTransitionViewModel.kt | 4 +-
...zingToPrimaryBouncerTransitionViewModel.kt | 4 +-
.../ui/viewmodel/KeyguardRootViewModel.kt | 7 +-
...reenToPrimaryBouncerTransitionViewModel.kt | 4 +-
.../LockscreenUserActionsViewModel.kt | 7 +-
.../PrimaryBouncerToAodTransitionViewModel.kt | 4 +-
...imaryBouncerToDozingTransitionViewModel.kt | 4 +-
...yBouncerToLockscreenTransitionViewModel.kt | 4 +-
.../ui/controller/MediaCarouselController.kt | 2 +-
.../systemui/model/SceneContainerPlugin.kt | 2 +-
...tificationsShadeOverlayContentViewModel.kt | 13 -
.../viewmodel/QSFragmentComposeViewModel.kt | 4 +-
...ickSettingsShadeOverlayContentViewModel.kt | 13 -
.../scene/SceneContainerFrameworkModule.kt | 10 +-
.../ShadelessSceneContainerFrameworkModule.kt | 10 +-
.../SceneContainerOcclusionInteractor.kt | 2 +-
.../domain/interactor/SceneInteractor.kt | 52 +++-
.../WindowRootViewVisibilityInteractor.kt | 2 +-
.../startable/SceneContainerStartable.kt | 123 +++++----
.../scene/domain/startable/ScrimStartable.kt | 14 +-
.../domain/startable/StatusBarStartable.kt | 9 +-
.../systemui/scene/shared/model/Overlays.kt | 6 +
.../systemui/scene/shared/model/Scenes.kt | 6 -
.../scene/ui/view/SceneJankMonitor.kt | 6 +-
.../ui/viewmodel/SceneContainerViewModel.kt | 2 +-
.../viewmodel/NotificationShadeWindowModel.kt | 3 +-
.../StatusBarStateControllerImpl.java | 8 +-
.../StatusBarKeyguardViewManagerInteractor.kt | 9 +-
.../viewmodel/NotificationScrollViewModel.kt | 2 +-
.../SharedNotificationContainerViewModel.kt | 7 +-
.../phone/StatusBarKeyguardViewManager.java | 24 +-
.../viewmodel/KeyguardStatusBarViewModel.kt | 1 +
.../keyguard/KeyguardUpdateMonitorTest.java | 6 +-
.../ui/composable/BouncerContentTest.kt | 6 +-
.../NotificationGutsManagerWithScenesTest.kt | 2 +-
.../StatusBarKeyguardViewManagerTest.java | 4 +-
.../ui/viewmodel/BouncerViewModelKosmos.kt | 16 +-
.../com/android/systemui/scene/SceneKosmos.kt | 4 +-
.../SceneContainerRepositoryUtil.kt | 66 ++++-
.../scene/shared/model/FakeSceneDataSource.kt | 13 +-
120 files changed, 1383 insertions(+), 1063 deletions(-)
rename packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/{BouncerSceneModule.kt => BouncerOverlayModule.kt} (71%)
rename packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/{BouncerScene.kt => BouncerOverlay.kt} (78%)
rename packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/{BouncerSceneLayout.kt => BouncerOverlayLayout.kt} (74%)
rename packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/composable/{BouncerSceneLayoutTest.kt => BouncerOverlayLayoutTest.kt} (93%)
rename packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/{BouncerSceneContentViewModelTest.kt => BouncerOverlayContentViewModelTest.kt} (98%)
rename packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/{BouncerSceneContentViewModel.kt => BouncerOverlayContentViewModel.kt} (99%)
diff --git a/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/BouncerSceneModule.kt b/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/BouncerOverlayModule.kt
similarity index 71%
rename from packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/BouncerSceneModule.kt
rename to packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/BouncerOverlayModule.kt
index 5b368df9d0ef4..4269424393916 100644
--- a/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/BouncerSceneModule.kt
+++ b/packages/SystemUI/compose/facade/enabled/src/com/android/systemui/scene/BouncerOverlayModule.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2023 The Android Open Source Project
+ * Copyright (C) 2025 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,14 +16,13 @@
package com.android.systemui.scene
-import com.android.systemui.bouncer.ui.composable.BouncerScene
-import com.android.systemui.scene.ui.composable.Scene
+import com.android.systemui.bouncer.ui.composable.BouncerOverlay
+import com.android.systemui.scene.ui.composable.Overlay
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoSet
@Module
-interface BouncerSceneModule {
-
- @Binds @IntoSet fun bouncerScene(scene: BouncerScene): Scene
+interface BouncerOverlayModule {
+ @Binds @IntoSet fun bouncer(overlay: BouncerOverlay): Overlay
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt
index 456edaf1012ec..48e52d6c5fb2a 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt
@@ -98,7 +98,7 @@ import com.android.systemui.bouncer.shared.model.BouncerActionButtonModel
import com.android.systemui.bouncer.ui.BouncerDialogFactory
import com.android.systemui.bouncer.ui.viewmodel.AuthMethodBouncerViewModel
import com.android.systemui.bouncer.ui.viewmodel.BouncerMessageViewModel
-import com.android.systemui.bouncer.ui.viewmodel.BouncerSceneContentViewModel
+import com.android.systemui.bouncer.ui.viewmodel.BouncerOverlayContentViewModel
import com.android.systemui.bouncer.ui.viewmodel.MessageViewModel
import com.android.systemui.bouncer.ui.viewmodel.PasswordBouncerViewModel
import com.android.systemui.bouncer.ui.viewmodel.PatternBouncerViewModel
@@ -118,7 +118,7 @@ import platform.test.motion.compose.values.motionTestValues
@Composable
fun BouncerContent(
- viewModel: BouncerSceneContentViewModel,
+ viewModel: BouncerOverlayContentViewModel,
dialogFactory: BouncerDialogFactory,
modifier: Modifier = Modifier,
) {
@@ -131,8 +131,8 @@ fun BouncerContent(
@Composable
@VisibleForTesting
fun BouncerContent(
- layout: BouncerSceneLayout,
- viewModel: BouncerSceneContentViewModel,
+ layout: BouncerOverlayLayout,
+ viewModel: BouncerOverlayContentViewModel,
dialogFactory: BouncerDialogFactory,
modifier: Modifier,
) {
@@ -147,11 +147,12 @@ fun BouncerContent(
modifier = modifier.imePadding().onKeyEvent(viewModel::onKeyEvent).scale(scale)
) {
when (layout) {
- BouncerSceneLayout.STANDARD_BOUNCER -> StandardLayout(viewModel = viewModel)
- BouncerSceneLayout.BESIDE_USER_SWITCHER ->
+ BouncerOverlayLayout.STANDARD_BOUNCER -> StandardLayout(viewModel = viewModel)
+ BouncerOverlayLayout.BESIDE_USER_SWITCHER ->
BesideUserSwitcherLayout(viewModel = viewModel)
- BouncerSceneLayout.BELOW_USER_SWITCHER -> BelowUserSwitcherLayout(viewModel = viewModel)
- BouncerSceneLayout.SPLIT_BOUNCER -> SplitLayout(viewModel = viewModel)
+ BouncerOverlayLayout.BELOW_USER_SWITCHER ->
+ BelowUserSwitcherLayout(viewModel = viewModel)
+ BouncerOverlayLayout.SPLIT_BOUNCER -> SplitLayout(viewModel = viewModel)
}
Dialog(bouncerViewModel = viewModel, dialogFactory = dialogFactory)
@@ -163,7 +164,10 @@ fun BouncerContent(
* authentication attempt, including all messaging UI (directives, reasoning, errors, etc.).
*/
@Composable
-private fun StandardLayout(viewModel: BouncerSceneContentViewModel, modifier: Modifier = Modifier) {
+private fun StandardLayout(
+ viewModel: BouncerOverlayContentViewModel,
+ modifier: Modifier = Modifier,
+) {
val isHeightExpanded =
LocalWindowSizeClass.current.heightSizeClass == WindowHeightSizeClass.Expanded
@@ -208,7 +212,7 @@ private fun StandardLayout(viewModel: BouncerSceneContentViewModel, modifier: Mo
* by double-tapping on the side.
*/
@Composable
-private fun SplitLayout(viewModel: BouncerSceneContentViewModel, modifier: Modifier = Modifier) {
+private fun SplitLayout(viewModel: BouncerOverlayContentViewModel, modifier: Modifier = Modifier) {
val authMethod by viewModel.authMethodViewModel.collectAsStateWithLifecycle()
Row(
@@ -297,7 +301,7 @@ private fun SplitLayout(viewModel: BouncerSceneContentViewModel, modifier: Modif
*/
@Composable
private fun BesideUserSwitcherLayout(
- viewModel: BouncerSceneContentViewModel,
+ viewModel: BouncerOverlayContentViewModel,
modifier: Modifier = Modifier,
) {
val isLeftToRight = LocalLayoutDirection.current == LayoutDirection.Ltr
@@ -452,7 +456,7 @@ private fun BesideUserSwitcherLayout(
/** Arranges the bouncer contents and user switcher contents one on top of the other, vertically. */
@Composable
private fun BelowUserSwitcherLayout(
- viewModel: BouncerSceneContentViewModel,
+ viewModel: BouncerOverlayContentViewModel,
modifier: Modifier = Modifier,
) {
Column(modifier = modifier.padding(vertical = 128.dp)) {
@@ -483,7 +487,7 @@ private fun BelowUserSwitcherLayout(
@Composable
private fun FoldAware(
- viewModel: BouncerSceneContentViewModel,
+ viewModel: BouncerOverlayContentViewModel,
aboveFold: @Composable BoxScope.() -> Unit,
belowFold: @Composable BoxScope.() -> Unit,
modifier: Modifier = Modifier,
@@ -606,7 +610,7 @@ private fun StatusMessage(viewModel: BouncerMessageViewModel, modifier: Modifier
* For example, this can be the PIN shapes or password text field.
*/
@Composable
-private fun OutputArea(viewModel: BouncerSceneContentViewModel, modifier: Modifier = Modifier) {
+private fun OutputArea(viewModel: BouncerOverlayContentViewModel, modifier: Modifier = Modifier) {
val authMethodViewModel: AuthMethodBouncerViewModel? by
viewModel.authMethodViewModel.collectAsStateWithLifecycle()
when (val nonNullViewModel = authMethodViewModel) {
@@ -631,7 +635,7 @@ private fun OutputArea(viewModel: BouncerSceneContentViewModel, modifier: Modifi
*/
@Composable
private fun InputArea(
- viewModel: BouncerSceneContentViewModel,
+ viewModel: BouncerOverlayContentViewModel,
pinButtonRowVerticalSpacing: Dp,
centerPatternDotsVertically: Boolean,
modifier: Modifier = Modifier,
@@ -659,7 +663,7 @@ private fun InputArea(
}
@Composable
-private fun ActionArea(viewModel: BouncerSceneContentViewModel, modifier: Modifier = Modifier) {
+private fun ActionArea(viewModel: BouncerOverlayContentViewModel, modifier: Modifier = Modifier) {
val actionButton: BouncerActionButtonModel? by
viewModel.actionButton.collectAsStateWithLifecycle()
val appearFadeInAnimatable = remember { Animatable(0f) }
@@ -723,7 +727,7 @@ private fun ActionArea(viewModel: BouncerSceneContentViewModel, modifier: Modifi
@Composable
private fun Dialog(
- bouncerViewModel: BouncerSceneContentViewModel,
+ bouncerViewModel: BouncerOverlayContentViewModel,
dialogFactory: BouncerDialogFactory,
) {
val dialogViewModel by bouncerViewModel.dialogViewModel.collectAsStateWithLifecycle()
@@ -751,7 +755,7 @@ private fun Dialog(
/** Renders the UI of the user switcher that's displayed on large screens next to the bouncer UI. */
@Composable
-private fun UserSwitcher(viewModel: BouncerSceneContentViewModel, modifier: Modifier = Modifier) {
+private fun UserSwitcher(viewModel: BouncerOverlayContentViewModel, modifier: Modifier = Modifier) {
val isUserSwitcherVisible by viewModel.isUserSwitcherVisible.collectAsStateWithLifecycle()
if (!isUserSwitcherVisible) {
// Take up the same space as the user switcher normally would, but with nothing inside it.
@@ -829,7 +833,7 @@ private fun UserSwitcher(viewModel: BouncerSceneContentViewModel, modifier: Modi
@Composable
private fun UserSwitcherDropdownMenu(
isExpanded: Boolean,
- items: List,
+ items: List,
onDismissed: () -> Unit,
) {
val context = LocalContext.current
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerOverlay.kt
similarity index 78%
rename from packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt
rename to packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerOverlay.kt
index fad8ae7e3ba2b..48dee240a1df3 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerOverlay.kt
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2025 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.
@@ -29,19 +29,19 @@ import com.android.compose.animation.scene.ElementKey
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserActionResult
import com.android.systemui.bouncer.ui.BouncerDialogFactory
-import com.android.systemui.bouncer.ui.viewmodel.BouncerSceneContentViewModel
+import com.android.systemui.bouncer.ui.viewmodel.BouncerOverlayContentViewModel
import com.android.systemui.bouncer.ui.viewmodel.BouncerUserActionsViewModel
import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.rememberViewModel
-import com.android.systemui.scene.shared.model.Scenes
-import com.android.systemui.scene.ui.composable.Scene
+import com.android.systemui.scene.shared.model.Overlays
+import com.android.systemui.scene.ui.composable.Overlay
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
object Bouncer {
object Elements {
+ val Root = ElementKey("BouncerRoot")
val Background = ElementKey("BouncerBackground")
val Content = ElementKey("BouncerContent")
}
@@ -51,16 +51,16 @@ object Bouncer {
}
}
-/** The bouncer scene displays authentication challenges like PIN, password, or pattern. */
+/** The bouncer overlay displays authentication challenges like PIN, password, or pattern. */
@SysUISingleton
-class BouncerScene
+class BouncerOverlay
@Inject
constructor(
private val actionsViewModelFactory: BouncerUserActionsViewModel.Factory,
- private val contentViewModelFactory: BouncerSceneContentViewModel.Factory,
+ private val contentViewModelFactory: BouncerOverlayContentViewModel.Factory,
private val dialogFactory: BouncerDialogFactory,
-) : ExclusiveActivatable(), Scene {
- override val key = Scenes.Bouncer
+) : Overlay {
+ override val key = Overlays.Bouncer
private val actionsViewModel: BouncerUserActionsViewModel by lazy {
actionsViewModelFactory.create()
@@ -68,22 +68,22 @@ constructor(
override val userActions: Flow
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index e627b794d9a54..91e8889acfa57 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -113,33 +113,23 @@
"გარემოცვის განახლება ვერ მოხერხდა""აქტიური (მხოლოდ მედია). %1$s%% ბატარეა.""აქტიური (მხოლოდ მედია), მარცხენა: %1$s, მარჯვენა:%2$s ბატარეა."
-
-
-
-
-
-
-
-
+ "სტუმარი მოწყობილობა. %1$s ბატარეა."
+ "სტუმარი მოწყობილობა. მარცხენა: %1$s, მარჯვენა: %2$s ბატარეა."
+ "სტუმარი მოწყობილობა (მხოლოდ მედია). %1$s ბატარეა."
+ "სტუმარი მოწყობილობა (მხოლოდ მედია). მარცხენა: %1$s, მარჯვენა: %2$s ბატარეა.""დაკავშირებული (აუდიოს გაზიარება მხარდაჭერილია). ბატარეა %1$s.""დაკავშირებული (აუდიოს გაზიარება მხარდაჭერილია). მარცხენა: ბატარეა %1$s, მარჯვენა: ბატარეა %2$s""დაკავშირებული (აუდიოს გაზიარება მხარდაჭერილია). მარცხენა: %1$s ბატარეა.""დაკავშირებული (აუდიოს გაზიარება მხარდაჭერილია). მარჯვენა: %1$s ბატარეა.""დაკავშირებული (აუდიოს გაზიარება მხარდაჭერილია)"
-
-
-
-
-
-
+ "სტუმარი მოწყობილობა (აუდიოს გაზიარება მხარდაჭერილია). %1$s ბატარეა."
+ "სტუმარი მოწყობილობა (აუდიოს გაზიარება მხარდაჭერილია). მარცხენა: %1$s, მარჯვენა: %2$s ბატარეა."
+ "სტუმარი მოწყობილობა (აუდიოს გაზიარება მხარდაჭერილია)""აქტიური (მხოლოდ მედია)"
-
-
-
-
+ "სტუმარი მოწყობილობა"
+ "სტუმარი მოწყობილობა (მხოლოდ მედია)""აუდიოს გაზიარება მხარდაჭერილია"
-
-
+ "სტუმარი მოწყობილობა. აუდიოს გაზიარება მხარდაჭერილია""აქტიური (მხოლოდ მედია), მხოლოდ მარცხენა""აქტიური (მხოლოდ მედია), მხოლოდ მარჯვენა""აქტიური (მხოლოდ მედია), მარცხენა და მარჯვენა"
@@ -396,8 +386,7 @@
"აპარატურით დაჩქარებული გამოსახულება""მედია""მონიტორინგი"
-
-
+ "ფანჯრების მართვა""მკაცრი რეჟიმი ჩართულია""ეკრანის აციმციმება, როცა აპები ახორციელებენ ხანგრძლივ ოპერაციებს მთავარ ნაკადზე""მაჩვენებლის მდებარეობა"
@@ -492,12 +481,9 @@
"WebView რეალიზაცია""WebView რეალიზაციის დაყენება""თქვენი არჩევანი აღარ მოქმედებს. ცადეთ ხელახლა."
-
-
-
-
-
-
+ "WebView DevTools"
+ "WebView-ის პაკეტი ვერ მოიძებნა"
+ "DevTools-ის გაშვება ვერ მოხერხდა""გამოსახულების ფერების რეჟიმი""sRGB-ს გამოყენება""გამორთულია"
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index a85e6245fa605..25c92de406570 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -113,33 +113,23 @@
"Айналаны жаңарту мүмкін болмады.""Істеп тұр (тек мультимедиа). Батарея зарядының деңгейі – %1$s""Істеп тұр (тек мультимедиа). Сол жақ: батарея зарядының деңгейі — %1$s. Оң жақ: батарея зарядының деңгейі — %2$s."
-
-
-
-
-
-
-
-
+ "Қонақ құрылғы. Батарея зарядының деңгейі – %1$s."
+ "Қонақ құрылғы. Сол жақ: батарея зарядының деңгейі – %1$s. Оң жақ: батарея зарядының деңгейі — %2$s."
+ "Қонақ құрылғы (тек медиафайл). Батарея зарядының деңгейі – %1$s."
+ "Қонақ құрылғы (тек медиафайл). Сол жақ: батарея зарядының деңгейі – %1$s. Оң жақ: батарея зарядының деңгейі — %2$s.""Жалғанып тұр (аудио бөлісу мүмкіндігі бар). Батарея зарядының деңгейі – %1$s.""Қосылды (аудио бөлісуге мүмкіндік береді). Сол жақ: батарея зарядының деңгейі — %1$s. Оң жақ: батарея зарядының деңгейі — %2$s.""Қосылды (аудио бөлісуге мүмкіндік береді). Сол жақ: батарея зарядының деңгейі – %1$s.""Қосылды (аудио бөлісуге мүмкіндік береді). Оң жақ: батарея зарядының деңгейі – %1$s.""Жалғанды (аудио бөлісу мүмкіндігі бар)."
-
-
-
-
-
-
+ "Қонақ құрылғы (аудио бөлісуге мүмкіндік береді). Батарея зарядының деңгейі – %1$s."
+ "Қонақ құрылғы (аудио бөлісуге мүмкіндік береді). Сол жақ: батарея зарядының деңгейі – %1$s. Оң жақ: батарея зарядының деңгейі — %2$s."
+ "Қонақ құрылғы (аудио бөлісуге мүмкіндік береді)""Істеп тұр (тек мультимедиа)."
-
-
-
-
+ "Қонақ құрылғы"
+ "Қонақ құрылғы (тек медиафайл)""Аудио бөлісуге мүмкіндік береді."
-
-
+ "Қонақ құрылғы. Аудио бөлісуге мүмкіндік береді.""Тек сол жақ істеп тұр (мультимедиа ғана).""Тек оң жақ істеп тұр (мультимедиа ғана).""Сол және оң жақ істеп тұр (мультимедиа ғана)."
@@ -396,8 +386,7 @@
"Бейнелеуді аппаратпен жеделдету""Mультимeдиа""Бақылау"
-
-
+ "Терезелерді басқару""Қатаң режим қосылған""Қолданбалар ұзақ операцияларды орындағанда экранды жыпылықтату""Меңзер орны"
@@ -492,12 +481,9 @@
"WebView қызметі""WebView ендіруін орнату""Бұл таңдау енді жарамды емес. Әрекетті қайталаңыз."
-
-
-
-
-
-
+ "WebView әзірлеуші құралдары"
+ "WebView пакеті табылмады."
+ "Әзірлеуші құралдары іске қосылмады.""Сурет түс режимі""sRGB пайдалану""Өшірулі"
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index d2d5893c969ba..9dadee1d34b35 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -113,33 +113,23 @@
"មិនអាចប្ដូរមជ្ឈដ្ឋានជុំវិញបានទេ""សកម្ម (តែមេឌៀប៉ុណ្ណោះ)។ ថ្ម %1$s។""សកម្ម (តែមេឌៀប៉ុណ្ណោះ)។ ឆ្វេង៖ ថ្ម %1$s ស្ដាំ៖ ថ្ម %2$s។"
-
-
-
-
-
-
-
-
+ "ឧបករណ៍ភ្ញៀវ។ ថ្ម %1$s។"
+ "ឧបករណ៍ភ្ញៀវ។ ឆ្វេង៖ ថ្ម %1$s ស្ដាំ៖ ថ្ម %2$s។"
+ "ឧបករណ៍ភ្ញៀវ (មេឌៀតែប៉ុណ្ណោះ)។ ថ្ម %1$s។"
+ "ឧបករណ៍ភ្ញៀវ (មេឌៀតែប៉ុណ្ណោះ)។ ឆ្វេង៖ ថ្ម %1$s ស្ដាំ៖ ថ្ម %2$s។""បានភ្ជាប់ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា)។ ថ្ម %1$s។""បានភ្ជាប់ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា)។ ឆ្វេង៖ ថ្ម %1$s ស្ដាំ៖ ថ្ម %2$s។""បានភ្ជាប់ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា)។ ឆ្វេង៖ ថ្ម %1$s។""បានភ្ជាប់ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា)។ ស្ដាំ៖ ថ្ម %1$s។""បានភ្ជាប់ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា)"
-
-
-
-
-
-
+ "ឧបករណ៍ភ្ញៀវ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា)។ ថ្ម %1$s។"
+ "ឧបករណ៍ភ្ញៀវ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា)។ ឆ្វេង៖ ថ្ម %1$s ស្ដាំ៖ ថ្ម %2$s។"
+ "ឧបករណ៍ភ្ញៀវ (អាចប្រើការស្ដាប់សំឡេងរួមគ្នា)""សកម្ម (តែមេឌៀប៉ុណ្ណោះ)"
-
-
-
-
+ "ឧបករណ៍ភ្ញៀវ"
+ "ឧបករណ៍ភ្ញៀវ (មេឌៀតែប៉ុណ្ណោះ)""អាចប្រើការស្ដាប់សំឡេងរួមគ្នា"
-
-
+ "ឧបករណ៍ភ្ញៀវ។ អាចប្រើការស្ដាប់សំឡេងរួមគ្នា""សកម្ម (តែមេឌៀប៉ុណ្ណោះ) តែខាងឆ្វេងប៉ុណ្ណោះ""សកម្ម (តែមេឌៀប៉ុណ្ណោះ) តែខាងស្ដាំប៉ុណ្ណោះ""សកម្ម (តែមេឌៀប៉ុណ្ណោះ) ឆ្វេង និងស្ដាំ"
@@ -396,8 +386,7 @@
"ការបំប្លែងដែលពន្លឿនដោយប្រើហាតវែរ""មេឌៀ""តាមដាន"
-
-
+ "ការគ្រប់គ្រងវិនដូ""បានបើកមុខងារតឹងរ៉ឹង""បញ្ចេញពន្លឺអេក្រង់ពេលកម្មវិធីធ្វើប្រតិបត្តិការយូរលើសែស្រឡាយមេ""ទីតាំងទ្រនិច"
@@ -492,12 +481,9 @@
"ការអនុវត្ត WebView""កំណត់ការប្រតិបត្តិ WebView""ជម្រើសនេះលែងមានសុពលភាពទៀតហើយ ព្យាយាមម្តងទៀត"
-
-
-
-
-
-
+ "ឧបករណ៍អ្នកអភិវឌ្ឍន៍ WebView"
+ "រកមិនឃើញកញ្ចប់ WebView ទេ។"
+ "មិនអាចបើកឧបករណ៍អ្នកអភិវឌ្ឍន៍បានទេ។""របៀបនៃពណ៌រូបភាព""ប្រើ sRGB""បានបិទ"
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 87f2cdf9e3409..72056bb1ed7d2 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -113,33 +113,23 @@
"ಆ್ಯಂಬಿಯೆಂಟ್ ಸ್ಥಿತಿಯನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ""ಸಕ್ರಿಯವಾಗಿದೆ (ಮೀಡಿಯಾ ಮಾತ್ರ). %1$s ಬ್ಯಾಟರಿ ಮಟ್ಟ.""ಸಕ್ರಿಯವಾಗಿದೆ (ಮೀಡಿಯಾ ಮಾತ್ರ). ಎಡ: %1$s, ಬಲ: %2$s ಬ್ಯಾಟರಿ ಮಟ್ಟ."
-
-
-
-
-
-
-
-
+ "ಅತಿಥಿ ಸಾಧನ. %1$s ಬ್ಯಾಟರಿ ಮಟ್ಟ."
+ "ಅತಿಥಿ ಸಾಧನ. ಎಡ: %1$s, ಬಲ: %2$s ಬ್ಯಾಟರಿ ಮಟ್ಟ."
+ "ಅತಿಥಿ ಸಾಧನ (ಮಾಧ್ಯಮ ಮಾತ್ರ). %1$s ಬ್ಯಾಟರಿ ಮಟ್ಟ."
+ "ಅತಿಥಿ ಸಾಧನ (ಮಾಧ್ಯಮ ಮಾತ್ರ). ಎಡ: %1$s, ಬಲ: %2$s ಬ್ಯಾಟರಿ ಮಟ್ಟ.""ಕನೆಕ್ಟ್ ಆಗಿದೆ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ). %1$s ಬ್ಯಾಟರಿ ಮಟ್ಟ.""ಕನೆಕ್ಟ್ ಆಗಿದೆ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ). ಎಡ: %1$s, ಬಲ: %2$s ಬ್ಯಾಟರಿ ಮಟ್ಟ.""ಕನೆಕ್ಟ್ ಆಗಿದೆ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ). ಎಡ: %1$s ಬ್ಯಾಟರಿ ಮಟ್ಟ.""ಕನೆಕ್ಟ್ ಆಗಿದೆ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ). ಬಲ: %1$s ಬ್ಯಾಟರಿ ಮಟ್ಟ.""ಕನೆಕ್ಟ್ ಆಗಿದೆ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ)"
-
-
-
-
-
-
+ "ಅತಿಥಿ ಸಾಧನ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ). %1$s ಬ್ಯಾಟರಿ ಮಟ್ಟ."
+ "ಅತಿಥಿ ಸಾಧನ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ). ಎಡ: %1$s, ಬಲ: %2$s ಬ್ಯಾಟರಿ ಮಟ್ಟ."
+ "ಅತಿಥಿ ಸಾಧನ (ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ)""ಸಕ್ರಿಯವಾಗಿದೆ (ಮೀಡಿಯಾ ಮಾತ್ರ)"
-
-
-
-
+ "ಅತಿಥಿ ಸಾಧನ"
+ "ಅತಿಥಿ ಸಾಧನ (ಮಾಧ್ಯಮ ಮಾತ್ರ)""ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ"
-
-
+ "ಅತಿಥಿ ಸಾಧನ. ಆಡಿಯೋ ಹಂಚಿಕೊಳ್ಳುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ""ಸಕ್ರಿಯವಾಗಿದೆ (ಮೀಡಿಯಾ ಮಾತ್ರ), ಎಡ ಭಾಗದ ಮಾತ್ರ""ಸಕ್ರಿಯವಾಗಿದೆ (ಮೀಡಿಯಾ ಮಾತ್ರ), ಬಲ ಭಾಗದ ಮಾತ್ರ""ಸಕ್ರಿಯವಾಗಿದೆ (ಮೀಡಿಯಾ ಮಾತ್ರ), ಎಡ ಮತ್ತು ಬಲ ಭಾಗದ"
@@ -396,8 +386,7 @@
"ಹಾರ್ಡ್ವೇರ್ ವೇಗವರ್ಧಿತ ರೆಂಡರಿಂಗ್""ಮಾಧ್ಯಮ""ಪರಿವೀಕ್ಷಣೆ ಮಾಡುವಿಕೆ"
-
-
+ "ವಿಂಡೋ ನಿರ್ವಹಣೆ""ಸ್ಟ್ರಿಕ್ಟ್ ಮೋಡ್ ಸಕ್ರಿಯ""ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮುಖ್ಯ ಥ್ರೆಡ್ನಲ್ಲಿ ದೀರ್ಘ ಕಾರ್ಯಾಚರಣೆ ನಿರ್ವಹಿಸಿದಾಗ ಪರದೆಯನ್ನು ಫ್ಲ್ಯಾಶ್ ಮಾಡು""ಪಾಯಿಂಟರ್ ಸ್ಥಳ"
@@ -492,12 +481,9 @@
"WebView ಹೊಂದಿಸಿ""WebView ಅನುಷ್ಠಾನಗೊಳಿಸುವಿಕೆಯನ್ನು ಸೆಟ್ ಮಾಡಿ""ಈ ಆಯ್ಕೆಯು ಇನ್ನು ಮುಂದೆ ಮಾನ್ಯವಾಗಿರುವುದಿಲ್ಲ. ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ."
-
-
-
-
-
-
+ "WebView DevTools"
+ "WebView ಪ್ಯಾಕೇಜ್ ಕಂಡುಬಂದಿಲ್ಲ."
+ "DevTools ಅನ್ನು ಲಾಂಚ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.""ಚಿತ್ರ ಬಣ್ಣದ ಮೋಡ್""sRGB ಬಳಸಿ""ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index 669d8ef896553..3b965e54e1453 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -113,33 +113,23 @@
"주변 소리를 업데이트할 수 없음""사용 중입니다(미디어 전용). 배터리는 %1$s입니다.""사용 중입니다(미디어 전용). 배터리는 왼쪽 %1$s, 오른쪽 %2$s입니다."
-
-
-
-
-
-
-
-
+ "게스트 기기입니다. 배터리는 %1$s입니다."
+ "게스트 기기입니다. 배터리는 왼쪽 %1$s, 오른쪽 %2$s입니다."
+ "게스트 기기(미디어 전용)입니다. 배터리는 %1$s입니다."
+ "게스트 기기(미디어 전용)입니다. 배터리는 왼쪽 %1$s, 오른쪽 %2$s입니다.""연결되었습니다(오디오 공유 지원). 배터리는 %1$s입니다.""연결되었습니다(오디오 공유 지원). 배터리는 왼쪽 %1$s, 오른쪽 %2$s입니다.""연결되었습니다(오디오 공유 지원). 왼쪽 배터리는 %1$s입니다.""연결되었습니다(오디오 공유 지원). 오른쪽 배터리는 %1$s입니다.""연결됨(오디오 공유 지원)"
-
-
-
-
-
-
+ "게스트 기기(오디오 공유 지원)입니다. 배터리는 %1$s입니다."
+ "게스트 기기(오디오 공유 지원)입니다. 배터리는 왼쪽 %1$s, 오른쪽 %2$s입니다."
+ "게스트 기기(오디오 공유 지원)""사용 중(미디어 전용)"
-
-
-
-
+ "게스트 기기"
+ "게스트 기기(미디어 전용)""오디오 공유 지원"
-
-
+ "게스트 기기입니다. 오디오 공유를 지원합니다.""사용 중(미디어 전용), 왼쪽만""사용 중(미디어 전용), 오른쪽만""사용 중(미디어 전용), 왼쪽 및 오른쪽"
@@ -396,8 +386,7 @@
"하드웨어 가속 렌더링""미디어""모니터링"
-
-
+ "창 관리""엄격 모드 사용""앱이 기본 스레드에서 오래 작업하면 화면 깜박이기""포인터 위치"
@@ -492,12 +481,9 @@
"WebView 구현""WebView 구현 설정""선택이 더 이상 유효하지 않습니다. 다시 시도하세요."
-
-
-
-
-
-
+ "WebView DevTools"
+ "WebView 패키지를 찾을 수 없습니다."
+ "DevTools를 실행할 수 없습니다.""사진 색상 모드""sRGB 사용""사용 중지됨"
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index c69325b2dc434..3eee360ed220d 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -113,33 +113,23 @@
"Айланадагы абал жаңыртылган жок""Жигердүү (медиа үчүн гана). Батарея: %1$s.""Жигердүү (медиа үчүн гана). Батарея: L: %1$s, R: %2$s."
-
-
-
-
-
-
-
-
+ "Конок түзмөк. Батарея: %1$s."
+ "Конок түзмөк. Батарея: L: %1$s, R: %2$s."
+ "Конок түзмөк (медиа гана). Батарея: %1$s."
+ "Конок түзмөк (медиа гана). Батарея: L: %1$s, R: %2$s.""Туташып турат (чогуу уксаңыз болот). Батарея: %1$s.""Туташып турат (чогуу уксаңыз болот). Батарея: L: %1$s, R: %2$s.""Туташып турат (чогуу уксаңыз болот). Сол кулак – батареянын деңгээли: %1$s.""Туташып турат (чогуу уксаңыз болот). Оң кулак – батареянын деңгээли: %1$s.""Туташып турат (чогуу уксаңыз болот)"
-
-
-
-
-
-
+ "Конок түзмөк (чогуу угуу колдоого алынат). Батарея: %1$s."
+ "Конок түзмөк (чогуу угуу колдоого алынат). Батарея: L: %1$s, R: %2$s."
+ "Конок түзмөк (чогуу угуу колдоого алынат)""Активдүү (медиа үчүн гана)"
-
-
-
-
+ "Конок түзмөк"
+ "Конок түзмөк (медиа гана)""Чогуу уксаңыз болот"
-
-
+ "Конок түзмөк. Чогуу угуу колдоого алынат""Активдүү (медиа үчүн гана), сол кулакчын гана""Активдүү (медиа үчүн гана), оң кулакчын гана""Активдүү (медиа үчүн гана), сол жана оң кулакчын"
@@ -396,8 +386,7 @@
"Визуалдаштырууну аппарат менен ылдамдатуу""Медиа""Мониторинг"
-
-
+ "Терезени тескөө""Катаал режим иштетилди""Узак операцияларда экран күйүп-өчүп турат""Көрсөткүчтүн турган жери"
@@ -492,12 +481,9 @@
"WebView кызматы""WebView аткарылышын коюу""Тандалган нерсе жараксыз болуп калган. Кайталап көрүңүз."
-
-
-
-
-
-
+ "WebView сунуштаган иштеп чыгуучунун куралдары"
+ "WebView топтому табылган жок."
+ "Иштеп чыгуучунун куралдары иштетилген жок.""Сүрөт түсү режими""sRGB колдонуңуз""Өчүк"
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index d1f1344fd5060..8044cce18edbc 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -113,33 +113,23 @@
"ບໍ່ສາມາດອັບເດດສຽງແວດລ້ອມໄດ້""ນຳໃຊ້ຢູ່ (ມີເດຍເທົ່ານັ້ນ). ແບັດເຕີຣີ %1$s.""ນຳໃຊ້ຢູ່ (ມີເດຍເທົ່ານັ້ນ). ຊ: ແບັດເຕີຣີ %1$s, ຂ: ແບັດເຕີຣີ %2$s."
-
-
-
-
-
-
-
-
+ "ອຸປະກອນແຂກ. ແບັດເຕີຣີ %1$s."
+ "ອຸປະກອນແຂກ. ແບັດເຕີຣີ L: %1$s, R: %2$s."
+ "ອຸປະກອນແຂກ (ສື່ເທົ່ານັ້ນ). ແບັດເຕີຣີ %1$s."
+ "ອຸປະກອນແຂກ (ສື່ເທົ່ານັ້ນ). ແບັດເຕີຣີ L: %1$s, R: %2$s.""ເຊື່ອມຕໍ່ແລ້ວ (ຮອງຮັບການແບ່ງປັນສຽງ). ແບັດເຕີຣີ %1$s.""ເຊື່ອມຕໍ່ແລ້ວ (ຮອງຮັບການແບ່ງປັນສຽງ). ຊ: ແບັດເຕີຣີ %1$s, ຂ: ແບັດເຕີຣີ %2$s.""ເຊື່ອມຕໍ່ແລ້ວ (ຮອງຮັບການແບ່ງປັນສຽງ). ຊ້າຍ: ແບັດເຕີຣີ %1$s.""ເຊື່ອມຕໍ່ແລ້ວ (ຮອງຮັບການແບ່ງປັນສຽງ). ຂວາ: ແບັດເຕີຣີ %1$s.""ເຊື່ອມຕໍ່ແລ້ວ (ຮອງຮັບການແບ່ງປັນສຽງ)"
-
-
-
-
-
-
+ "ອຸປະກອນແຂກ (ຮອງຮັບການແບ່ງປັນສຽງ). ແບັດເຕີຣີ %1$s."
+ "ອຸປະກອນແຂກ (ຮອງຮັບການແບ່ງປັນສຽງ). ແບັດເຕີຣີ L: %1$s, R: %2$s."
+ "ອຸປະກອນແຂກ (ຮອງຮັບການແບ່ງປັນສຽງ)""ນຳໃຊ້ຢູ່ (ມີເດຍເທົ່ານັ້ນ)"
-
-
-
-
+ "ອຸປະກອນແຂກ"
+ "ອຸປະກອນແຂກ (ສື່ເທົ່ານັ້ນ)""ຮອງຮັບການແບ່ງປັນສຽງ"
-
-
+ "ອຸປະກອນແຂກ. ຮອງຮັບການແບ່ງປັນສຽງ""ນຳໃຊ້ຢູ່ (ມີເດຍເທົ່ານັ້ນ), ຊ້າຍເທົ່ານັ້ນ""ນຳໃຊ້ຢູ່ (ມີເດຍເທົ່ານັ້ນ), ຂວາເທົ່ານັ້ນ""ນຳໃຊ້ຢູ່ (ມີເດຍເທົ່ານັ້ນ), ຊ້າຍ ແລະ ຂວາ"
@@ -396,8 +386,7 @@
"ການສະແດງຜົນໂດຍໃຊ້ຮາດແວຊ່ວຍ""ມີເດຍ""ກຳລັງກວດສອບ"
-
-
+ "ການຈັດການໜ້າຈໍ""ເປີດໃຊ້ໂໝດເຄັ່ງຄັດ""ກະພິບໜ້າຈໍເມື່ອມີແອັບເຮັດວຽກດົນເກີນໄປໃນເທຣດຫຼັກ""ຕຳແໜ່ງໂຕຊີ້"
@@ -492,12 +481,9 @@
"ການຈັດຕັ້ງປະຕິບັດ WebView""ຕັ້ງການຈັດຕັ້ງປະຕິບັດ WebView""ບໍ່ສາມາດໃຊ້ການເລືອກນີ້ໄດ້ອີກຕໍ່ໄປແລ້ວ. ກະລຸນາລອງໃໝ່."
-
-
-
-
-
-
+ "WebView DevTools"
+ "ບໍ່ພົບແພັກເກດ WebView."
+ "ບໍ່ສາມາດເປີດໃຊ້ DevTools.""ໂໝດສີຮູບ""ໃຊ້ sRGB""ປິດນຳໃຊ້ແລ້ວ"
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 7f940109e867a..aec236a55d41e 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -113,33 +113,23 @@
"Nepavyko atnaujinti aplinkos""Aktyvus (tik medija). Akumuliatorius lygis: %1$s.""Aktyvus (tik medija), akumuliatoriaus lygis kairėje: %1$s, dešinėje: %2$s."
-
-
-
-
-
-
-
-
+ "Svečio įrenginys. Akumuliatorius lygis: %1$s."
+ "Svečio įrenginys. Akumuliatoriaus lygis kairėje: %1$s, dešinėje: %2$s."
+ "Svečio įrenginys (tik medija). Akumuliatorius lygis: %1$s."
+ "Svečio įrenginys (tik medija). Akumuliatoriaus lygis kairėje: %1$s, dešinėje: %2$s.""Prijungta (palaikomas garso įrašų bendrinimas). Akumuliatoriaus lygis: %1$s.""Prijungta (palaikomas garso įrašų bendrinimas), akumuliatoriaus lygis kairėje: %1$s, dešinėje: %2$s.""Prijungta (palaikomas garso įrašų bendrinimas). Akumuliatoriaus lygis kairėje: %1$s.""Prijungta (palaikomas garso įrašų bendrinimas). Akumuliatoriaus lygis dešinėje: %1$s.""Prijungta (palaikomas garso įrašų bendrinimas)"
-
-
-
-
-
-
+ "Svečio įrenginys (palaikomas garso įrašų bendrinimas). Akumuliatorius lygis: %1$s."
+ "Svečio įrenginys (palaikomas garso įrašų bendrinimas). Akumuliatoriaus lygis kairėje: %1$s, dešinėje: %2$s."
+ "Svečio įrenginys (palaikomas garso įrašų bendrinimas)""Aktyvus (tik medija)"
-
-
-
-
+ "Svečio įrenginys"
+ "Svečio įrenginys (tik medija)""Palaikomas garso įrašų bendrinimas"
-
-
+ "Svečio įrenginys. Palaikomas garso įrašų bendrinimas""Aktyvus (tik medija), tik kairė""Aktyvus (tik medija), tik dešinė""Aktyvus (tik medija), kairė ir dešinė"
@@ -396,8 +386,7 @@
"Aparatinės įrangos paspartintas pateikimas""Medija""Stebėjimas"
-
-
+ "Langų tvarkymas""Įgal. griežtas režimas""Ekr. blyksės, kai pr. atl. ilgus proc. pgr. gijoje""Žymiklio vieta"
@@ -492,12 +481,9 @@
"„WebView“ diegimas""„WebView“ diegimo nustatymas""Šios parinkties nebegalima pasirinkti. Bandykite dar kartą."
-
-
-
-
-
-
+ "„WebView“ kūrėjo įrankiai"
+ "Žiniatinklio rodinio paketas nerastas."
+ "Nepavyko paleisti kūrėjo įrankių.""Nuotraukos spalvos režimas""Naudoti sRGB""Išjungtas"
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 50a56d4c956f3..5716f8f4194c0 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -113,33 +113,23 @@
"Nevarēja atjaunināt apkārtnes skaņas""Aktīvs (tikai multividei). Akumulatora uzlādes līmenis: %1$s.""Aktīvs (tikai multividei). Akumulatora uzlādes līmenis kreisajā austiņā: %1$s, labajā austiņā: %2$s."
-
-
-
-
-
-
-
-
+ "Viesa ierīce. Akumulatora uzlādes līmenis: %1$s."
+ "Viesa ierīce. Akumulatora uzlādes līmenis kreisajā austiņā: %1$s, labajā austiņā: %2$s."
+ "Viesa ierīce (tikai multividei). Akumulatora uzlādes līmenis: %1$s."
+ "Viesa ierīce (tikai multividei). Akumulatora uzlādes līmenis kreisajā austiņā: %1$s, labajā austiņā: %2$s.""Izveidots savienojums (atbalsta audio kopīgošanu). Akumulatora uzlādes līmenis: %1$s.""Izveidots savienojums (atbalsta audio kopīgošanu). Akumulatora uzlādes līmenis kreisajā austiņā: %1$s, labajā austiņā: %2$s.""Izveidots savienojums (atbalsta audio kopīgošanu). Akumulatora uzlādes līmenis kreisajā austiņā: %1$s.""Izveidots savienojums (atbalsta audio kopīgošanu). Akumulatora uzlādes līmenis labajā austiņā: %1$s.""Izveidots savienojums (atbalsta audio kopīgošanu)"
-
-
-
-
-
-
+ "Viesa ierīce (atbalsta audio kopīgošanu). Akumulatora uzlādes līmenis: %1$s."
+ "Viesa ierīce (atbalsta audio kopīgošanu). Akumulatora uzlādes līmenis kreisajā austiņā: %1$s, labajā austiņā: %2$s."
+ "Viesa ierīce (atbalsta audio kopīgošanu)""Aktīvs (tikai multividei)"
-
-
-
-
+ "Viesa ierīce"
+ "Viesa ierīce (tikai multividei)""Atbalsta audio kopīgošanu"
-
-
+ "Viesa ierīce. Atbalsta audio kopīgošanu""Aktīvs (tikai multivide), tikai kreisās puses aparāts""Aktīvs (tikai multivide), tikai labās puses aparāts""Aktīvs (tikai multivide), kreisās un labās puses aparāts"
@@ -396,8 +386,7 @@
"Aparatūras paātrinātā atveidošana""Multivide""Pārraudzība"
-
-
+ "Logu pārvaldība""Precīzais rež. ir iespēj.""Zibsnīt ekrānu, ja liet. ilgi darbojas galv. pav.""Rādītāja atrašanās vieta"
@@ -492,12 +481,9 @@
"WebView ieviešana""Iestatīt WebView ieviešanu""Šī iespēja vairs nav derīga. Mēģiniet vēlreiz."
-
-
-
-
-
-
+ "WebView izstrādātāja rīki"
+ "WebView pakotne netika atrasta."
+ "Nevarēja palaist izstrādātāja rīkus.""Attēla krāsu režīms""Izmantot sRGB""Atspējota"
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index e86a6cee62497..bc6409da8e128 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -113,33 +113,23 @@
"Не можеше да се ажурира опкружувањето""Активно (само аудиовизуелни содржини). %1$s батерија.""Активно (само аудиовизуелни содржини). Л: %1$s батерија, Д: %2$s батерија."
-
-
-
-
-
-
-
-
+ "Гостински уред. %1$s батерија."
+ "Гостински уред. Л: %1$s батерија, Д: %2$s батерија."
+ "Гостински уред (само аудиовизуелни содржини). %1$s батерија."
+ "Гостински уред (само аудиовизуелни содржини). Л: %1$s батерија, Д: %2$s батерија.""Поврзано (поддржува споделување аудио). %1$s батерија.""Поврзано (поддржува споделување аудио). Л: %1$s батерија, Д: %2$s батерија.""Поврзано (поддржува споделување аудио). Лево: %1$s батерија.""Поврзано (поддржува споделување аудио). Десно: %1$s батерија.""Поврзано (поддржува споделување аудио)"
-
-
-
-
-
-
+ "Гостински уред (поддржува споделување аудио). %1$s батерија."
+ "Гостински уред (поддржува споделување аудио). Л: %1$s батерија, Д: %2$s батерија."
+ "Гостински уред (поддржува споделување аудио)""Активно (само аудиовизуелни содржини)"
-
-
-
-
+ "Гостински уред"
+ "Гостински уред (само аудиовизуелни содржини)""Поддржува споделување аудио"
-
-
+ "Гостински уред. Поддржува споделување аудио""Активно (само аудиовизуелни содржини), само лево""Активно (само аудиовизуелни содржини), само десно""Активно (само аудиовизуелни содржини), лево и десно"
@@ -396,8 +386,7 @@
"Хардверско забрзување""Аудиовизуелни содржини""Следење"
-
-
+ "Управување со прозорци""Овозможен е строг режим""Трепкај со екранот при долги операции на главна нишка""Локација на покажувач"
@@ -492,12 +481,9 @@
"Примена на WebView""Поставете воведување WebView""Овој избор веќе не важи. Обидете се повторно."
-
-
-
-
-
-
+ "WebView DevTools"
+ "Пакетот на WebView не е најден."
+ "Не можеше да се стартува DevTools.""Режим на боја на слика""Користи sRGB""Оневозможено"
@@ -666,7 +652,7 @@
"Да се постави корисников како администратор?""Администраторите имаат посебни привилегии што другите корисници ги немаат. Администраторот може да управува со сите корисници, да го ажурира или ресетира уредов, да ги менува поставките, да ги прегледува сите инсталирани апликации и да доделува или одзема администраторски привилегии на другите корисници.""Постави како администратор"
- "Ќе поставите корисник сега?"
+ "Да се постави корисник?""Проверете дали лицето е достапно да го земе уредот и да го постави својот простор""Постави профил сега?""Постави сега"
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index f7ab232ff0feb..bcadd7d880596 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -113,33 +113,23 @@
"സറൗണ്ടിംഗ്സ് അപ്ഡേറ്റ് ചെയ്യാനായില്ല""സജീവം (മീഡിയ മാത്രം). %1$s ബാറ്ററി.""സജീവം (മീഡിയ മാത്രം). ഇടതുവശത്ത്: %1$s ബാറ്ററി, വലതുവശത്ത്: %2$s ബാറ്ററി."
-
-
-
-
-
-
-
-
+ "അതിഥി ഉപകരണം. %1$s ബാറ്ററി."
+ "അതിഥി ഉപകരണം. ഇടതുവശത്ത്: %1$s, വലതുവശത്ത്: %2$s ബാറ്ററി."
+ "അതിഥി ഉപകരണം (മീഡിയ മാത്രം). %1$s ബാറ്ററി."
+ "അതിഥി ഉപകരണം (മീഡിയ മാത്രം). ഇടതുവശത്ത്: %1$s, വലതുവശത്ത്: %2$s ബാറ്ററി.""കണക്റ്റ് ചെയ്തു (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു). %1$s ബാറ്ററി.""കണക്റ്റ് ചെയ്തു (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു). ഇടതുവശത്ത്: %1$s ബാറ്ററി, വലതുവശത്ത്: %2$s ബാറ്ററി.""കണക്റ്റ് ചെയ്തു (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു). ഇടത് വശത്ത്: %1$s ബാറ്ററി.""കണക്റ്റ് ചെയ്തു (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു). വലത് വശത്ത്: %1$s ബാറ്ററി.""കണക്റ്റ് ചെയ്തു (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു)."
-
-
-
-
-
-
+ "അതിഥി ഉപകരണം (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു). %1$s ബാറ്ററി."
+ "അതിഥി ഉപകരണം (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു). ഇടതുവശത്ത്: %1$s, വലതുവശത്ത്: %2$s ബാറ്ററി."
+ "അതിഥി ഉപകരണം (ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു)""സജീവം (മീഡിയ മാത്രം)"
-
-
-
-
+ "അതിഥി ഉപകരണം"
+ "അതിഥി ഉപകരണം (മീഡിയ മാത്രം)""ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു"
-
-
+ "അതിഥി ഉപകരണം. ഓഡിയോ പങ്കിടൽ പിന്തുണയ്ക്കുന്നു""സജീവം (മീഡിയ മാത്രം), ഇടതുവശത്ത് മാത്രം""സജീവം (മീഡിയ മാത്രം), വലതുവശത്ത് മാത്രം""സജീവം (മീഡിയ മാത്രം), ഇടതുവശത്തെയും വലതുവശത്തെയും"
@@ -396,8 +386,7 @@
"ഹാർഡ്വെയർ ത്വരിതപ്പെടുത്തിയ റെൻഡറിംഗ്""മീഡിയ""മോണിറ്ററിംഗ്"
-
-
+ "വിൻഡോ മാനേജ്മെന്റ്""ഫോഴ്സ്മോഡ് സജീവമാക്കി""പ്രധാന ത്രെഡിൽ ആപ്പുകൾ ദൈർഘ്യമേറിയ പ്രവർത്തനങ്ങൾ നടത്തുമ്പോൾ സ്ക്രീൻ ഫ്ലാഷ് ചെയ്യുക""പോയിന്റർ ലൊക്കേഷൻ"
@@ -492,12 +481,9 @@
"WebView നടപ്പാക്കൽ""WebView നടപ്പാക്കൽ സജ്ജമാക്കുക""ഈ തിരഞ്ഞെടുപ്പിന് തുടർന്നങ്ങോട്ട് സാധുതയില്ല. വീണ്ടും ശ്രമിക്കുക."
-
-
-
-
-
-
+ "WebView DevTools"
+ "WebView പാക്കേജ് കണ്ടെത്തിയില്ല."
+ "DevTools ലോഞ്ച് ചെയ്യാനായില്ല.""ചിത്ര വർണ്ണ മോഡ്""sRGB ഉപയോഗിക്കുക""പ്രവർത്തനരഹിതമാക്കി"
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 4dc754e9f3786..2b45e85a2995c 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -113,33 +113,23 @@
"Орчин тойрныг шинэчилж чадсангүй""Идэвхтэй (зөвхөн медиа). %1$s батарей.""Идэвхтэй (зөвхөн медиа). З: %1$s, Б: %2$s батарей."
-
-
-
-
-
-
-
-
+ "Зочин төхөөрөмж. %1$s батарейн цэнэгтэй."
+ "Зочин төхөөрөмж. З: %1$s, Б: %2$s батарейн цэнэгтэй."
+ "Зочин төхөөрөмж (зөвхөн медиа). %1$s батарейн цэнэгтэй."
+ "Зочин төхөөрөмж (зөвхөн медиа). З: %1$s, Б: %2$s батарейн цэнэгтэй.""Холбогдсон (аудио хуваалцахыг дэмждэг). %1$s батарей.""Холбогдсон (аудио хуваалцахыг дэмждэг). З: %1$s, Б: %2$s батарей.""Холбогдсон (аудио хуваалцахыг дэмждэг). Зүүн: %1$s батарей.""Холбогдсон (аудио хуваалцахыг дэмждэг). Баруун: %1$s батарей.""Холбогдсон (аудио хуваалцахыг дэмждэг)"
-
-
-
-
-
-
+ "Зочин төхөөрөмж (аудио хуваалцахыг дэмждэг). %1$s батарейн цэнэгтэй."
+ "Зочин төхөөрөмж (аудио хуваалцахыг дэмждэг). З: %1$s, Б: %2$s батарейн цэнэгтэй."
+ "Зочин төхөөрөмж (аудио хуваалцахыг дэмждэг)""Идэвхтэй (зөвхөн медиа)"
-
-
-
-
+ "Зочин төхөөрөмж"
+ "Зочин төхөөрөмж (зөвхөн медиа)""Аудио хуваалцахыг дэмждэг"
-
-
+ "Зочин төхөөрөмж. Аудио хуваалцахыг дэмждэг""Идэвхтэй (зөвхөн медиа), зөвхөн зүүн""Идэвхтэй (зөвхөн медиа), зөвхөн баруун""Идэвхтэй (зөвхөн медиа), зүүн болон баруун"
@@ -396,8 +386,7 @@
"Техник хангамжийн хурдасгасан үзүүлэлт""Медиа""Мониторинг"
-
-
+ "Цонхны удирдлага""Хатуу горимыг идэвхжүүлсэн""Аппууд үндсэн хэлхээс дээр удаан хугацаанд үйлдлүүд хийх үед дэлгэцийг анивчуулах""Чиглүүлэгчийн байршил"
@@ -492,12 +481,9 @@
"WebView хэрэгжилт""WebView хэрэгжилтийг тохируулах""Энэ сонголт хүчингүй байна. Дахин оролдоно уу."
-
-
-
-
-
-
+ "WebView-н DevTools"
+ "WebView-н багц олдсонгүй."
+ "DevTools-г эхлүүлж чадсангүй.""\"Зургийн өнгө\" горим""sRGB-г ашиглах""Идэвхгүй болсон"
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index eef39c433d328..826d6015fc49a 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -113,33 +113,23 @@
"जवळपासचे आवाज अपडेट करता आले नाहीत""अॅक्टिव्ह आहे (फक्त मीडिया). %1$s बॅटरी.""ॲक्टिव्ह आहे (फक्त मीडिया). डावीकडे: %1$s बॅटरी, उजवीकडे: %2$s बॅटरी."
-
-
-
-
-
-
-
-
+ "अतिथी डिव्हाइस. %1$s बॅटरी."
+ "अतिथी डिव्हाइस. डावीकडे: %1$s, उजवीकडे: %2$s बॅटरी."
+ "अतिथी डिव्हाइस (फक्त मीडिया). %1$s बॅटरी."
+ "अतिथी डिव्हाइस (फक्त मीडिया). डावीकडे: %1$s, उजवीकडे: %2$s बॅटरी.""कनेक्ट केले आहे (ऑडिओ शेअरिंगला सपोर्ट करते). %1$s बॅटरी.""कनेक्ट केले आहे (ऑडिओ शेअरिंगला सपोर्ट करते). डावीकडे: %1$s, उजवीकडे: %2$s बॅटरी.""कनेक्ट केले आहे (ऑडिओ शेअरिंगला सपोर्ट करते). डावीकडे: %1$s बॅटरी.""कनेक्ट केले आहे (ऑडिओ शेअरिंगला सपोर्ट करते). उजवीकडे: %1$s बॅटरी.""कनेक्ट केले आहे (ऑडिओ शेअरिंगला सपोर्ट करते)"
-
-
-
-
-
-
+ "अतिथी डिव्हाइस (ऑडिओ शेअरिंगला सपोर्ट करते). %1$s बॅटरी."
+ "अतिथी डिव्हाइस (ऑडिओ शेअरिंगला सपोर्ट करते). डावीकडे: %1$s, उजवीकडे: %2$s बॅटरी."
+ "अतिथी डिव्हाइस (ऑडिओ शेअरिंगला सपोर्ट करते)""अॅक्टिव्ह आहे (फक्त मीडिया)"
-
-
-
-
+ "अतिथी डिव्हाइस"
+ "अतिथी डिव्हाइस (फक्त मीडिया)""ऑडिओ शेअरिंगला सपोर्ट करते"
-
-
+ "अतिथी डिव्हाइस. ऑडिओ शेअरिंगला सपोर्ट करते""अॅक्टिव्ह आहे (फक्त मीडिया), फक्त डावे""अॅक्टिव्ह आहे (फक्त मीडिया), फक्त उजवे""अॅक्टिव्ह आहे (फक्त मीडिया), डावे आणि उजवे"
@@ -396,8 +386,7 @@
"हार्डवेअर अॅक्सिलरेटेड रेंडरिंग""मीडिया""परीक्षण"
-
-
+ "विंडो व्यवस्थापन""कठोर मोड सुरू""मुख्य थ्रेडवर अॅप्स मोठी कार्ये करतात तेव्हा स्क्रीन फ्लॅश करा""पॉइंटर स्थान"
@@ -492,12 +481,9 @@
"वेबदृश्य अंमलबजावणी""वेबदृश्य अंमलबजावणी सेट करा""ही निवड यापुढे वैध असणार नाही. पुन्हा प्रयत्न करा."
-
-
-
-
-
-
+ "WebView DevTools"
+ "WebView पॅकेज आढळले नाही."
+ "DevTools लाँच करता आले नाही.""चित्र रंग मोड""sRGB वापरा""बंद केले"
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index ca4649ccd8883..a2f95628a6a16 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -113,33 +113,23 @@
"Tidak dapat mengemaskinikan persekitaran""Aktif (media sahaja). Bateri %1$s.""Aktif (media sahaja), L: Bateri %1$s, R: Bateri %2$s."
-
-
-
-
-
-
-
-
+ "Peranti tetamu. Bateri %1$s."
+ "Peranti tetamu. L: %1$s, R: Bateri %2$s."
+ "Peranti tetamu (media sahaja). Bateri %1$s."
+ "Peranti tetamu (media sahaja). L: %1$s, R: Bateri %2$s.""Disambungkan (menyokong perkongsian audio). Bateri %1$s.""Disambungkan (menyokong perkongsian audio). L: Bateri %1$s, R: Bateri %2$s.""Disambungkan (menyokong perkongsian audio). Kiri: Bateri %1$s.""Disambungkan (menyokong perkongsian audio). Kanan: Bateri %1$s.""Disambungkan (menyokong perkongsian audio)"
-
-
-
-
-
-
+ "Peranti tetamu (menyokong perkongsian audio). Bateri %1$s."
+ "Peranti tetamu (menyokong perkongsian audio). L: %1$s, R: Bateri %2$s."
+ "Peranti tetamu (menyokong perkongsian audio)""Aktif (media sahaja)"
-
-
-
-
+ "Peranti tetamu"
+ "Peranti tetamu (media sahaja)""Menyokong perkongsian audio"
-
-
+ "Peranti tetamu. Menyokong perkongsian audio""Aktif (media sahaja), kiri sahaja""Aktif (media sahaja), kanan sahaja""Aktif (media sahaja), kiri dan kanan"
@@ -396,8 +386,7 @@
"Pemaparan dipercepat perkakasan""Media""Memantau"
-
-
+ "Pengurusan Tetingkap""Mod tegas didayakan""Kelip skrin apabila apl beroperasi lama pada urutan utama""Lokasi penuding"
@@ -492,12 +481,9 @@
"Pelaksanaan WebView""Tetapkan pelaksanaan WebView""Pilihan ini tidak lagi sah. Cuba lagi."
-
-
-
-
-
-
+ "Alatan Pembangun Paparan Web"
+ "Pakej Paparan Web tidak ditemukan."
+ "Tidak dapat melancarkan Alatan Pembangun.""Mod warna gambar""Gunakan sRGB""Dilumpuhkan"
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 1225e4c3e8a37..b0d86afe9a6c7 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -113,33 +113,23 @@
"ဝန်းကျင်အသံ အပ်ဒိတ်လုပ်၍ မရလိုက်ပါ""အသုံးပြုနေသည် (မီဒီယာသီးသန့်)။ ဘက်ထရီ %1$s။""အသုံးပြုနေသည် (မီဒီယာသီးသန့်)။ ဘက်ထရီ L- %1$s၊ R- %2$s။"
-
-
-
-
-
-
-
-
+ "ဧည့်သည်စက်ပစ္စည်း။ ဘက်ထရီ %1$s။"
+ "ဧည့်သည်စက်ပစ္စည်း။ ဘက်ထရီ L- %1$s၊ R- %2$s။"
+ "ဧည့်သည်စက်ပစ္စည်း (မီဒီယာသီးသန့်)။ ဘက်ထရီ %1$s။"
+ "ဧည့်သည်စက်ပစ္စည်း (မီဒီယာသီးသန့်)။ ဘက်ထရီ L- %1$s၊ R- %2$s။""ချိတ်ဆက်ထားသည် (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)။ ဘက်ထရီ %1$s။""ချိတ်ဆက်ထားသည် (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)။ ဘက်ထရီ L- %1$s၊ R- %2$s။""ချိတ်ဆက်ထားသည် (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)။ ဘယ်- ဘက်ထရီ %1$s။""ချိတ်ဆက်ထားသည် (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)။ ညာ- ဘက်ထရီ %1$s။""ချိတ်ဆက်ထားသည် (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)"
-
-
-
-
-
-
+ "ဧည့်သည်စက်ပစ္စည်း (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)။ ဘက်ထရီ %1$s။"
+ "ဧည့်သည်စက်ပစ္စည်း (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)။ ဘက်ထရီ L- %1$s၊ R- %2$s။"
+ "ဧည့်သည်စက်ပစ္စည်း (အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်)""သုံးနေသည် (မီဒီယာသီးသန့်)"
-
-
-
-
+ "ဧည့်သည်စက်ပစ္စည်း"
+ "ဧည့်သည်စက်ပစ္စည်း (မီဒီယာသီးသန့်)""အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်"
-
-
+ "ဧည့်သည်စက်ပစ္စည်း။ အော်ဒီယို မျှဝေခြင်း ပံ့ပိုးသည်""သုံးနေသည် (မီဒီယာသီးသန့်)၊ ဘယ်သီးသန့်""သုံးနေသည် (မီဒီယာသီးသန့်)၊ ညာသီးသန့်""သုံးနေသည် (မီဒီယာသီးသန့်)၊ ဘယ်နှင့် ညာ"
@@ -396,8 +386,7 @@
"ဟာ့ဒ်ဝဲ အရှိန်မြှင့် ပုံဖော်ခြင်း""မီဒီယာ""စောင့်ကြည့်စစ်ဆေးခြင်း"
-
-
+ "ဝင်းဒိုး စီမံခန့်ခွဲမှု""တင်းကြပ်သောစနစ် ဖွင့်ရန်""အက်ပ်လုပ်ဆောင်မှု ရှည်ကြာလျှင် စကရင်ပြန်စသည်""မြား၏တည်နေရာ"
@@ -492,12 +481,9 @@
"WebView အကောင်အထည်ဖော်မှု""WebView အကောင်အထည်ဖော်မှု သတ်မှတ်ပါ""ဤရွေးချယ်မှု မှန်ကန်မှု မရှိတော့ပါ။ ထပ်စမ်းကြည့်ပါ။"
-
-
-
-
-
-
+ "ဝဘ်မြင်ကွင်း ဆောဖ့်ဝဲတူးလ်များ"
+ "ဝဘ်မြင်ကွင်း ပက်ကေ့ဂျ် မတွေ့ပါ။"
+ "ဆောဖ့်ဝဲတူးလ်များ စတင်၍ မရလိုက်ပါ။""ဓာတ်ပုံအရောင်မုဒ်""sRGB ကို အသုံးပြုပါ""ပိတ်ထားသည်"
@@ -667,7 +653,7 @@
"စီမံခန့်ခွဲသူများ၌ အခြားအသုံးပြုသူများတွင်မရှိသော အထူးဆောင်ရွက်ခွင့်များရှိသည်။ စီမံခန့်ခွဲသူက အသုံးပြုသူအားလုံးကို စီမံခြင်း၊ ဤစက်ပစ္စည်းကို အပ်ဒိတ်လုပ်ခြင်း (သို့) ပြင်ဆင်သတ်မှတ်ခြင်း၊ ဆက်တင်များပြင်ဆင်ခြင်း၊ ထည့်သွင်းထားသောအက်ပ်အားလုံးကို ကြည့်ခြင်းနှင့် အခြားသူများအတွက် စီမံခန့်ခွဲသူ ဆောင်ရွက်ခွင့်များပေးခြင်း (သို့) ရုပ်သိမ်းခြင်းတို့ လုပ်နိုင်သည်။""စီမံခန့်ခွဲသူအဖြစ် သတ်မှတ်ရန်""အသုံးပြုသူကို ယခုသတ်မှတ်မလား။"
- "ထိုသူသည် ကိရိယာကိုယူ၍ ၎င်းတို့၏နေရာများကို ယခုသတ်မှတ်နိုင်ရမည်"
+ "သူသည် ကိရိယာကိုယူ၍ သူ၏နေရာကို ယခုသတ်မှတ်နိုင်ရမည်""ယခု ကိုယ်ရေးအချက်အလက်ကို အစီအမံလုပ်မည်လား?""ယခု သတ်မှတ်ပါမည်""ယခုမလုပ်ပါ"
@@ -679,7 +665,7 @@
"ကန့်သတ်ကိုယ်ရေးအချက်အလက်တစ်ခုကို မပြုလုပ်မီ သင်၏ အပလီကေးရှင်းများနှင့် ကိုယ်ပိုင်အချက်အလက်များကို ကာကွယ်ရန် မျက်နှာပြင်သော့ချခြင်းကို စီမံရန် လိုအပ်လိမ့်မည်""သော့ချရန် သတ်မှတ်ပါ""%s သို့ ပြောင်းရန်"
- "အသုံးပြုသူအသစ် ပြုလုပ်နေသည်…"
+ "အသုံးပြုသူအသစ်အတွက် ပြင်ဆင်နေသည်…""ဧည့်သည်သစ် ပြုလုပ်နေသည်…""အသုံးပြုသူအသစ် ပြုလုပ်၍မရပါ""ဧည့်သည်သစ် ပြုလုပ်၍မရပါ"
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 7c9b10f002678..755df5100e5ab 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -113,33 +113,23 @@
"Kunne ikke oppdatere omgivelsene""Aktiv (bare medieinnhold) %1$s batteri.""Aktiv (bare medieinnhold). V: %1$s batteri, H: %2$s batteri."
-
-
-
-
-
-
-
-
+ "Gjesteenhet. %1$s batteri."
+ "Gjesteenhet. V: %1$s, H: %2$s batteri."
+ "Gjesteenhet (bare medieinnhold). %1$s batteri."
+ "Gjesteenhet (bare medieinnhold). V: %1$s, H: %2$s batteri.""Tilkoblet (støtter lyddeling). %1$s batteri.""Tilkoblet (støtter lyddeling). V: %1$s batteri, H: %2$s batteri.""Tilkoblet (støtter lyddeling). Venstre: %1$s batteri.""Tilkoblet (støtter lyddeling). Høyre: %1$s batteri.""Tilkoblet (støtter lyddeling)"
-
-
-
-
-
-
+ "Gjesteenhet (støtter lyddeling). %1$s batteri."
+ "Gjesteenhet (støtter lyddeling). V: %1$s, H: %2$s batteri."
+ "Gjesteenhet (støtter lyddeling)""Aktiv (bare medieinnhold)"
-
-
-
-
+ "Gjesteenhet"
+ "Gjesteenhet (bare medieinnhold)""Støtter lyddeling"
-
-
+ "Gjesteenhet. Støtter lyddeling""Aktiv (bare medieinnhold), bare venstre""Aktiv (bare medieinnhold), bare høyre""Aktiv (bare medieinnhold), høyre og venstre"
@@ -396,8 +386,7 @@
"Maskinvareakselerert gjengivelse""Medier""Overvåking"
-
-
+ "Vindusadministrering""Slå på streng modus""Skjermblink ved lange apphandlinger på hovedtråd""Pekerplassering"
@@ -492,12 +481,9 @@
"WebView-implementering""Angi WebView-implementering""Dette valget er ikke gyldig lenger. Prøv på nytt."
-
-
-
-
-
-
+ "Utviklerverktøy for WebView"
+ "Fant ikke WebView-pakken."
+ "Kunne ikke starte utviklerverktøyene.""Fargemodus for bilder""Bruk sRGB""Slått av"
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index e2e7a8f48c76f..0a9ac17708961 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -113,33 +113,23 @@
"वरपरका आवाजसम्बन्धी सेटिङ अपडेट गर्न सकिएन""सक्रिय छ (मिडिया मात्र)। %1$s ब्याट्री।""सक्रिय छ (मिडिया मात्र)। बायाँ: %1$s, दायाँ: %2$s ब्याट्री।"
-
-
-
-
-
-
-
-
+ "अतिथि डिभाइस। %1$s ब्याट्री।"
+ "अतिथि डिभाइस। बायाँ: %1$s, दायाँ: %2$s ब्याट्री।"
+ "अतिथि डिभाइस (मिडिया मात्र)। %1$s ब्याट्री।"
+ "अतिथि डिभाइस (मिडिया मात्र)। बायाँ: %1$s, दायाँ: %2$s ब्याट्री।""कनेक्ट गरिएको छ (अडियो सेयर गर्न मिल्छ)। %1$s ब्याट्री।""कनेक्ट गरिएको छ (अडियो सेयर गर्न मिल्छ)। बायाँ: %1$s, दायाँ: %2$s ब्याट्री।""कनेक्ट गरिएको छ (अडियो सेयर गर्न मिल्छ)। बायाँ: %1$s ब्याट्री।""कनेक्ट गरिएको छ (अडियो सेयर गर्न मिल्छ)। दायाँ: %1$s ब्याट्री।""कनेक्ट गरिएको छ (अडियो सेयर गर्न मिल्छ)"
-
-
-
-
-
-
+ "अतिथि डिभाइस (अडियो सेयर गर्ने सुविधा प्रयोग गर्न मिल्छ)। %1$s ब्याट्री।"
+ "अतिथि डिभाइस (अडियो सेयर गर्ने सुविधा प्रयोग गर्न मिल्छ)। बायाँ: %1$s, दायाँ: %2$s ब्याट्री।"
+ "अतिथि डिभाइस (अडियो सेयर गर्ने सुविधा प्रयोग गर्न मिल्छ)""सक्रिय छ (मिडिया मात्र)"
-
-
-
-
+ "अतिथि डिभाइस"
+ "अतिथि डिभाइस (मिडिया मात्र)""अडियो सेयर गर्न मिल्छ"
-
-
+ "अतिथि डिभाइस। अडियो सेयर गर्ने सुविधा प्रयोग गर्न मिल्छ""सक्रिय छ (मिडिया मात्र), बायाँ मात्र""सक्रिय छ (मिडिया मात्र), दायाँ मात्र""सक्रिय छ (मिडिया मात्र), बायाँ र दायाँ"
@@ -396,8 +386,7 @@
"हार्डवेयरले बढाएको रेन्डरिङ""मिडिया""अनुगमन गरिँदै छ"
-
-
+ "विन्डो व्यवस्थापन""स्ट्रिक्ट मोड अन गर्नुहोस्""एपले मुख्य थ्रेडमा लामा गतिविधि गर्दा स्क्रिन फ्ल्यास गर्नुहोस्""पोइन्टरको स्थान"
@@ -492,12 +481,9 @@
"WebView कार्यान्वयन""WebView कार्यान्वयन सेट गर्नुहोस्""यो छनोट अब मान्य छैन। फेरि प्रयास गर्नुहोस्।"
-
-
-
-
-
-
+ "WebView सम्बन्धी विकासकर्ता टुलहरू"
+ "WebView प्याकेज भेटिएन।"
+ "विकासकर्ताका टुलहरू लन्च गर्न सकिएन।""चित्र रङ्ग मोड""sRGB प्रयोग गर्नुहोस्""अफ गरिएको छ"
@@ -678,7 +664,7 @@
"प्रोफाइलको जानकारी""निषेधयुक्त प्रोफाइल बनाउनु अघि तपाईँको एप र व्यक्तिगत डेटा सुरक्षा गर्नाका लागि तपाईँले स्क्रिन लक सेटअप गर्नु पर्दछ ।""लक सेट गर्नुहोस्"
- "प्रयोगकर्ता बदलेर %s बनाउनुहोस्"
+ "%s प्रयोग गर्नुहोस्""नयाँ प्रयोगकर्ता बनाइँदै छ…""नयाँ अतिथि बनाइँदै छ…""नयाँ प्रयोगकर्ता सिर्जना गर्न सकिएन"
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 6dfcc7b0b40cd..f71f3abfaf2b5 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -113,33 +113,23 @@
"Kan omgeving niet updaten""Actief (alleen media). Batterijniveau %1$s.""Actief (alleen media), L: batterijniveau %1$s, R: batterijniveau %2$s."
-
-
-
-
-
-
-
-
+ "Gastapparaat. Batterijniveau %1$s."
+ "Gastapparaat. L: batterijniveau %1$s, R: batterijniveau %2$s."
+ "Gastapparaat (alleen media). Batterijniveau %1$s."
+ "Gastapparaat (alleen media). L: batterijniveau %1$s, R: batterijniveau %2$s.""Verbonden (ondersteunt audio delen), batterijniveau %1$s.""Verbonden (ondersteunt audio delen), L: batterijniveau %1$s, R: batterijniveau %2$s.""Verbonden (ondersteunt audio delen). Links: batterijniveau %1$s.""Verbonden (ondersteunt audio delen). Rechts: batterijniveau %1$s.""Verbonden (ondersteunt audio delen)"
-
-
-
-
-
-
+ "Gastapparaat (ondersteunt audio delen). Batterijniveau %1$s."
+ "Gastapparaat (ondersteunt audio delen). L: batterijniveau %1$s, R: batterijniveau %2$s."
+ "Gastapparaat (ondersteunt audio delen)""Actief (alleen media)"
-
-
-
-
+ "Gastapparaat"
+ "Gastapparaat (alleen media)""Ondersteunt audio delen"
-
-
+ "Gastapparaat. Ondersteunt audio delen.""Actief (alleen media), alleen links""Actief (alleen media), alleen rechts""Actief (alleen media), links en rechts"
@@ -396,8 +386,7 @@
"Rendering met hardwareversnelling""Media""Controle"
-
-
+ "Vensterbeheer""Strikte modus staat aan""Knipperend scherm bij lange bewerkingen door apps""Cursorlocatie"
@@ -492,12 +481,9 @@
"WebView-implementatie""WebView-implementatie instellen""Deze keuze is niet meer geldig. Probeer het opnieuw."
-
-
-
-
-
-
+ "WebView DevTools"
+ "WebView-pakket niet gevonden."
+ "Kan DevTools niet starten.""Kleurenmodus voor afbeeldingen""sRGB gebruiken""Uitgezet"
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index 44c819cbb9b8b..f30ae3d94d421 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -113,33 +113,23 @@
"ପରିପାର୍ଶ୍ୱକୁ ଅପଡେଟ କରାଯାଇପାରିଲା ନାହିଁ""ସକ୍ରିୟ (କେବଳ ମିଡିଆ)। %1$s ବେଟେରୀ।""ସକ୍ରିୟ (କେବଳ ମିଡିଆ)। ବାମ: %1$s, ଡାହାଣ: %2$s ବେଟେରୀ।"
-
-
-
-
-
-
-
-
+ "ଅତିଥି ଡିଭାଇସ। %1$s ବେଟେରୀ।"
+ "ଅତିଥି ଡିଭାଇସ। ବାମ: %1$s, ଡାହାଣ: %2$s ବେଟେରୀ।"
+ "ଅତିଥି ଡିଭାଇସ (କେବଳ ମିଡିଆ)। %1$s ବେଟେରୀ।"
+ "ଅତିଥି ଡିଭାଇସ (କେବଳ ମିଡିଆ)। ବାମ: %1$s, ଡାହାଣ: %2$s ବେଟେରୀ।""କନେକ୍ଟ କରାଯାଇଛି (ଅଡିଓ ସେୟାରିଂକୁ ସପୋର୍ଟ କରେ)। %1$s ବେଟେରୀ।""କନେକ୍ଟ କରାଯାଇଛି (ଅଡିଓ ସେୟାରିଂକୁ ସମର୍ଥନ କରେ)। ବାମ: %1$s, ଡାହାଣ: %2$s ବେଟେରୀ।""କନେକ୍ଟ କରାଯାଇଛି (ଅଡିଓ ସେୟାରିଂକୁ ସମର୍ଥନ କରେ)। ବାମ: %1$s ବେଟେରୀ।""କନେକ୍ଟ କରାଯାଇଛି (ଅଡିଓ ସେୟାରିଂକୁ ସପୋର୍ଟ କରେ)। ଡାହାଣ: %1$s ବେଟେରୀ।""କନେକ୍ଟ କରାଯାଇଛି (ଅଡିଓ ସେୟାରିଂକୁ ସମର୍ଥନ କରେ)"
-
-
-
-
-
-
+ "ଅତିଥି ଡିଭାଇସ (ଅଡିଓ ସେୟାରିଂକୁ ସପୋର୍ଟ କରେ)। %1$s ବେଟେରୀ।"
+ "ଅତିଥି ଡିଭାଇସ (ଅଡିଓ ସେୟାରିଂକୁ ସପୋର୍ଟ କରେ)। ବାମ: %1$s, ଡାହାଣ: %2$s ବେଟେରୀ।"
+ "ଅତିଥି ଡିଭାଇସ (ଅଡିଓ ସେୟାରିଂକୁ ସପୋର୍ଟ କରେ)""ସକ୍ରିୟ (କେବଳ ମିଡିଆ)"
-
-
-
-
+ "ଅତିଥି ଡିଭାଇସ"
+ "ଅତିଥି ଡିଭାଇସ (କେବଳ ମିଡିଆ)""ଅଡିଓ ସେୟାରିଂକୁ ସପୋର୍ଟ କରେ"
-
-
+ "ଅତିଥି ଡିଭାଇସ। ଅଡିଓ ସେୟାରିଂକୁ ସପୋର୍ଟ କରେ""ସକ୍ରିୟ (କେବଳ ମିଡିଆ), କେବଳ ବାମ""ସକ୍ରିୟ (କେବଳ ମିଡିଆ), କେବଳ ଡାହାଣ""ସକ୍ରିୟ (କେବଳ ମିଡିଆ), ବାମ ଏବଂ ଡାହାଣ"
@@ -396,8 +386,7 @@
"ହାର୍ଡୱେର୍ ଆକ୍ସଲରେଟେଡ୍ ରେଣ୍ଡରିଙ୍ଗ""ମିଡିଆ""ମନିଟରିଙ୍ଗ"
-
-
+ "ୱିଣ୍ଡୋ ପରିଚାଳନା""କଡ଼ା ମୋଡ୍ ସକ୍ଷମ କରାଯାଇଛି""ମୁଖ୍ୟ ଥ୍ରେଡ୍ରେ ଆପ୍ ଦୀର୍ଘ ସମୟ କାର୍ଯ୍ୟ କଲେ ସ୍କ୍ରୀନ୍ ଫ୍ଲାଶ୍ କରନ୍ତୁ""ପଏଣ୍ଟର୍ ଲୋକେସନ୍"
@@ -492,12 +481,9 @@
"ୱେବ୍ଭ୍ୟୁ ପ୍ରୟୋଗ""WebView କାର୍ଯ୍ୟକାରିତାକୁ ସେଟ୍ କରନ୍ତୁ""ଏହି ପସନ୍ଦ ଆଉ ମାନ୍ୟ ନାହିଁ। ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"
-
-
-
-
-
-
+ "WebView DevTools"
+ "WebView ମିଳିଲା ନାହିଁ।"
+ "DevTools ଲଞ୍ଚ କରାଯାଇପାରିଲା ନାହିଁ।""ପିକ୍ଚର୍ ରଙ୍ଗ ମୋଡ୍""sRGB ବ୍ୟବହାର କରନ୍ତୁ""ଅକ୍ଷମ ହୋଇଛି"
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 731c195065af3..2c2eab2fa8713 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -113,33 +113,23 @@
"ਆਲੇ-ਦੁਆਲੇ ਨੂੰ ਅੱਪਡੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ""ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਮੀਡੀਆ)। %1$s ਬੈਟਰੀ।""ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਮੀਡੀਆ)। ਖੱਬੇ ਪਾਸੇ: %1$s, ਸੱਜੇ ਪਾਸੇ: %2$s ਬੈਟਰੀ।"
-
-
-
-
-
-
-
-
+ "ਮਹਿਮਾਨ ਡੀਵਾਈਸ। %1$s ਬੈਟਰੀ।"
+ "ਮਹਿਮਾਨ ਡੀਵਾਈਸ। ਖੱਬੇ ਪਾਸੇ: %1$s, ਸੱਜੇ ਪਾਸੇ: %2$s ਬੈਟਰੀ।"
+ "ਮਹਿਮਾਨ ਡੀਵਾਈਸ (ਸਿਰਫ਼ ਮੀਡੀਆ)। %1$s ਬੈਟਰੀ।"
+ "ਮਹਿਮਾਨ ਡੀਵਾਈਸ (ਸਿਰਫ਼ ਮੀਡੀਆ)। ਖੱਬੇ ਪਾਸੇ: %1$s, ਸੱਜੇ ਪਾਸੇ: %2$s ਬੈਟਰੀ।""ਕਨੈਕਟ ਕੀਤਾ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ)। %1$s ਬੈਟਰੀ।""ਕਨੈਕਟ ਕੀਤਾ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ)। ਖੱਬੇ ਪਾਸੇ: %1$s, ਸੱਜੇ ਪਾਸੇ: %2$s ਬੈਟਰੀ।""ਕਨੈਕਟ ਕੀਤਾ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ)। ਖੱਬੇ ਪਾਸੇ: %1$s ਬੈਟਰੀ।""ਕਨੈਕਟ ਕੀਤਾ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ)। ਸੱਜੇ ਪਾਸੇ: %1$s ਬੈਟਰੀ।""ਕਨੈਕਟ ਕੀਤਾ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ)"
-
-
-
-
-
-
+ "ਮਹਿਮਾਨ ਡੀਵਾਈਸ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ)। %1$s ਬੈਟਰੀ।"
+ "ਮਹਿਮਾਨ ਡੀਵਾਈਸ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ)। ਖੱਬੇ ਪਾਸੇ: %1$s, ਸੱਜੇ ਪਾਸੇ: %2$s ਬੈਟਰੀ।"
+ "ਮਹਿਮਾਨ ਡੀਵਾਈਸ (ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ)""ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਮੀਡੀਆ)"
-
-
-
-
+ "ਮਹਿਮਾਨ ਡੀਵਾਈਸ"
+ "ਮਹਿਮਾਨ ਡੀਵਾਈਸ (ਸਿਰਫ਼ ਮੀਡੀਆ)""ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ"
-
-
+ "ਮਹਿਮਾਨ ਡੀਵਾਈਸ। ਆਡੀਓ ਸਾਂਝਾਕਰਨ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ""ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਮੀਡੀਆ), ਸਿਰਫ਼ ਖੱਬਾ""ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਮੀਡੀਆ), ਸਿਰਫ਼ ਸੱਜਾ""ਕਿਰਿਆਸ਼ੀਲ (ਸਿਰਫ਼ ਮੀਡੀਆ), ਖੱਬਾ ਅਤੇ ਸੱਜਾ"
@@ -396,8 +386,7 @@
"ਹਾਰਡਵੇਅਰ ਐਕਸੈੱਲਰੇਟਿਡ ਰੈਂਡਰਿੰਗ""ਮੀਡੀਆ""ਨਿਰੀਖਣ ਕਰਨਾ"
-
-
+ "ਵਿੰਡੋ ਪ੍ਰਬੰਧਨ""ਸਟ੍ਰਿਕਟ ਮੋਡ ਚਾਲੂ ਹੈ""ਐਪਾਂ ਵੱਲੋਂ ਮੁੱਖ ਥ੍ਰੈੱਡ \'ਤੇ ਲੰਬੀਆਂ ਕਾਰਵਾਈਆਂ ਕਰਨ \'ਤੇ ਸਕ੍ਰੀਨ ਫਲੈਸ਼ ਕਰੋ""ਪੁਆਇੰਟਰ ਟਿਕਾਣਾ"
@@ -492,12 +481,9 @@
"WebView ਅਮਲੀਕਰਨ""WebView ਅਮਲੀਕਰਨ ਸੈੱਟ ਕਰੋ""ਇਹ ਚੋਣ ਹੁਣ ਵੈਧ ਨਹੀਂ ਹੈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"
-
-
-
-
-
-
+ "WebView DevTools"
+ "WebView ਪੈਕੇਜ ਨਹੀਂ ਮਿਲਿਆ।"
+ "DevTools ਨੂੰ ਲਾਂਚ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।""ਤਸਵੀਰ ਰੰਗ ਮੋਡ""sRGB ਵਰਤੋਂ ਕਰੋ""ਬੰਦ ਹੈ"
@@ -666,8 +652,8 @@
"ਕੀ ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਪ੍ਰਸ਼ਾਸਕ ਬਣਾਉਣਾ ਹੈ?""ਪ੍ਰਸ਼ਾਸਕਾਂ ਕੋਲ ਵਿਸ਼ੇਸ਼ ਅਧਿਕਾਰ ਹੁੰਦੇ ਹਨ ਜੋ ਹੋਰ ਵਰਤੋਂਕਾਰਾਂ ਕੋਲ ਨਹੀਂ ਹੁੰਦੇ। ਇੱਕ ਪ੍ਰਸ਼ਾਸਕ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ, ਇਸ ਡੀਵਾਈਸ ਨੂੰ ਅੱਪਡੇਟ ਜਾਂ ਰੀਸੈੱਟ ਕਰ ਸਕਦਾ ਹੈ, ਸੈਟਿੰਗਾਂ ਨੂੰ ਸੋਧ ਸਕਦਾ ਹੈ, ਸਾਰੀਆਂ ਸਥਾਪਤ ਐਪਾਂ ਨੂੰ ਦੇਖ ਸਕਦਾ ਹੈ, ਅਤੇ ਦੂਜਿਆਂ ਲਈ ਪ੍ਰਸ਼ਾਸਕ ਦੇ ਅਧਿਕਾਰਾਂ ਨੂੰ ਮਨਜ਼ੂਰ ਜਾਂ ਰੱਦ ਕਰ ਸਕਦਾ ਹੈ।""ਪ੍ਰਸ਼ਾਸਕ ਬਣਾਓ"
- "ਕੀ ਹੁਣ ਵਰਤੋਂਕਾਰ ਸੈੱਟ ਅੱਪ ਕਰਨਾ ਹੈ?"
- "ਇਹ ਪੱਕਾ ਕਰੋ ਕਿ ਵਿਅਕਤੀ ਡੀਵਾਈਸ ਵਰਤਣ ਅਤੇ ਆਪਣੀ ਜਗ੍ਹਾ ਦੇ ਸੈੱਟ ਅੱਪ ਲਈ ਉਪਲਬਧ ਹੈ"
+ "ਕੀ ਹੁਣ ਵਰਤੋਂਕਾਰ ਸੈੱਟਅੱਪ ਕਰਨਾ ਹੈ?"
+ "ਇਹ ਪੱਕਾ ਕਰੋ ਕਿ ਵਿਅਕਤੀ ਡੀਵਾਈਸ ਵਰਤਣ ਅਤੇ ਆਪਣੀ ਜਗ੍ਹਾ ਦੇ ਸੈੱਟਅੱਪ ਲਈ ਉਪਲਬਧ ਹੈ""ਕੀ ਹੁਣ ਪ੍ਰੋਫਾਈਲ ਸੈੱਟ ਅੱਪ ਕਰਨੀ ਹੈ?""ਹੁਣੇ ਸੈੱਟ ਅੱਪ ਕਰੋ""ਅਜੇ ਨਹੀਂ"
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index b9adae26df7e1..79be6b314ef87 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -113,33 +113,23 @@
"Nie udało się zaktualizować otoczenia""Aktywne (tylko multimedia). %1$s naładowania baterii.""Aktywne (tylko multimedia), lewa: %1$s, prawa: %2$s naładowania baterii."
-
-
-
-
-
-
-
-
+ "Urządzenie gościa. %1$s naładowania baterii."
+ "Urządzenie gościa. Lewa: %1$s, prawa: %2$s naładowania baterii."
+ "Urządzenie gościa (tylko multimedia). %1$s naładowania baterii."
+ "Urządzenie gościa (tylko multimedia). Lewa: %1$s, prawa: %2$s naładowania baterii.""Połączone (obsługa udostępniania dźwięku), %1$s naładowania baterii.""Połączone (obsługa udostępniania dźwięku), lewa: %1$s, prawa: %2$s naładowania baterii.""Połączone (obsługa udostępniania dźwięku). Lewa: %1$s naładowania baterii.""Połączone (obsługa udostępniania dźwięku). Prawa: %1$s naładowania baterii.""Połączone (obsługa udostępniania dźwięku)"
-
-
-
-
-
-
+ "Urządzenie gościa (obsługuje udostępnianie dźwięku). %1$s naładowania baterii."
+ "Urządzenie gościa (obsługuje udostępnianie dźwięku). Lewa: %1$s, prawa: %2$s naładowania baterii."
+ "Urządzenie gościa (obsługuje udostępnianie dźwięku)""Aktywne (tylko multimedia)"
-
-
-
-
+ "Urządzenie gościa"
+ "Urządzenie gościa (tylko multimedia)""Obsługa udostępniania dźwięku"
-
-
+ "Urządzenie gościa. Obsługuje udostępnianie dźwięku""Aktywne (tylko multimedia), tylko lewa""Aktywne (tylko multimedia), tylko prawa""Aktywne (tylko multimedia), lewa i prawa"
@@ -396,8 +386,7 @@
"Sprzętowa akceleracja renderowania""Multimedia""Monitorowanie"
-
-
+ "Zarządzanie oknami""Tryb ścisły włączony""Miganie ekranu podczas długich operacji w wątku głównym""Lokalizacja wskaźnika"
@@ -492,12 +481,9 @@
"Implementacja WebView""Ustaw implementację WebView""Ta opcja nie jest już obsługiwana. Spróbuj ponownie."
-
-
-
-
-
-
+ "Narzędzia deweloperskie WebView"
+ "Nie znaleziono pakietu WebView."
+ "Nie udało się uruchomić Narzędzi deweloperskich.""Tryb kolorów obrazu""Użyj sRGB""Wyłączone"
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 5b3bb0600eb9d..e16e3557dc38f 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -113,33 +113,23 @@
"Não foi possível atualizar o som ambiente""Ativo (apenas mídia). %1$s de bateria.""Ativo (apenas mídia). Lado esquerdo: %1$s de bateria. Lado direito: %2$s de bateria."
-
-
-
-
-
-
-
-
+ "Dispositivo convidado. %1$s de bateria."
+ "Dispositivo convidado. Lado esquerdo: %1$s de bateria. Lado direito: %2$s de bateria."
+ "Dispositivo convidado (somente mídia). %1$s de bateria."
+ "Dispositivo convidado (somente mídia). Lado esquerdo: %1$s de bateria. Lado direito: %2$s de bateria.""Conectado (aceita compartilhamento de áudio). %1$s de bateria.""Conectado (aceita compartilhamento de áudio). Lado esquerdo: %1$s de bateria. Lado direito: %2$s de bateria.""Conectado (aceita compartilhamento de áudio). Lado esquerdo: %1$s de bateria.""Conectado (aceita compartilhamento de áudio). Lado direito: %1$s de bateria.""Conectado (aceita compartilhamento de áudio)"
-
-
-
-
-
-
+ "Dispositivo convidado (aceita compartilhamento de áudio). %1$s de bateria."
+ "Dispositivo convidado (aceita compartilhamento de áudio). Lado esquerdo: %1$s de bateria. Lado direito: %2$s de bateria."
+ "Dispositivo convidado (aceita compartilhamento de áudio)""Ativo (apenas mídia)"
-
-
-
-
+ "Dispositivo convidado"
+ "Dispositivo convidado (somente mídia)""Com suporte ao compartilhamento de áudio"
-
-
+ "Dispositivo convidado. Aceita compartilhamento de áudio""Ativo (apenas mídia), apenas esquerdo""Ativo (apenas mídia), somente direito""Ativo (apenas mídia), esquerdo e direito"
@@ -396,8 +386,7 @@
"Renderização acelerada por hardware""Mídia""Monitoramento"
-
-
+ "Gerenciamento de janelas""Modo restrito ativado""Piscar tela se apps demorarem no processo principal""Localização do cursor"
@@ -492,12 +481,9 @@
"Implementação do WebView""Configurar implementação do WebView""Esta opção não é mais válida. Tente novamente."
-
-
-
-
-
-
+ "DevTools do WebView"
+ "O pacote WebView não foi encontrado."
+ "Não foi possível abrir o DevTools.""Modo de cor da imagem""Usar sRGB""Desativado"
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index e6b343ab94572..e4381d6131e78 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -113,33 +113,23 @@
"Não foi possível atualizar o ambiente""Ativo (apenas para multimédia). %1$s de bateria.""Ativo (apenas para multimédia). E: %1$s de bateria. D: %2$s de bateria."
-
-
-
-
-
-
-
-
+ "Dispositivo convidado. %1$s de bateria."
+ "Dispositivo convidado. E: %1$s. D: %2$s de bateria."
+ "Dispositivo convidado (apenas para multimédia). %1$s de bateria."
+ "Dispositivo convidado (apenas para multimédia). E: %1$s. D: %2$s de bateria.""Ligado (suporta partilha de áudio). %1$s de bateria.""Ligado (suporta partilha de áudio). E: %1$s de bateria. D: %2$s de bateria.""Ligado (suporta a partilha de áudio). Esquerdo: %1$s de bateria.""Ligado (suporta a partilha de áudio). Direito: %1$s de bateria.""Ligado (suporta a partilha de áudio)"
-
-
-
-
-
-
+ "Dispositivo convidado (compatível com partilha de áudio). %1$s de bateria."
+ "Dispositivo convidado (compatível com partilha de áudio). E: %1$s. D: %2$s de bateria."
+ "Dispositivo convidado (compatível com partilha de áudio)""Ativo (apenas para multimédia)"
-
-
-
-
+ "Dispositivo convidado"
+ "Dispositivo convidado (apenas para multimédia)""Suporta partilha de áudio"
-
-
+ "Dispositivo convidado. Compatível com partilha de áudio""Ativo (apenas para multimédia), apenas esquerdo""Ativo (apenas para multimédia), apenas direito""Ativo (apenas para multimédia), esquerdo e direito"
@@ -149,7 +139,7 @@
"Dispositivo de entrada""Acesso à internet""Acesso a contactos e histórico de chamadas"
- "As informações são usadas para anúncios por chamadas e outros"
+ "As informações são usadas para anunciar chamadas e outros""Partilha da ligação à internet""Mensagens de texto""Acesso ao SIM"
@@ -396,8 +386,7 @@
"Conversão acelerada de hardware""Multimédia""Monitorização"
-
-
+ "Gestão de janelas""Modo rigoroso ativado""Piscar ecrã se app fazem oper. prolong. no tópico princ.""Localização do ponteiro"
@@ -492,12 +481,9 @@
"Implementação WebView""Definir implementação WebView""Esta opção já não é válida. Tente novamente."
-
-
-
-
-
-
+ "DevTools do WebView"
+ "Pacote WebView não encontrado."
+ "Não foi possível iniciar as DevTools.""Modo de cor da imagem""Usar sRGB""Desativado"
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 5b3bb0600eb9d..e16e3557dc38f 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -113,33 +113,23 @@
"Não foi possível atualizar o som ambiente""Ativo (apenas mídia). %1$s de bateria.""Ativo (apenas mídia). Lado esquerdo: %1$s de bateria. Lado direito: %2$s de bateria."
-
-
-
-
-
-
-
-
+ "Dispositivo convidado. %1$s de bateria."
+ "Dispositivo convidado. Lado esquerdo: %1$s de bateria. Lado direito: %2$s de bateria."
+ "Dispositivo convidado (somente mídia). %1$s de bateria."
+ "Dispositivo convidado (somente mídia). Lado esquerdo: %1$s de bateria. Lado direito: %2$s de bateria.""Conectado (aceita compartilhamento de áudio). %1$s de bateria.""Conectado (aceita compartilhamento de áudio). Lado esquerdo: %1$s de bateria. Lado direito: %2$s de bateria.""Conectado (aceita compartilhamento de áudio). Lado esquerdo: %1$s de bateria.""Conectado (aceita compartilhamento de áudio). Lado direito: %1$s de bateria.""Conectado (aceita compartilhamento de áudio)"
-
-
-
-
-
-
+ "Dispositivo convidado (aceita compartilhamento de áudio). %1$s de bateria."
+ "Dispositivo convidado (aceita compartilhamento de áudio). Lado esquerdo: %1$s de bateria. Lado direito: %2$s de bateria."
+ "Dispositivo convidado (aceita compartilhamento de áudio)""Ativo (apenas mídia)"
-
-
-
-
+ "Dispositivo convidado"
+ "Dispositivo convidado (somente mídia)""Com suporte ao compartilhamento de áudio"
-
-
+ "Dispositivo convidado. Aceita compartilhamento de áudio""Ativo (apenas mídia), apenas esquerdo""Ativo (apenas mídia), somente direito""Ativo (apenas mídia), esquerdo e direito"
@@ -396,8 +386,7 @@
"Renderização acelerada por hardware""Mídia""Monitoramento"
-
-
+ "Gerenciamento de janelas""Modo restrito ativado""Piscar tela se apps demorarem no processo principal""Localização do cursor"
@@ -492,12 +481,9 @@
"Implementação do WebView""Configurar implementação do WebView""Esta opção não é mais válida. Tente novamente."
-
-
-
-
-
-
+ "DevTools do WebView"
+ "O pacote WebView não foi encontrado."
+ "Não foi possível abrir o DevTools.""Modo de cor da imagem""Usar sRGB""Desativado"
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 13c9032603ca3..83a6e68b36b4f 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -113,33 +113,23 @@
"Nu s-a putut actualiza zona din jur""Activ (numai pentru conținut media). Nivelul bateriei %1$s.""Activ (numai pentru conținut media): nivelul bateriei din stânga: %1$s, nivelul bateriei din dreapta: %2$s"
-
-
-
-
-
-
-
-
+ "Dispozitiv invitat. Nivelul bateriei: %1$s."
+ "Dispozitiv invitat. Nivelul bateriei din stânga: %1$s, dreapta: %2$s."
+ "Dispozitiv invitat (numai pentru conținut media). Nivelul bateriei: %1$s."
+ "Dispozitiv invitat (numai pentru conținut media). Nivelul bateriei din stânga: %1$s, dreapta: %2$s.""Conectat (acceptă permiterea accesului la audio). Nivelul bateriei: %1$s.""Conectat (acceptă permiterea accesului la audio), nivelul bateriei din stânga: %1$s, nivelul bateriei din dreapta: %2$s""Conectat (acceptă permiterea accesului la audio). Nivelul bateriei din stânga: %1$s""Conectat (acceptă permiterea accesului la audio). Nivelul bateriei din dreapta: %1$s""Conectat (acceptă permiterea accesului la audio)"
-
-
-
-
-
-
+ "Dispozitiv invitat (acceptă permiterea accesului la audio). Nivelul bateriei: %1$s."
+ "Dispozitiv invitat (acceptă permiterea accesului la audio). Nivelul bateriei din stânga: %1$s, dreapta: %2$s."
+ "Dispozitiv invitat (acceptă permiterea accesului la audio)""Activ (numai pentru conținut media)"
-
-
-
-
+ "Dispozitiv invitat"
+ "Dispozitiv invitat (numai pentru conținut media)""Acceptă permiterea accesului la audio"
-
-
+ "Dispozitiv invitat. Acceptă permiterea accesului la audio""Activ (numai pentru conținut media), numai stânga""Activ (numai pentru conținut media), numai dreapta""Activ (numai pentru conținut media), stânga și dreapta"
@@ -396,8 +386,7 @@
"Redare accelerată hardware""Media""Monitorizare"
-
-
+ "Gestionarea ferestrelor""Modul Strict activat""Iluminare intermitentă la operații lungi pe firul principal""Locația indicatorului"
@@ -492,12 +481,9 @@
"Implementare WebView""Setează implementarea WebView""Această opțiune nu mai este validă. Încearcă din nou."
-
-
-
-
-
-
+ "DevTools WebView"
+ "Pachetul WebView nu a fost găsit."
+ "Nu s-a putut lansa DevTools.""Modul de culori pentru imagini""Folosește sRGB""Dezactivat"
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index 831623d6c80b5..1ed7c3623acc2 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -113,33 +113,23 @@
"Не удалось отрегулировать окружающие звуки.""Используется (только для медиа), заряд: %1$s.""Используется (только для медиа), заряд: %1$s (Л), %2$s (П)."
-
-
-
-
-
-
-
-
+ "Гостевое устройство. Заряд батареи: %1$s."
+ "Гостевое устройство. Заряд батареи: %1$s (Л), %2$s (П)."
+ "Гостевое устройство (только медиафайлы). Заряд батареи: %1$s."
+ "Гостевое устройство (только медиафайлы). Заряд батареи: %1$s (Л), %2$s (П).""Подключено (поддерживается отправка аудио), заряд: %1$s.""Подключено (поддерживается отправка аудио), заряд: %1$s (Л), %2$s (П).""Подключено (поддерживается отправка аудио), заряд: %1$s (Л).""Подключено (поддерживается отправка аудио), заряд: %1$s (П).""Подключено (поддерживается отправка аудио)."
-
-
-
-
-
-
+ "Гостевое устройство (поддерживает передачу аудио). Заряд батареи: %1$s."
+ "Гостевое устройство (поддерживает передачу аудио). Заряд батареи: %1$s (Л), %2$s (П)."
+ "Гостевое устройство (поддерживает передачу аудио)""Используется (только для медиа)"
-
-
-
-
+ "Гостевое устройство"
+ "Гостевое устройство (только медиафайлы)""Поддерживается отправка аудио"
-
-
+ "Гостевое устройство. Поддерживает передачу аудио.""Используется (только для медиа), только левый""Используется (только для медиа), правый наушник""Используется (только для медиа), левый и правый наушники"
@@ -396,8 +386,7 @@
"Аппаратное ускорение отрисовки""Мультимедиа""Мониторинг"
-
-
+ "Управление окнами""Строгий режим""Подсвечивать экран во время длительных операций""Место касания"
@@ -492,12 +481,9 @@
"Сервис WebView""Настройки сервиса WebView""Вариант недействителен. Повторите попытку."
-
-
-
-
-
-
+ "Инструменты разработчика от поставщика WebView"
+ "Пакет WebView не найден."
+ "Не удалось запустить инструменты разработчика.""Цветовой режим""Использовать sRGB""Отключено"
@@ -508,7 +494,7 @@
"Коррекция цвета""Используйте коррекцию цвета, чтобы:<br/> <ol> <li> Добиться нужной цветопередачи.</li> <li> Убрать цвета, которые мешают сосредоточиться.</li> </ol>""Новая настройка: %1$s"
- "Уровень заряда – %1$s. %2$s."
+ "%1$s - %2$s""%1$s, зарядка приостановлена для защиты батареи""%1$s, проверьте зарядное устройство""Заряда хватит примерно на %1$s"
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index dcfb914b6c863..dffa392c79479 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -113,33 +113,23 @@
"වටපිටාව යාවත්කාලීන කළ නොහැකි විය""ක්රියාත්මකයි (මාධ්ය පමණයි). බැටරිය %1$s.""ක්රියාත්මකයි (මාධ්ය පමණයි), බැටරිය ව: %1$s, ද: %2$s."
-
-
-
-
-
-
-
-
+ "ආගන්තුක උපාංගය. බැටරිය %1$s."
+ "ආගන්තුක උපාංගය. බැටරිය ව: %1$s, ද: %2$s."
+ "ආගන්තුක උපාංගය (මාධ්ය පමණි). බැටරිය %1$s."
+ "ආගන්තුක උපාංගය (මාධ්ය පමණි). බැටරිය ව: %1$s, ද: %2$s.""සම්බන්ධයි (ශ්රව්ය බෙදා ගැනීමට සහය දක්වයි). බැටරිය %1$s.""සම්බන්ධයි (ශ්රව්ය බෙදා ගැනීමට සහය දක්වයි). බැටරිය ව: %1$s, ද: %2$s.""සම්බන්ධයි (ශ්රව්ය බෙදා ගැනීමට සහය දක්වයි). වම: බැටරිය %1$s.""සම්බන්ධයි (ශ්රව්ය බෙදා ගැනීමට සහය දක්වයි). දකුණ: බැටරිය %1$s.""සම්බන්ධයි (ශ්රව්ය බෙදා ගැනීමට සහය දක්වයි)"
-
-
-
-
-
-
+ "ආගන්තුක උපාංගය (ශ්රව්ය බෙදා ගැනීම සඳහා සහය දක්වයි). බැටරිය %1$s."
+ "ආගන්තුක උපාංගය (ශ්රව්ය බෙදා ගැනීම සඳහා සහය දක්වයි). බැටරිය ව: %1$s, ද: %2$s."
+ "ආගන්තුක උපාංගය (ශ්රව්ය බෙදා ගැනීම සඳහා සහය දක්වයි)""සක්රිය (මාධ්ය පමණි)"
-
-
-
-
+ "ආගන්තුක උපාංගය"
+ "ආගන්තුක උපාංගය (මාධ්ය පමණි)""ශ්රව්ය බෙදා ගැනීම සහය දක්වයි"
-
-
+ "ආගන්තුක උපාංගය. ශ්රව්ය බෙදා ගැනීම සහය දක්වයි""සක්රිය (මාධ්ය පමණි), වම පමණි""සක්රිය (මාධ්ය පමණි), දකුණ පමණි""සක්රිය (මාධ්ය පමණි), වම සහ දකුණ"
@@ -396,8 +386,7 @@
"දෘඩාංග වේගය වැඩි කළ පිරිනැමීම""මාධ්ය""නිරීක්ෂණය"
-
-
+ "කවුළු කළමනාකරණය""තදබල ආකාරය සබල කිරීම""මූලික පොටේ යෙදුම්, දිගු මෙහෙයුම් කරන විට තිරය ෆ්ලෑෂ් කරන්න""සූචක පිහිටීම"
@@ -492,12 +481,9 @@
"WebView ක්රියාත්මක කිරීම""WebView ක්රියාත්මක කිරීම සකසන්න""මෙම තෝරා ගැනීම තව දුරටත් වලංගු නැත. නැවත උත්සාහ කරන්න."
-
-
-
-
-
-
+ "WebView DevTools"
+ "WebView පැකේජය හමු නොවුණි."
+ "DevTools දියත් කිරීමට නොහැකි විය.""පින්තූර වර්ණ ප්රකාරය""sRGB භාවිතා කරන්න""අබලයි"
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 86e827438e795..0f4297aec6adc 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -113,33 +113,23 @@
"Okolie sa nepodarilo aktualizovať""Aktívne (iba médiá). %1$s batérie.""Aktívne (iba médiá). Ľ: %1$s batérie, P: %2$s batérie."
-
-
-
-
-
-
-
-
+ "Zariadenie hosťa. %1$s batérie."
+ "Zariadenie hosťa. Ľ: %1$s, P: %2$s batérie."
+ "Zariadenie hosťa (iba médiá). %1$s batérie."
+ "Zariadenie hosťa (iba médiá). Ľ: %1$s, P: %2$s batérie.""Pripojené (podporuje zdieľanie zvuku). %1$s batérie.""Pripojené (podporuje zdieľanie zvuku). Ľ: %1$s, P: %2$s batérie.""Pripojené (podporuje zdieľanie zvuku). Ľavá strana: %1$s batérie.""Pripojené (podporuje zdieľanie zvuku). Pravá strana: %1$s batérie.""Pripojené (podporuje zdieľanie zvuku)"
-
-
-
-
-
-
+ "Zariadenie hosťa (podporuje zdieľanie zvuku). %1$s batérie."
+ "Zariadenie hosťa (podporuje zdieľanie zvuku). Ľ: %1$s, P: %2$s batérie."
+ "Zariadenie hosťa (podporuje zdieľanie zvuku)""Aktívne (iba médiá)"
-
-
-
-
+ "Zariadenie hosťa"
+ "Zariadenie hosťa (iba médiá)""Podporuje zdieľanie zvuku"
-
-
+ "Zariadenie hosťa. Podporuje zdieľanie zvuku.""Aktívne (iba médiá), iba ľavá strana""Aktívne (iba médiá), iba pravá strana""Aktívne (iba médiá), ľavá aj pravá strana"
@@ -396,8 +386,7 @@
"Hardvérom zrýchlené vykresľovanie""Médiá""Monitorovanie"
-
-
+ "Správa okien""Povoliť prísny režim""Blikať pri dlhých operáciách hlavného vlákna""Umiestnenie kurzora"
@@ -492,12 +481,9 @@
"Implementácia WebView""Nastaviť implementáciu WebView""Táto voľba už nie je platná. Skúste to znova."
-
-
-
-
-
-
+ "Nástroje pre vývojárov prvku WebView"
+ "Balík WebView sa nenašiel."
+ "Nástroje pre vývojárov sa nepodarilo spustiť.""Farebný režim obrázka""Použije sa sRGB""Vypnuté"
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 28ae8e14472da..744b4da576ed2 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -113,33 +113,23 @@
"Okolice ni bilo mogoče posodobiti""Aktivno (samo predstavnost). Baterija: %1$s.""Aktivno (samo predstavnost), baterija – L: %1$s, D: %2$s."
-
-
-
-
-
-
-
-
+ "Naprava gosta. Baterija: %1$s."
+ "Naprava gosta. Baterija – L: %1$s, D: %2$s."
+ "Naprava gosta (samo predstavnost). Baterija: %1$s."
+ "Naprava gosta (samo predstavnost). Baterija – L: %1$s, D: %2$s.""Povezano (podpira deljenje zvoka), baterija: %1$s.""Povezano (podpira deljenje zvoka), baterija – L: %1$s, D: %2$s.""Povezano (podpira deljenje zvoka). Levo – baterija: %1$s.""Povezano (podpira deljenje zvoka). Desno – baterija: %1$s.""Povezano (podpira deljenje zvoka)"
-
-
-
-
-
-
+ "Naprava gosta (podpira deljenje zvoka). Baterija: %1$s."
+ "Naprava gosta (podpira deljenje zvoka). Baterija – L: %1$s, D: %2$s."
+ "Naprava gosta (podpira deljenje zvoka)""Aktivno (samo predstavnost)"
-
-
-
-
+ "Naprava gosta"
+ "Naprava gosta (samo predstavnost)""Podpira deljenje zvoka"
-
-
+ "Naprava gosta. Podpira deljenje zvoka.""Aktivno (samo predstavnost), samo levo""Aktivno (samo predstavnost), samo desno""Aktivno (samo predstavnost), levo in desno"
@@ -396,8 +386,7 @@
"Upodabljanje s strojnim pospeševanjem""Predstavnost""Spremljanje"
-
-
+ "Upravljanje oken""Strog način je omogočen""Osveži zaslon pri dolgih postopkih v glavni niti.""Mesto kazalca"
@@ -492,12 +481,9 @@
"Izvedba spletnega pogleda""Nastavitev izvedbe spletnega pogleda""Ta izbira ni več veljavna. Poskusite znova."
-
-
-
-
-
-
+ "Orodja za razvijalce za WebView"
+ "Paketa WebView ni bilo mogoče najti."
+ "Orodij za razvijalce ni bilo mogoče zagnati.""Način barv slike""Uporaba sRGB-ja""Onemogočeno"
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 4e6ec9f96284f..3d9622e063def 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -113,33 +113,23 @@
"Ambienti rrethues nuk mund të përditësohej""Aktiv (vetëm për media). %1$s bateri.""Aktiv (vetëm për media). Majtas: %1$s bateri, djathtas: %2$s bateri."
-
-
-
-
-
-
-
-
+ "Pajisja vizitore. %1$s bateri."
+ "Pajisja vizitore. Majtas: %1$s bateri, djathtas: %2$s bateri."
+ "Pajisja vizitore (vetëm media). %1$s bateri."
+ "Pajisja vizitore (vetëm media). Majtas: %1$s bateri, djathtas: %2$s bateri.""Lidhur (mbështet ndarjen e audios). %1$s bateri.""Lidhur (mbështet ndarjen e audios). Majtas: %1$s bateri, djathtas: %2$s bateri.""Lidhur (mbështet ndarjen e audios). Majtas: %1$s bateri.""Lidhur (mbështet ndarjen e audios). Djathtas: %1$s bateri.""Lidhur (mbështet ndarjen e audios)"
-
-
-
-
-
-
+ "Pajisja vizitore (mbështet ndarjen e audios). %1$s bateri."
+ "Pajisja vizitore (mbështet ndarjen e audios). Majtas: %1$s bateri, djathtas: %2$s bateri."
+ "Pajisja vizitore (mbështet ndarjen e audios)""Aktiv (vetëm për media)"
-
-
-
-
+ "Pajisja vizitore"
+ "Pajisja vizitore (vetëm media)""Mbështet ndarjen e audios"
-
-
+ "Pajisja vizitore. Mbështet ndarjen e audios""Aktiv (vetëm për media), vetëm majtas""Aktiv (vetëm për media), vetëm djathtas""Aktiv (vetëm për media), majtas dhe djathtas"
@@ -396,8 +386,7 @@
"Interpretimi i përshpejtuar i harduerit""Media""Monitorimi"
-
-
+ "Menaxhimi i dritareve""Aktivizo modalitetin e rreptë""Ndriço ekranin kur aplikacionet kryejnë operacione të gjata teksa bashkëveprojnë""Vendndodhja e treguesit"
@@ -492,12 +481,9 @@
"Zbatimi i WebView""Cakto zbatimin e WebView""Kjo zgjedhje nuk është më e vlefshme. Provo përsëri."
-
-
-
-
-
-
+ "DevTools e WebView"
+ "Paketa e WebView nuk u gjet."
+ "DevTools nuk mund të nisej.""Modalitti i ngjyrave të figurës""Përdor sRGB""Çaktivizuar"
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 96924b9e3cee2..32ec5000bfd05 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -113,33 +113,23 @@
"Ажурирање окружења није успело""Активно (само за медије). %1$s батерије.""Активно (само за медије). Лево: %1$s, десно: %2$s батерије."
-
-
-
-
-
-
-
-
+ "Уређај госта. %1$s батерије."
+ "Уређај госта. Лево: %1$s, десно: %2$s батерије."
+ "Уређај госта (само за медије). %1$s батерије."
+ "Уређај госта (само за медије). Лево: %1$s, десно: %2$s батерије.""Повезано (подржава дељење звука), %1$s батерије.""Повезано (подржава дељење звука), лево: %1$s, десно: %2$s батерије.""Повезано (подржава дељење звука). Лево: %1$s батерије""Повезано (подржава дељење звука). Десно: %1$s батерије.""Повезано (подржава дељење звука)"
-
-
-
-
-
-
+ "Уређај госта (подржава дељење звука). %1$s батерије."
+ "Уређај госта (подржава дељење звука). Лево: %1$s, десно: %2$s батерије."
+ "Уређај госта (подржава дељење звука)""Активан (само за медије)"
-
-
-
-
+ "Уређај госта"
+ "Уређај госта (само за медије)""Подржава дељење звука"
-
-
+ "Уређај госта. Подржава дељење звука""Активан (само за медије), само лево""Активан (само за медије), само десно""Активан (само за медије), лево и десно"
@@ -396,8 +386,7 @@
"Хардверски убрзано приказивање""Медији""Надгледање"
-
-
+ "Управљање прозорима""Омогућен је строги режим""Екран трепери када апликације обављају дуге операције на главној нити""Локација показивача"
@@ -492,12 +481,9 @@
"Примена WebView-а""Подесите примену WebView-а""Овај избор више није важећи. Пробајте поново."
-
-
-
-
-
-
+ "WebView алатке за програмере"
+ "Пакет за WebView није пронађен."
+ "Покретање алатки за програмере није успело.""Режим боја слика""Користи sRGB""Онемогућено је"
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 3c7aff69fd732..cf223f5b7bdbb 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -113,33 +113,23 @@
"Det gick inte att uppdatera omgivningsläget""Aktiv (endast media). %1$s batteri.""Aktiv (endast media). V: %1$s, H: %2$s batteri."
-
-
-
-
-
-
-
-
+ "Gästenhet. %1$s batteri."
+ "Gästenhet. V: %1$s, H: %2$s batteri."
+ "Gästenhet (endast media). %1$s batteri."
+ "Gästenhet (endast media). V: %1$s, H: %2$s batteri.""Ansluten (ljuddelning stöds). %1$s batteri.""Ansluten (ljuddelning stöds). V: %1$s, H: %2$s batteri.""Ansluten (ljuddelning stöds). Vänster: %1$s batteri.""Ansluten (ljuddelning stöds). Höger: %1$s batteri.""Ansluten (ljuddelning stöds)"
-
-
-
-
-
-
+ "Gästenhet (ljuddelning stöds). %1$s batteri."
+ "Gästenhet (ljuddelning stöds). V: %1$s, H: %2$s batteri."
+ "Gästenhet (ljuddelning stöds)""Aktiv (endast media)"
-
-
-
-
+ "Gästenhet"
+ "Gästenhet (endast media)""Ljuddelning stöds"
-
-
+ "Gästenhet. Ljuddelning stöds""Aktiv (endast media), endast vänster""Aktiv (endast media), endast höger""Aktiv (endast media), vänster och höger"
@@ -396,8 +386,7 @@
"Hårdvaruaccelererad rendering""Media""Övervakning"
-
-
+ "Fönsterhantering""Strikt läge aktiverat""Tänd skärm när app gör omfattande åtgärd på huvudtråd""Pekarens plats"
@@ -492,12 +481,9 @@
"WebView-implementering""Ange WebView-implementering""Det här alternativet är inte längre giltigt. Försök igen."
-
-
-
-
-
-
+ "Verktyg för programmerare för WebView"
+ "WebView-paketet hittades inte."
+ "Verktyg för programmerare kunde inte startas.""Färgläge för bilder""Använd sRGB""Inaktiverad"
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 4f520b499b85d..26e0412b2893c 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -113,33 +113,23 @@
"Imeshindwa kusasisha mazingira""Inatumika (maudhui pekee). Chaji ya betri imefika %1$s.""Inatumika (maudhui pekee), Kushoto: chaji ya betri imefika %1$s, Kulia: chaji ya betri imefika %2$s."
-
-
-
-
-
-
-
-
+ "Kifaa kingeni. Chaji ya betri imefika %1$s."
+ "Kifaa kingeni. Kushoto: chaji ya betri imefika %1$s, Kulia: chaji ya betri imefika %2$s."
+ "Kifaa kingeni (sauti/video/picha pekee). Chaji ya betri imefika %1$s."
+ "Kifaa kingeni (sauti/video/picha pekee). Kushoto: chaji ya betri imefika %1$s, Kulia: chaji ya betri imefika %2$s.""Imeunganishwa (inaweza kutumia kipengele cha kusikiliza pamoja). Chaji imefika %1$s.""Imeunganishwa (inaweza kutumia kipengele cha kusikiliza pamoja). Kushoto: chaji ya betri imefika %1$s, Kulia: chaji ya betri imefika %2$s.""Imeunganishwa (inaweza kutumia kipengele cha kusikiliza pamoja). Kushoto: chaji ya betri imefika %1$s.""Imeunganishwa (inaweza kutumia kipengele cha kusikiliza pamoja). Kulia: chaji ya betri imefika %1$s.""Imeunganishwa (inaweza kusikiliza pamoja)"
-
-
-
-
-
-
+ "Kifaa kingeni (kinatumia kipengele cha kusikiliza pamoja). Chaji ya betri imefika %1$s."
+ "Kifaa kingeni (kinatumia kipengele cha kusikiliza pamoja). Kushoto: chaji ya betri imefika %1$s, Kulia: chaji ya betri imefika %2$s."
+ "Kifaa kingeni (kinatumia kipengele cha kusikiliza pamoja)""Inatumika (maudhui pekee)"
-
-
-
-
+ "Kifaa kingeni"
+ "Kifaa kingeni (sauti/video/picha pekee)""Inaweza kutumia kipengele cha kusikiliza pamoja"
-
-
+ "Kifaa kingeni. Kinatumia kipengele cha kusikiliza pamoja""Inatumika (maudhui pekee), kushoto pekee""Inatumika (maudhui pekee), kulia pekee""Inatumika (maudhui pekee), kushoto na kulia"
@@ -396,8 +386,7 @@
"Utekelezaji wa maunzi ulioharakishwa""Maudhui""Ufuatiliaji"
-
-
+ "Udhibiti wa Dirisha""Hali makinifu imewashwa""Fanya skrini imemeteke programu zinapoendeleza shughuli ndefu kwenye skrini kuu""Mahali pa kiashiria"
@@ -492,12 +481,9 @@
"Utekelezaji wa WebView""Weka utekelezaji wa WebView""Chaguo hili halipo tena. Jaribu tena."
-
-
-
-
-
-
+ "Zana za Wasanidi Programu za Mwonekano wa Wavuti"
+ "Haijapata kifurushi cha Mwonekano wa Wavuti."
+ "Imeshindwa kuwasha Zana za Wasanidi Programu.""Hali ya rangi ya picha""Tumia sRGB""Imezimwa"
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index aa345842779ca..c2e762f417e7c 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -113,33 +113,23 @@
"சுற்றுப்புறங்களைப் புதுப்பிக்க முடியவில்லை""செயலிலுள்ளது (மீடியா மட்டும்). %1$s பேட்டரி.""செயலிலுள்ளது (மீடியா மட்டும்). இடது பேட்டரி: %1$s, வலது பேட்டரி: %2$s."
-
-
-
-
-
-
-
-
+ "விருந்தினர் சாதனம். %1$s பேட்டரி."
+ "விருந்தினர் சாதனம். இடது பேட்டரி: %1$s, வலது பேட்டரி: %2$s."
+ "விருந்தினர் சாதனம் (மீடியா மட்டும்). %1$s பேட்டரி."
+ "விருந்தினர் சாதனம் (மீடியா மட்டும்). இடது பேட்டரி: %1$s, வலது பேட்டரி: %2$s.""இணைக்கப்பட்டுள்ளது (ஆடியோ பகிர்வை ஆதரிக்கிறது). %1$s பேட்டரி.""இணைக்கப்பட்டுள்ளது (ஆடியோ பகிர்வை ஆதரிக்கிறது). இடது பேட்டரி: %1$s, வலது பேட்டரி: %2$s.""இணைக்கப்பட்டுள்ளது (ஆடியோ பகிர்வை ஆதரிக்கிறது). இடது: - %1$s பேட்டரி.""இணைக்கப்பட்டுள்ளது (ஆடியோ பகிர்வை ஆதரிக்கிறது). வலது: %1$s பேட்டரி.""இணைக்கப்பட்டுள்ளது (ஆடியோ பகிர்வை ஆதரிக்கிறது)"
-
-
-
-
-
-
+ "விருந்தினர் சாதனம் (ஆடியோ பகிர்வை ஆதரிக்கிறது). %1$s பேட்டரி."
+ "விருந்தினர் சாதனம் (ஆடியோ பகிர்வை ஆதரிக்கிறது). இடது பேட்டரி: %1$s, வலது பேட்டரி: %2$s."
+ "விருந்தினர் சாதனம் (ஆடியோ பகிர்வை ஆதரிக்கிறது)""செயலிலுள்ளது (மீடியா மட்டும்)"
-
-
-
-
+ "விருந்தினர் சாதனம்"
+ "விருந்தினர் சாதனம் (மீடியா மட்டும்)""ஆடியோ பகிர்வை ஆதரிக்கிறது"
-
-
+ "விருந்தினர் சாதனம். ஆடியோ பகிர்வை ஆதரிக்கிறது.""செயலிலுள்ளது (மீடியா மட்டும்), இடதுபுறம் மட்டும்""செயலிலுள்ளது (மீடியா மட்டும்), வலதுபுறம் மட்டும்""செயலிலுள்ளது (மீடியா மட்டும்), இடதுபுறம் மற்றும் வலதுபுறம்"
@@ -396,8 +386,7 @@
"வன்பொருள் முடுக்கத்துடன் கூடிய காட்சியாக்கம்""மீடியா""கண்காணித்தல்"
-
-
+ "சாளர நிர்வாகம்""நிலையான பயன்முறை இயக்கப்பட்டது""முக்கியத் தொடரிழையில் நீண்ட நேரம் செயல்படும்போது திரையைக் காட்சிப்படுத்தும்""குறிப்பான் இடம்"
@@ -492,12 +481,9 @@
"WebView செயல்படுத்தல்""WebView செயல்படுத்தலை அமை""இனி இந்தத் தேர்வைப் பயன்படுத்த முடியாது. மீண்டும் முயலவும்."
-
-
-
-
-
-
+ "WebView டெவெலப்பர் கருவிகள்"
+ "WebView தொகுப்பு இல்லை."
+ "டெவெலப்பர் கருவிகளை இயக்க முடியவில்லை.""படத்தின் வண்ணப் பயன்முறை""sRGBஐப் பயன்படுத்தும்""முடக்கப்பட்டது"
@@ -667,7 +653,7 @@
"மற்ற பயனர்களுக்கு இல்லாத சிறப்புரிமைகள் நிர்வாகிகளுக்கு உண்டு. நிர்வாகி அனைத்துப் பயனர்களையும் நிர்வகிக்கலாம், இந்தச் சாதனத்தைப் புதுப்பிக்கலாம் அல்லது ரீசெட் செய்யலாம், அமைப்புகளை மாற்றலாம், நிறுவப்பட்ட அனைத்து ஆப்ஸையும் பார்க்கலாம், பிறருக்கு நிர்வாகி சிறப்புரிமைகளை வழங்கலாம் அல்லது அகற்றலாம்.""நிர்வாகியாக்கு""இப்போது பயனரை அமைக்கவா?"
- "இந்தச் சாதனத்தை இவர் பயன்படுத்தும் நிலையிலும், அவருக்கான அமைப்புகளை அவரே செய்து கொள்பவராகவும் இருக்க வேண்டும்."
+ "பயனர் இந்தச் சாதனத்தில் அவருக்கான அமைப்புகளை அமைக்கும் நிலையில் இப்போது இருக்க வேண்டும்""இப்போது சுயவிவரத்தை அமைக்கவா?""இப்போது அமை""இப்போது இல்லை"
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index cded034d5ab37..f4678f3d0dd5a 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -113,33 +113,23 @@
"పరిసరాలను అప్డేట్ చేయడం సాధ్యం కాలేదు""యాక్టివ్ (మీడియా మాత్రమే). %1$s బ్యాటరీ.""యాక్టివ్ (మీడియా మాత్రమే). ఎడమ వైపు: %1$s బ్యాటరీ, కుడివైపు: %2$s బ్యాటరీ."
-
-
-
-
-
-
-
-
+ "గెస్ట్ పరికరం. %1$s బ్యాటరీ."
+ "గెస్ట్ పరికరం. ఎడమ వైపు: %1$s, కుడివైపు: %2$s బ్యాటరీ."
+ "గెస్ట్ పరికరం (మీడియాకు మాత్రమే). %1$s బ్యాటరీ."
+ "గెస్ట్ పరికరం (మీడియాకు మాత్రమే). ఎడమ వైపు: %1$s, కుడివైపు: %2$s బ్యాటరీ.""కనెక్ట్ చేయబడింది (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది). %1$s బ్యాటరీ.""కనెక్ట్ చేయబడింది (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది). ఎడమ వైపు: %1$s బ్యాటరీ, కుడివైపు: %2$s బ్యాటరీ.""కనెక్ట్ చేయబడింది (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది). ఎడమ వైపు: %1$s బ్యాటరీ.""కనెక్ట్ అయింది (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది). కుడివైపు: %1$s బ్యాటరీ.""కనెక్ట్ చేయబడింది (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది)"
-
-
-
-
-
-
+ "గెస్ట్ పరికరం (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది). %1$s బ్యాటరీ."
+ "గెస్ట్ పరికరం (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది). ఎడమ వైపు: %1$s, కుడివైపు: %2$s బ్యాటరీ."
+ "గెస్ట్ పరికరం (ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది)""యాక్టివ్ (మీడియా మాత్రమే)"
-
-
-
-
+ "గెస్ట్ పరికరం"
+ "గెస్ట్ పరికరం (మీడియాకు మాత్రమే)""ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది"
-
-
+ "గెస్ట్ పరికరం. ఆడియో షేరింగ్కు సపోర్ట్ చేస్తుంది""యాక్టివ్ (మీడియా మాత్రమే), ఎడమ వైపు మాత్రమే""యాక్టివ్ (మీడియా మాత్రమే), కుడివైపు మాత్రమే""యాక్టివ్ (మీడియా మాత్రమే), ఎడమ, కుడివైపు మాత్రమే"
@@ -396,8 +386,7 @@
"హార్డ్వేర్ యాగ్జిలరేషన్ ఆధారిత రెండరింగ్""మీడియా""పర్యవేక్షణ"
-
-
+ "విండో మేనేజ్మెంట్""స్ట్రిక్ట్ మోడ్ ఎనేబుల్డ్""యాప్లు ప్రధాన థ్రెడ్లో సుదీర్ఘ చర్యలు చేసేటప్పుడు స్క్రీన్ను ఫ్లాష్ చేయండి""పాయింటర్ లొకేషన్"
@@ -492,12 +481,9 @@
"వెబ్ వీక్షణ అమలు""వెబ్ వీక్షణ అమలుని సెట్ చేయండి""ఈ ఎంపిక ఇప్పుడు లేదు. మళ్లీ ట్రై చేయండి."
-
-
-
-
-
-
+ "వెబ్ వీక్షణ DevTools"
+ "వెబ్ వీక్షణ ప్యాకేజీ కనుగొనబడలేదు."
+ "DevToolsను లాంచ్ చేయడం సాధ్యపడలేదు.""చిత్రం రంగు మోడ్""sRGB ఉపయోగిస్తుంది""డిజేబుల్ చేయబడింది"
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index eaf256d520df8..e360ae6d52786 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -113,33 +113,23 @@
"อัปเดตเสียงแวดล้อมไม่ได้""ใช้งานอยู่ (สื่อเท่านั้น) แบตเตอรี่ %1$s""ใช้งานอยู่ (สื่อเท่านั้น) แบตเตอรี่ข้างซ้าย: %1$s, ข้างขวา: %2$s"
-
-
-
-
-
-
-
-
+ "อุปกรณ์ของผู้มาเยือน แบตเตอรี่ %1$s"
+ "อุปกรณ์ของผู้มาเยือน L: แบตเตอรี่ %1$s, R: แบตเตอรี่ %2$s"
+ "อุปกรณ์ของผู้มาเยือน (สื่อเท่านั้น) แบตเตอรี่ %1$s"
+ "อุปกรณ์ของผู้มาเยือน (สื่อเท่านั้น) L: แบตเตอรี่ %1$s, R: แบตเตอรี่ %2$s""เชื่อมต่อแล้ว (รองรับการแชร์เสียง) แบตเตอรี่ %1$s""เชื่อมต่อแล้ว (รองรับการแชร์เสียง) แบตเตอรี่ข้างซ้าย: %1$s, ข้างขวา: %2$s""เชื่อมต่อแล้ว (รองรับการแชร์เสียง) ซ้าย: แบตเตอรี่ %1$s""เชื่อมต่อแล้ว (รองรับการแชร์เสียง) ขวา: แบตเตอรี่ %1$s""เชื่อมต่อแล้ว (รองรับการแชร์เสียง)"
-
-
-
-
-
-
+ "อุปกรณ์ของผู้มาเยือน (รองรับการแชร์เสียง) แบตเตอรี่ %1$s"
+ "อุปกรณ์ของผู้มาเยือน (รองรับการแชร์เสียง) L: แบตเตอรี่ %1$s, R: แบตเตอรี่ %2$s"
+ "อุปกรณ์ของผู้มาเยือน (รองรับการแชร์เสียง)""ใช้งานอยู่ (สื่อเท่านั้น)"
-
-
-
-
+ "อุปกรณ์ของผู้มาเยือน"
+ "อุปกรณ์ของผู้มาเยือน (สื่อเท่านั้น)""รองรับการแชร์เสียง"
-
-
+ "อุปกรณ์ของผู้มาเยือน รองรับการแชร์เสียง""ใช้งานอยู่ (สื่อเท่านั้น), ซ้ายเท่านั้น""ใช้งานอยู่ (สื่อเท่านั้น), ขวาเท่านั้น""ใช้งานอยู่ (สื่อเท่านั้น), ซ้ายและขวา"
@@ -396,8 +386,7 @@
"การแสดงผลที่มีการเร่งด้วยฮาร์ดแวร์""สื่อ""การตรวจสอบ"
-
-
+ "การจัดการหน้าต่าง""เปิดใช้งานโหมดเข้มงวด""กะพริบหน้าจอเมื่อแอปทำงานในเทรดหลักนาน""ตำแหน่งของตัวชี้"
@@ -492,12 +481,9 @@
"การใช้งาน WebView""ตั้งค่าการใช้งาน WebView""ตัวเลือกนี้ใช้ไม่ได้อีกต่อไป โปรดลองอีกครั้ง"
-
-
-
-
-
-
+ "เครื่องมือสำหรับนักพัฒนาเว็บของ WebView"
+ "ไม่พบแพ็กเกจ WebView"
+ "เปิดเครื่องมือสำหรับนักพัฒนาเว็บไม่ได้""โหมดสีของรูปภาพ""ใช้ sRGB""ปิดใช้"
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index b6d8d190d1ca0..09f40c761fdac 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -113,33 +113,23 @@
"Hindi ma-update ang paligid""Aktibo (media lang). %1$s baterya.""Aktibo (media lang). L: %1$s, R: %2$s baterya."
-
-
-
-
-
-
-
-
+ "Device ng bisita. %1$s baterya."
+ "Device ng bisita. L: %1$s, R: %2$s baterya."
+ "Device ng bisita (media lang). %1$s baterya."
+ "Device ng bisita (media lang). L: %1$s, R: %2$s baterya.""Nakakonekta (sinusuportahan ang pag-share ng audio), %1$s baterya.""Nakakonekta (sinusuportahan ang pag-share ng audio). L: %1$s, R: %2$s baterya.""Nakakonekta (sinusuportahan ang pag-share ng audio). Kaliwa: %1$s baterya.""Nakakonekta (sinusuportahan ang pag-share ng audio). Kanan: %1$s baterya.""Nakakonekta (sinusuportahan ang pag-share ng audio)"
-
-
-
-
-
-
+ "Device ng bisita (sinusuportahan ang pag-share ng audio). %1$s baterya."
+ "Device ng bisita (sinusuportahan ang pag-share ng audio). L: %1$s, R: %2$s baterya."
+ "Device ng bisita (sinusuportahan ang pag-share ng audio)""Aktibo (media lang)"
-
-
-
-
+ "Device ng bisita"
+ "Device ng bisita (media lang)""Sinusuportahan ang pag-share ng audio"
-
-
+ "Device ng bisita. Sinusuportahan ang pag-share ng audio""Aktibo (media lang), kaliwa lang""Aktibo (media lang), kanan lang""Aktibo (media lang), kaliwa at kanan"
@@ -396,8 +386,7 @@
"Pag-render na pinapabilis ng hardware""Media""Pagsubaybay"
-
-
+ "Pamamahala sa Window""Enabled ang strict mode""I-flash ang screen pag may long ops ang app sa main thread""Lokasyon ng pointer"
@@ -492,12 +481,9 @@
"Pagpapatupad sa WebView""Itakda ang pagpapatupad sa WebView""Wala nang bisa ang napiling ito. Subukang muli."
-
-
-
-
-
-
+ "DevTools ng WebView"
+ "Hindi nakita ang WebView package."
+ "Hindi mailunsad ang DevTools.""Mode ng kulay ng larawan""Gamitin ang sRGB""Naka-disable"
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index c4cbaf69b5a91..19b3baf6c82df 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -113,33 +113,23 @@
"Çevredeki sesler güncellenemedi""Etkin (yalnızca medya). %1$s pil seviyesi.""Etkin (yalnızca medya). Sol: %1$s, Sağ: %2$s pil seviyesi."
-
-
-
-
-
-
-
-
+ "Misafir cihaz. %1$s pil seviyesi."
+ "Misafir cihaz. Sol: %1$s, Sağ: %2$s pil seviyesi."
+ "Misafir cihaz (yalnızca medya). %1$s pil seviyesi."
+ "Misafir cihaz (yalnızca medya). Sol: %1$s, Sağ: %2$s pil seviyesi.""Bağlı (ses paylaşımını destekler). %1$s pil seviyesi.""Bağlı (ses paylaşımını destekler). Sol: %1$s, Sağ: %2$s pil seviyesi.""Bağlı (ses paylaşımını destekler). Sol: %1$s pil seviyesi.""Bağlı (ses paylaşımını destekler). Sağ: %1$s pil seviyesi.""Bağlı (ses paylaşımını destekler)"
-
-
-
-
-
-
+ "Misafir cihaz (ses paylaşımını destekler). %1$s pil seviyesi."
+ "Misafir cihaz (ses paylaşımını destekler). Sol: %1$s, Sağ: %2$s pil seviyesi."
+ "Misafir cihaz (ses paylaşımını destekler)""Etkin (yalnızca medya)"
-
-
-
-
+ "Misafir cihaz"
+ "Misafir cihaz (yalnızca medya)""Ses paylaşımını destekler"
-
-
+ "Misafir cihaz. Ses paylaşımını destekler""Etkin (yalnızca medya), yalnızca sol""Etkin (yalnızca medya), yalnızca sağ""Etkin (yalnızca medya), sol ve sağ"
@@ -396,8 +386,7 @@
"Donanım hızlandırmalı oluşturma""Medya""İzleme"
-
-
+ "Pencere Yönetimi""Yüksek düzey modu etkin""Uygulamalar ana iş parçacığında uzun işlem yaparken ekranı yanıp söndür""İşaretçi konumu"
@@ -492,12 +481,9 @@
"Web Görünümü kullanımı""Web Görünümü kullanımını ayarla""Bu seçenek artık geçerli değil. Tekrar deneyin."
-
-
-
-
-
-
+ "WebView Geliştirici Araçları"
+ "WebView paketi bulunamadı."
+ "Geliştirici Araçları başlatılamadı.""Resim renk modu""sRGB\'yi kullan""Devre dışı"
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index ecff5722472c7..ff18f5cf10a49 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -113,33 +113,23 @@
"Не вдалось оновити стан оточення""Активне з’єднання (лише для мультимедіа). %1$s заряду акумулятора.""Активне з’єднання (лише для мультимедіа). Рівень заряду: лівий %1$s, правий: %2$s."
-
-
-
-
-
-
-
-
+ "Гостьовий пристрій. %1$s заряду акумулятора."
+ "Гостьовий пристрій. Лівий: %1$s, правий: %2$s заряду акумулятора."
+ "Гостьовий пристрій (лише для мультимедіа). %1$s заряду акумулятора."
+ "Гостьовий пристрій (лише для мультимедіа). Лівий: %1$s, правий: %2$s заряду акумулятора.""Підключено (підтримує надсилання аудіо). %1$s заряду акумулятора.""Підключено (підтримує надсилання аудіо). Лівий: %1$s, правий: %2$s заряду акумулятора.""Підключено (підтримує надсилання аудіо). Лівий: %1$s заряду акумулятора.""Підключено (підтримує надсилання аудіо). Правий: %1$s заряду акумулятора.""Підключено (підтримує надсилання аудіо)"
-
-
-
-
-
-
+ "Гостьовий пристрій (підтримує надсилання аудіо). %1$s заряду акумулятора."
+ "Гостьовий пристрій (підтримує надсилання аудіо). Лівий: %1$s, правий: %2$s заряду акумулятора."
+ "Гостьовий пристрій (підтримує надсилання аудіо)""Активно (лише для мультимедіа)"
-
-
-
-
+ "Гостьовий пристрій"
+ "Гостьовий пристрій (лише для мультимедіа)""Підтримує надсилання аудіо"
-
-
+ "Гостьовий пристрій. Підтримує надсилання аудіо.""Активно (лише для мультимедіа); лише лівий""Активно (лише для мультимедіа); лише правий""Активно (лише для мультимедіа); лівий і правий"
@@ -396,8 +386,7 @@
"Апаратне прискорення""Медіа""Моніторинг"
-
-
+ "Керування вікнами""Строгий режим увімкнено""Підсвічувати екран під час довгострокових операцій""Розташування курсора"
@@ -492,12 +481,9 @@
"Застосування WebView""Налаштувати застосування WebView""Ця опція більше не дійсна. Повторіть спробу."
-
-
-
-
-
-
+ "Інструменти розробника WebView"
+ "Пакет WebView не знайдено."
+ "Не вдалося запустити Інструменти розробника.""Режим кольору""Використовувати sRGB""Вимкнено"
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 34071147f5d9a..a07a341fd956d 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -113,33 +113,23 @@
"اطراف کو اپ ڈیٹ نہیں کیا جا سکا""فعال (صرف میڈیا)۔ %1$s بیٹری۔""فعال (صرف میڈیا)۔ L: %1$s، R: %2$s بیٹری۔"
-
-
-
-
-
-
-
-
+ "مہمان آلہ۔ %1$s بیٹری۔"
+ "مہمان آلہ۔ بایاں: %1$s، دایاں: %2$s بیٹری۔"
+ "مہمان آلہ (صرف میڈیا)۔ %1$s بیٹری۔"
+ "مہمان آلہ (صرف میڈیا)۔ بایاں: %1$s، دایاں: %2$s بیٹری۔""منسلک ہے (آڈیو کے اشتراک کو سپورٹ کرتا ہے)۔ %1$s بیٹری۔""منسلک ہے (آڈیو کے اشتراک کو سپورٹ کرتا ہے)۔ L: %1$s، R: %2$s بیٹری۔""منسلک ہے (آڈیو کے اشتراک کو سپورٹ کرتا ہے)۔ بائيں: %1$s بیٹری۔""منسلک ہے (آڈیو کے اشتراک کو سپورٹ کرتا ہے)۔ دائيں: %1$s بیٹری۔""منسلک ہے (آڈیو کے اشتراک کو سپورٹ کرتا ہے)"
-
-
-
-
-
-
+ "مہمان آلہ (آڈیو کے اشتراک کو سپورٹ کرتا ہے)۔ %1$s بیٹری۔"
+ "مہمان آلہ (آڈیو کے اشتراک کو سپورٹ کرتا ہے)۔ بایاں: %1$s، دایاں: %2$s بیٹری۔"
+ "مہمان آلہ (آڈیو کے اشتراک کو سپورٹ کرتا ہے)""فعال (صرف میڈیا)"
-
-
-
-
+ "مہمان آلہ"
+ "مہمان آلہ (صرف میڈیا)""آڈیو کے اشتراک کو سپورٹ کرتا ہے"
-
-
+ "مہمان آلہ۔ آڈیو کے اشتراک کو سپورٹ کرتا ہے""فعال (صرف میڈیا)، صرف بائیں""فعال (صرف میڈیا)، صرف دائیں""فعال (صرف میڈیا)، بائیں اور دائیں"
@@ -396,8 +386,7 @@
"ہارڈ ویئر کے ذریعے تیز کردہ رینڈرنگ""میڈیا""مانیٹر کرنا"
-
-
+ "ونڈو کا نظم و نسق""سخت وضع فعال ہے""ایپس کے اصل تھریڈ پر طویل اعمال انجام دیتے وقت اسکرین کو فلیش کریں""پوائنٹر مقام"
@@ -492,12 +481,9 @@
"WebView کا نفاذ""WebView کا نفاذ سیٹ کریں""یہ انتخاب اب درست نہیں رہا۔ دوبارہ کوشش کریں۔"
-
-
-
-
-
-
+ "WebView DevTools"
+ "WebView پیکیج نہیں ملا۔"
+ "DevTools کو شروع نہیں کیا جا سکا۔""تصویری رنگ موڈ""sRGB استعمال کریں""غیر فعال"
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index bff79933c10c9..3a10aa801797e 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -113,33 +113,23 @@
"Atrof-muhit yangilanmadi""Faol (faqat media uchun) Quvvat: %1$s.""Faol (faqat media uchun), quvvat: %1$s (L), %2$s (R)"
-
-
-
-
-
-
-
-
+ "Mehmon qurilma. Quvvat: %1$s."
+ "Mehmon qurilma. Quvvat: %1$s (L), %2$s (R)."
+ "Mehmon qurilma (faqat multimedia). Quvvat: %1$s."
+ "Mehmon qurilma (faqat multimedia). Quvvat: %1$s (L), %2$s (R).""Ulangan (audio yuborish mumkin), quvvat: %1$s""Ulangan (audio yuborish mumkin), quvvat: %1$s (L), %2$s (R)""Ulangan (audio yuborish mumkin). Quvvat: %1$s (chap).""Ulangan (audio yuborish mumkin). Quvvat: %1$s (oʻng).""Ulangan (audio yuborish mumkin)"
-
-
-
-
-
-
+ "Mehmon qurilma (audio ulashuvni dastaklaydi). Quvvat: %1$s."
+ "Mehmon qurilma (audio ulashuvni dastaklaydi). Quvvat: %1$s (L), %2$s (R)."
+ "Mehmon qurilma (audio ulashuvni dastaklaydi)""Faol (faqat media uchun)"
-
-
-
-
+ "Mehmon qurilma"
+ "Mehmon qurilma (faqat multimedia)""Audio yuborishi mumkin"
-
-
+ "Mehmon qurilma. Audio ulashishi mumkin""Faol (faqat media uchun), faqat chap""Faol (faqat media uchun), faqat oʻng""Faol (faqat media uchun), chap va oʻng"
@@ -148,7 +138,7 @@
"Fayl uzatish""Kiritish qurilmasi""Internetga ulanish"
- "Chaqiruv va kontaktlarga ruxsat berilsinmi?"
+ "Kontaktlar va chaqiruv tarixiga ruxsat berish""Maʼlumotlar chaqiruvlar haqida xabar berish uchun ishlatiladi""Internet aloqasi ulashmasi""SMS xabarlari"
@@ -396,8 +386,7 @@
"Vizualizatsiyani apparatli tezlatish""Multimedia""Monitoring"
-
-
+ "Oyna boshqaruvi""Qat’iy rejim yoqilgan""Uzun amallar vaqtida ekranni miltillatish""Kursor joylashuvi"
@@ -492,12 +481,9 @@
"WebView ta’minotchisi""WebView ta’minotchisini sozlash""Bu variant endi yaroqsiz. Qaytadan urining."
-
-
-
-
-
-
+ "WebView DevTools"
+ "WebView paketi topilmadi."
+ "DevTools ishga tushirilmadi.""Rang rejimi""sRGB ranglaridan foydalanish""Oʻchiq"
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index cb0a875a8d7a7..6095e8c2af4cd 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -113,33 +113,23 @@
"Không cập nhật được âm lượng xung quanh""Đang hoạt động (chỉ phát nội dung đa phương tiện). Còn %1$s pin.""Đang hoạt động (chỉ phát nội dung đa phương tiện). Bên trái: Còn %1$s pin. Bên phải: Còn %2$s pin."
-
-
-
-
-
-
-
-
+ "Thiết bị khách. Còn %1$s pin."
+ "Thiết bị khách. Bên trái: Còn %1$s pin. Bên phải: Còn %2$s pin."
+ "Thiết bị khách (chỉ dành cho nội dung nghe nhìn). Còn %1$s pin."
+ "Thiết bị khách (chỉ dành cho nội dung nghe nhìn). Bên trái: Còn %1$s pin. Bên phải: Còn %2$s pin.""Đã kết nối (có hỗ trợ tính năng chia sẻ âm thanh). Còn %1$s pin.""Đã kết nối (có hỗ trợ tính năng chia sẻ âm thanh). Bên trái: Còn %1$s pin. Bên phải: Còn %2$s pin.""Đã kết nối (có hỗ trợ tính năng chia sẻ âm thanh). Bên trái: Còn %1$s pin.""Đã kết nối (có hỗ trợ tính năng chia sẻ âm thanh). Bên phải: Còn %1$s pin.""Đã kết nối (có hỗ trợ tính năng chia sẻ âm thanh)."
-
-
-
-
-
-
+ "Thiết bị khách (hỗ trợ tính năng chia sẻ âm thanh). Còn %1$s pin."
+ "Thiết bị khách (hỗ trợ tính năng chia sẻ âm thanh). Bên trái: Còn %1$s pin. Bên phải: Còn %2$s pin."
+ "Thiết bị khách (hỗ trợ tính năng chia sẻ âm thanh)""Đang hoạt động (chỉ phát nội dung đa phương tiện)"
-
-
-
-
+ "Thiết bị khách"
+ "Thiết bị khách (chỉ dành cho nội dung nghe nhìn)""Hỗ trợ tính năng chia sẻ âm thanh"
-
-
+ "Thiết bị khách. Hỗ trợ tính năng chia sẻ âm thanh""Đang hoạt động (chỉ phát nội dung đa phương tiện), chỉ dùng tai nghe bên trái""Đang hoạt động (chỉ phát nội dung đa phương tiện), chỉ dùng tai nghe bên phải""Đang hoạt động (chỉ phát nội dung đa phương tiện), đang dùng cả tai nghe bên trái và phải"
@@ -396,8 +386,7 @@
"Kết xuất có tăng tốc phần cứng""Phương tiện""Giám sát"
-
-
+ "Quản lý cửa sổ""Luôn bật chế độ nghiêm ngặt""Màn hình nháy khi ứng dụng thực hiện các hoạt động dài trên luồng chính""Vị trí con trỏ"
@@ -492,12 +481,9 @@
"Triển khai WebView""Đặt triển khai WebView""Lựa chọn này không còn hợp lệ nữa. Hãy thử lại."
-
-
-
-
-
-
+ "Công cụ cho nhà phát triển WebView"
+ "Không tìm thấy gói WebView."
+ "Không khởi chạy được Công cụ cho nhà phát triển.""Chế độ màu của ảnh""Sử dụng sRGB""Đã tắt"
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index f13f7d91bd718..06379e1c254ff 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -107,39 +107,29 @@
"右耳机电池电量 %1$s""使用中""已保存的设备"
- "使用中(仅左耳助听器)"
+ "使用中(仅左耳)""使用中(仅右耳助听器)""使用中(左右耳助听器)""无法更新周围声音""使用中(仅限媒体)。电池电量为 %1$s。""使用中(仅限媒体)。左侧电池电量为 %1$s,右侧电池电量为 %2$s。"
-
-
-
-
-
-
-
-
+ "访客设备。电池电量为 %1$s。"
+ "访客设备。左侧电池电量为 %1$s,右侧电池电量为 %2$s。"
+ "访客设备(仅限媒体)。电池电量为 %1$s。"
+ "访客设备(仅限媒体)。左侧电池电量为 %1$s,右侧电池电量为 %2$s。""已连接(支持音频分享)。电池电量为 %1$s。""已连接(支持音频分享)。左侧电池电量为 %1$s,右侧电池电量为 %2$s。""已连接(支持音频分享)。左侧电池电量为 %1$s。""已连接(支持音频分享)。右侧电池电量为 %1$s。""已连接(支持音频分享)"
-
-
-
-
-
-
+ "访客设备(支持音频分享)。电池电量为 %1$s。"
+ "访客设备(支持音频分享)。左侧电池电量为 %1$s,右侧电池电量为 %2$s。"
+ "访客设备(支持音频分享)""使用中(仅限媒体)"
-
-
-
-
+ "访客设备"
+ "访客设备(仅限媒体)""支持音频分享"
-
-
+ "访客设备。支持音频分享""使用中(仅限媒体),仅左侧""使用中(仅限媒体),仅右侧""使用中(仅限媒体),左侧和右侧"
@@ -396,8 +386,7 @@
"硬件加速渲染""媒体""监控"
-
-
+ "窗口管理""启用严格模式""应用在主线程上执行长时间操作时闪烁屏幕""指针位置"
@@ -492,12 +481,9 @@
"WebView 实现""设置 WebView 实现""此选项已失效,请重试。"
-
-
-
-
-
-
+ "WebView 开发者工具"
+ "未找到 WebView 软件包。"
+ "无法启动开发者工具。""图片颜色模式""使用 sRGB""已停用"
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 14976e098efaa..a3ae971b07c47 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -113,33 +113,23 @@
"無法更新環境聲音""啟用 (只限媒體)。%1$s 電量。""啟用 (只限媒體),左側:%1$s 電量,右側:%2$s 電量。"
-
-
-
-
-
-
-
-
+ "訪客裝置。%1$s 電量。"
+ "訪客裝置。左側:%1$s,右側:%2$s 電量。"
+ "訪客裝置 (僅限媒體)。%1$s 電量。"
+ "訪客裝置 (僅限媒體)。左側:%1$s,右側:%2$s 電量。""已連線 (支援音訊分享功能),%1$s 電量。""已連線 (支援音訊分享功能),左側:%1$s 電量,右側:%2$s 電量。""已連線 (支援音訊分享功能)。左側:%1$s 電量。""已連線 (支援音訊分享功能)。右側:%1$s 電量。""已連線 (支援音訊分享功能)"
-
-
-
-
-
-
+ "訪客裝置 (支援音訊分享功能)。%1$s 電量。"
+ "訪客裝置 (支援音訊分享功能)。左側:%1$s,右側:%2$s 電量。"
+ "訪客裝置 (支援音訊分享功能)""啟用 (只限媒體)"
-
-
-
-
+ "訪客裝置"
+ "訪客裝置 (僅限媒體)""支援音訊分享功能"
-
-
+ "訪客裝置。支援音訊分享功能""左側啟用 (只限媒體)""右側啟用 (只限媒體)""右側同時啟用 (只限媒體)"
@@ -396,8 +386,7 @@
"硬件加速轉譯""媒體""監控"
-
-
+ "視窗管理""嚴格模式已啟用""當應用程式在主執行緒中進行長時間作業時,讓螢幕閃爍""指標位置"
@@ -492,12 +481,9 @@
"WebView 設置""設定 WebView 設置""此選擇已失效,請再試一次。"
-
-
-
-
-
-
+ "WebView 開發人員工具"
+ "找不到 WebView 套件。"
+ "無法啟動開發人員工具。""相片顏色模式""使用 sRGB""已停用"
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index b65cb4f5ecbe9..f670088de16b1 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -113,33 +113,23 @@
"無法更新環境狀態""已啟用 (僅限媒體)。電量:%1$s。""已啟用 (僅限媒體)。左側電量:%1$s,右側電量:%2$s。"
-
-
-
-
-
-
-
-
+ "訪客裝置。電量:%1$s。"
+ "訪客裝置。左側電量:%1$s,右側電量:%2$s。"
+ "訪客裝置 (僅限媒體)。電量:%1$s。"
+ "訪客裝置 (僅限媒體)。左側電量:%1$s,右側電量:%2$s。""已連線 (支援音訊分享)。電量:%1$s。""已連線 (支援音訊分享)。左側電量:%1$s,右側電量:%2$s。""已連線 (支援音訊分享)。左側電量:%1$s。""已連線 (支援音訊分享)。右側電量:%1$s。""已連線 (支援音訊分享)"
-
-
-
-
-
-
+ "訪客裝置 (支援音訊分享)。電量:%1$s。"
+ "訪客裝置 (支援音訊分享)。左側電量:%1$s,右側電量:%2$s。"
+ "訪客裝置 (支援音訊分享)""啟用 (僅限媒體)"
-
-
-
-
+ "訪客裝置"
+ "訪客裝置 (僅限媒體)""支援音訊分享"
-
-
+ "訪客裝置。支援音訊分享""左側啟用 (僅限媒體)""右側啟用 (僅限媒體)""左右側同時啟用 (僅限媒體)"
@@ -396,8 +386,7 @@
"硬體加速轉譯""媒體""監控"
-
-
+ "視窗管理""嚴格模式已啟用""當應用程式在主執行緒中進行長時間作業時,讓螢幕閃爍""指標位置"
@@ -492,12 +481,9 @@
"WebView 實作""設定 WebView 實作""這個選項已失效,請再試一次。"
-
-
-
-
-
-
+ "WebView 開發人員工具"
+ "找不到 WebView 套件。"
+ "無法啟動開發人員工具。""螢幕色彩模式""使用 sRGB""已停用"
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 859c153dd59da..1d792a0a28648 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -113,33 +113,23 @@
"Ayikwazanga ukubuyekeza izindawo ezizungezile""Iyasebenza (imidiya kuphela). %1$s ibhethri.""Iyasebenza (imidiya kuphela). L: %1$s, R: %2$s ibhethri."
-
-
-
-
-
-
-
-
+ "Idivayisi yesivakashi. Ibhethri engu-%1$s."
+ "Idivayisi yesivakashi. L: %1$s, R: %2$s ibhethri."
+ "Idivayisi yomsindo (imidiya kuphela). Ibhethri engu-%1$s."
+ "Idivayisi yomsindo (imidiya kuphela). L: %1$s, R: %2$s ibhethri.""Ixhunyiwe (isekela ukwabelana ngokuqoshiwe). %1$s ibhethri.""Ixhunyiwe (isekela ukwabelana ngokuqoshiwe). L: %1$s, R: %2$s ibhethri.""Ixhunyiwe (isekela ukwabelana ngokuqoshiwe). Kwesokudla: %1$s ibhethri.""Ixhunyiwe (isekela ukwabelana ngokuqoshiwe). Kwesokudla: %1$s ibhethri.""Ixhunyiwe (isekela ukwabelana ngokuqoshiwe)"
-
-
-
-
-
-
+ "Idivayisi yesivakashi (isekela ukwabelana ngomsindo). Ibhethri engu-%1$s."
+ "Idivayisi yesivakashi (isekela ukwabelana ngomsindo). L: %1$s, R: %2$s ibhethri."
+ "Idivayisi yesivakashi (isekela ukwabelana ngomsindo)""Kuyasebenza (imidiya kuphela)"
-
-
-
-
+ "Idivayisi yesivakashi"
+ "Idivayisi yesivakashi (imidiya kuphela)""Isekela ukwabelana ngokuqoshiwe"
-
-
+ "Idivayisi yesivakashi. Isekela ukwabelana ngomsindo""Iyasebenza (imidiya kuphela), ngakwesokunxele kuphela""Kuyasebenza (imidiya kuphela), ngakwesokudla kuphela""Kuyasebenza (imidiya kuphela), ngakwesokunxele nakwesokudla"
@@ -396,8 +386,7 @@
"Ukunikezelwa okusheshisiwe kwezingxenyekazi zekhompyutha""Imidiya""Ukwengamela"
-
-
+ "Ukuphathwa Kwewindi""Imodi eqinile ivumelwe""Ukuphazimisa isikrini uma izinhlelo zokusebenza ziyenza umsebenzi ngesikhathi eside kuchungechunge olukhulu""Isikhombi sendawo"
@@ -492,12 +481,9 @@
"Ukufakwa ke-WebView""Sesba ukufakwa kwe-WebView""Lokhu kukhetha akusavumelekile. Zama futhi."
-
-
-
-
-
-
+ "IWebView DevTools"
+ "Iphakheji yeWebView ayitholwanga."
+ "Ayikwazanga ukuqalisa iDevTools.""Imodi yombala wesithombe""Sebenzisa i-sRGB""Kukhutshaziwe"
--
GitLab
From 8c8593fb2b7b4a386b810d013532764606a7d65a Mon Sep 17 00:00:00 2001
From: Mill Chen
Date: Fri, 21 Feb 2025 08:05:21 +0000
Subject: [PATCH 089/111] Update folder names of resources for v36
Fix: 391685101
Test: visual test
Flag: EXEMPT folder names updated
Change-Id: I2ef2f4e67468448c7363e201292f64cc9cb9a4b0
---
.../settingslib_expressive_action_buttons.xml | 0
.../res/{values-v35 => values-v36}/styles_expressive.xml | 0
.../settingslib_expressive_card_background.xml | 0
.../settingslib_resolved_banner_avd.xml | 0
.../settingslib_expressive_banner_message.xml | 0
.../res/{values-v35 => values-v36}/styles_expressive.xml | 0
.../settingslib_expressive_button_filled.xml | 0
.../settingslib_expressive_button_filled_extra.xml | 0
.../settingslib_expressive_button_filled_large.xml | 0
.../settingslib_expressive_button_outline.xml | 0
.../settingslib_expressive_button_outline_extra.xml | 0
.../settingslib_expressive_button_outline_large.xml | 0
.../settingslib_expressive_button_tonal.xml | 0
.../settingslib_expressive_button_tonal_extra.xml | 0
.../settingslib_expressive_button_tonal_large.xml | 0
.../settingslib_expressive_icon_back.xml | 0
.../settingslib_expressive_collapsing_toolbar_base_layout.xml | 0
...ttingslib_expressive_collapsing_toolbar_content_layout.xml | 0
.../res/{values-night-v35 => values-night-v36}/themes.xml | 0
.../res/{values-v35 => values-v36}/styles.xml | 0
.../res/{values-v35 => values-v36}/styles_expressive.xml | 0
.../res/{values-v35 => values-v36}/themes.xml | 0
.../res/{values-v35 => values-v36}/themes_expressive.xml | 0
.../settingslib_main_switch_text_color.xml | 0
.../settingslib_main_switch_text_color.xml | 0
.../settingslib_expressive_switch_bar_bg.xml | 0
.../settingslib_expressive_main_switch_bar.xml | 0
.../settingslib_expressive_main_switch_layout.xml | 0
.../settingslib_tabs_indicator_color.xml | 0
.../settingslib_switch_track_outline_color.xml | 0
.../settingslib_expressive_color_main_switch_track.xml | 0
.../settingslib_preference_bg_color.xml | 0
.../settingslib_switch_track_outline_color.xml | 0
.../settingslib_text_color_primary.xml | 0
.../settingslib_text_color_secondary.xml | 0
.../settingslib_arrow_drop_down.xml | 0
.../settingslib_list_divider.xml | 0
.../settingslib_progress_horizontal.xml | 0
.../settingslib_round_background.xml | 0
.../settingslib_round_background_bottom.xml | 0
.../settingslib_round_background_bottom_highlighted.xml | 0
.../settingslib_round_background_bottom_selected.xml | 0
.../settingslib_round_background_center.xml | 0
.../settingslib_round_background_center_highlighted.xml | 0
.../settingslib_round_background_center_selected.xml | 0
.../settingslib_round_background_highlighted.xml | 0
.../settingslib_round_background_selected.xml | 0
.../settingslib_round_background_top.xml | 0
.../settingslib_round_background_top_highlighted.xml | 0
.../settingslib_round_background_top_selected.xml | 0
.../settingslib_spinner_background.xml | 0
.../settingslib_spinner_dropdown_background.xml | 0
.../settingslib_expressive_preference.xml | 0
.../settingslib_expressive_preference_icon_frame.xml | 0
.../settingslib_expressive_preference_switch.xml | 0
.../settingslib_expressive_two_target_divider.xml | 0
.../res/{values-night-v35 => values-night-v36}/colors.xml | 0
.../SettingsTheme/res/{values-v35 => values-v36}/colors.xml | 0
.../SettingsTheme/res/{values-v35 => values-v36}/dimens.xml | 0
.../res/{values-v35 => values-v36}/styles_expressive.xml | 0
.../styles_preference_expressive.xml | 0
.../SettingsTheme/res/{values-v35 => values-v36}/themes.xml | 4 ++--
.../res/{values-v35 => values-v36}/themes_expressive.xml | 0
.../themes_preference_expressive.xml | 0
.../settingslib_expressive_preference_two_target.xml | 0
65 files changed, 2 insertions(+), 2 deletions(-)
rename packages/SettingsLib/ActionButtonsPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_action_buttons.xml (100%)
rename packages/SettingsLib/ActionButtonsPreference/res/{values-v35 => values-v36}/styles_expressive.xml (100%)
rename packages/SettingsLib/BannerMessagePreference/res/{drawable-v35 => drawable-v36}/settingslib_expressive_card_background.xml (100%)
rename packages/SettingsLib/BannerMessagePreference/res/{drawable-v35 => drawable-v36}/settingslib_resolved_banner_avd.xml (100%)
rename packages/SettingsLib/BannerMessagePreference/res/{layout-v35 => layout-v36}/settingslib_expressive_banner_message.xml (100%)
rename packages/SettingsLib/BannerMessagePreference/res/{values-v35 => values-v36}/styles_expressive.xml (100%)
rename packages/SettingsLib/ButtonPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_button_filled.xml (100%)
rename packages/SettingsLib/ButtonPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_button_filled_extra.xml (100%)
rename packages/SettingsLib/ButtonPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_button_filled_large.xml (100%)
rename packages/SettingsLib/ButtonPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_button_outline.xml (100%)
rename packages/SettingsLib/ButtonPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_button_outline_extra.xml (100%)
rename packages/SettingsLib/ButtonPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_button_outline_large.xml (100%)
rename packages/SettingsLib/ButtonPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_button_tonal.xml (100%)
rename packages/SettingsLib/ButtonPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_button_tonal_extra.xml (100%)
rename packages/SettingsLib/ButtonPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_button_tonal_large.xml (100%)
rename packages/SettingsLib/CollapsingToolbarBaseActivity/res/{drawable-v35 => drawable-v36}/settingslib_expressive_icon_back.xml (100%)
rename packages/SettingsLib/CollapsingToolbarBaseActivity/res/{layout-v35 => layout-v36}/settingslib_expressive_collapsing_toolbar_base_layout.xml (100%)
rename packages/SettingsLib/CollapsingToolbarBaseActivity/res/{layout-v35 => layout-v36}/settingslib_expressive_collapsing_toolbar_content_layout.xml (100%)
rename packages/SettingsLib/CollapsingToolbarBaseActivity/res/{values-night-v35 => values-night-v36}/themes.xml (100%)
rename packages/SettingsLib/CollapsingToolbarBaseActivity/res/{values-v35 => values-v36}/styles.xml (100%)
rename packages/SettingsLib/CollapsingToolbarBaseActivity/res/{values-v35 => values-v36}/styles_expressive.xml (100%)
rename packages/SettingsLib/CollapsingToolbarBaseActivity/res/{values-v35 => values-v36}/themes.xml (100%)
rename packages/SettingsLib/CollapsingToolbarBaseActivity/res/{values-v35 => values-v36}/themes_expressive.xml (100%)
rename packages/SettingsLib/MainSwitchPreference/res/{color-night-v35 => color-night-v36}/settingslib_main_switch_text_color.xml (100%)
rename packages/SettingsLib/MainSwitchPreference/res/{color-v35 => color-v36}/settingslib_main_switch_text_color.xml (100%)
rename packages/SettingsLib/MainSwitchPreference/res/{drawable-v35 => drawable-v36}/settingslib_expressive_switch_bar_bg.xml (100%)
rename packages/SettingsLib/MainSwitchPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_main_switch_bar.xml (100%)
rename packages/SettingsLib/MainSwitchPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_main_switch_layout.xml (100%)
rename packages/SettingsLib/ProfileSelector/res/{color-night-v35 => color-night-v36}/settingslib_tabs_indicator_color.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{color-night-v35 => color-night-v36}/settingslib_switch_track_outline_color.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{color-v35 => color-v36}/settingslib_expressive_color_main_switch_track.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{color-v35 => color-v36}/settingslib_preference_bg_color.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{color-v35 => color-v36}/settingslib_switch_track_outline_color.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{color-v35 => color-v36}/settingslib_text_color_primary.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{color-v35 => color-v36}/settingslib_text_color_secondary.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_arrow_drop_down.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_list_divider.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_progress_horizontal.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_round_background.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_round_background_bottom.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_round_background_bottom_highlighted.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_round_background_bottom_selected.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_round_background_center.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_round_background_center_highlighted.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_round_background_center_selected.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_round_background_highlighted.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_round_background_selected.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_round_background_top.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_round_background_top_highlighted.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_round_background_top_selected.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_spinner_background.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{drawable-v35 => drawable-v36}/settingslib_spinner_dropdown_background.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{layout-v35 => layout-v36}/settingslib_expressive_preference.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{layout-v35 => layout-v36}/settingslib_expressive_preference_icon_frame.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{layout-v35 => layout-v36}/settingslib_expressive_preference_switch.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{layout-v35 => layout-v36}/settingslib_expressive_two_target_divider.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{values-night-v35 => values-night-v36}/colors.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{values-v35 => values-v36}/colors.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{values-v35 => values-v36}/dimens.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{values-v35 => values-v36}/styles_expressive.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{values-v35 => values-v36}/styles_preference_expressive.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{values-v35 => values-v36}/themes.xml (95%)
rename packages/SettingsLib/SettingsTheme/res/{values-v35 => values-v36}/themes_expressive.xml (100%)
rename packages/SettingsLib/SettingsTheme/res/{values-v35 => values-v36}/themes_preference_expressive.xml (100%)
rename packages/SettingsLib/TwoTargetPreference/res/{layout-v35 => layout-v36}/settingslib_expressive_preference_two_target.xml (100%)
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/layout-v35/settingslib_expressive_action_buttons.xml b/packages/SettingsLib/ActionButtonsPreference/res/layout-v36/settingslib_expressive_action_buttons.xml
similarity index 100%
rename from packages/SettingsLib/ActionButtonsPreference/res/layout-v35/settingslib_expressive_action_buttons.xml
rename to packages/SettingsLib/ActionButtonsPreference/res/layout-v36/settingslib_expressive_action_buttons.xml
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml b/packages/SettingsLib/ActionButtonsPreference/res/values-v36/styles_expressive.xml
similarity index 100%
rename from packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml
rename to packages/SettingsLib/ActionButtonsPreference/res/values-v36/styles_expressive.xml
diff --git a/packages/SettingsLib/BannerMessagePreference/res/drawable-v35/settingslib_expressive_card_background.xml b/packages/SettingsLib/BannerMessagePreference/res/drawable-v36/settingslib_expressive_card_background.xml
similarity index 100%
rename from packages/SettingsLib/BannerMessagePreference/res/drawable-v35/settingslib_expressive_card_background.xml
rename to packages/SettingsLib/BannerMessagePreference/res/drawable-v36/settingslib_expressive_card_background.xml
diff --git a/packages/SettingsLib/BannerMessagePreference/res/drawable-v35/settingslib_resolved_banner_avd.xml b/packages/SettingsLib/BannerMessagePreference/res/drawable-v36/settingslib_resolved_banner_avd.xml
similarity index 100%
rename from packages/SettingsLib/BannerMessagePreference/res/drawable-v35/settingslib_resolved_banner_avd.xml
rename to packages/SettingsLib/BannerMessagePreference/res/drawable-v36/settingslib_resolved_banner_avd.xml
diff --git a/packages/SettingsLib/BannerMessagePreference/res/layout-v35/settingslib_expressive_banner_message.xml b/packages/SettingsLib/BannerMessagePreference/res/layout-v36/settingslib_expressive_banner_message.xml
similarity index 100%
rename from packages/SettingsLib/BannerMessagePreference/res/layout-v35/settingslib_expressive_banner_message.xml
rename to packages/SettingsLib/BannerMessagePreference/res/layout-v36/settingslib_expressive_banner_message.xml
diff --git a/packages/SettingsLib/BannerMessagePreference/res/values-v35/styles_expressive.xml b/packages/SettingsLib/BannerMessagePreference/res/values-v36/styles_expressive.xml
similarity index 100%
rename from packages/SettingsLib/BannerMessagePreference/res/values-v35/styles_expressive.xml
rename to packages/SettingsLib/BannerMessagePreference/res/values-v36/styles_expressive.xml
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled.xml b/packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_filled.xml
similarity index 100%
rename from packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled.xml
rename to packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_filled.xml
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled_extra.xml b/packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_filled_extra.xml
similarity index 100%
rename from packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled_extra.xml
rename to packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_filled_extra.xml
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled_large.xml b/packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_filled_large.xml
similarity index 100%
rename from packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_filled_large.xml
rename to packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_filled_large.xml
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline.xml b/packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_outline.xml
similarity index 100%
rename from packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline.xml
rename to packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_outline.xml
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline_extra.xml b/packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_outline_extra.xml
similarity index 100%
rename from packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline_extra.xml
rename to packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_outline_extra.xml
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline_large.xml b/packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_outline_large.xml
similarity index 100%
rename from packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_outline_large.xml
rename to packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_outline_large.xml
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal.xml b/packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_tonal.xml
similarity index 100%
rename from packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal.xml
rename to packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_tonal.xml
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal_extra.xml b/packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_tonal_extra.xml
similarity index 100%
rename from packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal_extra.xml
rename to packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_tonal_extra.xml
diff --git a/packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal_large.xml b/packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_tonal_large.xml
similarity index 100%
rename from packages/SettingsLib/ButtonPreference/res/layout-v35/settingslib_expressive_button_tonal_large.xml
rename to packages/SettingsLib/ButtonPreference/res/layout-v36/settingslib_expressive_button_tonal_large.xml
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v36/settingslib_expressive_icon_back.xml
similarity index 100%
rename from packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v35/settingslib_expressive_icon_back.xml
rename to packages/SettingsLib/CollapsingToolbarBaseActivity/res/drawable-v36/settingslib_expressive_icon_back.xml
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v35/settingslib_expressive_collapsing_toolbar_base_layout.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v36/settingslib_expressive_collapsing_toolbar_base_layout.xml
similarity index 100%
rename from packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v35/settingslib_expressive_collapsing_toolbar_base_layout.xml
rename to packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v36/settingslib_expressive_collapsing_toolbar_base_layout.xml
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v35/settingslib_expressive_collapsing_toolbar_content_layout.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v36/settingslib_expressive_collapsing_toolbar_content_layout.xml
similarity index 100%
rename from packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v35/settingslib_expressive_collapsing_toolbar_content_layout.xml
rename to packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v36/settingslib_expressive_collapsing_toolbar_content_layout.xml
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v35/themes.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v36/themes.xml
similarity index 100%
rename from packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v35/themes.xml
rename to packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-night-v36/themes.xml
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v36/styles.xml
similarity index 100%
rename from packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles.xml
rename to packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v36/styles.xml
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v36/styles_expressive.xml
similarity index 100%
rename from packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/styles_expressive.xml
rename to packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v36/styles_expressive.xml
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v36/themes.xml
similarity index 100%
rename from packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes.xml
rename to packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v36/themes.xml
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes_expressive.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v36/themes_expressive.xml
similarity index 100%
rename from packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v35/themes_expressive.xml
rename to packages/SettingsLib/CollapsingToolbarBaseActivity/res/values-v36/themes_expressive.xml
diff --git a/packages/SettingsLib/MainSwitchPreference/res/color-night-v35/settingslib_main_switch_text_color.xml b/packages/SettingsLib/MainSwitchPreference/res/color-night-v36/settingslib_main_switch_text_color.xml
similarity index 100%
rename from packages/SettingsLib/MainSwitchPreference/res/color-night-v35/settingslib_main_switch_text_color.xml
rename to packages/SettingsLib/MainSwitchPreference/res/color-night-v36/settingslib_main_switch_text_color.xml
diff --git a/packages/SettingsLib/MainSwitchPreference/res/color-v35/settingslib_main_switch_text_color.xml b/packages/SettingsLib/MainSwitchPreference/res/color-v36/settingslib_main_switch_text_color.xml
similarity index 100%
rename from packages/SettingsLib/MainSwitchPreference/res/color-v35/settingslib_main_switch_text_color.xml
rename to packages/SettingsLib/MainSwitchPreference/res/color-v36/settingslib_main_switch_text_color.xml
diff --git a/packages/SettingsLib/MainSwitchPreference/res/drawable-v35/settingslib_expressive_switch_bar_bg.xml b/packages/SettingsLib/MainSwitchPreference/res/drawable-v36/settingslib_expressive_switch_bar_bg.xml
similarity index 100%
rename from packages/SettingsLib/MainSwitchPreference/res/drawable-v35/settingslib_expressive_switch_bar_bg.xml
rename to packages/SettingsLib/MainSwitchPreference/res/drawable-v36/settingslib_expressive_switch_bar_bg.xml
diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v35/settingslib_expressive_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v36/settingslib_expressive_main_switch_bar.xml
similarity index 100%
rename from packages/SettingsLib/MainSwitchPreference/res/layout-v35/settingslib_expressive_main_switch_bar.xml
rename to packages/SettingsLib/MainSwitchPreference/res/layout-v36/settingslib_expressive_main_switch_bar.xml
diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v35/settingslib_expressive_main_switch_layout.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v36/settingslib_expressive_main_switch_layout.xml
similarity index 100%
rename from packages/SettingsLib/MainSwitchPreference/res/layout-v35/settingslib_expressive_main_switch_layout.xml
rename to packages/SettingsLib/MainSwitchPreference/res/layout-v36/settingslib_expressive_main_switch_layout.xml
diff --git a/packages/SettingsLib/ProfileSelector/res/color-night-v35/settingslib_tabs_indicator_color.xml b/packages/SettingsLib/ProfileSelector/res/color-night-v36/settingslib_tabs_indicator_color.xml
similarity index 100%
rename from packages/SettingsLib/ProfileSelector/res/color-night-v35/settingslib_tabs_indicator_color.xml
rename to packages/SettingsLib/ProfileSelector/res/color-night-v36/settingslib_tabs_indicator_color.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/color-night-v35/settingslib_switch_track_outline_color.xml b/packages/SettingsLib/SettingsTheme/res/color-night-v36/settingslib_switch_track_outline_color.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/color-night-v35/settingslib_switch_track_outline_color.xml
rename to packages/SettingsLib/SettingsTheme/res/color-night-v36/settingslib_switch_track_outline_color.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_expressive_color_main_switch_track.xml b/packages/SettingsLib/SettingsTheme/res/color-v36/settingslib_expressive_color_main_switch_track.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_expressive_color_main_switch_track.xml
rename to packages/SettingsLib/SettingsTheme/res/color-v36/settingslib_expressive_color_main_switch_track.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_preference_bg_color.xml b/packages/SettingsLib/SettingsTheme/res/color-v36/settingslib_preference_bg_color.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_preference_bg_color.xml
rename to packages/SettingsLib/SettingsTheme/res/color-v36/settingslib_preference_bg_color.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_switch_track_outline_color.xml b/packages/SettingsLib/SettingsTheme/res/color-v36/settingslib_switch_track_outline_color.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_switch_track_outline_color.xml
rename to packages/SettingsLib/SettingsTheme/res/color-v36/settingslib_switch_track_outline_color.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_text_color_primary.xml b/packages/SettingsLib/SettingsTheme/res/color-v36/settingslib_text_color_primary.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_text_color_primary.xml
rename to packages/SettingsLib/SettingsTheme/res/color-v36/settingslib_text_color_primary.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_text_color_secondary.xml b/packages/SettingsLib/SettingsTheme/res/color-v36/settingslib_text_color_secondary.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/color-v35/settingslib_text_color_secondary.xml
rename to packages/SettingsLib/SettingsTheme/res/color-v36/settingslib_text_color_secondary.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_arrow_drop_down.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_arrow_drop_down.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_arrow_drop_down.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_arrow_drop_down.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_list_divider.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_list_divider.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_list_divider.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_list_divider.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_progress_horizontal.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_progress_horizontal.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_progress_horizontal.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_progress_horizontal.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_bottom.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_bottom.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_bottom.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_bottom.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_bottom_highlighted.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_bottom_highlighted.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_bottom_highlighted.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_bottom_highlighted.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_bottom_selected.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_bottom_selected.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_bottom_selected.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_bottom_selected.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_center.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_center.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_center.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_center.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_center_highlighted.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_center_highlighted.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_center_highlighted.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_center_highlighted.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_center_selected.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_center_selected.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_center_selected.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_center_selected.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_highlighted.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_highlighted.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_highlighted.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_highlighted.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_selected.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_selected.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_selected.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_selected.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_top.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_top.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_top.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_top.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_top_highlighted.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_top_highlighted.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_top_highlighted.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_top_highlighted.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_top_selected.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_top_selected.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_top_selected.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_round_background_top_selected.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_spinner_background.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_spinner_background.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_spinner_background.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_spinner_background.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_spinner_dropdown_background.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_spinner_dropdown_background.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_spinner_dropdown_background.xml
rename to packages/SettingsLib/SettingsTheme/res/drawable-v36/settingslib_spinner_dropdown_background.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference.xml b/packages/SettingsLib/SettingsTheme/res/layout-v36/settingslib_expressive_preference.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference.xml
rename to packages/SettingsLib/SettingsTheme/res/layout-v36/settingslib_expressive_preference.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_icon_frame.xml b/packages/SettingsLib/SettingsTheme/res/layout-v36/settingslib_expressive_preference_icon_frame.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_icon_frame.xml
rename to packages/SettingsLib/SettingsTheme/res/layout-v36/settingslib_expressive_preference_icon_frame.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_switch.xml b/packages/SettingsLib/SettingsTheme/res/layout-v36/settingslib_expressive_preference_switch.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_preference_switch.xml
rename to packages/SettingsLib/SettingsTheme/res/layout-v36/settingslib_expressive_preference_switch.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_two_target_divider.xml b/packages/SettingsLib/SettingsTheme/res/layout-v36/settingslib_expressive_two_target_divider.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/layout-v35/settingslib_expressive_two_target_divider.xml
rename to packages/SettingsLib/SettingsTheme/res/layout-v36/settingslib_expressive_two_target_divider.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-night-v36/colors.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/values-night-v35/colors.xml
rename to packages/SettingsLib/SettingsTheme/res/values-night-v36/colors.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml b/packages/SettingsLib/SettingsTheme/res/values-v36/colors.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/values-v35/colors.xml
rename to packages/SettingsLib/SettingsTheme/res/values-v36/colors.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/dimens.xml b/packages/SettingsLib/SettingsTheme/res/values-v36/dimens.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/values-v35/dimens.xml
rename to packages/SettingsLib/SettingsTheme/res/values-v36/dimens.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v36/styles_expressive.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
rename to packages/SettingsLib/SettingsTheme/res/values-v36/styles_expressive.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_preference_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v36/styles_preference_expressive.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/values-v35/styles_preference_expressive.xml
rename to packages/SettingsLib/SettingsTheme/res/values-v36/styles_preference_expressive.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/themes.xml b/packages/SettingsLib/SettingsTheme/res/values-v36/themes.xml
similarity index 95%
rename from packages/SettingsLib/SettingsTheme/res/values-v35/themes.xml
rename to packages/SettingsLib/SettingsTheme/res/values-v36/themes.xml
index b6e80c784f10f..1c45ff6ca6cf2 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v35/themes.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v36/themes.xml
@@ -16,7 +16,7 @@
-->
-
-
+
\ No newline at end of file
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/themes_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v36/themes_expressive.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/values-v35/themes_expressive.xml
rename to packages/SettingsLib/SettingsTheme/res/values-v36/themes_expressive.xml
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/themes_preference_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v36/themes_preference_expressive.xml
similarity index 100%
rename from packages/SettingsLib/SettingsTheme/res/values-v35/themes_preference_expressive.xml
rename to packages/SettingsLib/SettingsTheme/res/values-v36/themes_preference_expressive.xml
diff --git a/packages/SettingsLib/TwoTargetPreference/res/layout-v35/settingslib_expressive_preference_two_target.xml b/packages/SettingsLib/TwoTargetPreference/res/layout-v36/settingslib_expressive_preference_two_target.xml
similarity index 100%
rename from packages/SettingsLib/TwoTargetPreference/res/layout-v35/settingslib_expressive_preference_two_target.xml
rename to packages/SettingsLib/TwoTargetPreference/res/layout-v36/settingslib_expressive_preference_two_target.xml
--
GitLab
From c8ce1d8377e98da84cfc3cef8ea5104b9acf7b3d Mon Sep 17 00:00:00 2001
From: Nicolo' Mazzucato
Date: Fri, 21 Feb 2025 10:05:46 +0000
Subject: [PATCH 090/111] Provide correct context on cast dialog creation
The dialog context was the shade one, that is now a TYPE_NOTIFICATION_SHADE window context. We can't create dialogs from that.
This uses the context created from ShadeDialogContextInteractor (that is DIALOG_WINDOW_TYPE)
Bug: 362719719
Bug: 383294128
Test: open cast dialog from QS
Flag: com.android.systemui.shade_window_goes_around
Change-Id: I216b2a010c3260951f4a238c7771fe02744ad786
---
.../com/android/systemui/qs/tiles/CastTileTest.java | 10 ++++++++--
.../src/com/android/systemui/qs/tiles/CastTile.java | 8 ++++++--
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/CastTileTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/CastTileTest.java
index 31a627fe06672..765c5749cd4be 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/CastTileTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/CastTileTest.java
@@ -50,6 +50,8 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.QsEventLogger;
import com.android.systemui.qs.logging.QSLogger;
+import com.android.systemui.shade.domain.interactor.FakeShadeDialogContextInteractor;
+import com.android.systemui.shade.domain.interactor.ShadeDialogContextInteractor;
import com.android.systemui.statusbar.connectivity.IconState;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.SignalCallback;
@@ -107,6 +109,8 @@ public class CastTileTest extends SysuiTestCase {
private final FakeConnectivityRepository mConnectivityRepository =
new FakeConnectivityRepository();
private final FakeFeatureFlags mFeatureFlags = new FakeFeatureFlags();
+ private final ShadeDialogContextInteractor mShadeDialogContextInteractor =
+ new FakeShadeDialogContextInteractor(mContext);
private TestableLooper mTestableLooper;
private CastTile mCastTile;
@@ -535,7 +539,8 @@ public class CastTileTest extends SysuiTestCase {
mDialogTransitionAnimator,
mConnectivityRepository,
mJavaAdapter,
- mFeatureFlags
+ mFeatureFlags,
+ mShadeDialogContextInteractor
);
mCastTile.initialize();
@@ -578,7 +583,8 @@ public class CastTileTest extends SysuiTestCase {
mDialogTransitionAnimator,
mConnectivityRepository,
mJavaAdapter,
- mFeatureFlags
+ mFeatureFlags,
+ mShadeDialogContextInteractor
);
mCastTile.initialize();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
index 30c2adf89e9bb..c60e3da9d8339 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
@@ -54,6 +54,7 @@ import com.android.systemui.qs.QsEventLogger;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.res.R;
+import com.android.systemui.shade.domain.interactor.ShadeDialogContextInteractor;
import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.connectivity.WifiIndicators;
@@ -89,6 +90,7 @@ public class CastTile extends QSTileImpl {
private final Callback mCallback = new Callback();
private final TileJavaAdapter mJavaAdapter;
private final FeatureFlags mFeatureFlags;
+ private final ShadeDialogContextInteractor mShadeDialogContextInteractor;
private boolean mCastTransportAllowed;
private boolean mHotspotConnected;
@@ -110,7 +112,8 @@ public class CastTile extends QSTileImpl {
DialogTransitionAnimator dialogTransitionAnimator,
ConnectivityRepository connectivityRepository,
TileJavaAdapter javaAdapter,
- FeatureFlags featureFlags
+ FeatureFlags featureFlags,
+ ShadeDialogContextInteractor shadeDialogContextInteractor
) {
super(host, uiEventLogger, backgroundLooper, mainHandler, falsingManager, metricsLogger,
statusBarStateController, activityStarter, qsLogger);
@@ -120,6 +123,7 @@ public class CastTile extends QSTileImpl {
mDialogTransitionAnimator = dialogTransitionAnimator;
mJavaAdapter = javaAdapter;
mFeatureFlags = featureFlags;
+ mShadeDialogContextInteractor = shadeDialogContextInteractor;
mController.observe(this, mCallback);
mKeyguard.observe(this, mCallback);
if (!mFeatureFlags.isEnabled(SIGNAL_CALLBACK_DEPRECATION)) {
@@ -220,7 +224,7 @@ public class CastTile extends QSTileImpl {
mUiHandler.post(() -> {
final DialogHolder holder = new DialogHolder();
final Dialog dialog = MediaRouteDialogPresenter.createDialog(
- mContext,
+ mShadeDialogContextInteractor.getContext(),
ROUTE_TYPE_REMOTE_DISPLAY,
v -> {
ActivityTransitionAnimator.Controller controller =
--
GitLab
From f0484b2c40d21b7757d2cbe12f97351634ac21c5 Mon Sep 17 00:00:00 2001
From: Ming-Shin Lu
Date: Fri, 21 Feb 2025 08:42:33 +0000
Subject: [PATCH 091/111] [BrightnessToast]: fix string being ellisped in wrong
place
Remove the line breaking charactor in the middle of the string to avoid
the sting being ellipsed in wrong place when chaning the font scale
bigger (e.g. font_size > 1.1 - 1.2)
Fix: 397267724
Fix: 396747791
Flag: EXEMPT string resources update
Test: manual
Change-Id: I3eb19db0366a378bbea0f44db3d5e3f02de744e0
---
packages/SystemUI/res/values-af/strings.xml | 2 +-
packages/SystemUI/res/values-am/strings.xml | 2 +-
packages/SystemUI/res/values-ar/strings.xml | 2 +-
packages/SystemUI/res/values-az/strings.xml | 2 +-
packages/SystemUI/res/values-b+sr+Latn/strings.xml | 2 +-
packages/SystemUI/res/values-be/strings.xml | 2 +-
packages/SystemUI/res/values-bg/strings.xml | 2 +-
packages/SystemUI/res/values-bn/strings.xml | 2 +-
packages/SystemUI/res/values-bs/strings.xml | 2 +-
packages/SystemUI/res/values-ca/strings.xml | 2 +-
packages/SystemUI/res/values-cs/strings.xml | 2 +-
packages/SystemUI/res/values-da/strings.xml | 2 +-
packages/SystemUI/res/values-de/strings.xml | 2 +-
packages/SystemUI/res/values-el/strings.xml | 2 +-
packages/SystemUI/res/values-en-rAU/strings.xml | 2 +-
packages/SystemUI/res/values-en-rCA/strings.xml | 2 +-
packages/SystemUI/res/values-en-rGB/strings.xml | 2 +-
packages/SystemUI/res/values-en-rIN/strings.xml | 2 +-
packages/SystemUI/res/values-es-rUS/strings.xml | 2 +-
packages/SystemUI/res/values-es/strings.xml | 2 +-
packages/SystemUI/res/values-et/strings.xml | 2 +-
packages/SystemUI/res/values-eu/strings.xml | 2 +-
packages/SystemUI/res/values-fa/strings.xml | 2 +-
packages/SystemUI/res/values-fi/strings.xml | 2 +-
packages/SystemUI/res/values-fr-rCA/strings.xml | 2 +-
packages/SystemUI/res/values-fr/strings.xml | 2 +-
packages/SystemUI/res/values-gl/strings.xml | 2 +-
packages/SystemUI/res/values-gu/strings.xml | 2 +-
packages/SystemUI/res/values-hi/strings.xml | 2 +-
packages/SystemUI/res/values-hr/strings.xml | 2 +-
packages/SystemUI/res/values-hu/strings.xml | 2 +-
packages/SystemUI/res/values-hy/strings.xml | 2 +-
packages/SystemUI/res/values-in/strings.xml | 2 +-
packages/SystemUI/res/values-is/strings.xml | 2 +-
packages/SystemUI/res/values-it/strings.xml | 2 +-
packages/SystemUI/res/values-iw/strings.xml | 2 +-
packages/SystemUI/res/values-ja/strings.xml | 2 +-
packages/SystemUI/res/values-kk/strings.xml | 2 +-
packages/SystemUI/res/values-km/strings.xml | 2 +-
packages/SystemUI/res/values-kn/strings.xml | 2 +-
packages/SystemUI/res/values-ko/strings.xml | 2 +-
packages/SystemUI/res/values-ky/strings.xml | 2 +-
packages/SystemUI/res/values-lo/strings.xml | 2 +-
packages/SystemUI/res/values-lt/strings.xml | 2 +-
packages/SystemUI/res/values-lv/strings.xml | 2 +-
packages/SystemUI/res/values-mk/strings.xml | 2 +-
packages/SystemUI/res/values-ml/strings.xml | 2 +-
packages/SystemUI/res/values-mn/strings.xml | 2 +-
packages/SystemUI/res/values-mr/strings.xml | 2 +-
packages/SystemUI/res/values-ms/strings.xml | 2 +-
packages/SystemUI/res/values-my/strings.xml | 2 +-
packages/SystemUI/res/values-nb/strings.xml | 2 +-
packages/SystemUI/res/values-ne/strings.xml | 2 +-
packages/SystemUI/res/values-nl/strings.xml | 2 +-
packages/SystemUI/res/values-or/strings.xml | 2 +-
packages/SystemUI/res/values-pa/strings.xml | 2 +-
packages/SystemUI/res/values-pl/strings.xml | 2 +-
packages/SystemUI/res/values-pt-rBR/strings.xml | 2 +-
packages/SystemUI/res/values-pt-rPT/strings.xml | 2 +-
packages/SystemUI/res/values-pt/strings.xml | 2 +-
packages/SystemUI/res/values-ro/strings.xml | 2 +-
packages/SystemUI/res/values-ru/strings.xml | 2 +-
packages/SystemUI/res/values-si/strings.xml | 2 +-
packages/SystemUI/res/values-sk/strings.xml | 2 +-
packages/SystemUI/res/values-sl/strings.xml | 2 +-
packages/SystemUI/res/values-sq/strings.xml | 2 +-
packages/SystemUI/res/values-sr/strings.xml | 2 +-
packages/SystemUI/res/values-sv/strings.xml | 2 +-
packages/SystemUI/res/values-sw/strings.xml | 2 +-
packages/SystemUI/res/values-ta/strings.xml | 2 +-
packages/SystemUI/res/values-te/strings.xml | 2 +-
packages/SystemUI/res/values-th/strings.xml | 2 +-
packages/SystemUI/res/values-tl/strings.xml | 2 +-
packages/SystemUI/res/values-tr/strings.xml | 2 +-
packages/SystemUI/res/values-uk/strings.xml | 2 +-
packages/SystemUI/res/values-ur/strings.xml | 2 +-
packages/SystemUI/res/values-uz/strings.xml | 2 +-
packages/SystemUI/res/values-vi/strings.xml | 2 +-
packages/SystemUI/res/values-zh-rCN/strings.xml | 2 +-
packages/SystemUI/res/values-zh-rHK/strings.xml | 2 +-
packages/SystemUI/res/values-zh-rTW/strings.xml | 2 +-
packages/SystemUI/res/values-zu/strings.xml | 2 +-
packages/SystemUI/res/values/strings.xml | 2 +-
83 files changed, 83 insertions(+), 83 deletions(-)
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index b8b69b6ea9929..c72d969c57a7f 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -328,7 +328,7 @@
"Invoer""Gehoortoestelle""Skakel tans aan …"
- "Kan nie helderheid verstel nie omdat dit\n deur die topapp beheer word"
+ "Kan nie helderheid verstel nie omdat dit deur die topapp beheer word""Outodraai""Outodraai skerm""Ligging"
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index c89ea75ad4cd0..3abce3bae80e8 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -328,7 +328,7 @@
"ግቤት""መስሚያ አጋዥ መሣሪያዎች""በማብራት ላይ..."
- "ከላይ ባለው መተግበሪያ ቁጥጥር ላይ ስለሆነ\n ብሩህነትን ማስተካከል አልተቻለም"
+ "ከላይ ባለው መተግበሪያ ቁጥጥር ላይ ስለሆነ ብሩህነትን ማስተካከል አልተቻለም""በራስ ሰር አሽከርክር""ማያ ገጽን በራስ-አሽከርክር""አካባቢ"
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 962f1c954a31b..da89b39073ec3 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -328,7 +328,7 @@
"الإدخال""سماعات الأذن الطبية""جارٍ التفعيل…"
- "لا يمكن ضبط مستوى السطوع لأنّ\n التطبيق الأول يتحكّم فيه"
+ "لا يمكن ضبط مستوى السطوع لأنّ التطبيق الأول يتحكّم فيه""التدوير التلقائي""التدوير التلقائي للشاشة""الموقع الجغرافي"
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index e629969acd10f..8aeaa888b5fdb 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -328,7 +328,7 @@
"Giriş""Eşitmə aparatları""Aktiv edilir..."
- "Yuxarıdakı tətbiq tərəfindən idarə olunduğu üçün\n parlaqlığı tənzimləmək mümkün deyil"
+ "Yuxarıdakı tətbiq tərəfindən idarə olunduğu üçün parlaqlığı tənzimləmək mümkün deyil""Avtodönüş""Ekranın avtomatik dönməsi""Məkan"
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 1970144f74c67..bdf36433696c8 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -328,7 +328,7 @@
"Unos""Slušni aparati""Uključuje se..."
- "Ne možete da prilagodite osvetljenost jer je\n kontroliše aplikacija u vrhu"
+ "Ne možete da prilagodite osvetljenost jer je kontroliše aplikacija u vrhu""Automatska rotacija""Automatsko rotiranje ekrana""Lokacija"
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index afbac9f8be093..c66ca1b427c8c 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -328,7 +328,7 @@
"Увод""Слыхавыя апараты""Уключэнне…"
- "Не ўдаецца адрэгуляваць яркасць, бо яна\nкантралюецца асноўнай праграмай"
+ "Не ўдаецца адрэгуляваць яркасць, бо янакантралюецца асноўнай праграмай""Аўтапаварот""Аўтаматычны паварот экрана""Месцазнаходжанне"
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 77542de3bec92..cae284987c1bc 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -328,7 +328,7 @@
"Вход""Слухови апарати""Включва се..."
- "Яркостта не може да се коригира, защото се контролира\n от приложението на екрана"
+ "Яркостта не може да се коригира, защото се контролира от приложението на екрана""Авт. ориентация""Автоматично завъртане на екрана""Местоположение"
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index 6bd1e0c0fc717..c3e8b1c99e38b 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -328,7 +328,7 @@
"ইনপুট""হিয়ারিং এড""চালু করা হচ্ছে…"
- "উজ্জ্বলতা টপ অ্যাপ নিয়ন্ত্রণ করায়\n এটিকে অ্যাডজাস্ট করা যাচ্ছে না"
+ "উজ্জ্বলতা টপ অ্যাপ নিয়ন্ত্রণ করায় এটিকে অ্যাডজাস্ট করা যাচ্ছে না""নিজে থেকে ঘুরবে""অটো-রোটেট স্ক্রিন""লোকেশন"
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 4ccc38ad85726..aeb59668fd31f 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -328,7 +328,7 @@
"Ulaz""Slušni aparati""Uključivanje…"
- "Nije moguće podesiti osvijetljenost\n jer njome upravlja aplikacija pri vrhu"
+ "Nije moguće podesiti osvijetljenost jer njome upravlja aplikacija pri vrhu""Automatsko rotiranje""Automatsko rotiranje ekrana""Lokacija"
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 80558a92194c5..3a49d4631d8db 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -328,7 +328,7 @@
"Entrada""Audiòfons""S\'està activant…"
- "No es pot ajustar la brillantor perquè\n està controlada per l\'aplicació superior"
+ "No es pot ajustar la brillantor perquè està controlada per l\'aplicació superior""Gira automàticament""Gira la pantalla automàticament""Ubicació"
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index ee321074a2507..5bdf77371286d 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -328,7 +328,7 @@
"Vstup""Naslouchátka""Zapínání…"
- "Jas nelze upravit, protože ho\n řídí hlavní aplikace"
+ "Jas nelze upravit, protože ho řídí hlavní aplikace""Autom. otáčení""Automatické otáčení obrazovky""Poloha"
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 323b9d884ad50..663bb42b35462 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -328,7 +328,7 @@
"Input""Høreapparater""Aktiverer…"
- "Lysstyrken kan ikke justeres, fordi den\n styres af den øverste app"
+ "Lysstyrken kan ikke justeres, fordi den styres af den øverste app""Roter automatisk""Roter skærmen automatisk""Lokation"
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 3c8be75f894b4..8294af902f057 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -328,7 +328,7 @@
"Eingabe""Hörgerät""Wird aktiviert…"
- "Die Helligkeit kann nicht angepasst werden, weil sie\n von der obersten App gesteuert wird"
+ "Die Helligkeit kann nicht angepasst werden, weil sie von der obersten App gesteuert wird""Autom. drehen""Bildschirm automatisch drehen""Standort"
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 470dd2c1f3537..a5db7e6fced33 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -328,7 +328,7 @@
"Είσοδος""Βοηθήματα ακοής""Ενεργοποίηση…"
- "Δεν είναι δυνατή η προσαρμογή της φωτεινότητας, επειδή\n ελέγχεται από την εφαρμογή στην κορυφή"
+ "Δεν είναι δυνατή η προσαρμογή της φωτεινότητας, επειδή ελέγχεται από την εφαρμογή στην κορυφή""Αυτόματη περιστροφή""Αυτόματη περιστροφή οθόνης""Τοποθεσία"
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 0c161a7493f5a..fb82cadfe307e 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -328,7 +328,7 @@
"Input""Hearing aids""Turning on…"
- "Can\'t adjust brightness because it\'s being\n controlled by the top app"
+ "Can\'t adjust brightness because it\'s being controlled by the top app""Auto-rotate""Auto-rotate screen""Location"
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index 3a7440bceaa02..6fd13b3728824 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -328,7 +328,7 @@
"Input""Hearing aids""Turning on…"
- "Can\'t adjust brightness because it\'s being\n controlled by the top app"
+ "Can\'t adjust brightness because it\'s being controlled by the top app""Auto-rotate""Auto-rotate screen""Location"
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 0c161a7493f5a..fb82cadfe307e 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -328,7 +328,7 @@
"Input""Hearing aids""Turning on…"
- "Can\'t adjust brightness because it\'s being\n controlled by the top app"
+ "Can\'t adjust brightness because it\'s being controlled by the top app""Auto-rotate""Auto-rotate screen""Location"
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 0c161a7493f5a..fb82cadfe307e 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -328,7 +328,7 @@
"Input""Hearing aids""Turning on…"
- "Can\'t adjust brightness because it\'s being\n controlled by the top app"
+ "Can\'t adjust brightness because it\'s being controlled by the top app""Auto-rotate""Auto-rotate screen""Location"
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index dd8f735197b8b..43ff877cd6711 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -328,7 +328,7 @@
"Entrada""Audífonos""Activando…"
- "La app superior controla el brillo,\npor lo que no se puede ajustar"
+ "La app superior controla el brillo,por lo que no se puede ajustar""Giro automático""Girar la pantalla automáticamente""Ubicación"
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index a2fcc5c75e1ea..38a0c45f96355 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -328,7 +328,7 @@
"Entrada""Audífonos""Activando…"
- "No se puede ajustar el brillo porque la aplicación superior lo está\n controlando"
+ "No se puede ajustar el brillo porque la aplicación superior lo está controlando""Giro automático""Girar pantalla automáticamente""Ubicación"
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index bca7491908585..46fdefe0e9b1a 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -328,7 +328,7 @@
"Sisend""Kuuldeaparaadid""Sisselülitamine …"
- "Heledust ei saa reguleerida, kuna seda\n juhib ülemine rakendus"
+ "Heledust ei saa reguleerida, kuna seda juhib ülemine rakendus""Autom. pööramine""Kuva automaatne pööramine""Asukoht"
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index f447dc6e6c480..b30cb1c2ce748 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -328,7 +328,7 @@
"Sarrera""Audifonoak""Aktibatzen…"
- "Ezin da doitu argitasuna,\ngaineko aplikazioak kontrolatzen duelako"
+ "Ezin da doitu argitasuna,gaineko aplikazioak kontrolatzen duelako""Biratze automatikoa""Biratu pantaila automatikoki""Kokapena"
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 800bf785c339d..680cc611211c7 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -328,7 +328,7 @@
"ورودی""سمعک""روشن کردن…"
- "نمیتوان روشنایی را تنظیم کرد زیرا\n برنامه بالایی آن را کنترل میکند"
+ "نمیتوان روشنایی را تنظیم کرد زیرا برنامه بالایی آن را کنترل میکند""چرخش خودکار""چرخش خودکار صفحهنمایش""مکان"
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index fdf18a3c77e21..e2b0bff980de6 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -330,7 +330,7 @@
"Syöttölaite""Kuulolaitteet""Otetaan käyttöön…"
- "Kirkkautta ei voi säätää, koska \n ensisijainen sovellus ohjaa sitä"
+ "Kirkkautta ei voi säätää, koska ensisijainen sovellus ohjaa sitä""Automaattinen kääntö""Käännä näyttöä automaattisesti.""Sijainti"
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index dde9b64f661b3..14f67c45d0930 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -328,7 +328,7 @@
"Entrée""Prothèses auditives""Activation en cours…"
- "Impossible de régler la luminosité, car elle est\n contrôlée par l\'appli principale"
+ "Impossible de régler la luminosité, car elle est contrôlée par l\'appli principale""Rotation auto""Rotation automatique de l\'écran""Localisation"
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 53dbfea513631..bcff1f6fc8dc7 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -328,7 +328,7 @@
"Entrée""Appareils auditifs""Activation…"
- "Impossible d\'ajuster la luminosité, car celle-ci\n est contrôlée par l\'appli principale"
+ "Impossible d\'ajuster la luminosité, car celle-ci est contrôlée par l\'appli principale""Rotation auto""Rotation automatique de l\'écran""Localisation"
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 03ec2b0ad8175..009fe790d04ff 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -328,7 +328,7 @@
"Entrada""Audiófonos""Activando…"
- "Non se pode axustar o brillo\n porque o controla a aplicación principal"
+ "Non se pode axustar o brillo porque o controla a aplicación principal""Xirar automaticamente""Xirar pantalla automaticamente""Localización"
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 0c27927e2662b..9eaa6127369dc 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -328,7 +328,7 @@
"ઇનપુટ""સાંભળવામાં મદદ આપતા યંત્રો""ચાલુ કરી રહ્યાં છીએ…"
- "બ્રાઇટનેસ ગોઠવી શકતા નથી કારણ કે તે\n લોકપ્રિય ઍપ દ્વારા નિયંત્રિત કરવામાં આવી રહી છે"
+ "બ્રાઇટનેસ ગોઠવી શકતા નથી કારણ કે તે લોકપ્રિય ઍપ દ્વારા નિયંત્રિત કરવામાં આવી રહી છે""ઑટો રોટેટ""ઑટો રોટેટ સ્ક્રીન""લોકેશન"
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index f2daffe3f4439..bf251469e59cf 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -328,7 +328,7 @@
"इनपुट""कान की मशीनें""ब्लूटूथ चालू हो रहा है…"
- "स्क्रीन की रोशनी को एडजस्ट नहीं किया जा सकता, क्योंकि\n इसे टॉप ऐप्लिकेशन कंट्रोल कर रहा है"
+ "स्क्रीन की रोशनी को एडजस्ट नहीं किया जा सकता, क्योंकि इसे टॉप ऐप्लिकेशन कंट्रोल कर रहा है""ऑटो-रोटेट""स्क्रीन का अपने-आप दिशा बदलना (ऑटो-रोटेट)""जगह की जानकारी"
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 5222e8010e816..3cc40f0a6193a 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -328,7 +328,7 @@
"Unos""Slušna pomagala""Uključivanje…"
- "Svjetlina se ne može prilagoditi jer njome\n upravlja aplikacija pri vrhu"
+ "Svjetlina se ne može prilagoditi jer njome upravlja aplikacija pri vrhu""Automatsko zakretanje""Automatsko zakretanje zaslona""Lokacija"
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 109c52fd6e8da..1df0f48ca6207 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -328,7 +328,7 @@
"Bevitel""Hallókészülék""Bekapcsolás…"
- "Nem lehet módosítani a fényerőt, mert a felső alkalmazás\n vezérli"
+ "Nem lehet módosítani a fényerőt, mert a felső alkalmazás vezérli""Automatikus elforgatás""Automatikus képernyőforgatás""Tartózkodási hely"
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 914d2cd8fd784..030bd1b72ffcd 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -328,7 +328,7 @@
"Մուտքագրում""Լսողական սարք""Միացում…"
- "Հնարավոր չէ կարգավորել պայծառությունը, քանի որ այն\n կառավարվում է գլխավոր հավելվածի կողմից"
+ "Հնարավոր չէ կարգավորել պայծառությունը, քանի որ այն կառավարվում է գլխավոր հավելվածի կողմից""Ինքնապտտում""Ավտոմատ պտտել էկրանը""Տեղորոշում"
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 62e3476032426..b991cd6780da5 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -328,7 +328,7 @@
"Input""Alat bantu dengar""Mengaktifkan…"
- "Tidak dapat menyesuaikan kecerahan karena sedang\n dikontrol oleh aplikasi atas"
+ "Tidak dapat menyesuaikan kecerahan karena sedang dikontrol oleh aplikasi atas""Putar Otomatis""Putar layar otomatis""Lokasi"
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 4e486d01caa45..f6fe3e1dddff0 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -328,7 +328,7 @@
"Inntak""Heyrnartæki""Kveikir…"
- "Ekki er hægt að breyta birtustiginu vegna þess að \n efsta forritið stjórnar því"
+ "Ekki er hægt að breyta birtustiginu vegna þess að efsta forritið stjórnar því""Sjálfvirkur snúningur""Snúa skjá sjálfkrafa""Staðsetning"
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 786254be73c06..90483e3580309 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -328,7 +328,7 @@
"Ingresso""Apparecchi acustici""Attivazione…"
- "Impossibile regolare la luminosità perché è\n controllata dall\'app in primo piano"
+ "Impossibile regolare la luminosità perché è controllata dall\'app in primo piano""Rotazione automatica""Rotazione automatica dello schermo""Posizione"
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 50008854f1df5..2b162e6364d2f 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -328,7 +328,7 @@
"קלט""מכשירי שמיעה""ההפעלה מתבצעת…"
- "לא ניתן להתאים את הבהירות כי היא\n נשלטת על ידי האפליקציה העליונה"
+ "לא ניתן להתאים את הבהירות כי היא נשלטת על ידי האפליקציה העליונה""סיבוב אוטומטי""סיבוב אוטומטי של המסך""מיקום"
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index fd98fe822b6f1..3cbfac0e61b9c 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -328,7 +328,7 @@
"入力""補聴器""ON にしています…"
- "明るさはトップ アプリによって\n制御されているため、調整できません"
+ "明るさはトップ アプリによって制御されているため、調整できません""自動回転""画面を自動回転します""位置情報"
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 83af7c8b86072..208c4be7b465f 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -328,7 +328,7 @@
"Кіріс""Есту аппараттары""Қосылып жатыр…"
- "Жарықтықты реттеу мүмкін емес, себебі ол\n жетекші қолданба арқылы басқарылады."
+ "Жарықтықты реттеу мүмкін емес, себебі ол жетекші қолданба арқылы басқарылады.""Автоматты түрде бұру""Автоматты айналатын экран""Локация"
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 569ecd3d16771..966f1a72e9979 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -328,7 +328,7 @@
"បញ្ចូល""ឧបករណ៍ជំនួយការស្ដាប់""កំពុងបើក..."
- "មិនអាចកែតម្រូវកម្រិតពន្លឺបានទេ ដោយសារវាកំពុងស្ថិតក្រោម\nការគ្រប់គ្រងរបស់កម្មវិធីខាងលើគេ"
+ "មិនអាចកែតម្រូវកម្រិតពន្លឺបានទេ ដោយសារវាកំពុងស្ថិតក្រោមការគ្រប់គ្រងរបស់កម្មវិធីខាងលើគេ""បង្វិលស្វ័យប្រវត្តិ""បង្វិលអេក្រង់ស្វ័យប្រវត្តិ""ទីតាំង"
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 5bcd986b2bad6..8790c678347c1 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -328,7 +328,7 @@
"ಇನ್ಪುಟ್""ಶ್ರವಣ ಸಾಧನಗಳು""ಆನ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."
- "ಬ್ರೈಟ್ನೆಸ್ ಅನ್ನು ಅಡ್ಜಸ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ,\n ಏಕೆಂದರೆ ಅದನ್ನು ಟಾಪ್ ಆ್ಯಪ್ ನಿಯಂತ್ರಿಸುತ್ತಿದೆ"
+ "ಬ್ರೈಟ್ನೆಸ್ ಅನ್ನು ಅಡ್ಜಸ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ, ಏಕೆಂದರೆ ಅದನ್ನು ಟಾಪ್ ಆ್ಯಪ್ ನಿಯಂತ್ರಿಸುತ್ತಿದೆ""ಸ್ವಯಂ-ತಿರುಗುವಿಕೆ""ಪರದೆಯನ್ನು ಸ್ವಯಂ-ತಿರುಗಿಸಿ""ಸ್ಥಳ"
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index fd2c62e16a17b..1c85de307bc81 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -328,7 +328,7 @@
"입력""보청기""켜는 중..."
- "상위 앱에서 밝기를 제어하고 있으므로\n 밝기를 조절할 수 없습니다."
+ "상위 앱에서 밝기를 제어하고 있으므로 밝기를 조절할 수 없습니다.""자동 회전""화면 자동 회전""위치"
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 1916cbc212701..a36905f483698 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -328,7 +328,7 @@
"Киргизүү""Угуу аппараттары""Күйгүзүлүүдө…"
- "Жарыктыкты тууралоого болбойт, анткени аны\n жогорку колдонмо көзөмөлдөйт"
+ "Жарыктыкты тууралоого болбойт, анткени аны жогорку колдонмо көзөмөлдөйт""Авто буруу""Экранды авто буруу""Жайгашкан жер"
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index f61186d19e0b7..97e562966c0ef 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -328,7 +328,7 @@
"ການປ້ອນຂໍ້ມູນ""ເຄື່ອງຊ່ວຍຟັງ""ກຳລັງເປີດ..."
- "ບໍ່ສາມາດປັບຄວາມແຈ້ງເນື່ອງຈາກມັນ\n ຖືກຄວບຄຸມໂດຍແອັບຍອດນິຍົມ"
+ "ບໍ່ສາມາດປັບຄວາມແຈ້ງເນື່ອງຈາກມັນ ຖືກຄວບຄຸມໂດຍແອັບຍອດນິຍົມ""ໝຸນອັດຕະໂນມັດ""ໝຸນໜ້າຈໍອັດຕະໂນມັດ""ສະຖານທີ່"
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 88f9399c3a568..c690fea067c30 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -328,7 +328,7 @@
"Įvestis""Klausos aparatai""Įjungiama…"
- "Negalima koreguoti ryškumo, nes jį valdo\n viršuje esanti programa"
+ "Negalima koreguoti ryškumo, nes jį valdo viršuje esanti programa""Automatinis pasukimas""Automatiškai sukti ekraną""Vietovė"
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index e0e38a140beec..88d211803a8de 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -328,7 +328,7 @@
"Ievade""Dzirdes aparāti""Notiek ieslēgšana…"
- "Nevar mainīt spilgtumu, jo to kontrolē\n aktīvā lietotne."
+ "Nevar mainīt spilgtumu, jo to kontrolē aktīvā lietotne.""Automātiska pagriešana""Automātiska ekrāna pagriešana""Atrašanās vieta"
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 0a9ca89fd4d31..125eb9268b536 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -328,7 +328,7 @@
"Влез""Слушни помагала""Се вклучува…"
- "Не може да се приспособи осветленоста бидејќи е\n контролирана од горната апликација"
+ "Не може да се приспособи осветленоста бидејќи е контролирана од горната апликација""Автоматско ротирање""Автоматско ротирање на екранот""Локација"
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index 8ef9b7904765b..a317b9d2e2b70 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -328,7 +328,7 @@
"ഇൻപുട്ട്""ശ്രവണ സഹായികൾ""ഓണാക്കുന്നു…"
- "തെളിച്ചം അഡ്ജസ്റ്റ് ചെയ്യാനാകില്ല, അത്\n നിയന്ത്രിക്കുന്നത് ഏറ്റവും മുകളിലുള്ള ആപ്പാണ്"
+ "തെളിച്ചം അഡ്ജസ്റ്റ് ചെയ്യാനാകില്ല, അത് നിയന്ത്രിക്കുന്നത് ഏറ്റവും മുകളിലുള്ള ആപ്പാണ്""സ്ക്രീൻ സ്വയമേവ തിരിയൽ""സ്ക്രീൻ സ്വയമേവ തിരിക്കുക""ലൊക്കേഷൻ"
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index feca24111f3df..307cd1a46dafe 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -328,7 +328,7 @@
"Оролт""Сонсголын төхөөрөмж""Асааж байна…"
- "Гэрэлтүүлгийг\nдавуу эрхтэй аппаас хянаж байгаа тул тохируулах боломжгүй"
+ "Гэрэлтүүлгийгдавуу эрхтэй аппаас хянаж байгаа тул тохируулах боломжгүй""Автоматаар эргэх""Дэлгэцийг автоматаар эргүүлэх""Байршил"
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index a3c45f3f0870b..5dcba79eaa91a 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -328,7 +328,7 @@
"इनपुट""श्रवणयंत्रे""सुरू करत आहे…"
- "ब्राइटनेस ॲडजस्ट करू शकत नाही, कारण तो\n टॉप ॲपद्वारे नियंत्रित केला जात आहे"
+ "ब्राइटनेस ॲडजस्ट करू शकत नाही, कारण तो टॉप ॲपद्वारे नियंत्रित केला जात आहे""ऑटो-रोटेट""ऑटो-रोटेट स्क्रीन""स्थान"
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index bb7dcb86428f1..88f1df827933e 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -328,7 +328,7 @@
"Input""Alat bantu pendengaran""Menghidupkan…"
- "Tidak dapat melaraskan kecerahan kerana peranti\n dikawal oleh apl popular"
+ "Tidak dapat melaraskan kecerahan kerana peranti dikawal oleh apl popular""Autoputar""Autoputar skrin""Lokasi"
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 0219f695c6f07..797c98aa4f551 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -328,7 +328,7 @@
"အဝင်""နားကြားကိရိယာ""ဖွင့်နေသည်…"
- "၎င်းကို ထိပ်ဆုံးရှိအက်ပ်က\n ထိန်းချုပ်နေသဖြင့် တောက်ပမှုကို ပြင်ဆင်၍မရပါ"
+ "၎င်းကို ထိပ်ဆုံးရှိအက်ပ်က ထိန်းချုပ်နေသဖြင့် တောက်ပမှုကို ပြင်ဆင်၍မရပါ""အော်တို-လည်""မျက်နှာပြင်အား အလိုအလျောက်လှည့်ခြင်း""တည်နေရာ"
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 15e568b1c6878..4626c9d231bea 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -328,7 +328,7 @@
"Innenhet""Høreapparater""Slår på …"
- "Kan ikke justere lysstyrken, fordi den\n kontrolleres av appen på toppen"
+ "Kan ikke justere lysstyrken, fordi den kontrolleres av appen på toppen""Rotér automatisk""Rotér skjermen automatisk""Sted"
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index 02285f209b88a..24d8ce6474a4f 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -328,7 +328,7 @@
"इनपुट""हियरिङ डिभाइसहरू""सक्रिय गर्दै…"
- "टप एपले चमक नियन्त्रण गरिरहेकाले\n चमक मिलाउन मिल्दैन"
+ "टप एपले चमक नियन्त्रण गरिरहेकाले चमक मिलाउन मिल्दैन""अटो रोटेट""स्क्रिन स्वतःघुम्ने""लोकेसन"
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 99c8838db1cc0..546e0fba5d144 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -328,7 +328,7 @@
"Invoer""Hoortoestellen""Aanzetten…"
- "Kan de helderheid niet aanpassen omdat deze wordt\n beheerd door de bovenste app"
+ "Kan de helderheid niet aanpassen omdat deze wordt beheerd door de bovenste app""Automatisch draaien""Scherm automatisch draaien""Locatie"
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
index 5847a9a968ba9..b45f2e9c5c642 100644
--- a/packages/SystemUI/res/values-or/strings.xml
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -328,7 +328,7 @@
"ଇନପୁଟ୍""ଶ୍ରବଣ ଯନ୍ତ୍ର""ଅନ୍ ହେଉଛି…"
- "ଟପ ଆପ ଦ୍ୱାରା ଉଜ୍ଜ୍ୱଳତା ନିୟନ୍ତ୍ରିତ\nହେଉଥିବା ଯୋଗୁଁ ଏହାକୁ ଆଡଜଷ୍ଟ କରିପାରିବେ ନାହିଁ"
+ "ଟପ ଆପ ଦ୍ୱାରା ଉଜ୍ଜ୍ୱଳତା ନିୟନ୍ତ୍ରିତହେଉଥିବା ଯୋଗୁଁ ଏହାକୁ ଆଡଜଷ୍ଟ କରିପାରିବେ ନାହିଁ""ଅଟୋ-ରୋଟେଟ""ଅଟୋ-ରୋଟେଟ ସ୍କ୍ରିନ""ଲୋକେସନ"
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 17757b896f5b2..f6a7195cfff86 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -328,7 +328,7 @@
"ਇਨਪੁੱਟ""ਸੁਣਨ ਦੇ ਸਾਧਨ""ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"
- "ਚਮਕ ਨੂੰ ਵਿਵਸਥਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਕਿਉਂਕਿ ਇਹ ਪਹਿਲਾਂ ਚੱਲ ਰਹੀ ਐਪ ਵੱਲੋਂ ਕੰਟਰੋਲ ਕਰਨ ਕਰਕੇ \n ਹੋ ਰਿਹਾ ਹੈ"
+ "ਚਮਕ ਨੂੰ ਵਿਵਸਥਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਕਿਉਂਕਿ ਇਹ ਪਹਿਲਾਂ ਚੱਲ ਰਹੀ ਐਪ ਵੱਲੋਂ ਕੰਟਰੋਲ ਕਰਨ ਕਰਕੇ ਹੋ ਰਿਹਾ ਹੈ""ਸਵੈ-ਘੁਮਾਓ""ਸਕ੍ਰੀਨ ਨੂੰ ਆਪਣੇ ਆਪ ਘੁੰਮਾਓ""ਟਿਕਾਣਾ"
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index c0a2831135685..318aa66394765 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -328,7 +328,7 @@
"Wejście""Aparaty słuchowe""Włączam…"
- "Nie można dostosować jasności, ponieważ jest ona\nkontrolowana przez aplikację na pierwszym planie"
+ "Nie można dostosować jasności, ponieważ jest onakontrolowana przez aplikację na pierwszym planie""Autoobracanie""Autoobracanie ekranu""Lokalizacja"
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index c1a8ec4f5b0e8..07ae257a465ea 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -328,7 +328,7 @@
"Entrada""Aparelhos auditivos""Ativando…"
- "Não é possível ajustar o brilho, porque ele está sendo\n controlado pelo app principal"
+ "Não é possível ajustar o brilho, porque ele está sendo controlado pelo app principal""Giro automático""Giro automático da tela""Localização"
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 36384bce6ba2c..c0319cb68f224 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -328,7 +328,7 @@
"Entrada""Aparelhos auditivos""A ativar..."
- "Não é possível ajustar o brilho porque está a ser\n controlado pela app principal"
+ "Não é possível ajustar o brilho porque está a ser controlado pela app principal""Rotação auto.""Rodar o ecrã automaticamente""Localização"
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index c1a8ec4f5b0e8..07ae257a465ea 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -328,7 +328,7 @@
"Entrada""Aparelhos auditivos""Ativando…"
- "Não é possível ajustar o brilho, porque ele está sendo\n controlado pelo app principal"
+ "Não é possível ajustar o brilho, porque ele está sendo controlado pelo app principal""Giro automático""Giro automático da tela""Localização"
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index beb3c1166684a..2baec1b905414 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -328,7 +328,7 @@
"Intrare""Aparate auditive""Se activează..."
- "Nu se poate ajusta luminozitatea deoarece este\n controlată de aplicația de top"
+ "Nu se poate ajusta luminozitatea deoarece este controlată de aplicația de top""Rotire automată""Rotirea automată a ecranului""Locație"
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index e3f852c5bcc3c..3b66364ff5172 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -328,7 +328,7 @@
"Устройство ввода""Слуховые аппараты""Включение…"
- "Невозможно изменить яркость,\nтак как она регулируется общими настройками."
+ "Невозможно изменить яркость,так как она регулируется общими настройками.""Автоповорот""Автоповорот экрана""Геолокация"
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 9ff67479aed2d..9d3396f54fb2d 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -328,7 +328,7 @@
"ආදානය""ශ්රවණාධාරක""ක්රියාත්මක කරමින්…"
- "ඉහළ යෙදුම මඟින් එය පාලනය වන නිසා\nදීප්තිය ගැළපුම් කළ නොහැක"
+ "ඉහළ යෙදුම මඟින් එය පාලනය වන නිසාදීප්තිය ගැළපුම් කළ නොහැක""ස්වයංක්රීය කරකැවීම""ස්වයංක්රීයව-භ්රමණය වන තිරය""ස්ථානය"
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index a42eb1e6c35e5..b40d01adfb776 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -328,7 +328,7 @@
"Vstup""Načúvadlá""Zapína sa…"
- "Jas sa nedá upraviť, pretože ho \n ovláda horná aplikácia"
+ "Jas sa nedá upraviť, pretože ho ovláda horná aplikácia""Automatické otáčanie""Automatické otáčanie obrazovky""Poloha"
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index c0e751b82c9f6..be8499d6f3cd8 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -328,7 +328,7 @@
"Vhodna naprava""Slušni aparati""Vklapljanje …"
- "Svetlosti ni mogoče prilagoditi, ker jo\n nadzoruje aplikacija na vrhu"
+ "Svetlosti ni mogoče prilagoditi, ker jo nadzoruje aplikacija na vrhu""Samodejno sukanje""Samodejno sukanje zaslona""Lokacija"
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 06cefd9c7734d..cd6d0cd80930a 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -328,7 +328,7 @@
"Hyrja""Aparatet e dëgjimit""Po aktivizohet…"
- "Ndriçimi nuk mund të rregullohet pasi\n po kontrollohet nga aplikacioni i sipërm"
+ "Ndriçimi nuk mund të rregullohet pasi po kontrollohet nga aplikacioni i sipërm""Rrotullim automatik""Rrotullimi automatik i ekranit""Vendndodhja"
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 3977058725a22..f0648dc410982 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -328,7 +328,7 @@
"Унос""Слушни апарати""Укључује се..."
- "Не можете да прилагодите осветљеност јер је\n контролише апликација у врху"
+ "Не можете да прилагодите осветљеност јер је контролише апликација у врху""Аутоматска ротација""Аутоматско ротирање екрана""Локација"
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 7051a2a92aa7d..97b77f04786d3 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -328,7 +328,7 @@
"Ingång""Hörapparater""Aktiverar …"
- "Det går inte att justera ljusstyrkan eftersom den\n styrs av den översta appen"
+ "Det går inte att justera ljusstyrkan eftersom den styrs av den översta appen""Rotera automatiskt""Rotera skärmen automatiskt""Plats"
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 2ead01a379075..3f37a823cda84 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -328,7 +328,7 @@
"Vifaa vya kuingiza sauti""Visaidizi vya kusikia""Inawasha..."
- "Imeshindwa kurekebisha mwangaza kwa sababu\n inadhibitiwa na programu inayotumika"
+ "Imeshindwa kurekebisha mwangaza kwa sababu inadhibitiwa na programu inayotumika""Zungusha kiotomatiki""Skrini ijizungushe kiotomatiki""Mahali"
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index b37350cc3b829..b5080ddee2c2d 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -328,7 +328,7 @@
"உள்ளீடு""செவித்துணைக் கருவி""ஆன் செய்கிறது…"
- "சிறந்த ஆப்ஸால் ஒளிர்வு கட்டுப்படுத்தப்படுவதால்\n இதைச் சரிசெய்ய முடியவில்லை"
+ "சிறந்த ஆப்ஸால் ஒளிர்வு கட்டுப்படுத்தப்படுவதால் இதைச் சரிசெய்ய முடியவில்லை""தானாகச் சுழற்று""திரையைத் தானாகச் சுழற்று""இருப்பிடம்"
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index f64c737d8236e..173d65594b46b 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -328,7 +328,7 @@
"ఇన్పుట్""వినికిడి పరికరాలు""ఆన్ చేస్తోంది…"
- "ఇది టాప్ యాప్ ద్వారా\n కంట్రోల్ చేయబడుతున్నందున బ్రైట్నెస్ను సర్దుబాటు చేయడం సాధ్యం కాదు"
+ "ఇది టాప్ యాప్ ద్వారా కంట్రోల్ చేయబడుతున్నందున బ్రైట్నెస్ను సర్దుబాటు చేయడం సాధ్యం కాదు""ఆటో-రొటేట్""స్క్రీన్ ఆటో-రొటేట్""లొకేషన్"
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 316aab0270ffd..f6fc5ccc97da0 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -328,7 +328,7 @@
"อินพุต""เครื่องช่วยฟัง""กำลังเปิด..."
- "ปรับความสว่างไม่ได้เนื่องจาก\nควบคุมโดยแอปที่อยู่ด้านบน"
+ "ปรับความสว่างไม่ได้เนื่องจากควบคุมโดยแอปที่อยู่ด้านบน""หมุนอัตโนมัติ""หมุนหน้าจออัตโนมัติ""ตำแหน่ง"
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 04dc6c7c7680a..b80f89280e4bc 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -328,7 +328,7 @@
"Input""Mga hearing aid""Ino-on…"
- "Hindi ma-adjust ang liwanag dahil\n kinokontrol ito ng nangingibabaw na app"
+ "Hindi ma-adjust ang liwanag dahil kinokontrol ito ng nangingibabaw na app""I-auto rotate""Awtomatikong i-rotate ang screen""Lokasyon"
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index f4a2c92603989..28328507e622d 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -328,7 +328,7 @@
"Giriş""İşitme cihazları""Açılıyor…"
- "Parlaklık ayarlanamıyor, çünkü bu özellik\n en üstteki uygulama tarafından kontrol ediliyor"
+ "Parlaklık ayarlanamıyor, çünkü bu özellik en üstteki uygulama tarafından kontrol ediliyor""Otomatik döndür""Ekranı otomatik döndür""Konum"
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 7dab3db1d310a..eaf42d7264077 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -328,7 +328,7 @@
"Джерело сигналу""Слухові апарати""Увімкнення…"
- "Не вдається змінити яскравість, оскільки\n нею керує основний додаток"
+ "Не вдається змінити яскравість, оскільки нею керує основний додаток""Автообертання""Автоматично обертати екран""Геодані"
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 6460721222044..91635625fee7e 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -328,7 +328,7 @@
"ان پٹ""سماعتی آلات""آن ہو رہا ہے…"
- "چمک کو ایڈجسٹ نہیں کیا جا سکتا کیونکہ اسے سرفہرست ایپ کے ذریعے \n کنٹرول کیا جا رہا ہے"
+ "چمک کو ایڈجسٹ نہیں کیا جا سکتا کیونکہ اسے سرفہرست ایپ کے ذریعے کنٹرول کیا جا رہا ہے""خود کار طور پر گھمائیں""اسکرین کو خود کار طور پر گھمائیں""مقام"
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 6bcd9d6c4c1cf..ec8bc9de60011 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -328,7 +328,7 @@
"Kirish""Eshitish moslamalari""Yoqilmoqda…"
- "Yorqinlik umumiy sozlamalar orqali boshqariladi.\nUni moslash imkonsiz"
+ "Yorqinlik umumiy sozlamalar orqali boshqariladi.Uni moslash imkonsiz""Avto-burilish""Ekranning avtomatik burilishi""Joylashuv"
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index a9f24ed1da78d..f4a574e1732c6 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -328,7 +328,7 @@
"Thiết bị đầu vào""Thiết bị trợ thính""Đang bật…"
- "Không điều chỉnh được độ sáng vì độ sáng đang được\n ứng dụng trên cùng điều khiển"
+ "Không điều chỉnh được độ sáng vì độ sáng đang được ứng dụng trên cùng điều khiển""Tự động xoay""Tự động xoay màn hình""Vị trí"
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 0f28d9299d681..140ccb44ba3c3 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -328,7 +328,7 @@
"输入""助听器""正在开启…"
- "亮度无法调整,因为它正在被\n顶层应用控制"
+ "亮度无法调整,因为它正在被顶层应用控制""自动屏幕旋转""自动旋转屏幕""位置信息"
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 6a29d86bb49fd..5e352a5d751a6 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -328,7 +328,7 @@
"輸入""助聽器""正在開啟…"
- "無法調整亮度,因為\n目前是由上層應用程式控制亮度"
+ "無法調整亮度,因為目前是由上層應用程式控制亮度""自動旋轉""自動旋轉螢幕""位置"
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index a931304cdfbe8..49ee7b20183ae 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -328,7 +328,7 @@
"輸入""助聽器""開啟中…"
- "無法調整亮度,因為\n目前是由上層應用程式控制亮度"
+ "無法調整亮度,因為目前是由上層應用程式控制亮度""自動旋轉""自動旋轉螢幕""定位"
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 08e685273bb32..1888939a35946 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -330,7 +330,7 @@
"Okokufaka""Imishini yendlebe""Iyavula..."
- "Ayikwazi ukulungisa ukukhanya ngoba ilawulwa\n yi-app ephezulu"
+ "Ayikwazi ukulungisa ukukhanya ngoba ilawulwa yi-app ephezulu""Ukuphenduka okuzenzakalelayo""Phendula iskrini ngokuzenzakalela""Indawo"
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index e077b41a6f59c..f24d4e8efce34 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -801,7 +801,7 @@
Turning on…
- Can\'t adjust brightness because it\'s being\n controlled by the top app
+ Can\'t adjust brightness because it\'s being controlled by the top appAuto-rotate
--
GitLab
From febf30307208f68b8dd45c5f2d846ac51a4a2633 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Cosmin=20B=C4=83ie=C8=99?=
Date: Fri, 21 Feb 2025 13:08:36 +0100
Subject: [PATCH 092/111] Write dumpOnFailure to app files
The DumpOnFailure utility was trying to write to /sdcard/DumpOnFailure,
which would fail if the test app did not have the permission for
external storage. Instead, we can simply write to the files of the test
app, and pull from there, removing and requirements on permissions.
This also removes the manual cleanup of these files, instead delegating
it to the FilePullerLogCollector, which will only clean up after
successfully reading the files.
This also adds the dumpOnFailure for IME tests that use UiDevice.
Lastly, it changes the manifest of these tests to refer to the real
package name, for consistency.
Flag: EXEMPT testfix
Bug: 395783236
Test: atest InputMethodServiceTest
Change-Id: I6dece3f39a2f3ee3273b6ef12e3314f807d3457f
---
.../android/inputmethodservice/AndroidManifest.xml | 4 ++--
.../com/android/inputmethodservice/AndroidTest.xml | 7 ++++---
.../inputmethodservice/InputMethodServiceTest.java | 11 ++++++++++-
3 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/AndroidManifest.xml b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/AndroidManifest.xml
index 45523268c9665..79dd1292f140e 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/AndroidManifest.xml
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/AndroidManifest.xml
@@ -16,7 +16,7 @@
-->
+ package="com.android.inputmethodservice">
@@ -33,7 +33,7 @@
+ while the test package is "com.android.inputmethodservice" (FrameworksImeTests.apk).-->
-
+
-
+
-
+
+
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
index 2d3f7231cc5c9..0ee670138c8c1 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java
@@ -42,6 +42,7 @@ import android.os.Build;
import android.os.RemoteException;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.provider.Settings;
+import android.server.wm.DumpOnFailure;
import android.server.wm.WindowManagerStateHelper;
import android.util.Log;
import android.view.WindowManagerGlobal;
@@ -118,6 +119,9 @@ public class InputMethodServiceTest {
@Rule
public final TestName mName = new TestName();
+ @Rule
+ public final DumpOnFailure mDumpOnFailure = new DumpOnFailure();
+
private Instrumentation mInstrumentation;
private UiDevice mUiDevice;
private InputMethodManager mImm;
@@ -1210,8 +1214,13 @@ public class InputMethodServiceTest {
@NonNull
private UiObject2 getUiObject(@NonNull BySelector bySelector) {
+ final var preScreenshot = mInstrumentation.getUiAutomation().takeScreenshot();
+ mDumpOnFailure.dumpOnFailure("pre-getUiObject", preScreenshot);
final var uiObject = mUiDevice.wait(Until.findObject(bySelector), TIMEOUT_MS);
- assertWithMessage("UiObject with " + bySelector + " was found").that(uiObject).isNotNull();
+ mInstrumentation.waitForIdleSync();
+ final var postScreenshot = mInstrumentation.getUiAutomation().takeScreenshot();
+ mDumpOnFailure.dumpOnFailure("post-getUiObject", postScreenshot);
+ assertWithMessage("UiObject with " + bySelector + " was found").that(uiObject).isNull();
return uiObject;
}
--
GitLab
From c8b9a1fa24ee56cabaec579bb34f6e78dee1f0d8 Mon Sep 17 00:00:00 2001
From: Selim Cinek
Date: Wed, 19 Feb 2025 15:53:35 +0000
Subject: [PATCH 093/111] Fixed an issue where all appear and disappear
animations were linear
Since the cycling flag was introduced, all notification animations
that were adding or removing a notification were linear.
Bug: 397658189
Flag: com.android.systemui.notification_appear_nonlinear
Test: atest SystemUITests
Change-Id: I2ce2710dcb336dc066aac345b301d95cbe8ed229
---
packages/SystemUI/aconfig/systemui.aconfig | 10 +++++
.../stack/StackStateAnimatorTest.kt | 3 ++
.../row/ActivatableNotificationView.java | 37 ++++++++++++++-----
.../row/ExpandableNotificationRow.java | 27 ++++++--------
.../notification/row/ExpandableView.java | 10 +++--
.../row/StackScrollerDecorView.java | 4 +-
.../notification/stack/MediaContainerView.kt | 33 +++++++++--------
.../stack/StackStateAnimator.java | 10 +++--
8 files changed, 84 insertions(+), 50 deletions(-)
diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig
index eb5b22f6c82c3..f2c76ba25079a 100644
--- a/packages/SystemUI/aconfig/systemui.aconfig
+++ b/packages/SystemUI/aconfig/systemui.aconfig
@@ -1938,6 +1938,16 @@ flag {
bug: "382531177"
}
+flag {
+ name: "notification_appear_nonlinear"
+ namespace: "systemui"
+ description: "Fix linear usage of notification appear"
+ bug: "397658189"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
flag {
name: "disable_shade_trackpad_two_finger_swipe"
namespace: "systemui"
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/StackStateAnimatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/StackStateAnimatorTest.kt
index 67415de86d9ba..e7be20e7c3cbf 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/StackStateAnimatorTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/StackStateAnimatorTest.kt
@@ -88,6 +88,7 @@ class StackStateAnimatorTest : SysuiTestCase() {
/* delay= */ 0L,
/* duration= */ ANIMATION_DURATION_HEADS_UP_APPEAR.toLong(),
/* isHeadsUpAppear= */ true,
+ /* isHeadsUpCycling= */ false,
/* onEndRunnable= */ null,
)
}
@@ -111,6 +112,7 @@ class StackStateAnimatorTest : SysuiTestCase() {
/* delay= */ 0L,
/* duration= */ ANIMATION_DURATION_HEADS_UP_APPEAR.toLong(),
/* isHeadsUpAppear= */ true,
+ /* isHeadsUpCycling= */ false,
/* onEndRunnable= */ null,
)
}
@@ -128,6 +130,7 @@ class StackStateAnimatorTest : SysuiTestCase() {
/* delay= */ eq(0L),
/* translationDirection= */ eq(0f),
/* isHeadsUpAnimation= */ eq(true),
+ /* isHeadsUpCycling= */ eq(false),
/* onStartedRunnable= */ any(),
/* onFinishedRunnable= */ runnableCaptor.capture(),
/* animationListener= */ any(),
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
index b0773276a3e91..4ed9dcee072ea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java
@@ -16,8 +16,10 @@
package com.android.systemui.statusbar.notification.row;
+import static com.android.systemui.Flags.notificationAppearNonlinear;
import static com.android.systemui.Flags.notificationBackgroundTintOptimization;
import static com.android.systemui.Flags.notificationRowTransparency;
+import static com.android.systemui.Flags.physicalNotificationMovement;
import static com.android.systemui.statusbar.notification.row.ExpandableView.ClipSide.BOTTOM;
import static com.android.systemui.statusbar.notification.row.ExpandableView.ClipSide.TOP;
@@ -71,7 +73,8 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
* #ALPHA_APPEAR_START_FRACTION.
*/
- private static final float ALPHA_APPEAR_START_FRACTION = .7f;
+ private static final float ALPHA_APPEAR_START_FRACTION =
+ notificationAppearNonlinear() ? .55f : .7f;
/**
* The content should show fully with progress at #ALPHA_APPEAR_END_FRACTION
* The start of the animation is at #ALPHA_APPEAR_START_FRACTION
@@ -111,6 +114,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
private float mOverrideAmount;
private boolean mShadowHidden;
private boolean mIsHeadsUpAnimation;
+ private boolean mIsHeadsUpCycling;
/* In order to track headsup longpress coorindate. */
protected Point mTargetPoint;
private boolean mDismissed;
@@ -349,10 +353,12 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
@Override
public long performRemoveAnimation(long duration, long delay, float translationDirection,
- boolean isHeadsUpAnimation, Runnable onStartedRunnable, Runnable onFinishedRunnable,
- AnimatorListenerAdapter animationListener, ClipSide clipSide) {
+ boolean isHeadsUpAnimation, boolean isHeadsUpCycling, Runnable onStartedRunnable,
+ Runnable onFinishedRunnable, AnimatorListenerAdapter animationListener,
+ ClipSide clipSide) {
enableAppearDrawing(true);
mIsHeadsUpAnimation = isHeadsUpAnimation;
+ mIsHeadsUpCycling = isHeadsUpCycling;
if (mDrawingAppearAnimation) {
startAppearAnimation(false /* isAppearing */, translationDirection,
delay, duration, onStartedRunnable, onFinishedRunnable, animationListener,
@@ -370,9 +376,10 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
@Override
public void performAddAnimation(long delay, long duration, boolean isHeadsUpAppear,
- Runnable onFinishRunnable) {
+ boolean isHeadsUpCycling, Runnable onFinishRunnable) {
enableAppearDrawing(true);
mIsHeadsUpAnimation = isHeadsUpAppear;
+ mIsHeadsUpCycling = isHeadsUpCycling;
if (mDrawingAppearAnimation) {
startAppearAnimation(true /* isAppearing */, isHeadsUpAppear ? 0.0f : -1.0f, delay,
duration, null, null, null, ClipSide.BOTTOM);
@@ -404,14 +411,14 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
targetValue = 0.0f;
}
- if (NotificationHeadsUpCycling.isEnabled()) {
- // TODO(b/316404716): add avalanche filtering
+ if (NotificationHeadsUpCycling.isEnabled() && !useNonLinearAnimation()) {
mCurrentAppearInterpolator = Interpolators.LINEAR;
}
mAppearAnimator = ValueAnimator.ofFloat(mAppearAnimationFraction,
targetValue);
- mAppearAnimator.setInterpolator(mCurrentAppearInterpolator);
+ mAppearAnimator.setInterpolator(
+ useNonLinearAnimation() ? Interpolators.LINEAR : mCurrentAppearInterpolator);
mAppearAnimator.setDuration(
(long) (duration * Math.abs(mAppearAnimationFraction - targetValue)));
mAppearAnimator.addUpdateListener(animation -> {
@@ -530,7 +537,13 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
* @param clipSide Which side if view we want to clip from
*/
private void updateAppearRect(ClipSide clipSide) {
- float interpolatedFraction = mAppearAnimationFraction;
+ float interpolatedFraction;
+ if (useNonLinearAnimation()) {
+ interpolatedFraction = mCurrentAppearInterpolator.getInterpolation(
+ mAppearAnimationFraction);
+ } else {
+ interpolatedFraction = mAppearAnimationFraction;
+ }
mAppearAnimationTranslation = (1.0f - interpolatedFraction) * mAnimationTranslationY;
final int fullHeight = getActualHeight();
float height = fullHeight * interpolatedFraction;
@@ -558,6 +571,11 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
}
}
+ private boolean useNonLinearAnimation() {
+ return notificationAppearNonlinear() && (!mIsHeadsUpCycling
+ || physicalNotificationMovement());
+ }
+
private void updateAppearRect() {
updateAppearRect(ClipSide.BOTTOM);
}
@@ -567,7 +585,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
mAppearAnimationFraction,
ALPHA_APPEAR_START_FRACTION,
ALPHA_APPEAR_END_FRACTION,
- Interpolators.ALPHA_IN
+ notificationAppearNonlinear() ? mCurrentAppearInterpolator : Interpolators.ALPHA_IN
);
}
@@ -813,6 +831,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
pw.print("mDrawingAppearAnimation", mDrawingAppearAnimation);
pw.print("mAppearAnimationFraction", mAppearAnimationFraction);
pw.print("mIsHeadsUpAnimation", mIsHeadsUpAnimation);
+ pw.print("mIsHeadsUpCycling", mIsHeadsUpCycling);
pw.print("mTargetPoint", mTargetPoint);
pw.println();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
index d2800d7c1b71a..4c744086fea4e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java
@@ -3494,20 +3494,17 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
@Override
public void performAddAnimation(long delay, long duration, boolean isHeadsUpAppear,
- Runnable onFinishRunnable) {
+ boolean isHeadsUpCycling, Runnable onFinishRunnable) {
mLogger.logStartAppearAnimation(mLoggingKey, /* isAppear = */ true);
- super.performAddAnimation(delay, duration, isHeadsUpAppear, onFinishRunnable);
+ super.performAddAnimation(delay, duration, isHeadsUpAppear, isHeadsUpCycling,
+ onFinishRunnable);
}
@Override
- public long performRemoveAnimation(
- long duration,
- long delay,
- float translationDirection,
- boolean isHeadsUpAnimation,
- Runnable onStartedRunnable,
- Runnable onFinishedRunnable,
- AnimatorListenerAdapter animationListener, ClipSide clipSide) {
+ public long performRemoveAnimation(long duration, long delay, float translationDirection,
+ boolean isHeadsUpAnimation, boolean isHeadsUpCycling, Runnable onStartedRunnable,
+ Runnable onFinishedRunnable, AnimatorListenerAdapter animationListener,
+ ClipSide clipSide) {
mLogger.logStartAppearAnimation(mLoggingKey, /* isAppear = */ false);
if (mMenuRow != null && mMenuRow.isMenuVisible()) {
Animator anim = getTranslateViewAnimator(0f, null /* listener */);
@@ -3522,9 +3519,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
@Override
public void onAnimationEnd(Animator animation) {
- ExpandableNotificationRow.super.performRemoveAnimation(
- duration, delay, translationDirection, isHeadsUpAnimation,
- null, onFinishedRunnable, animationListener, ClipSide.BOTTOM);
+ ExpandableNotificationRow.super.performRemoveAnimation(duration, delay,
+ translationDirection, isHeadsUpAnimation, isHeadsUpCycling, null,
+ onFinishedRunnable, animationListener, ClipSide.BOTTOM);
}
});
anim.start();
@@ -3532,8 +3529,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
}
}
return super.performRemoveAnimation(duration, delay, translationDirection,
- isHeadsUpAnimation, onStartedRunnable, onFinishedRunnable, animationListener,
- clipSide);
+ isHeadsUpAnimation, isHeadsUpCycling, onStartedRunnable, onFinishedRunnable,
+ animationListener, clipSide);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
index da664f864f06e..292f74a65554b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableView.java
@@ -467,7 +467,8 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable, Ro
* remove animation should be performed upwards,
* such that the child appears to be going away to the top. 1
* Should mean the opposite.
- * @param isHeadsUpAnimation Is this a headsUp animation.
+ * @param isHeadsUpAnimation Is this a headsUp animation
+ * @param isHeadsUpCycling Is this the cycling heads up animation
* @param onFinishedRunnable A runnable which should be run when the animation is finished.
* @param animationListener An animation listener to add to the animation.
* @return The additional delay, in milliseconds, that this view needs to add before the
@@ -475,7 +476,7 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable, Ro
*/
public abstract long performRemoveAnimation(long duration,
long delay, float translationDirection, boolean isHeadsUpAnimation,
- Runnable onStartedRunnable,
+ boolean isHeadsUpCycling, Runnable onStartedRunnable,
Runnable onFinishedRunnable,
AnimatorListenerAdapter animationListener, ClipSide clipSide);
@@ -485,11 +486,12 @@ public abstract class ExpandableView extends FrameLayout implements Dumpable, Ro
}
public void performAddAnimation(long delay, long duration, boolean isHeadsUpAppear) {
- performAddAnimation(delay, duration, isHeadsUpAppear, null);
+ performAddAnimation(delay, duration, isHeadsUpAppear, false /* isHeadsUpCycling */,
+ null);
}
public abstract void performAddAnimation(long delay, long duration, boolean isHeadsUpAppear,
- Runnable onEndRunnable);
+ boolean isHeadsUpCycling, Runnable onEndRunnable);
public int getPinnedHeadsUpHeight() {
return getIntrinsicHeight();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/StackScrollerDecorView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/StackScrollerDecorView.java
index cd228e7872c1e..a064d1c5b7014 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/StackScrollerDecorView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/StackScrollerDecorView.java
@@ -260,7 +260,7 @@ public abstract class StackScrollerDecorView extends ExpandableView {
@Override
public long performRemoveAnimation(long duration, long delay,
float translationDirection, boolean isHeadsUpAnimation,
- Runnable onStartedRunnable,
+ boolean isHeadsUpCycling, Runnable onStartedRunnable,
Runnable onFinishedRunnable,
AnimatorListenerAdapter animationListener, ClipSide clipSide) {
// TODO: Use duration
@@ -279,7 +279,7 @@ public abstract class StackScrollerDecorView extends ExpandableView {
@Override
public void performAddAnimation(long delay, long duration, boolean isHeadsUpAppear,
- Runnable endRunnable) {
+ boolean isHeadsUpCycling, Runnable endRunnable) {
// TODO: use delay and duration
setContentVisibleAnimated(true);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaContainerView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaContainerView.kt
index bd7bd596438a3..4d10a527d53b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaContainerView.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/MediaContainerView.kt
@@ -70,14 +70,15 @@ class MediaContainerView(context: Context, attrs: AttributeSet?) : ExpandableVie
}
override fun performRemoveAnimation(
- duration: Long,
- delay: Long,
- translationDirection: Float,
- isHeadsUpAnimation: Boolean,
- onStartedRunnable: Runnable?,
- onFinishedRunnable: Runnable?,
- animationListener: AnimatorListenerAdapter?,
- clipSide: ClipSide
+ duration: Long,
+ delay: Long,
+ translationDirection: Float,
+ isHeadsUpAnimation: Boolean,
+ isHeadsUpCycling: Boolean,
+ onStartedRunnable: Runnable?,
+ onFinishedRunnable: Runnable?,
+ animationListener: AnimatorListenerAdapter?,
+ clipSide: ClipSide,
): Long {
return 0
}
@@ -86,7 +87,8 @@ class MediaContainerView(context: Context, attrs: AttributeSet?) : ExpandableVie
delay: Long,
duration: Long,
isHeadsUpAppear: Boolean,
- onEnd: Runnable?
+ isHeadsUpCycling: Boolean,
+ onEnd: Runnable?,
) {
// No animation, it doesn't need it, this would be local
}
@@ -103,9 +105,7 @@ class MediaContainerView(context: Context, attrs: AttributeSet?) : ExpandableVie
assertMediaContainerVisibility(visibility)
}
- /**
- * visibility should be aligned with MediaContainerView visibility on the keyguard.
- */
+ /** visibility should be aligned with MediaContainerView visibility on the keyguard. */
private fun isVisibilityValid(visibility: Int): Boolean {
val currentViewState = viewState as? MediaContainerViewState ?: return true
val shouldBeGone = !currentViewState.shouldBeVisible
@@ -113,8 +113,7 @@ class MediaContainerView(context: Context, attrs: AttributeSet?) : ExpandableVie
}
/**
- * b/298213983
- * MediaContainerView's visibility is changed to VISIBLE when it should be GONE.
+ * b/298213983 MediaContainerView's visibility is changed to VISIBLE when it should be GONE.
* This method check this state and logs.
*/
private fun assertMediaContainerVisibility(visibility: Int) {
@@ -122,8 +121,10 @@ class MediaContainerView(context: Context, attrs: AttributeSet?) : ExpandableVie
if (currentViewState is MediaContainerViewState) {
if (!currentViewState.shouldBeVisible && visibility == VISIBLE) {
- Log.wtf("MediaContainerView", "MediaContainerView should be GONE " +
- "but its visibility changed to VISIBLE")
+ Log.wtf(
+ "MediaContainerView",
+ "MediaContainerView should be GONE " + "but its visibility changed to VISIBLE",
+ )
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
index 5e0d57ebb3fe0..2b052236a9215 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackStateAnimator.java
@@ -506,8 +506,8 @@ public class StackStateAnimator {
}
changingView.performRemoveAnimation(ANIMATION_DURATION_APPEAR_DISAPPEAR,
0 /* delay */, translationDirection, false /* isHeadsUpAppear */,
- startAnimation, postAnimation, getGlobalAnimationFinishedListener(),
- ExpandableView.ClipSide.BOTTOM);
+ false /* isHeadsUpCycling */, startAnimation, postAnimation,
+ getGlobalAnimationFinishedListener(), ExpandableView.ClipSide.BOTTOM);
needsCustomAnimation = true;
} else if (event.animationType ==
NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_REMOVE_SWIPED_OUT) {
@@ -538,7 +538,7 @@ public class StackStateAnimator {
};
}
changingView.performAddAnimation(0, ANIMATION_DURATION_HEADS_UP_CYCLING,
- /* isHeadsUpAppear= */ true, onAnimationEnd);
+ /* isHeadsUpAppear= */ true, /* isHeadsUpCycling= */ true, onAnimationEnd);
} else if (event.animationType == ANIMATION_TYPE_HEADS_UP_APPEAR) {
mHeadsUpAppearChildren.add(changingView);
@@ -559,7 +559,7 @@ public class StackStateAnimator {
onAnimationEnd = () -> mLogger.appearAnimationEnded(finalKey);
}
changingView.performAddAnimation(0, ANIMATION_DURATION_HEADS_UP_APPEAR,
- /* isHeadsUpAppear= */ true, onAnimationEnd);
+ /* isHeadsUpAppear= */ true, /* isHeadsUpCycling= */ false, onAnimationEnd);
} else if (event.animationType == ANIMATION_TYPE_HEADS_UP_CYCLING_OUT) {
mHeadsUpDisappearChildren.add(changingView);
Runnable endRunnable = null;
@@ -629,6 +629,7 @@ public class StackStateAnimator {
// translation, the actual translation is in StackScrollAlgorithm.
/* translationDirection= */ 0.0f,
/* isHeadsUpAnimation= */ true,
+ /* isHeadsUpCycling= */ true,
startAnimation, postAnimation,
getGlobalAnimationFinishedListener(), ExpandableView.ClipSide.TOP);
mAnimationProperties.delay += removeAnimationDelay;
@@ -706,6 +707,7 @@ public class StackStateAnimator {
long removeAnimationDelay = changingView.performRemoveAnimation(
ANIMATION_DURATION_HEADS_UP_DISAPPEAR,
0, 0.0f, true /* isHeadsUpAppear */,
+ false /* isHeadsUpCycling */,
startAnimation, postAnimation,
getGlobalAnimationFinishedListener(), ExpandableView.ClipSide.BOTTOM);
mAnimationProperties.delay += removeAnimationDelay;
--
GitLab
From 953a29f5ca6b33e37c58d8bb765d6a20f9555aa7 Mon Sep 17 00:00:00 2001
From: Biswarup Pal
Date: Fri, 21 Feb 2025 04:37:24 -0800
Subject: [PATCH 094/111] Do not ignore overlays.xml with previous versions (3,
4)
... after version upgrade to 5 (because this version upgrade
is not a breaking change).
Change-Id: I13ddd37e6d27fe95323c845b4a6074a3a3c9415f
Test: atest OverlayManagerSettingsTests
Bug: 397939752
Flag: EXEMPT bugfix
---
.../server/om/OverlayManagerSettings.java | 1 +
.../om/OverlayManagerSettingsTests.java | 46 ++++++++++++++++++-
2 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/services/core/java/com/android/server/om/OverlayManagerSettings.java b/services/core/java/com/android/server/om/OverlayManagerSettings.java
index cb01727524daf..1ac9711044868 100644
--- a/services/core/java/com/android/server/om/OverlayManagerSettings.java
+++ b/services/core/java/com/android/server/om/OverlayManagerSettings.java
@@ -544,6 +544,7 @@ final class OverlayManagerSettings {
// and overwritten.
throw new XmlPullParserException("old version " + oldVersion + "; ignoring");
case 3:
+ case 4:
// Upgrading from version 3 to 5 is not a breaking change so do not ignore the
// overlay file.
return;
diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/om/OverlayManagerSettingsTests.java
index ad3855f4c28fb..b1cf9059fdc49 100644
--- a/services/tests/servicestests/src/com/android/server/om/OverlayManagerSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/om/OverlayManagerSettingsTests.java
@@ -37,10 +37,12 @@ import android.text.TextUtils;
import android.util.Xml;
import androidx.annotation.NonNull;
-import androidx.test.runner.AndroidJUnit4;
import com.android.modules.utils.TypedXmlPullParser;
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -56,7 +58,7 @@ import java.util.Set;
import javax.annotation.Nullable;
-@RunWith(AndroidJUnit4.class)
+@RunWith(JUnitParamsRunner.class)
public class OverlayManagerSettingsTests {
private OverlayManagerSettings mSettings;
private static final int USER_0 = 0;
@@ -438,6 +440,39 @@ public class OverlayManagerSettingsTests {
assertListsAreEqual(List.of(CONSTRAINT_0, CONSTRAINT_1), oi.constraints);
}
+ @Test
+ @Parameters(method = "getPreviousVersions")
+ public void testRestoreWithPreviousVersion(int version) throws Exception {
+ final String xml =
+ "\n"
+ + "\n"
+ + "\n"
+ + "\n";
+ ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes(UTF_8));
+
+ mSettings.restore(is);
+ final OverlayIdentifier identifier = new OverlayIdentifier("com.test.overlay", "test");
+ OverlayInfo oi = mSettings.getOverlayInfo(identifier, 1234);
+ assertNotNull(oi);
+ assertEquals("com.test.overlay", oi.packageName);
+ assertEquals("test", oi.overlayName);
+ assertEquals("com.test.target", oi.targetPackageName);
+ assertEquals("/data/app/com.test.overlay-1/base.apk", oi.baseCodePath);
+ assertEquals(1234, oi.userId);
+ assertEquals(STATE_DISABLED, oi.state);
+ assertFalse(mSettings.getEnabled(identifier, 1234));
+ assertTrue(oi.constraints.isEmpty());
+ }
+
@Test
public void testPersistAndRestore() throws Exception {
insertSetting(OVERLAY_A_USER0);
@@ -585,4 +620,11 @@ public class OverlayManagerSettingsTests {
TextUtils.join(",", expected), TextUtils.join(",", actual)));
}
}
+
+ private static Integer[] getPreviousVersions() {
+ return new Integer[]{
+ 3,
+ 4,
+ };
+ }
}
--
GitLab
From cc6464ecd56701d08333fbb571bf24b873d41c89 Mon Sep 17 00:00:00 2001
From: Ebru Kurnaz
Date: Fri, 21 Feb 2025 05:53:22 -0800
Subject: [PATCH 095/111] Add a flag for adding forced density ratio for
external displays
Flag: com.android.window.flags.enable_persisting_density_scale_for_connected_displays
Test: NA
Bug: 392855657
Change-Id: I4d132895a36825c27d9a267386301ffef11718e9
---
.../window/flags/lse_desktop_experience.aconfig | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/core/java/android/window/flags/lse_desktop_experience.aconfig b/core/java/android/window/flags/lse_desktop_experience.aconfig
index f77a36676b3d4..6d63fdf99652c 100644
--- a/core/java/android/window/flags/lse_desktop_experience.aconfig
+++ b/core/java/android/window/flags/lse_desktop_experience.aconfig
@@ -794,4 +794,14 @@ flag {
namespace: "lse_desktop_experience"
description: "Enable Desktop Mode on Projected Mode devices but constrained to the external display."
bug: "384568161"
+}
+
+flag {
+ name: "enable_persisting_density_scale_for_connected_displays"
+ namespace: "lse_desktop_experience"
+ description: "Enables persisting density scale on resolution change for connected displays."
+ bug: "392855657"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
}
\ No newline at end of file
--
GitLab
From 72968422ef05caee834f7de2f7ae7c55651f6e0c Mon Sep 17 00:00:00 2001
From: Caitlin Shkuratov
Date: Thu, 20 Feb 2025 21:51:34 +0000
Subject: [PATCH 096/111] [CD] Log why we couldn't fetch a StatusBarIconView
for a given display.
Bug: 397713944
Change-Id: I2521b6ceecf7674fa65a394c754375f6a363a44f
Flag: com.android.systemui.shared.status_bar_connected_displays
Test: compiles
---
...splaysStatusBarNotificationIconViewStore.kt | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/ConnectedDisplaysStatusBarNotificationIconViewStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/ConnectedDisplaysStatusBarNotificationIconViewStore.kt
index eb55856d994bf..5760b5f79c748 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/ConnectedDisplaysStatusBarNotificationIconViewStore.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/ConnectedDisplaysStatusBarNotificationIconViewStore.kt
@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.notification.icon.ui.viewbinder
+import android.util.Log
import com.android.systemui.display.domain.interactor.DisplayWindowPropertiesInteractor
import com.android.systemui.lifecycle.Activatable
import com.android.systemui.statusbar.StatusBarIconView
@@ -61,9 +62,16 @@ constructor(
}
override fun iconView(key: String): StatusBarIconView? {
- val entry = notifCollection.getEntry(key) ?: return null
- val displayWindowProperties =
- displayWindowPropertiesInteractor.getForStatusBar(displayId) ?: return null
+ val entry = notifCollection.getEntry(key)
+ if (entry == null) {
+ Log.w(TAG, "No notification entry found for key: $key")
+ return null
+ }
+ val displayWindowProperties = displayWindowPropertiesInteractor.getForStatusBar(displayId)
+ if (displayWindowProperties == null) {
+ Log.w(TAG, "No display properties found for display id: $displayId")
+ return null
+ }
return cachedIcons.computeIfAbsent(key) {
val context = displayWindowProperties.context
iconManager.createSbIconView(context, entry)
@@ -93,4 +101,8 @@ constructor(
interface Factory {
fun create(displayId: Int): ConnectedDisplaysStatusBarNotificationIconViewStore
}
+
+ companion object {
+ private const val TAG = "ConnectedDisplaysNotifIconViewStore"
+ }
}
--
GitLab
From 8b43a111dbb9bfa7e68486bd4ac8f1ded3528e53 Mon Sep 17 00:00:00 2001
From: Ibrahim Yilmaz
Date: Fri, 21 Feb 2025 06:57:01 -0800
Subject: [PATCH 097/111] [RONs] Move right icon to right available space
The expander is not shown for RONs. This CL positions right icon to the right available space from expander by respecting its horizontal paddings.
Bug: 393369727
Test: Post a RON with long header content and large icon and see large icon is shown on the right available space.
Flag: com.android.systemui.ui_rich_ongoing_force_expanded
Change-Id: I37279967d0719d004a2e0ba1e409d49b8aa4935b
---
.../row/NotificationContentInflater.java | 7 ++--
.../NotificationTemplateViewWrapper.java | 37 +++++++++++++++++++
2 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
index c31f4ad5c3f12..4b2b1688bde6c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java
@@ -998,6 +998,10 @@ public class NotificationContentInflater implements NotificationRowContentBinder
entry.setPromotedNotificationContentModel(result.mPromotedContent);
}
+ if (PromotedNotificationUiForceExpanded.isEnabled()) {
+ row.setPromotedOngoing(entry.isOngoingPromoted());
+ }
+
boolean setRepliesAndActions = true;
if ((reInflateFlags & FLAG_CONTENT_VIEW_CONTRACTED) != 0) {
if (result.inflatedContentView != null) {
@@ -1130,9 +1134,6 @@ public class NotificationContentInflater implements NotificationRowContentBinder
entry.setHeadsUpStatusBarText(result.headsUpStatusBarText);
entry.setHeadsUpStatusBarTextPublic(result.headsUpStatusBarTextPublic);
- if (PromotedNotificationUiForceExpanded.isEnabled()) {
- row.setPromotedOngoing(entry.isOngoingPromoted());
- }
Trace.endAsyncSection(APPLY_TRACE_METHOD, System.identityHashCode(row));
if (endListener != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java
index 3ccf5063cd689..b9aa57145c7c9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java
@@ -33,6 +33,7 @@ import android.graphics.drawable.Icon;
import android.service.notification.StatusBarNotification;
import android.util.ArraySet;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
@@ -42,6 +43,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ContrastColorUtil;
import com.android.internal.widget.NotificationActionListLayout;
import com.android.systemui.Dependency;
+import com.android.systemui.Flags;
import com.android.systemui.UiOffloadThread;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.CrossFadeHelper;
@@ -51,6 +53,7 @@ import com.android.systemui.statusbar.notification.ImageTransformState;
import com.android.systemui.statusbar.notification.TransformState;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.HybridNotificationView;
+import com.android.systemui.util.DimensionKt;
import java.util.function.Consumer;
@@ -186,9 +189,43 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp
mActions = mView.findViewById(com.android.internal.R.id.actions);
mRemoteInputHistory = mView.findViewById(
com.android.internal.R.id.notification_material_reply_container);
+
+ adjustTitleAndRightIconForPromotedOngoing();
updatePendingIntentCancellations();
}
+ private void adjustTitleAndRightIconForPromotedOngoing() {
+ if (Flags.uiRichOngoingForceExpanded() && mRow.isPromotedOngoing() && mRightIcon != null) {
+ final int horizontalMargin;
+ if (notificationsRedesignTemplates()) {
+ horizontalMargin = mView.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.notification_2025_margin);
+ } else {
+ horizontalMargin = (int) DimensionKt.dpToPx(16, mView.getContext());
+ }
+
+ // position right icon to the right available space from expander.
+ final ViewGroup.MarginLayoutParams rightIconLP =
+ (ViewGroup.MarginLayoutParams) mRightIcon.getLayoutParams();
+ rightIconLP.setMarginEnd(horizontalMargin);
+ mRightIcon.setLayoutParams(rightIconLP);
+
+ // align top line view to start of the right icon.
+ final int iconSize = mView.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.notification_right_icon_size);
+ final int marginEnd = 2 * horizontalMargin + iconSize;
+ mNotificationTopLine.setHeaderTextMarginEnd(marginEnd);
+
+ // title has too much margin on the right, so we need to reduce it
+ if (mTitle != null) {
+ final ViewGroup.MarginLayoutParams titleLP =
+ (ViewGroup.MarginLayoutParams) mTitle.getLayoutParams();
+ titleLP.setMarginEnd(marginEnd);
+ mTitle.setLayoutParams(titleLP);
+ }
+ }
+ }
+
@Nullable
protected final Icon getLargeIcon(Notification n) {
Icon modernLargeIcon = n.getLargeIcon();
--
GitLab
From 5d49cc79ce92aea75866cedab1510d947721b3a4 Mon Sep 17 00:00:00 2001
From: amehfooz
Date: Fri, 21 Feb 2025 15:00:21 +0000
Subject: [PATCH 098/111] [ROSP] Add media carousel location for status bar
popup
This change introduces a new location for the media carousel,
specifically within a status bar popup. This popup is displayed when the
media controls chip is clicked.
Key changes include:
- Added `LOCATION_STATUS_BAR_POPUP` to `MediaHierarchyManager` to represent the new location.
- Modified `MediaHierarchyManager` to handle the new location and update the desired location accordingly.
- Created a new `MediaControlPopup` composable to display the media carousel within the popup.
- Added a new `MediaHost` for the popup location.
Bug: b/385202114
Flag: com.android.systemui.status_bar_popup_chips
Test: Make sure media carousel shows up when chip is clicked.
Screenshot provided in b/385202114 comment#2
Test: Make sure the carousel moves to the other locations as expected
Change-Id: I383708af32e335a8ce9c91ef815e4f07030847d1
---
.../ui/controller/MediaHierarchyManager.kt | 19 ++++++-
.../media/controls/util/MediaUiEventLogger.kt | 26 +++++----
.../systemui/media/dagger/MediaModule.java | 22 +++++++-
.../media/ui/compose/MediaControlPopup.kt | 56 +++++++++++++++++++
.../popups/ui/compose/StatusBarPopup.kt | 6 +-
.../compose/StatusBarPopupChipsContainer.kt | 27 ++++++++-
.../shared/ui/composable/StatusBarRoot.kt | 27 ++++++++-
.../controller/MediaHierarchyManagerTest.kt | 33 ++++++++++-
8 files changed, 197 insertions(+), 19 deletions(-)
create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/ui/compose/MediaControlPopup.kt
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt
index 20593942148b6..5389fea529150 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt
@@ -58,6 +58,7 @@ import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.statusbar.CrossFadeHelper
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController
+import com.android.systemui.statusbar.featurepods.popups.StatusBarPopupChips
import com.android.systemui.statusbar.notification.stack.StackStateAnimator
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.ConfigurationController
@@ -229,7 +230,7 @@ constructor(
else result.setIntersect(animationStartClipping, targetClipping)
}
- private val mediaHosts = arrayOfNulls(LOCATION_COMMUNAL_HUB + 1)
+ private val mediaHosts = arrayOfNulls(LOCATION_STATUS_BAR_POPUP + 1)
/**
* The last location where this view was at before going to the desired location. This is useful
@@ -374,6 +375,15 @@ constructor(
}
}
+ /** Is the Media Control StatusBarPopup showing */
+ var isMediaControlPopupShowing: Boolean = false
+ set(value) {
+ if (field != value && StatusBarPopupChips.isEnabled) {
+ field = value
+ updateDesiredLocation(forceNoAnimation = true)
+ }
+ }
+
/** Are location changes currently blocked? */
private val blockLocationChanges: Boolean
get() {
@@ -1225,6 +1235,7 @@ constructor(
// Keep the current location until we're allowed to again
return desiredLocation
}
+
val onLockscreen =
(!bypassController.bypassEnabled && (statusbarState == StatusBarState.KEYGUARD))
@@ -1234,6 +1245,8 @@ constructor(
(onCommunalNotDreaming && qsExpansion == 0.0f) || onCommunalDreamingAndShadeExpanding
val location =
when {
+ isMediaControlPopupShowing && StatusBarPopupChips.isEnabled ->
+ LOCATION_STATUS_BAR_POPUP
dreamOverlayActive && dreamMediaComplicationActive -> LOCATION_DREAM_OVERLAY
onCommunal -> LOCATION_COMMUNAL_HUB
(qsExpansion > 0.0f || inSplitShade) && !onLockscreen -> LOCATION_QS
@@ -1377,6 +1390,9 @@ constructor(
/** Attached to a view in the communal UI grid */
const val LOCATION_COMMUNAL_HUB = 4
+ /** Attached to a popup that is shown with a media control chip in the status bar */
+ const val LOCATION_STATUS_BAR_POPUP = 5
+
/** Attached at the root of the hierarchy in an overlay */
const val IN_OVERLAY = -1000
@@ -1422,6 +1438,7 @@ private annotation class TransformationType
MediaHierarchyManager.LOCATION_LOCKSCREEN,
MediaHierarchyManager.LOCATION_DREAM_OVERLAY,
MediaHierarchyManager.LOCATION_COMMUNAL_HUB,
+ MediaHierarchyManager.LOCATION_STATUS_BAR_POPUP,
MediaHierarchyManager.LOCATION_UNKNOWN,
],
)
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaUiEventLogger.kt b/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaUiEventLogger.kt
index 09f973cca3432..f0da226129bf5 100644
--- a/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaUiEventLogger.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/controls/util/MediaUiEventLogger.kt
@@ -45,7 +45,7 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
uid: Int,
packageName: String,
instanceId: InstanceId,
- playbackLocation: Int
+ playbackLocation: Int,
) {
val event =
when (playbackLocation) {
@@ -61,7 +61,7 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
uid: Int,
packageName: String,
instanceId: InstanceId,
- playbackLocation: Int
+ playbackLocation: Int,
) {
val event =
when (playbackLocation) {
@@ -112,7 +112,7 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
MediaUiEvent.OPEN_SETTINGS_LONG_PRESS,
uid,
packageName,
- instanceId
+ instanceId,
)
}
@@ -156,6 +156,8 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
MediaUiEvent.MEDIA_CAROUSEL_LOCATION_DREAM
MediaHierarchyManager.LOCATION_COMMUNAL_HUB ->
MediaUiEvent.MEDIA_CAROUSEL_LOCATION_COMMUNAL
+ MediaHierarchyManager.LOCATION_STATUS_BAR_POPUP ->
+ MediaUiEvent.MEDIA_CAROUSEL_LOCATION_STATUS_BAR_POPUP
else -> throw IllegalArgumentException("Unknown media carousel location $location")
}
logger.log(event)
@@ -166,7 +168,7 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
MediaUiEvent.MEDIA_RECOMMENDATION_ADDED,
0,
packageName,
- instanceId
+ instanceId,
)
}
@@ -175,7 +177,7 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
MediaUiEvent.MEDIA_RECOMMENDATION_REMOVED,
0,
packageName,
- instanceId
+ instanceId,
)
}
@@ -184,7 +186,7 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
MediaUiEvent.MEDIA_RECOMMENDATION_ACTIVATED,
uid,
packageName,
- instanceId
+ instanceId,
)
}
@@ -194,7 +196,7 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
0,
packageName,
instanceId,
- position
+ position,
)
}
@@ -203,7 +205,7 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
MediaUiEvent.MEDIA_RECOMMENDATION_CARD_TAP,
0,
packageName,
- instanceId
+ instanceId,
)
}
@@ -212,7 +214,7 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
MediaUiEvent.MEDIA_OPEN_BROADCAST_DIALOG,
uid,
packageName,
- instanceId
+ instanceId,
)
}
@@ -221,7 +223,7 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
MediaUiEvent.MEDIA_CAROUSEL_SINGLE_PLAYER,
uid,
packageName,
- instanceId
+ instanceId,
)
}
@@ -230,7 +232,7 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
MediaUiEvent.MEDIA_CAROUSEL_MULTIPLE_PLAYERS,
uid,
packageName,
- instanceId
+ instanceId,
)
}
}
@@ -280,6 +282,8 @@ enum class MediaUiEvent(val metricId: Int) : UiEventLogger.UiEventEnum {
MEDIA_CAROUSEL_LOCATION_DREAM(1040),
@UiEvent(doc = "The media carousel moved to the communal hub UI")
MEDIA_CAROUSEL_LOCATION_COMMUNAL(1520),
+ @UiEvent(doc = "The media carousel moved to the status bar popup")
+ MEDIA_CAROUSEL_LOCATION_STATUS_BAR_POPUP(2170),
@UiEvent(doc = "A media recommendation card was added to the media carousel")
MEDIA_RECOMMENDATION_ADDED(1041),
@UiEvent(doc = "A media recommendation card was removed from the media carousel")
diff --git a/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java b/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java
index 45a3a8ce60c47..662a9c739ff61 100644
--- a/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java
+++ b/packages/SystemUI/src/com/android/systemui/media/dagger/MediaModule.java
@@ -49,6 +49,7 @@ public interface MediaModule {
String KEYGUARD = "media_keyguard";
String DREAM = "dream";
String COMMUNAL_HUB = "communal_Hub";
+ String POPUP = "popup";
/** */
@Provides
@@ -102,7 +103,26 @@ public interface MediaModule {
@Provides
@SysUISingleton
@Named(COMMUNAL_HUB)
- static MediaHost providesCommunalMediaHost(MediaHost.MediaHostStateHolder stateHolder,
+ static MediaHost providesCommunalMediaHost(
+ MediaHost.MediaHostStateHolder stateHolder,
+ MediaHierarchyManager hierarchyManager,
+ MediaDataManager dataManager,
+ MediaHostStatesManager statesManager,
+ MediaCarouselController carouselController,
+ MediaCarouselControllerLogger logger) {
+ return new MediaHost(
+ stateHolder,
+ hierarchyManager,
+ dataManager,
+ statesManager,
+ carouselController,
+ logger);
+ }
+
+ @Provides
+ @SysUISingleton
+ @Named(POPUP)
+ static MediaHost providesPopupMediaHost(MediaHost.MediaHostStateHolder stateHolder,
MediaHierarchyManager hierarchyManager, MediaDataManager dataManager,
MediaHostStatesManager statesManager, MediaCarouselController carouselController,
MediaCarouselControllerLogger logger) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/ui/compose/MediaControlPopup.kt b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/ui/compose/MediaControlPopup.kt
new file mode 100644
index 0000000000000..80bdb7f8a05fb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/media/ui/compose/MediaControlPopup.kt
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2025 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.statusbar.featurepods.media.ui.compose
+
+import android.widget.FrameLayout
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.res.dimensionResource
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.viewinterop.AndroidView
+import com.android.systemui.media.controls.ui.view.MediaHost
+import com.android.systemui.res.R
+
+/** Displays a popup containing media controls. Embeds the MediaCarousel within a Compose popup. */
+@Composable
+fun MediaControlPopup(mediaHost: MediaHost, modifier: Modifier = Modifier) {
+ AndroidView(
+ modifier =
+ modifier
+ .width(400.dp)
+ .height(200.dp)
+ .clip(
+ shape =
+ RoundedCornerShape(dimensionResource(R.dimen.notification_corner_radius))
+ ),
+ factory = { _ ->
+ mediaHost.hostView.apply {
+ layoutParams =
+ FrameLayout.LayoutParams(
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ )
+ }
+ mediaHost.hostView
+ },
+ onReset = {},
+ )
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/compose/StatusBarPopup.kt b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/compose/StatusBarPopup.kt
index 8a66904ea59b3..ead51482b561b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/compose/StatusBarPopup.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/compose/StatusBarPopup.kt
@@ -28,7 +28,9 @@ import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Popup
import androidx.compose.ui.window.PopupProperties
+import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.res.R
+import com.android.systemui.statusbar.featurepods.media.ui.compose.MediaControlPopup
import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipId
import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipModel
@@ -37,7 +39,7 @@ import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipM
* status bar.
*/
@Composable
-fun StatusBarPopup(viewModel: PopupChipModel.Shown) {
+fun StatusBarPopup(viewModel: PopupChipModel.Shown, mediaHost: MediaHost) {
val density = Density(LocalContext.current)
Popup(
properties =
@@ -56,7 +58,7 @@ fun StatusBarPopup(viewModel: PopupChipModel.Shown) {
Box(modifier = Modifier.padding(8.dp).wrapContentSize()) {
when (viewModel.chipId) {
is PopupChipId.MediaControl -> {
- // TODO(b/385202114): Populate MediaControlPopup contents.
+ MediaControlPopup(mediaHost = mediaHost)
}
}
// Future popup types will be handled here.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/compose/StatusBarPopupChipsContainer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/compose/StatusBarPopupChipsContainer.kt
index 16538c93cf353..f5f1f2028aa2d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/compose/StatusBarPopupChipsContainer.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/featurepods/popups/ui/compose/StatusBarPopupChipsContainer.kt
@@ -20,14 +20,37 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
+import com.android.systemui.media.controls.ui.view.MediaHost
+import com.android.systemui.scene.shared.flag.SceneContainerFlag
+import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipId
import com.android.systemui.statusbar.featurepods.popups.shared.model.PopupChipModel
/** Container view that holds all right hand side chips in the status bar. */
@Composable
-fun StatusBarPopupChipsContainer(chips: List, modifier: Modifier = Modifier) {
+fun StatusBarPopupChipsContainer(
+ chips: List,
+ mediaHost: MediaHost,
+ onMediaControlPopupVisibilityChanged: (Boolean) -> Unit,
+ modifier: Modifier = Modifier,
+) {
+ if (!SceneContainerFlag.isEnabled) {
+ val isMediaControlPopupShown =
+ remember(chips) {
+ chips.any { it.chipId == PopupChipId.MediaControl && it.isPopupShown }
+ }
+
+ LaunchedEffect(isMediaControlPopupShown) {
+ onMediaControlPopupVisibilityChanged(isMediaControlPopupShown)
+ }
+ }
+
// TODO(b/385353140): Add padding and spacing for this container according to UX specs.
Box {
Row(
@@ -37,7 +60,7 @@ fun StatusBarPopupChipsContainer(chips: List, modifier: Mo
chips.forEach { chip ->
StatusBarPopupChip(chip)
if (chip.isPopupShown) {
- StatusBarPopup(chip)
+ StatusBarPopup(viewModel = chip, mediaHost = mediaHost)
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt
index 39a1b46292b03..4189221d8a830 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt
@@ -37,6 +37,10 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.theme.PlatformTheme
import com.android.keyguard.AlphaOptimizedLinearLayout
import com.android.systemui.lifecycle.rememberViewModel
+import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
+import com.android.systemui.media.controls.ui.view.MediaHost
+import com.android.systemui.media.controls.ui.view.MediaHostState
+import com.android.systemui.media.dagger.MediaModule.POPUP
import com.android.systemui.plugins.DarkIconDispatcher
import com.android.systemui.res.R
import com.android.systemui.statusbar.chips.ui.compose.OngoingActivityChips
@@ -67,6 +71,7 @@ import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel.HomeStatusBarViewModelFactory
import javax.inject.Inject
+import javax.inject.Named
/** Factory to simplify the dependency management for [StatusBarRoot] */
class StatusBarRootFactory
@@ -81,6 +86,8 @@ constructor(
private val ongoingCallController: OngoingCallController,
private val darkIconDispatcherStore: DarkIconDispatcherStore,
private val eventAnimationInteractor: SystemStatusEventAnimationInteractor,
+ private val mediaHierarchyManager: MediaHierarchyManager,
+ @Named(POPUP) private val mediaHost: MediaHost,
) {
fun create(root: ViewGroup, andThen: (ViewGroup) -> Unit): ComposeView {
val composeView = ComposeView(root.context)
@@ -99,6 +106,8 @@ constructor(
ongoingCallController = ongoingCallController,
darkIconDispatcher = darkIconDispatcher,
eventAnimationInteractor = eventAnimationInteractor,
+ mediaHierarchyManager = mediaHierarchyManager,
+ mediaHost = mediaHost,
onViewCreated = andThen,
)
}
@@ -130,6 +139,8 @@ fun StatusBarRoot(
ongoingCallController: OngoingCallController,
darkIconDispatcher: DarkIconDispatcher,
eventAnimationInteractor: SystemStatusEventAnimationInteractor,
+ mediaHierarchyManager: MediaHierarchyManager,
+ mediaHost: MediaHost,
onViewCreated: (ViewGroup) -> Unit,
) {
val displayId = parent.context.displayId
@@ -237,6 +248,15 @@ fun StatusBarRoot(
// Add a composable container for `StatusBarPopupChip`s
if (StatusBarPopupChips.isEnabled) {
+ with(mediaHost) {
+ expansion = MediaHostState.EXPANDED
+ expandedMatchesParentHeight = true
+ showsOnlyActiveMedia = true
+ falsingProtectionNeeded = false
+ disablePagination = true
+ init(MediaHierarchyManager.LOCATION_STATUS_BAR_POPUP)
+ }
+
val endSideContent =
phoneStatusBarView.requireViewById(
R.id.status_bar_end_side_content
@@ -256,7 +276,12 @@ fun StatusBarRoot(
setContent {
StatusBarPopupChipsContainer(
- chips = statusBarViewModel.popupChips
+ chips = statusBarViewModel.popupChips,
+ mediaHost = mediaHost,
+ onMediaControlPopupVisibilityChanged = { popupShowing ->
+ mediaHierarchyManager.isMediaControlPopupShowing =
+ popupShowing
+ },
)
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt
index 6ca4ae2d2259c..14b14126b7f66 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt
@@ -17,6 +17,7 @@
package com.android.systemui.media.controls.ui.controller
import android.graphics.Rect
+import android.platform.test.annotations.EnableFlags
import android.provider.Settings
import android.testing.TestableLooper
import android.view.ViewGroup
@@ -36,7 +37,6 @@ import com.android.systemui.flags.DisableSceneContainer
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
-import com.android.systemui.keyguard.data.repository.keyguardRepository
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.kosmos.testScope
@@ -50,6 +50,7 @@ import com.android.systemui.res.R
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController
+import com.android.systemui.statusbar.featurepods.popups.StatusBarPopupChips
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.FakeConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController
@@ -580,6 +581,36 @@ class MediaHierarchyManagerTest : SysuiTestCase() {
)
}
+ @Test
+ @EnableFlags(StatusBarPopupChips.FLAG_NAME)
+ fun testStatusBarPopupLocation() =
+ testScope.runTest {
+ mediaHierarchyManager.isMediaControlPopupShowing = true
+ runCurrent()
+
+ verify(mediaCarouselController)
+ .onDesiredLocationChanged(
+ eq(MediaHierarchyManager.LOCATION_STATUS_BAR_POPUP),
+ nullable(),
+ eq(false),
+ anyLong(),
+ anyLong(),
+ )
+ clearInvocations(mediaCarouselController)
+
+ mediaHierarchyManager.isMediaControlPopupShowing = false
+ runCurrent()
+
+ verify(mediaCarouselController)
+ .onDesiredLocationChanged(
+ eq(MediaHierarchyManager.LOCATION_QQS),
+ any(),
+ eq(false),
+ anyLong(),
+ anyLong(),
+ )
+ }
+
@Test
fun testCommunalLocationVisibilityWithShadeShowing() =
testScope.runTest {
--
GitLab
From c5ba66b4c6c6963787fe178c8ff33fd8eca11621 Mon Sep 17 00:00:00 2001
From: Caitlin Shkuratov
Date: Fri, 21 Feb 2025 07:07:25 -0800
Subject: [PATCH 099/111] [SB][Chips] Remove old `when` branch for
StatusBarNotificationIcon.
When I added a real Compose implementation for StatusBarNotificationIcon I forgot to remove the old TODO part.
Bug: 372657935
Change-Id: I08656ae6975811cd03905495b36a9c32ebe12ea6
Flag: com.android.systemui.status_bar_chips_modernization
Test: compiles
---
.../statusbar/chips/ui/compose/OngoingActivityChip.kt | 4 ----
1 file changed, 4 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt
index efd402ead979b..95e454ac7bdab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt
@@ -211,10 +211,6 @@ private fun ChipIcon(
modifier.size(dimensionResource(id = R.dimen.ongoing_activity_chip_icon_size)),
)
}
-
- // TODO(b/372657935): Add recommended architecture implementation for
- // StatusBarNotificationIcons
- is OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon -> {}
}
}
--
GitLab
From 48624d40799f0d8d2796f6b61263086e377e2ea0 Mon Sep 17 00:00:00 2001
From: Peter Kalauskas
Date: Fri, 21 Feb 2025 07:26:03 -0800
Subject: [PATCH 100/111] Workaround to enable sysui lint checks in ASfP
System UI's custom lint checks will not run in ASfP unless the jar path
to the checks is specified in the lint.xml of the module.
This is a temporary workaround to get lint checks to work in ASfP when
using the module path "frameworks/base/packages/SystemUI".
Bug: 397519800
Bug: 398194411
Test: Create ASfP project, look for custom inline lint inspections
Test: m SystemUI-core-lint and view report
Flag: EXEMPT lint only
Change-Id: I92e2febd39a96cb20ca17296f2ae093217b6dbb2
---
packages/SystemUI/lint.xml | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/packages/SystemUI/lint.xml b/packages/SystemUI/lint.xml
index 59a71099bb3fc..bef2edd436e20 100644
--- a/packages/SystemUI/lint.xml
+++ b/packages/SystemUI/lint.xml
@@ -1,4 +1,5 @@
-
+
+
-
\ No newline at end of file
+
--
GitLab
From 79e50b8516eaa9433ff65eefd3a306e92f687d53 Mon Sep 17 00:00:00 2001
From: Lais Andrade
Date: Fri, 21 Feb 2025 13:26:10 +0000
Subject: [PATCH 101/111] Improve VibrationThread assertions for debugging
Improve VibrationThread tests to use Truth assertions to improve error
messages and help debugging flaky tests.
Bug: 368277051
Test: VibrationThreadTest
Flag: EXEMPT test only
Change-Id: I78e9247b92c333af62638ea1f7c25402561570de
---
.../server/vibrator/VibrationThreadTest.java | 727 +++++++++---------
1 file changed, 379 insertions(+), 348 deletions(-)
diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
index 42279e40fa336..04335df8c4544 100644
--- a/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
+++ b/services/tests/vibrator/src/com/android/server/vibrator/VibrationThreadTest.java
@@ -20,14 +20,14 @@ import static android.os.VibrationAttributes.USAGE_RINGTONE;
import static android.os.VibrationEffect.Composition.PRIMITIVE_CLICK;
import static android.os.VibrationEffect.Composition.PRIMITIVE_SPIN;
import static android.os.VibrationEffect.Composition.PRIMITIVE_TICK;
+import static android.os.VibrationEffect.EFFECT_CLICK;
+import static android.os.VibrationEffect.EFFECT_TICK;
import static android.os.VibrationEffect.VibrationParameter.targetAmplitude;
import static android.os.VibrationEffect.VibrationParameter.targetFrequency;
import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
@@ -189,7 +189,7 @@ public class VibrationThreadTest {
public void vibrate_noVibrator_ignoresVibration() {
mVibratorProviders.clear();
CombinedVibration effect = CombinedVibration.createParallel(
- VibrationEffect.get(VibrationEffect.EFFECT_CLICK));
+ VibrationEffect.get(EFFECT_CLICK));
HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
@@ -200,8 +200,8 @@ public class VibrationThreadTest {
@Test
public void vibrate_missingVibrators_ignoresVibration() {
CombinedVibration effect = CombinedVibration.startSequential()
- .addNext(2, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
- .addNext(3, VibrationEffect.get(VibrationEffect.EFFECT_TICK))
+ .addNext(2, VibrationEffect.get(EFFECT_CLICK))
+ .addNext(3, VibrationEffect.get(EFFECT_TICK))
.combine();
HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
@@ -222,11 +222,12 @@ public class VibrationThreadTest {
verify(mManagerHooks).noteVibratorOff(eq(UID));
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
- assertEquals(Arrays.asList(expectedOneShot(10)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
- assertEquals(expectedAmplitudes(100), mVibratorProviders.get(VIBRATOR_ID).getAmplitudes());
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(10)).inOrder();
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(100)).inOrder();
}
@Test
@@ -239,11 +240,11 @@ public class VibrationThreadTest {
verify(mManagerHooks).noteVibratorOff(eq(UID));
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
- assertEquals(Arrays.asList(expectedOneShot(10)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
- assertTrue(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes().isEmpty());
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(10)).inOrder();
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes()).isEmpty();
}
@Test
@@ -259,12 +260,12 @@ public class VibrationThreadTest {
verify(mManagerHooks).noteVibratorOff(eq(UID));
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
- assertEquals(Arrays.asList(expectedOneShot(15)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
- assertEquals(expectedAmplitudes(1, 2, 3),
- mVibratorProviders.get(VIBRATOR_ID).getAmplitudes());
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(15)).inOrder();
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(1, 2, 3)).inOrder();
}
@Test
@@ -285,11 +286,12 @@ public class VibrationThreadTest {
waitForCompletion();
verify(mStatsLoggerMock, never()).logVibrationParamRequestTimeout(UID);
- assertEquals(Arrays.asList(expectedOneShot(15)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(15)).inOrder();
List amplitudes = mVibratorProviders.get(VIBRATOR_ID).getAmplitudes();
for (int i = 0; i < amplitudes.size(); i++) {
- assertTrue(amplitudes.get(i) < 1 / 255f);
+ assertWithMessage("For amplitude index %s", i)
+ .that(amplitudes.get(i)).isLessThan(1 / 255f);
}
}
@@ -309,10 +311,10 @@ public class VibrationThreadTest {
waitForCompletion();
verify(mStatsLoggerMock).logVibrationParamRequestTimeout(UID);
- assertEquals(Arrays.asList(expectedOneShot(15)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
- assertEquals(expectedAmplitudes(1, 1, 1),
- mVibratorProviders.get(VIBRATOR_ID).getAmplitudes());
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(15)).inOrder();
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(1, 1, 1)).inOrder();
}
@Test
@@ -325,31 +327,33 @@ public class VibrationThreadTest {
VibrationEffect effect = VibrationEffect.createWaveform(new long[]{5, 5, 5}, amplitudes, 0);
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(
+ assertThat(
waitUntil(() -> fakeVibrator.getAmplitudes().size() > 2 * amplitudes.length,
- TEST_TIMEOUT_MILLIS));
+ TEST_TIMEOUT_MILLIS)).isTrue();
// Vibration still running after 2 cycles.
- assertTrue(mThread.isRunningVibrationId(vibration.id));
- assertTrue(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mThread.isRunningVibrationId(vibration.id)).isTrue();
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isTrue();
Vibration.EndInfo cancelVibrationInfo = new Vibration.EndInfo(Status.CANCELLED_SUPERSEDED,
new CallerInfo(VibrationAttributes.createForUsage(VibrationAttributes.USAGE_ALARM),
/* uid= */ 1, /* deviceId= */ -1, /* opPkg= */ null, /* reason= */ null));
mVibrationConductor.notifyCancelled(cancelVibrationInfo, /* immediate= */ false);
waitForCompletion();
- assertFalse(mThread.isRunningVibrationId(vibration.id));
+ assertThat(mThread.isRunningVibrationId(vibration.id)).isFalse();
verify(mManagerHooks).noteVibratorOn(eq(UID), anyLong());
verify(mManagerHooks).noteVibratorOff(eq(UID));
verifyCallbacksTriggered(vibration, Status.CANCELLED_SUPERSEDED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
List playedAmplitudes = fakeVibrator.getAmplitudes();
- assertFalse(fakeVibrator.getEffectSegments(vibration.id).isEmpty());
- assertFalse(playedAmplitudes.isEmpty());
+ assertThat(fakeVibrator.getEffectSegments(vibration.id)).isNotEmpty();
+ assertThat(playedAmplitudes).isNotEmpty();
for (int i = 0; i < playedAmplitudes.size(); i++) {
- assertEquals(amplitudes[i % amplitudes.length] / 255f, playedAmplitudes.get(i), 1e-5);
+ assertWithMessage("For amplitude index %s", i)
+ .that(amplitudes[i % amplitudes.length] / 255f)
+ .isWithin(1e-5f).of(playedAmplitudes.get(i));
}
}
@@ -364,15 +368,16 @@ public class VibrationThreadTest {
new long[]{1, 10, 100}, amplitudes, 0);
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> !fakeVibrator.getAmplitudes().isEmpty(), TEST_TIMEOUT_MILLIS));
+ assertThat(waitUntil(() -> !fakeVibrator.getAmplitudes().isEmpty(), TEST_TIMEOUT_MILLIS))
+ .isTrue();
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- assertEquals(Arrays.asList(expectedOneShot(5000)),
- fakeVibrator.getEffectSegments(vibration.id));
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
+ assertThat(fakeVibrator.getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(5000)).inOrder();
}
@Test
@@ -391,7 +396,7 @@ public class VibrationThreadTest {
assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
- .isEqualTo(expectedOneShots(100L, 150L));
+ .containsExactlyElementsIn(expectedOneShots(100L, 150L)).inOrder();
}
@Test
@@ -412,7 +417,7 @@ public class VibrationThreadTest {
assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
- .isEqualTo(expectedOneShots(200L, 50L));
+ .containsExactlyElementsIn(expectedOneShots(200L, 50L)).inOrder();
}
@EnableFlags(Flags.FLAG_FIX_VIBRATION_THREAD_CALLBACK_HANDLING)
@@ -433,8 +438,8 @@ public class VibrationThreadTest {
// 300ms ON (100ms + 200ms looping to the start and skipping first 0ms)
// 150ms ON (100ms + 50ms, skips 0ms)
// 300ms ON (100ms + 200ms looping to the start and skipping first 0ms)
- assertTrue(waitUntil(() -> fakeVibrator.getEffectSegments(vibration.id).size() >= 5,
- 5000L + TEST_TIMEOUT_MILLIS));
+ assertThat(waitUntil(() -> fakeVibrator.getEffectSegments(vibration.id).size() >= 5,
+ 5000L + TEST_TIMEOUT_MILLIS)).isTrue();
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
@@ -444,7 +449,8 @@ public class VibrationThreadTest {
assertThat(
mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id).subList(0, 5))
- .isEqualTo(expectedOneShots(200L, 150L, 300L, 150L, 300L));
+ .containsExactlyElementsIn(expectedOneShots(200L, 150L, 300L, 150L, 300L))
+ .inOrder();
}
@EnableFlags(Flags.FLAG_FIX_VIBRATION_THREAD_CALLBACK_HANDLING)
@@ -468,7 +474,7 @@ public class VibrationThreadTest {
// First callback ignored, did not cause the vibrator to turn back on during the 400ms step.
assertThat(fakeVibrator.getEffectSegments(vibration.id))
- .isEqualTo(expectedOneShots(200L, 400L));
+ .containsExactlyElementsIn(expectedOneShots(200L, 400L)).inOrder();
}
@Test
@@ -490,16 +496,16 @@ public class VibrationThreadTest {
.compose();
HalVibration vibration = startThreadAndDispatcher(repeatingEffect);
- assertTrue(waitUntil(() -> !fakeVibrator.getEffectSegments(vibration.id).isEmpty(),
- TEST_TIMEOUT_MILLIS));
+ assertThat(waitUntil(() -> !fakeVibrator.getEffectSegments(vibration.id).isEmpty(),
+ TEST_TIMEOUT_MILLIS)).isTrue();
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
// PWLE size max was used to generate a single vibrate call with 10 segments.
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- assertEquals(10, fakeVibrator.getEffectSegments(vibration.id).size());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
+ assertThat(fakeVibrator.getEffectSegments(vibration.id)).hasSize(10);
}
@Test
@@ -519,16 +525,16 @@ public class VibrationThreadTest {
.compose();
HalVibration vibration = startThreadAndDispatcher(repeatingEffect);
- assertTrue(waitUntil(() -> !fakeVibrator.getEffectSegments(vibration.id).isEmpty(),
- TEST_TIMEOUT_MILLIS));
+ assertThat(waitUntil(() -> !fakeVibrator.getEffectSegments(vibration.id).isEmpty(),
+ TEST_TIMEOUT_MILLIS)).isTrue();
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_SCREEN_OFF), /* immediate= */ false);
waitForCompletion();
// Composition size max was used to generate a single vibrate call with 10 primitives.
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SCREEN_OFF);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- assertEquals(10, fakeVibrator.getEffectSegments(vibration.id).size());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
+ assertThat(fakeVibrator.getEffectSegments(vibration.id)).hasSize(10);
}
@Test
@@ -542,15 +548,16 @@ public class VibrationThreadTest {
new long[]{5000, 500, 50}, amplitudes, 0);
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> !fakeVibrator.getAmplitudes().isEmpty(), TEST_TIMEOUT_MILLIS));
+ assertThat(waitUntil(() -> !fakeVibrator.getAmplitudes().isEmpty(), TEST_TIMEOUT_MILLIS))
+ .isTrue();
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- assertEquals(Arrays.asList(expectedOneShot(5550)),
- fakeVibrator.getEffectSegments(vibration.id));
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
+ assertThat(fakeVibrator.getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(5550)).inOrder();
}
@LargeTest
@@ -566,23 +573,24 @@ public class VibrationThreadTest {
/* amplitudes= */ new int[]{1, 2}, /* repeat= */ 0);
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> fakeVibrator.getEffectSegments(vibration.id).size() > 1,
- expectedOnDuration + TEST_TIMEOUT_MILLIS));
+ assertThat(waitUntil(() -> fakeVibrator.getEffectSegments(vibration.id).size() > 1,
+ expectedOnDuration + TEST_TIMEOUT_MILLIS)).isTrue();
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
List effectSegments = fakeVibrator.getEffectSegments(vibration.id);
// First time, turn vibrator ON for the expected fixed duration.
- assertEquals(expectedOnDuration, effectSegments.get(0).getDuration());
+ assertThat(effectSegments.get(0).getDuration()).isEqualTo(expectedOnDuration);
// Vibrator turns off in the middle of the second execution of the first step. Expect it to
// be turned back ON at least for the fixed duration + the remaining duration of the step.
- assertTrue(expectedOnDuration < effectSegments.get(1).getDuration());
+ assertThat(effectSegments.get(1).getDuration()).isGreaterThan(expectedOnDuration);
// Set amplitudes for a cycle {1, 2}, start second loop then turn it back on to same value.
- assertEquals(expectedAmplitudes(1, 2, 1, 1),
- mVibratorProviders.get(VIBRATOR_ID).getAmplitudes().subList(0, 4));
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes().subList(0, 4))
+ .containsExactlyElementsIn(expectedAmplitudes(1, 2, 1, 1))
+ .inOrder();
}
@Test
@@ -598,9 +606,9 @@ public class VibrationThreadTest {
.compose();
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
- TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibration.id));
+ assertThat(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
+ TEST_TIMEOUT_MILLIS)).isTrue();
+ assertThat(mThread.isRunningVibrationId(vibration.id)).isTrue();
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(vibrationThread) if the vibration not cancelled immediately.
@@ -614,7 +622,7 @@ public class VibrationThreadTest {
cancellingThread.join();
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SETTINGS_UPDATE);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
}
@Test
@@ -628,9 +636,9 @@ public class VibrationThreadTest {
VibrationEffect effect = VibrationEffect.createVendorEffect(createTestVendorData());
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
- TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibration.id));
+ assertThat(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
+ TEST_TIMEOUT_MILLIS)).isTrue();
+ assertThat(mThread.isRunningVibrationId(vibration.id)).isTrue();
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(vibrationThread) if the vibration not cancelled immediately.
@@ -644,7 +652,7 @@ public class VibrationThreadTest {
cancellingThread.join();
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SETTINGS_UPDATE);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
}
@Test
@@ -655,9 +663,9 @@ public class VibrationThreadTest {
VibrationEffect effect = VibrationEffect.createWaveform(new long[]{100}, new int[]{100}, 0);
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
- TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibration.id));
+ assertThat(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
+ TEST_TIMEOUT_MILLIS)).isTrue();
+ assertThat(mThread.isRunningVibrationId(vibration.id)).isTrue();
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(vibrationThread) if the vibration not cancelled immediately.
@@ -671,7 +679,7 @@ public class VibrationThreadTest {
cancellingThread.join();
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SCREEN_OFF);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
}
@Test
@@ -686,10 +694,10 @@ public class VibrationThreadTest {
verify(mManagerHooks).noteVibratorOff(eq(UID));
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
- assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_THUD)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedPrebaked(VibrationEffect.EFFECT_THUD)).inOrder();
}
@Test
@@ -698,7 +706,7 @@ public class VibrationThreadTest {
VibrationEffect fallback = VibrationEffect.createOneShot(10, 100);
HalVibration vibration = createVibration(CombinedVibration.createParallel(
- VibrationEffect.get(VibrationEffect.EFFECT_CLICK)));
+ VibrationEffect.get(EFFECT_CLICK)));
vibration.fillFallbacks(unused -> fallback);
startThreadAndDispatcher(vibration);
waitForCompletion();
@@ -707,16 +715,17 @@ public class VibrationThreadTest {
verify(mManagerHooks).noteVibratorOff(eq(UID));
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
- assertEquals(Arrays.asList(expectedOneShot(10)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
- assertEquals(expectedAmplitudes(100), mVibratorProviders.get(VIBRATOR_ID).getAmplitudes());
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(10)).inOrder();
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(100)).inOrder();
}
@Test
public void vibrate_singleVibratorPrebakedAndUnsupportedEffect_ignoresVibration() {
- VibrationEffect effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
+ VibrationEffect effect = VibrationEffect.get(EFFECT_CLICK);
HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
@@ -725,7 +734,7 @@ public class VibrationThreadTest {
verify(mControllerCallbacks, never())
.onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.IGNORED_UNSUPPORTED);
- assertTrue(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id).isEmpty());
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id)).isEmpty();
}
@Test
@@ -745,8 +754,7 @@ public class VibrationThreadTest {
assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
assertThat(mVibratorProviders.get(VIBRATOR_ID).getVendorEffects(vibration.id))
- .containsExactly(effect)
- .inOrder();
+ .containsExactly(effect).inOrder();
}
@Test
@@ -766,11 +774,12 @@ public class VibrationThreadTest {
verify(mManagerHooks).noteVibratorOff(eq(UID));
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- assertEquals(Arrays.asList(
- expectedPrimitive(PRIMITIVE_CLICK, 1, 0),
- expectedPrimitive(PRIMITIVE_TICK, 0.5f, 0)),
- fakeVibrator.getEffectSegments(vibration.id));
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
+ assertThat(fakeVibrator.getEffectSegments(vibration.id))
+ .containsExactly(
+ expectedPrimitive(PRIMITIVE_CLICK, 1, 0),
+ expectedPrimitive(PRIMITIVE_TICK, 0.5f, 0))
+ .inOrder();
}
@Test
@@ -787,7 +796,7 @@ public class VibrationThreadTest {
verify(mControllerCallbacks, never())
.onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.IGNORED_UNSUPPORTED);
- assertTrue(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id).isEmpty());
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id)).isEmpty();
}
@Test
@@ -804,7 +813,7 @@ public class VibrationThreadTest {
verify(mControllerCallbacks, never())
.onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.IGNORED_UNSUPPORTED);
- assertTrue(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id).isEmpty());
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id)).isEmpty();
}
@Test
@@ -826,14 +835,14 @@ public class VibrationThreadTest {
// Vibrator compose called twice.
verify(mControllerCallbacks, times(2))
.onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
- assertEquals(3, fakeVibrator.getEffectSegments(vibration.id).size());
+ assertThat(fakeVibrator.getEffectSegments(vibration.id)).hasSize(3);
}
@Test
@DisableFlags(Flags.FLAG_NORMALIZED_PWLE_EFFECTS)
public void vibrate_singleVibratorComposedEffects_runsDifferentVibrations() {
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(VIBRATOR_ID);
- fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK);
+ fakeVibrator.setSupportedEffects(EFFECT_CLICK);
fakeVibrator.setSupportedPrimitives(PRIMITIVE_CLICK, PRIMITIVE_TICK);
fakeVibrator.setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS,
IVibrator.CAP_COMPOSE_PWLE_EFFECTS, IVibrator.CAP_AMPLITUDE_CONTROL);
@@ -847,13 +856,13 @@ public class VibrationThreadTest {
.addEffect(VibrationEffect.createOneShot(10, 100))
.addPrimitive(PRIMITIVE_CLICK, 1f)
.addPrimitive(PRIMITIVE_TICK, 0.5f)
- .addEffect(VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
+ .addEffect(VibrationEffect.get(EFFECT_CLICK))
.addEffect(VibrationEffect.startWaveform()
.addTransition(Duration.ofMillis(10),
targetAmplitude(1), targetFrequency(100))
.addTransition(Duration.ofMillis(20), targetFrequency(120))
.build())
- .addEffect(VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
+ .addEffect(VibrationEffect.get(EFFECT_CLICK))
.compose();
HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
@@ -864,33 +873,37 @@ public class VibrationThreadTest {
verify(mControllerCallbacks, times(5))
.onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- assertEquals(Arrays.asList(
- expectedOneShot(10),
- expectedPrimitive(PRIMITIVE_CLICK, 1, 0),
- expectedPrimitive(PRIMITIVE_TICK, 0.5f, 0),
- expectedPrebaked(VibrationEffect.EFFECT_CLICK),
- expectedRamp(/* startAmplitude= */ 0, /* endAmplitude= */ 0.5f,
- /* startFrequencyHz= */ 150, /* endFrequencyHz= */ 100, /* duration= */ 10),
- expectedRamp(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.7f,
- /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 120, /* duration= */ 20),
- expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
- assertEquals(expectedAmplitudes(100), mVibratorProviders.get(VIBRATOR_ID).getAmplitudes());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(
+ expectedOneShot(10),
+ expectedPrimitive(PRIMITIVE_CLICK, 1, 0),
+ expectedPrimitive(PRIMITIVE_TICK, 0.5f, 0),
+ expectedPrebaked(EFFECT_CLICK),
+ expectedRamp(/* startAmplitude= */ 0, /* endAmplitude= */ 0.5f,
+ /* startFrequencyHz= */ 150, /* endFrequencyHz= */ 100,
+ /* duration= */ 10),
+ expectedRamp(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.7f,
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 120,
+ /* duration= */ 20),
+ expectedPrebaked(EFFECT_CLICK))
+ .inOrder();
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(100)).inOrder();
}
@Test
public void vibrate_singleVibratorComposedWithFallback_replacedInTheMiddleOfComposition() {
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(VIBRATOR_ID);
- fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK);
+ fakeVibrator.setSupportedEffects(EFFECT_CLICK);
fakeVibrator.setSupportedPrimitives(PRIMITIVE_CLICK, PRIMITIVE_TICK);
fakeVibrator.setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
VibrationEffect fallback = VibrationEffect.createOneShot(10, 100);
VibrationEffect effect = VibrationEffect.startComposition()
- .addEffect(VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
+ .addEffect(VibrationEffect.get(EFFECT_CLICK))
.addPrimitive(PRIMITIVE_CLICK, 1f)
- .addEffect(VibrationEffect.get(VibrationEffect.EFFECT_TICK))
+ .addEffect(VibrationEffect.get(EFFECT_TICK))
.addPrimitive(PRIMITIVE_TICK, 0.5f)
.compose();
HalVibration vibration = createVibration(CombinedVibration.createParallel(effect));
@@ -904,18 +917,19 @@ public class VibrationThreadTest {
verify(mControllerCallbacks, times(4))
.onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
List segments =
mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id);
- assertTrue("Wrong segments: " + segments, segments.size() >= 4);
- assertTrue(segments.get(0) instanceof PrebakedSegment);
- assertTrue(segments.get(1) instanceof PrimitiveSegment);
+ assertWithMessage("Wrong segments: %s", segments).that(segments.size()).isGreaterThan(3);
+ assertThat(segments.get(0)).isInstanceOf(PrebakedSegment.class);
+ assertThat(segments.get(1)).isInstanceOf(PrimitiveSegment.class);
for (int i = 2; i < segments.size() - 1; i++) {
// One or more step segments as fallback for the EFFECT_TICK.
- assertTrue(segments.get(i) instanceof StepSegment);
+ assertWithMessage("For segment index %s", i)
+ .that(segments.get(i)).isInstanceOf(StepSegment.class);
}
- assertTrue(segments.get(segments.size() - 1) instanceof PrimitiveSegment);
+ assertThat(segments.get(segments.size() - 1)).isInstanceOf(PrimitiveSegment.class);
}
@Test
@@ -942,14 +956,15 @@ public class VibrationThreadTest {
verify(mManagerHooks).noteVibratorOff(eq(UID));
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- assertEquals(Arrays.asList(
- expectedPwle(/*amplitude=*/ 0.0f, /*frequencyHz=*/ 60f, /*timeMillis=*/ 0),
- expectedPwle(/*amplitude=*/ 0.1f, /*frequencyHz=*/ 60f, /*timeMillis=*/ 20),
- expectedPwle(/*amplitude=*/ 0.3f, /*frequencyHz=*/ 100f, /*timeMillis=*/ 30),
- expectedPwle(/*amplitude=*/ 0.4f, /*frequencyHz=*/ 120f, /*timeMillis=*/ 20),
- expectedPwle(/*amplitude=*/ 0.0f, /*frequencyHz=*/ 120f, /*timeMillis=*/ 30)
- ), fakeVibrator.getEffectPwlePoints(vibration.id));
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
+ assertThat(fakeVibrator.getEffectPwlePoints(vibration.id))
+ .containsExactly(
+ expectedPwle(0.0f, 60f, 0),
+ expectedPwle(0.1f, 60f, 20),
+ expectedPwle(0.3f, 100f, 30),
+ expectedPwle(0.4f, 120f, 20),
+ expectedPwle(0.0f, 120f, 30))
+ .inOrder();
}
@@ -978,13 +993,14 @@ public class VibrationThreadTest {
verify(mManagerHooks).noteVibratorOff(eq(UID));
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- assertEquals(Arrays.asList(
- expectedPwle(/*amplitude=*/ 0.0f, /*frequencyHz=*/ 150f, /*timeMillis=*/ 0),
- expectedPwle(/*amplitude=*/ 1.0f, /*frequencyHz=*/ 150f, /*timeMillis=*/ 20),
- expectedPwle(/*amplitude=*/ 1.0f, /*frequencyHz=*/ 150f, /*timeMillis=*/ 100),
- expectedPwle(/*amplitude=*/ 0.0f, /*frequencyHz=*/ 150f, /*timeMillis=*/ 100)
- ), fakeVibrator.getEffectPwlePoints(vibration.id));
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
+ assertThat(fakeVibrator.getEffectPwlePoints(vibration.id))
+ .containsExactly(
+ expectedPwle(0.0f, 150f, 0),
+ expectedPwle(1.0f, 150f, 20),
+ expectedPwle(1.0f, 150f, 100),
+ expectedPwle(0.0f, 150f, 100))
+ .inOrder();
}
@@ -1014,15 +1030,15 @@ public class VibrationThreadTest {
verify(mManagerHooks).noteVibratorOff(eq(UID));
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- assertEquals(Arrays.asList(
- expectedPwle(/*amplitude=*/ 0.0f, /*frequencyHz=*/ 30f, /*timeMillis=*/ 0),
- expectedPwle(/*amplitude=*/ 0.1f, /*frequencyHz=*/ 60f, /*timeMillis=*/ 20),
- expectedPwle(/*amplitude=*/ 0.3f, /*frequencyHz=*/ 100f, /*timeMillis=*/ 30),
- expectedPwle(/*amplitude=*/ 0.4f, /*frequencyHz=*/ 120f, /*timeMillis=*/ 20),
- expectedPwle(/*amplitude=*/ 0.0f, /*frequencyHz=*/ 120f, /*timeMillis=*/ 30)
- ), fakeVibrator.getEffectPwlePoints(vibration.id));
-
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
+ assertThat(fakeVibrator.getEffectPwlePoints(vibration.id))
+ .containsExactly(
+ expectedPwle(0.0f, 30f, 0),
+ expectedPwle(0.1f, 60f, 20),
+ expectedPwle(0.3f, 100f, 30),
+ expectedPwle(0.4f, 120f, 20),
+ expectedPwle(0.0f, 120f, 30))
+ .inOrder();
}
@Test
@@ -1054,18 +1070,17 @@ public class VibrationThreadTest {
// Using best split points instead of max-packing PWLEs.
verify(mControllerCallbacks, times(3))
.onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
-
- assertEquals(Arrays.asList(
- expectedPwle(/*amplitude=*/ 0.0f, /*frequencyHz=*/ 100f, /*timeMillis=*/ 0),
- expectedPwle(/*amplitude=*/ 0.8f, /*frequencyHz=*/ 100f, /*timeMillis=*/ 30),
- expectedPwle(/*amplitude=*/ 0.0f, /*frequencyHz=*/ 100f, /*timeMillis=*/ 30),
- expectedPwle(/*amplitude=*/ 0.9f, /*frequencyHz=*/ 100f, /*timeMillis=*/ 0),
- expectedPwle(/*amplitude=*/ 0.4f, /*frequencyHz=*/ 100f, /*timeMillis=*/ 30),
- expectedPwle(/*amplitude=*/ 0.6f, /*frequencyHz=*/ 100f, /*timeMillis=*/ 0),
- expectedPwle(/*amplitude=*/ 0.7f, /*frequencyHz=*/ 100f, /*timeMillis=*/ 30)
- ), fakeVibrator.getEffectPwlePoints(vibration.id));
-
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
+ assertThat(fakeVibrator.getEffectPwlePoints(vibration.id))
+ .containsExactly(
+ expectedPwle(0.0f, 100f, 0),
+ expectedPwle(0.8f, 100f, 30),
+ expectedPwle(0.0f, 100f, 30),
+ expectedPwle(0.9f, 100f, 0),
+ expectedPwle(0.4f, 100f, 30),
+ expectedPwle(0.6f, 100f, 0),
+ expectedPwle(0.7f, 100f, 30))
+ .inOrder();
}
@Test
@@ -1094,17 +1109,21 @@ public class VibrationThreadTest {
verify(mManagerHooks).noteVibratorOff(eq(UID));
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
- assertEquals(Arrays.asList(
- expectedRamp(/* amplitude= */ 1, /* frequencyHz= */ 150, /* duration= */ 10),
- expectedRamp(/* startAmplitude= */ 1, /* endAmplitude= */ 0,
- /* startFrequencyHz= */ 150, /* endFrequencyHz= */ 150, /* duration= */ 20),
- expectedRamp(/* amplitude= */ 0.5f, /* frequencyHz= */ 100, /* duration= */ 30),
- expectedRamp(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.6f,
- /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 200,
- /* duration= */ 40)),
- fakeVibrator.getEffectSegments(vibration.id));
- assertEquals(Arrays.asList(Braking.CLAB), fakeVibrator.getBraking(vibration.id));
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
+ assertThat(fakeVibrator.getEffectSegments(vibration.id))
+ .containsExactly(
+ expectedRamp(/* amplitude= */ 1, /* frequencyHz= */ 150,
+ /* duration= */ 10),
+ expectedRamp(/* startAmplitude= */ 1, /* endAmplitude= */ 0,
+ /* startFrequencyHz= */ 150, /* endFrequencyHz= */ 150,
+ /* duration= */ 20),
+ expectedRamp(/* amplitude= */ 0.5f, /* frequencyHz= */ 100,
+ /* duration= */ 30),
+ expectedRamp(/* startAmplitude= */ 0.5f, /* endAmplitude= */ 0.6f,
+ /* startFrequencyHz= */ 100, /* endFrequencyHz= */ 200,
+ /* duration= */ 40))
+ .inOrder();
+ assertThat(fakeVibrator.getBraking(vibration.id)).containsExactly(Braking.CLAB).inOrder();
}
@Test
@@ -1137,7 +1156,7 @@ public class VibrationThreadTest {
// Using best split points instead of max-packing PWLEs.
verify(mControllerCallbacks, times(3))
.onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
- assertEquals(6, fakeVibrator.getEffectSegments(vibration.id).size());
+ assertThat(fakeVibrator.getEffectSegments(vibration.id)).hasSize(6);
}
@Test
@@ -1148,15 +1167,16 @@ public class VibrationThreadTest {
VibrationEffect effect = VibrationEffect.createWaveform(new long[]{5}, new int[]{100}, 0);
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> fakeVibrator.getAmplitudes().size() > 2, TEST_TIMEOUT_MILLIS));
+ assertThat(waitUntil(() -> fakeVibrator.getAmplitudes().size() > 2, TEST_TIMEOUT_MILLIS))
+ .isTrue();
// Vibration still running after 2 cycles.
- assertTrue(mThread.isRunningVibrationId(vibration.id));
- assertTrue(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mThread.isRunningVibrationId(vibration.id)).isTrue();
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isTrue();
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BINDER_DIED), /* immediate= */ false);
waitForCompletion();
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
verifyCallbacksTriggered(vibration, Status.CANCELLED_BINDER_DIED);
}
@@ -1176,11 +1196,11 @@ public class VibrationThreadTest {
@Test
public void vibrate_multipleExistingAndMissingVibrators_vibratesOnlyExistingOnes() {
- mVibratorProviders.get(1).setSupportedEffects(VibrationEffect.EFFECT_TICK);
+ mVibratorProviders.get(1).setSupportedEffects(EFFECT_TICK);
CombinedVibration effect = CombinedVibration.startParallel()
- .addVibrator(VIBRATOR_ID, VibrationEffect.get(VibrationEffect.EFFECT_TICK))
- .addVibrator(2, VibrationEffect.get(VibrationEffect.EFFECT_TICK))
+ .addVibrator(VIBRATOR_ID, VibrationEffect.get(EFFECT_TICK))
+ .addVibrator(2, VibrationEffect.get(EFFECT_TICK))
.combine();
HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
@@ -1190,21 +1210,21 @@ public class VibrationThreadTest {
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verify(mControllerCallbacks, never()).onComplete(eq(2), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
- assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_TICK)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedPrebaked(EFFECT_TICK)).inOrder();
}
@Test
public void vibrate_multipleMono_runsSameEffectInAllVibrators() {
mockVibrators(1, 2, 3);
- mVibratorProviders.get(1).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
- mVibratorProviders.get(2).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
- mVibratorProviders.get(3).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
+ mVibratorProviders.get(1).setSupportedEffects(EFFECT_CLICK);
+ mVibratorProviders.get(2).setSupportedEffects(EFFECT_CLICK);
+ mVibratorProviders.get(3).setSupportedEffects(EFFECT_CLICK);
CombinedVibration effect = CombinedVibration.createParallel(
- VibrationEffect.get(VibrationEffect.EFFECT_CLICK));
+ VibrationEffect.get(EFFECT_CLICK));
HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
@@ -1214,23 +1234,23 @@ public class VibrationThreadTest {
verify(mControllerCallbacks).onComplete(eq(2), eq(vibration.id), anyLong());
verify(mControllerCallbacks).onComplete(eq(3), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(1).isVibrating());
- assertFalse(mControllers.get(2).isVibrating());
- assertFalse(mControllers.get(3).isVibrating());
+ assertThat(mControllers.get(1).isVibrating()).isFalse();
+ assertThat(mControllers.get(2).isVibrating()).isFalse();
+ assertThat(mControllers.get(3).isVibrating()).isFalse();
- VibrationEffectSegment expected = expectedPrebaked(VibrationEffect.EFFECT_CLICK);
- assertEquals(Arrays.asList(expected),
- mVibratorProviders.get(1).getEffectSegments(vibration.id));
- assertEquals(Arrays.asList(expected),
- mVibratorProviders.get(2).getEffectSegments(vibration.id));
- assertEquals(Arrays.asList(expected),
- mVibratorProviders.get(3).getEffectSegments(vibration.id));
+ VibrationEffectSegment expected = expectedPrebaked(EFFECT_CLICK);
+ assertThat(mVibratorProviders.get(1).getEffectSegments(vibration.id))
+ .containsExactly(expected).inOrder();
+ assertThat(mVibratorProviders.get(2).getEffectSegments(vibration.id))
+ .containsExactly(expected).inOrder();
+ assertThat(mVibratorProviders.get(3).getEffectSegments(vibration.id))
+ .containsExactly(expected).inOrder();
}
@Test
public void vibrate_multipleStereo_runsVibrationOnRightVibrators() {
mockVibrators(1, 2, 3, 4);
- mVibratorProviders.get(1).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
+ mVibratorProviders.get(1).setSupportedEffects(EFFECT_CLICK);
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
mVibratorProviders.get(3).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
mVibratorProviders.get(4).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
@@ -1240,7 +1260,7 @@ public class VibrationThreadTest {
.addPrimitive(PRIMITIVE_CLICK)
.compose();
CombinedVibration effect = CombinedVibration.startParallel()
- .addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
+ .addVibrator(1, VibrationEffect.get(EFFECT_CLICK))
.addVibrator(2, VibrationEffect.createOneShot(10, 100))
.addVibrator(3, VibrationEffect.createWaveform(
new long[]{10, 10}, new int[]{1, 2}, -1))
@@ -1256,21 +1276,23 @@ public class VibrationThreadTest {
verify(mControllerCallbacks).onComplete(eq(3), eq(vibration.id), anyLong());
verify(mControllerCallbacks).onComplete(eq(4), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(1).isVibrating());
- assertFalse(mControllers.get(2).isVibrating());
- assertFalse(mControllers.get(3).isVibrating());
- assertFalse(mControllers.get(4).isVibrating());
-
- assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- mVibratorProviders.get(1).getEffectSegments(vibration.id));
- assertEquals(Arrays.asList(expectedOneShot(10)),
- mVibratorProviders.get(2).getEffectSegments(vibration.id));
- assertEquals(expectedAmplitudes(100), mVibratorProviders.get(2).getAmplitudes());
- assertEquals(Arrays.asList(expectedOneShot(20)),
- mVibratorProviders.get(3).getEffectSegments(vibration.id));
- assertEquals(expectedAmplitudes(1, 2), mVibratorProviders.get(3).getAmplitudes());
- assertEquals(Arrays.asList(expectedPrimitive(PRIMITIVE_CLICK, 1, 0)),
- mVibratorProviders.get(4).getEffectSegments(vibration.id));
+ assertThat(mControllers.get(1).isVibrating()).isFalse();
+ assertThat(mControllers.get(2).isVibrating()).isFalse();
+ assertThat(mControllers.get(3).isVibrating()).isFalse();
+ assertThat(mControllers.get(4).isVibrating()).isFalse();
+
+ assertThat(mVibratorProviders.get(1).getEffectSegments(vibration.id))
+ .containsExactly(expectedPrebaked(EFFECT_CLICK)).inOrder();
+ assertThat(mVibratorProviders.get(2).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(10)).inOrder();
+ assertThat(mVibratorProviders.get(2).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(100)).inOrder();
+ assertThat(mVibratorProviders.get(3).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(20)).inOrder();
+ assertThat(mVibratorProviders.get(3).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(1, 2)).inOrder();
+ assertThat(mVibratorProviders.get(4).getEffectSegments(vibration.id))
+ .containsExactly(expectedPrimitive(PRIMITIVE_CLICK, 1, 0)).inOrder();
}
@Test
@@ -1279,13 +1301,13 @@ public class VibrationThreadTest {
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
mVibratorProviders.get(2).setSupportedPrimitives(PRIMITIVE_CLICK);
- mVibratorProviders.get(3).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
+ mVibratorProviders.get(3).setSupportedEffects(EFFECT_CLICK);
VibrationEffect composed = VibrationEffect.startComposition()
.addPrimitive(PRIMITIVE_CLICK)
.compose();
CombinedVibration effect = CombinedVibration.startSequential()
- .addNext(3, VibrationEffect.get(VibrationEffect.EFFECT_CLICK), /* delay= */ 50)
+ .addNext(3, VibrationEffect.get(EFFECT_CLICK), /* delay= */ 50)
.addNext(1, VibrationEffect.createOneShot(10, 100), /* delay= */ 50)
.addNext(2, composed, /* delay= */ 50)
.combine();
@@ -1306,17 +1328,18 @@ public class VibrationThreadTest {
batteryVerifier.verify(mManagerHooks).noteVibratorOff(eq(UID));
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(1).isVibrating());
- assertFalse(mControllers.get(2).isVibrating());
- assertFalse(mControllers.get(3).isVibrating());
+ assertThat(mControllers.get(1).isVibrating()).isFalse();
+ assertThat(mControllers.get(2).isVibrating()).isFalse();
+ assertThat(mControllers.get(3).isVibrating()).isFalse();
- assertEquals(Arrays.asList(expectedOneShot(10)),
- mVibratorProviders.get(1).getEffectSegments(vibration.id));
- assertEquals(expectedAmplitudes(100), mVibratorProviders.get(1).getAmplitudes());
- assertEquals(Arrays.asList(expectedPrimitive(PRIMITIVE_CLICK, 1, 0)),
- mVibratorProviders.get(2).getEffectSegments(vibration.id));
- assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- mVibratorProviders.get(3).getEffectSegments(vibration.id));
+ assertThat(mVibratorProviders.get(1).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(10)).inOrder();
+ assertThat(mVibratorProviders.get(1).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(100)).inOrder();
+ assertThat(mVibratorProviders.get(2).getEffectSegments(vibration.id))
+ .containsExactly(expectedPrimitive(PRIMITIVE_CLICK, 1, 0)).inOrder();
+ assertThat(mVibratorProviders.get(3).getEffectSegments(vibration.id))
+ .containsExactly(expectedPrebaked(EFFECT_CLICK)).inOrder();
}
@Test
@@ -1339,10 +1362,10 @@ public class VibrationThreadTest {
when(mManagerHooks.triggerSyncedVibration(eq(vibration.id))).thenReturn(true);
startThreadAndDispatcher(vibration);
- assertTrue(waitUntil(
+ assertThat(waitUntil(
() -> !mVibratorProviders.get(1).getEffectSegments(vibration.id).isEmpty()
&& !mVibratorProviders.get(2).getEffectSegments(vibration.id).isEmpty(),
- TEST_TIMEOUT_MILLIS));
+ TEST_TIMEOUT_MILLIS)).isTrue();
mVibrationConductor.notifySyncedVibrationComplete();
waitForCompletion();
@@ -1353,17 +1376,17 @@ public class VibrationThreadTest {
verifyCallbacksTriggered(vibration, Status.FINISHED);
VibrationEffectSegment expected = expectedPrimitive(PRIMITIVE_CLICK, 1, 100);
- assertEquals(Arrays.asList(expected),
- mVibratorProviders.get(1).getEffectSegments(vibration.id));
- assertEquals(Arrays.asList(expected),
- mVibratorProviders.get(2).getEffectSegments(vibration.id));
+ assertThat(mVibratorProviders.get(1).getEffectSegments(vibration.id))
+ .containsExactly(expected).inOrder();
+ assertThat(mVibratorProviders.get(2).getEffectSegments(vibration.id))
+ .containsExactly(expected).inOrder();
}
@Test
public void vibrate_multipleSynced_callsPrepareAndTriggerCallbacks() {
int[] vibratorIds = new int[]{1, 2, 3, 4};
mockVibrators(vibratorIds);
- mVibratorProviders.get(1).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
+ mVibratorProviders.get(1).setSupportedEffects(EFFECT_CLICK);
mVibratorProviders.get(4).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
mVibratorProviders.get(4).setSupportedPrimitives(PRIMITIVE_CLICK);
when(mManagerHooks.prepareSyncedVibration(anyLong(), any())).thenReturn(true);
@@ -1372,7 +1395,7 @@ public class VibrationThreadTest {
.addPrimitive(PRIMITIVE_CLICK)
.compose();
CombinedVibration effect = CombinedVibration.startParallel()
- .addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
+ .addVibrator(1, VibrationEffect.get(EFFECT_CLICK))
.addVibrator(2, VibrationEffect.createOneShot(10, 100))
.addVibrator(3, VibrationEffect.createWaveform(new long[]{10}, new int[]{100}, -1))
.addVibrator(4, composed)
@@ -1417,24 +1440,26 @@ public class VibrationThreadTest {
verify(mManagerHooks, never()).triggerSyncedVibration(eq(vibration.id));
verify(mManagerHooks, never()).cancelSyncedVibration();
- assertEquals(Arrays.asList(expectedOneShot(10)),
- mVibratorProviders.get(1).getEffectSegments(vibration.id));
- assertEquals(expectedAmplitudes(100), mVibratorProviders.get(1).getAmplitudes());
- assertEquals(Arrays.asList(expectedOneShot(5)),
- mVibratorProviders.get(2).getEffectSegments(vibration.id));
- assertEquals(expectedAmplitudes(200), mVibratorProviders.get(2).getAmplitudes());
+ assertThat(mVibratorProviders.get(1).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(10)).inOrder();
+ assertThat(mVibratorProviders.get(1).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(100)).inOrder();
+ assertThat(mVibratorProviders.get(2).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(5)).inOrder();
+ assertThat(mVibratorProviders.get(2).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(200)).inOrder();
}
@Test
public void vibrate_multipleSyncedTriggerFailed_cancelPreparedVibrationAndSkipSetAmplitude() {
int[] vibratorIds = new int[]{1, 2};
mockVibrators(vibratorIds);
- mVibratorProviders.get(2).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
+ mVibratorProviders.get(2).setSupportedEffects(EFFECT_CLICK);
when(mManagerHooks.prepareSyncedVibration(anyLong(), any())).thenReturn(true);
CombinedVibration effect = CombinedVibration.startParallel()
.addVibrator(1, VibrationEffect.createOneShot(10, 100))
- .addVibrator(2, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
+ .addVibrator(2, VibrationEffect.get(EFFECT_CLICK))
.combine();
// We create the HalVibration here to obtain the vibration id and use it to mock the
// required response when calling triggerSyncedVibration.
@@ -1451,7 +1476,7 @@ public class VibrationThreadTest {
verify(mManagerHooks).prepareSyncedVibration(eq(expectedCap), eq(vibratorIds));
verify(mManagerHooks).triggerSyncedVibration(eq(vibration.id));
verify(mManagerHooks).cancelSyncedVibration();
- assertTrue(mVibratorProviders.get(1).getAmplitudes().isEmpty());
+ assertThat(mVibratorProviders.get(1).getAmplitudes()).isEmpty();
}
@Test
@@ -1472,11 +1497,11 @@ public class VibrationThreadTest {
HalVibration vibration = startThreadAndDispatcher(effect);
// All vibrators are turned on in parallel.
- assertTrue(waitUntil(
+ assertThat(waitUntil(
() -> mControllers.get(1).isVibrating()
&& mControllers.get(2).isVibrating()
&& mControllers.get(3).isVibrating(),
- TEST_TIMEOUT_MILLIS));
+ TEST_TIMEOUT_MILLIS)).isTrue();
waitForCompletion();
@@ -1486,19 +1511,23 @@ public class VibrationThreadTest {
verify(mControllerCallbacks).onComplete(eq(2), eq(vibration.id), anyLong());
verify(mControllerCallbacks).onComplete(eq(3), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertFalse(mControllers.get(1).isVibrating());
- assertFalse(mControllers.get(2).isVibrating());
- assertFalse(mControllers.get(3).isVibrating());
+ assertThat(mControllers.get(1).isVibrating()).isFalse();
+ assertThat(mControllers.get(2).isVibrating()).isFalse();
+ assertThat(mControllers.get(3).isVibrating()).isFalse();
+
+ assertThat(mVibratorProviders.get(1).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(25)).inOrder();
+ assertThat(mVibratorProviders.get(2).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(80)).inOrder();
+ assertThat(mVibratorProviders.get(3).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(60)).inOrder();
+ assertThat(mVibratorProviders.get(1).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(1, 2, 3)).inOrder();
+ assertThat(mVibratorProviders.get(2).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(4, 5)).inOrder();
+ assertThat(mVibratorProviders.get(3).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(6)).inOrder();
- assertEquals(Arrays.asList(expectedOneShot(25)),
- mVibratorProviders.get(1).getEffectSegments(vibration.id));
- assertEquals(Arrays.asList(expectedOneShot(80)),
- mVibratorProviders.get(2).getEffectSegments(vibration.id));
- assertEquals(Arrays.asList(expectedOneShot(60)),
- mVibratorProviders.get(3).getEffectSegments(vibration.id));
- assertEquals(expectedAmplitudes(1, 2, 3), mVibratorProviders.get(1).getAmplitudes());
- assertEquals(expectedAmplitudes(4, 5), mVibratorProviders.get(2).getAmplitudes());
- assertEquals(expectedAmplitudes(6), mVibratorProviders.get(3).getAmplitudes());
}
@Test
@@ -1545,8 +1574,8 @@ public class VibrationThreadTest {
VibrationEffect.createOneShot(
expectedDuration, VibrationEffect.DEFAULT_AMPLITUDE)));
- startThreadAndDispatcher(vibration);
long startTime = SystemClock.elapsedRealtime();
+ startThreadAndDispatcher(vibration);
vibration.waitForEnd();
long vibrationEndTime = SystemClock.elapsedRealtime();
@@ -1616,26 +1645,24 @@ public class VibrationThreadTest {
// Allow some delay for thread scheduling and callback triggering.
int maxDelay = (int) (0.05 * totalDuration); // < 5% of total duration
- assertTrue("Waveform with perceived delay of " + delay + "ms,"
- + " expected less than " + maxDelay + "ms",
- delay < maxDelay);
+ assertThat(delay).isLessThan(maxDelay);
}
@LargeTest
@Test
public void vibrate_cancelSlowVibrator_cancelIsNotBlockedByVibrationThread() throws Exception {
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(VIBRATOR_ID);
- fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK);
+ fakeVibrator.setSupportedEffects(EFFECT_CLICK);
long latency = 5_000; // 5s
fakeVibrator.setOnLatency(latency);
- VibrationEffect effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
+ VibrationEffect effect = VibrationEffect.get(EFFECT_CLICK);
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> !fakeVibrator.getEffectSegments(vibration.id).isEmpty(),
- TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibration.id));
+ assertThat(waitUntil(() -> !fakeVibrator.getEffectSegments(vibration.id).isEmpty(),
+ TEST_TIMEOUT_MILLIS)).isTrue();
+ assertThat(mThread.isRunningVibrationId(vibration.id)).isTrue();
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(cancellingThread).
@@ -1651,18 +1678,18 @@ public class VibrationThreadTest {
// After the vibrator call ends the vibration is cancelled and the vibrator is turned off.
waitForCompletion(/* timeout= */ latency + TEST_TIMEOUT_MILLIS);
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
}
@Test
public void vibrate_multiplePredefinedCancel_cancelsVibrationImmediately() throws Exception {
mockVibrators(1, 2);
- mVibratorProviders.get(1).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
+ mVibratorProviders.get(1).setSupportedEffects(EFFECT_CLICK);
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
mVibratorProviders.get(2).setSupportedPrimitives(PRIMITIVE_CLICK);
CombinedVibration effect = CombinedVibration.startParallel()
- .addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
+ .addVibrator(1, VibrationEffect.get(EFFECT_CLICK))
.addVibrator(2, VibrationEffect.startComposition()
.addPrimitive(PRIMITIVE_CLICK, 1f, 100)
.addPrimitive(PRIMITIVE_CLICK, 1f, 100)
@@ -1671,8 +1698,9 @@ public class VibrationThreadTest {
.combine();
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> mControllers.get(2).isVibrating(), TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibration.id));
+ assertThat(waitUntil(() -> mControllers.get(2).isVibrating(), TEST_TIMEOUT_MILLIS))
+ .isTrue();
+ assertThat(mThread.isRunningVibrationId(vibration.id)).isTrue();
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(vibrationThread) if the vibration not cancelled immediately.
@@ -1686,8 +1714,8 @@ public class VibrationThreadTest {
cancellingThread.join();
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SCREEN_OFF);
- assertFalse(mControllers.get(1).isVibrating());
- assertFalse(mControllers.get(2).isVibrating());
+ assertThat(mControllers.get(1).isVibrating()).isFalse();
+ assertThat(mControllers.get(2).isVibrating()).isFalse();
}
@Test
@@ -1705,8 +1733,9 @@ public class VibrationThreadTest {
.combine();
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> mControllers.get(2).isVibrating(), TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibration.id));
+ assertThat(waitUntil(() -> mControllers.get(2).isVibrating(), TEST_TIMEOUT_MILLIS))
+ .isTrue();
+ assertThat(mThread.isRunningVibrationId(vibration.id)).isTrue();
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(vibrationThread) if the vibration not cancelled immediately.
@@ -1720,8 +1749,8 @@ public class VibrationThreadTest {
cancellingThread.join();
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SCREEN_OFF);
- assertFalse(mControllers.get(1).isVibrating());
- assertFalse(mControllers.get(2).isVibrating());
+ assertThat(mControllers.get(1).isVibrating()).isFalse();
+ assertThat(mControllers.get(2).isVibrating()).isFalse();
}
@Test
@@ -1737,10 +1766,10 @@ public class VibrationThreadTest {
.combine();
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> mControllers.get(1).isVibrating()
+ assertThat(waitUntil(() -> mControllers.get(1).isVibrating()
&& mControllers.get(2).isVibrating(),
- TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibration.id));
+ TEST_TIMEOUT_MILLIS)).isTrue();
+ assertThat(mThread.isRunningVibrationId(vibration.id)).isTrue();
// Run cancel in a separate thread so if VibrationThread.cancel blocks then this test should
// fail at waitForCompletion(vibrationThread) if the vibration not cancelled immediately.
@@ -1754,8 +1783,8 @@ public class VibrationThreadTest {
cancellingThread.join();
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_SCREEN_OFF);
- assertFalse(mControllers.get(1).isVibrating());
- assertFalse(mControllers.get(2).isVibrating());
+ assertThat(mControllers.get(1).isVibrating()).isFalse();
+ assertThat(mControllers.get(2).isVibrating()).isFalse();
}
@Test
@@ -1763,17 +1792,18 @@ public class VibrationThreadTest {
VibrationEffect effect = VibrationEffect.createWaveform(new long[]{5}, new int[]{100}, 0);
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
- TEST_TIMEOUT_MILLIS));
- assertTrue(mThread.isRunningVibrationId(vibration.id));
+ assertThat(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
+ TEST_TIMEOUT_MILLIS)).isTrue();
+ assertThat(mThread.isRunningVibrationId(vibration.id)).isTrue();
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BINDER_DIED), /* immediate= */ false);
waitForCompletion();
verifyCallbacksTriggered(vibration, Status.CANCELLED_BINDER_DIED);
- assertFalse(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id).isEmpty());
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .isNotEmpty();
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
}
@Test
@@ -1790,13 +1820,16 @@ public class VibrationThreadTest {
verifyCallbacksTriggered(vibration, Status.FINISHED);
// Duration extended for 5 + 5 + 5 + 15.
- assertEquals(Arrays.asList(expectedOneShot(30)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(30)).inOrder();
List amplitudes = mVibratorProviders.get(VIBRATOR_ID).getAmplitudes();
- assertTrue(amplitudes.size() > 3);
- assertEquals(expectedAmplitudes(60, 120, 240), amplitudes.subList(0, 3));
+ assertThat(amplitudes.size()).isGreaterThan(3);
+ assertThat(amplitudes.subList(0, 3))
+ .containsExactlyElementsIn(expectedAmplitudes(60, 120, 240))
+ .inOrder();
for (int i = 3; i < amplitudes.size(); i++) {
- assertTrue(amplitudes.get(i) < amplitudes.get(i - 1));
+ assertWithMessage("For amplitude index %s", i)
+ .that(amplitudes.get(i)).isLessThan(amplitudes.get(i - 1));
}
}
@@ -1814,11 +1847,11 @@ public class VibrationThreadTest {
verify(mManagerHooks, never()).onVibrationThreadReleased(anyLong());
// Thread still running ramp down.
- assertTrue(mThread.isRunningVibrationId(vibration.id));
+ assertThat(mThread.isRunningVibrationId(vibration.id)).isTrue();
// Duration extended for 10 + 10000.
- assertEquals(Arrays.asList(expectedOneShot(10_010)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(10_010)).inOrder();
// Will stop the ramp down right away.
mVibrationConductor.notifyCancelled(
@@ -1838,8 +1871,8 @@ public class VibrationThreadTest {
VibrationEffect effect = VibrationEffect.createOneShot(10_000, 240);
HalVibration vibration = startThreadAndDispatcher(effect);
- assertTrue(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
- TEST_TIMEOUT_MILLIS));
+ assertThat(waitUntil(() -> mControllers.get(VIBRATOR_ID).isVibrating(),
+ TEST_TIMEOUT_MILLIS)).isTrue();
mVibrationConductor.notifyCancelled(
new Vibration.EndInfo(Status.CANCELLED_BY_USER), /* immediate= */ false);
waitForCompletion();
@@ -1847,12 +1880,13 @@ public class VibrationThreadTest {
verifyCallbacksTriggered(vibration, Status.CANCELLED_BY_USER);
// Duration extended for 10000 + 15.
- assertEquals(Arrays.asList(expectedOneShot(10_015)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(10_015)).inOrder();
List amplitudes = mVibratorProviders.get(VIBRATOR_ID).getAmplitudes();
- assertTrue(amplitudes.size() > 1);
+ assertThat(amplitudes.size()).isGreaterThan(1);
for (int i = 1; i < amplitudes.size(); i++) {
- assertTrue(amplitudes.get(i) < amplitudes.get(i - 1));
+ assertWithMessage("For amplitude index %s", i)
+ .that(amplitudes.get(i)).isLessThan(amplitudes.get(i - 1));
}
}
@@ -1860,18 +1894,18 @@ public class VibrationThreadTest {
public void vibrate_predefinedWithRampDown_doesNotAddRampDown() {
when(mVibrationConfigMock.getRampDownDurationMs()).thenReturn(15);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
- mVibratorProviders.get(VIBRATOR_ID).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
+ mVibratorProviders.get(VIBRATOR_ID).setSupportedEffects(EFFECT_CLICK);
- VibrationEffect effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
+ VibrationEffect effect = VibrationEffect.get(EFFECT_CLICK);
HalVibration vibration = startThreadAndDispatcher(effect);
waitForCompletion();
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
- assertTrue(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes().isEmpty());
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedPrebaked(EFFECT_CLICK)).inOrder();
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes()).isEmpty();
}
@Test
@@ -1888,8 +1922,7 @@ public class VibrationThreadTest {
verifyCallbacksTriggered(vibration, Status.FINISHED);
assertThat(mVibratorProviders.get(VIBRATOR_ID).getVendorEffects(vibration.id))
- .containsExactly(effect)
- .inOrder();
+ .containsExactly(effect).inOrder();
assertThat(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes()).isEmpty();
}
@@ -1909,9 +1942,9 @@ public class VibrationThreadTest {
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertEquals(Arrays.asList(expectedPrimitive(PRIMITIVE_CLICK, 1, 0)),
- mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id));
- assertTrue(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes().isEmpty());
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getEffectSegments(vibration.id))
+ .containsExactly(expectedPrimitive(PRIMITIVE_CLICK, 1, 0)).inOrder();
+ assertThat(mVibratorProviders.get(VIBRATOR_ID).getAmplitudes()).isEmpty();
}
@Test
@@ -1936,30 +1969,29 @@ public class VibrationThreadTest {
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration.id), anyLong());
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertEquals(Arrays.asList(expectedRamp(0, 1, 150, 150, 1)),
- fakeVibrator.getEffectSegments(vibration.id));
- assertTrue(fakeVibrator.getAmplitudes().isEmpty());
+ assertThat(fakeVibrator.getEffectSegments(vibration.id))
+ .containsExactly(expectedRamp(0, 1, 150, 150, 1)).inOrder();
+ assertThat(fakeVibrator.getAmplitudes()).isEmpty();
}
@Test
public void vibrate_multipleVibrations_withCancel() throws Exception {
- mVibratorProviders.get(VIBRATOR_ID).setSupportedEffects(
- VibrationEffect.EFFECT_CLICK, VibrationEffect.EFFECT_TICK);
+ mVibratorProviders.get(VIBRATOR_ID).setSupportedEffects(EFFECT_CLICK, EFFECT_TICK);
mVibratorProviders.get(VIBRATOR_ID).setSupportedPrimitives(PRIMITIVE_CLICK);
mVibratorProviders.get(VIBRATOR_ID).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL,
IVibrator.CAP_COMPOSE_EFFECTS);
// A simple effect, followed by a repeating effect that gets cancelled, followed by another
// simple effect.
- VibrationEffect effect1 = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
+ VibrationEffect effect1 = VibrationEffect.get(EFFECT_CLICK);
VibrationEffect effect2 = VibrationEffect.startComposition()
- .repeatEffectIndefinitely(VibrationEffect.get(VibrationEffect.EFFECT_TICK))
+ .repeatEffectIndefinitely(VibrationEffect.get(EFFECT_TICK))
.compose();
VibrationEffect effect3 = VibrationEffect.startComposition()
.addPrimitive(PRIMITIVE_CLICK)
.compose();
VibrationEffect effect4 = VibrationEffect.createOneShot(8000, 100);
- VibrationEffect effect5 = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
+ VibrationEffect effect5 = VibrationEffect.get(EFFECT_CLICK);
HalVibration vibration1 = startThreadAndDispatcher(effect1);
waitForCompletion();
@@ -1987,14 +2019,14 @@ public class VibrationThreadTest {
waitForCompletion();
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(VIBRATOR_ID);
- assertFalse(mControllers.get(VIBRATOR_ID).isVibrating());
+ assertThat(mControllers.get(VIBRATOR_ID).isVibrating()).isFalse();
// Effect1
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration1.id), anyLong());
verifyCallbacksTriggered(vibration1, Status.FINISHED);
- assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- fakeVibrator.getEffectSegments(vibration1.id));
+ assertThat(fakeVibrator.getEffectSegments(vibration1.id))
+ .containsExactly(expectedPrebaked(EFFECT_CLICK)).inOrder();
// Effect2: repeating, cancelled.
verify(mControllerCallbacks, atLeast(2))
@@ -2005,24 +2037,24 @@ public class VibrationThreadTest {
// all elements are the same segment.
List actualSegments2 =
fakeVibrator.getEffectSegments(vibration2.id);
- assertTrue(actualSegments2.size() + " > 2", actualSegments2.size() > 2);
+ assertThat(actualSegments2.size()).isGreaterThan(2);
for (VibrationEffectSegment segment : actualSegments2) {
- assertEquals(expectedPrebaked(VibrationEffect.EFFECT_TICK), segment);
+ assertThat(segment).isEqualTo(expectedPrebaked(EFFECT_TICK));
}
// Effect3
verify(mControllerCallbacks).onComplete(eq(VIBRATOR_ID), eq(vibration3.id), anyLong());
verifyCallbacksTriggered(vibration3, Status.FINISHED);
- assertEquals(Arrays.asList(expectedPrimitive(PRIMITIVE_CLICK, 1, 0)),
- fakeVibrator.getEffectSegments(vibration3.id));
+ assertThat(fakeVibrator.getEffectSegments(vibration3.id))
+ .containsExactly(expectedPrimitive(PRIMITIVE_CLICK, 1, 0)).inOrder();
// Effect4: cancelled quickly.
verifyCallbacksTriggered(vibration4, Status.CANCELLED_BY_SCREEN_OFF);
- assertTrue("Tested duration=" + duration4, duration4 < 2000);
+ assertThat(duration4).isLessThan(2000);
// Effect5: played normally after effect4, which may or may not have played.
- assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- fakeVibrator.getEffectSegments(vibration5.id));
+ assertThat(fakeVibrator.getEffectSegments(vibration5.id))
+ .containsExactly(expectedPrebaked(EFFECT_CLICK)).inOrder();
}
@Test
@@ -2031,16 +2063,13 @@ public class VibrationThreadTest {
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
mVibratorProviders.get(2).setSupportedPrimitives(PRIMITIVE_CLICK);
- mVibratorProviders.get(3).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
+ mVibratorProviders.get(3).setSupportedEffects(EFFECT_CLICK);
CombinedVibration effect = CombinedVibration.startSequential()
- .addNext(3,
- VibrationEffect.get(VibrationEffect.EFFECT_CLICK),
- /* delay= */ TEST_TIMEOUT_MILLIS)
+ .addNext(3, VibrationEffect.get(EFFECT_CLICK), /* delay= */ TEST_TIMEOUT_MILLIS)
.addNext(1,
VibrationEffect.createWaveform(
- new long[] {TEST_TIMEOUT_MILLIS, TEST_TIMEOUT_MILLIS},
- /* repeat= */ -1),
+ new long[] {TEST_TIMEOUT_MILLIS, TEST_TIMEOUT_MILLIS}, -1),
/* delay= */ TEST_TIMEOUT_MILLIS)
.addNext(2,
VibrationEffect.startComposition()
@@ -2055,20 +2084,22 @@ public class VibrationThreadTest {
// Vibrating state remains ON until session resets it.
verifyCallbacksTriggered(vibration, Status.FINISHED);
- assertTrue(mControllers.get(1).isVibrating());
- assertTrue(mControllers.get(2).isVibrating());
- assertTrue(mControllers.get(3).isVibrating());
-
- assertEquals(0, mVibratorProviders.get(1).getOffCount());
- assertEquals(0, mVibratorProviders.get(2).getOffCount());
- assertEquals(0, mVibratorProviders.get(3).getOffCount());
- assertEquals(Arrays.asList(expectedOneShot(TEST_TIMEOUT_MILLIS)),
- mVibratorProviders.get(1).getEffectSegments(vibration.id));
- assertEquals(expectedAmplitudes(255), mVibratorProviders.get(1).getAmplitudes());
- assertEquals(Arrays.asList(expectedPrimitive(PRIMITIVE_CLICK, 1, TEST_TIMEOUT_MILLIS)),
- mVibratorProviders.get(2).getEffectSegments(vibration.id));
- assertEquals(Arrays.asList(expectedPrebaked(VibrationEffect.EFFECT_CLICK)),
- mVibratorProviders.get(3).getEffectSegments(vibration.id));
+ assertThat(mControllers.get(1).isVibrating()).isTrue();
+ assertThat(mControllers.get(2).isVibrating()).isTrue();
+ assertThat(mControllers.get(3).isVibrating()).isTrue();
+
+ assertThat(mVibratorProviders.get(1).getOffCount()).isEqualTo(0);
+ assertThat(mVibratorProviders.get(2).getOffCount()).isEqualTo(0);
+ assertThat(mVibratorProviders.get(3).getOffCount()).isEqualTo(0);
+ assertThat(mVibratorProviders.get(1).getEffectSegments(vibration.id))
+ .containsExactly(expectedOneShot(TEST_TIMEOUT_MILLIS)).inOrder();
+ assertThat(mVibratorProviders.get(1).getAmplitudes())
+ .containsExactlyElementsIn(expectedAmplitudes(255)).inOrder();
+ assertThat(mVibratorProviders.get(2).getEffectSegments(vibration.id))
+ .containsExactly(expectedPrimitive(PRIMITIVE_CLICK, 1, TEST_TIMEOUT_MILLIS))
+ .inOrder();
+ assertThat(mVibratorProviders.get(3).getEffectSegments(vibration.id))
+ .containsExactly(expectedPrebaked(EFFECT_CLICK)).inOrder();
}
private void mockVibrators(int... vibratorIds) {
@@ -2122,7 +2153,7 @@ public class VibrationThreadTest {
mVibrationConductor = new VibrationStepConductor(vib, isInSession, mVibrationSettings,
deviceAdapter, mVibrationScaler, mStatsLoggerMock, requestVibrationParamsFuture,
mManagerHooks);
- assertTrue(mThread.runVibrationOnVibrationThread(mVibrationConductor));
+ assertThat(mThread.runVibrationOnVibrationThread(mVibrationConductor)).isTrue();
return mVibrationConductor.getVibration();
}
@@ -2142,8 +2173,8 @@ public class VibrationThreadTest {
}
private void waitForCompletion(long timeout) {
- assertTrue("Timed out waiting for VibrationThread to become idle",
- mThread.waitForThreadIdle(timeout));
+ assertWithMessage("Timed out waiting for VibrationThread to become idle")
+ .that(mThread.waitForThreadIdle(timeout)).isTrue();
mTestLooper.dispatchAll(); // Flush callbacks
}
--
GitLab
From 6e8caa6647887fb60e5be13844721284beed4c80 Mon Sep 17 00:00:00 2001
From: Shan Huang
Date: Thu, 20 Feb 2025 23:29:37 -0800
Subject: [PATCH 102/111] Disable ScrimControllerTest for
notification_shade_blur
Bug: 370555223
Flag: com.android.systemui.notification_shade_blur
Test: atest ScrimControllerTest
Change-Id: I70a8188446315a1868575cd37df824b95656e13b
---
.../systemui/statusbar/NotificationShadeDepthControllerTest.kt | 2 ++
.../android/systemui/statusbar/phone/ScrimControllerTest.java | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt
index 83361dad9ff03..c68439adaab04 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar
import android.os.IBinder
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
+import android.platform.test.annotations.RequiresFlagsDisabled
import android.testing.TestableLooper.RunWithLooper
import android.view.Choreographer
import android.view.View
@@ -353,6 +354,7 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
}
@Test
+ @RequiresFlagsDisabled(Flags.FLAG_NOTIFICATION_SHADE_BLUR)
fun updateBlurCallback_setsOpaque_whenScrim() {
scrimVisibilityCaptor.value.accept(ScrimController.OPAQUE)
notificationShadeDepthController.updateBlurCallback.doFrame(0)
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 10886760b5214..ffb861db182cb 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
@@ -113,7 +113,7 @@ import java.util.Map;
@SmallTest
// TODO(b/381263619) there are more changes and tweaks required to match the new bouncer/shade specs
// Disabling for now but it will be fixed before the flag is fully ramped up.
-@DisableFlags(Flags.FLAG_BOUNCER_UI_REVAMP)
+@DisableFlags({Flags.FLAG_BOUNCER_UI_REVAMP, Flags.FLAG_NOTIFICATION_SHADE_BLUR})
public class ScrimControllerTest extends SysuiTestCase {
@Rule public Expect mExpect = Expect.create();
--
GitLab
From 7221c360bfb13898d994115c891ee0e7513ceec3 Mon Sep 17 00:00:00 2001
From: yyalan
Date: Wed, 19 Feb 2025 15:29:51 +0000
Subject: [PATCH 103/111] [OOBE] Autoproceed
Only applies to the 1st to n-1th tutorials in OOBE flow
When a gesture is being recognized, automatically go to the next screen
after three seconds if the Done button has not been clicked
Bug: 369818644
Flag: com.android.systemui.shared.new_touchpad_gestures_tutorial
Test: KeyboardTouchpadTutorialViewModelTest
Change-Id: I2a227eac4c8732a86f2aab16b8e5ab2a24538726
---
.../KeyboardTouchpadTutorialViewModelTest.kt | 22 +++++++++++++++++++
.../TouchpadTutorialScreensProvider.kt | 12 ++++++++--
.../ui/composable/ActionTutorialContent.kt | 6 ++++-
.../ui/composable/TutorialScreenConfig.kt | 1 -
.../view/KeyboardTouchpadTutorialActivity.kt | 4 ++--
.../KeyboardTouchpadTutorialViewModel.kt | 16 ++++++++++++++
.../tutorial/TouchpadTutorialModule.kt | 8 +++----
.../composable/BackGestureTutorialScreen.kt | 4 ++--
.../ui/composable/GestureTutorialScreen.kt | 3 ++-
.../composable/HomeGestureTutorialScreen.kt | 4 ++--
10 files changed, 65 insertions(+), 15 deletions(-)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/ui/viewmodel/KeyboardTouchpadTutorialViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/ui/viewmodel/KeyboardTouchpadTutorialViewModelTest.kt
index 57bcc1407e24e..63be132dacaa5 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/ui/viewmodel/KeyboardTouchpadTutorialViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/inputdevice/tutorial/ui/viewmodel/KeyboardTouchpadTutorialViewModelTest.kt
@@ -247,6 +247,23 @@ class KeyboardTouchpadTutorialViewModelTest : SysuiTestCase() {
assertGesturesNotDisabled()
}
+ @Test
+ fun screensOrderUntilFinish_whenAutoProceed() =
+ testScope.runTest {
+ val screens by collectValues(viewModel.screen)
+ val closeActivity by collectLastValue(viewModel.closeActivity)
+
+ peripheralsState(keyboardConnected = true, touchpadConnected = true)
+
+ autoProceed()
+ autoProceed()
+ // No autoproceeding at the last screen
+ goToNextScreen()
+
+ assertThat(screens).containsExactly(BACK_GESTURE, HOME_GESTURE, ACTION_KEY).inOrder()
+ assertThat(closeActivity).isTrue()
+ }
+
@Test
fun activityFinishes_ifTouchpadModuleIsNotPresent() =
testScope.runTest {
@@ -299,6 +316,11 @@ class KeyboardTouchpadTutorialViewModelTest : SysuiTestCase() {
runCurrent()
}
+ private suspend fun TestScope.autoProceed() {
+ viewModel.onAutoProceed()
+ runCurrent()
+ }
+
private fun TestScope.goBack() {
viewModel.onBack()
runCurrent()
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/TouchpadTutorialScreensProvider.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/TouchpadTutorialScreensProvider.kt
index 7d2492a41e820..bea79fdb6aeec 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/TouchpadTutorialScreensProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/TouchpadTutorialScreensProvider.kt
@@ -21,8 +21,16 @@ import androidx.compose.runtime.Composable
interface TouchpadTutorialScreensProvider {
@Composable
- fun BackGesture(onDoneButtonClicked: () -> Unit, onBack: () -> Unit, isAutoProceed: Boolean)
+ fun BackGesture(
+ onDoneButtonClicked: () -> Unit,
+ onBack: () -> Unit,
+ onAutoProceed: (suspend () -> Unit)?,
+ )
@Composable
- fun HomeGesture(onDoneButtonClicked: () -> Unit, onBack: () -> Unit, isAutoProceed: Boolean)
+ fun HomeGesture(
+ onDoneButtonClicked: () -> Unit,
+ onBack: () -> Unit,
+ onAutoProceed: (suspend () -> Unit)?,
+ )
}
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionTutorialContent.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionTutorialContent.kt
index ee875c484ca6b..8e4e4c09e9f21 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionTutorialContent.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionTutorialContent.kt
@@ -108,6 +108,7 @@ fun ActionTutorialContent(
actionState: TutorialActionState,
onDoneButtonClicked: () -> Unit,
config: TutorialScreenConfig,
+ onAutoProceed: (suspend () -> Unit)? = null,
) {
Column(
verticalArrangement = Arrangement.Center,
@@ -137,9 +138,12 @@ fun ActionTutorialContent(
onDoneButtonClicked = onDoneButtonClicked,
modifier = Modifier.padding(horizontal = 60.dp).graphicsLayer { alpha = buttonAlpha },
enabled = actionState is Finished,
- isNext = config.hasNextButton,
+ isNext = onAutoProceed != null,
)
}
+ if (actionState is Finished) {
+ LaunchedEffect(Unit) { onAutoProceed?.invoke() }
+ }
}
@Composable
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/TutorialScreenConfig.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/TutorialScreenConfig.kt
index 65adc148b6aea..eda23a51a1ae5 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/TutorialScreenConfig.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/TutorialScreenConfig.kt
@@ -28,7 +28,6 @@ data class TutorialScreenConfig(
val colors: Colors,
val strings: Strings,
val animations: Animations,
- val hasNextButton: Boolean = false,
) {
data class Colors(
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/view/KeyboardTouchpadTutorialActivity.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/view/KeyboardTouchpadTutorialActivity.kt
index 086705fbd7ba4..8cc1865a6b7ee 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/view/KeyboardTouchpadTutorialActivity.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/view/KeyboardTouchpadTutorialActivity.kt
@@ -147,7 +147,7 @@ fun KeyboardTouchpadTutorialContainer(
.BackGesture(
onDoneButtonClicked = vm::onDoneButtonClicked,
onBack = vm::onBack,
- isAutoProceed = isAutoProceed,
+ onAutoProceed = if (isAutoProceed) vm::onAutoProceed else null,
)
HOME_GESTURE ->
touchpadScreens
@@ -155,7 +155,7 @@ fun KeyboardTouchpadTutorialContainer(
.HomeGesture(
onDoneButtonClicked = vm::onDoneButtonClicked,
onBack = vm::onBack,
- isAutoProceed = isScopeAll,
+ onAutoProceed = if (isScopeAll) vm::onAutoProceed else null,
)
ACTION_KEY ->
ActionKeyTutorialScreen(
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/viewmodel/KeyboardTouchpadTutorialViewModel.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/viewmodel/KeyboardTouchpadTutorialViewModel.kt
index eeb4b697a5fc0..90e3af4db6fab 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/viewmodel/KeyboardTouchpadTutorialViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/viewmodel/KeyboardTouchpadTutorialViewModel.kt
@@ -42,6 +42,8 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import java.util.Optional
+import kotlin.time.Duration.Companion.seconds
+import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
@@ -49,6 +51,7 @@ import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterNot
import kotlinx.coroutines.flow.runningFold
+@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
class KeyboardTouchpadTutorialViewModel(
private val gesturesInteractor: Optional,
private val keyboardTouchpadConnectionInteractor: KeyboardTouchpadConnectionInteractor,
@@ -149,7 +152,16 @@ class KeyboardTouchpadTutorialViewModel(
clearDeviceStateForScreen(_screen.value)
}
+ suspend fun onAutoProceed() {
+ delay(AUTO_PROCEED_DELAY)
+ progressToNextScreen()
+ }
+
fun onDoneButtonClicked() {
+ progressToNextScreen()
+ }
+
+ private fun progressToNextScreen() {
var nextScreen = screenSequence.nextScreen(_screen.value)
while (nextScreen != null) {
if (requiredHardwarePresent(nextScreen)) {
@@ -250,6 +262,10 @@ class KeyboardTouchpadTutorialViewModel(
private object SingleScreenOnly : ScreenSequence {
override fun nextScreen(current: Screen): Screen? = null
}
+
+ companion object {
+ private val AUTO_PROCEED_DELAY = 3.seconds
+ }
}
enum class RequiredHardware {
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/TouchpadTutorialModule.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/TouchpadTutorialModule.kt
index d8a9527b22ab6..d2f1d3cb7b47e 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/TouchpadTutorialModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/TouchpadTutorialModule.kt
@@ -133,14 +133,14 @@ private class ScreensProvider(
override fun BackGesture(
onDoneButtonClicked: () -> Unit,
onBack: () -> Unit,
- isAutoProceed: Boolean,
+ onAutoProceed: (suspend () -> Unit)?,
) {
BackGestureTutorialScreen(
backGestureScreenViewModel,
easterEggGestureViewModel,
onDoneButtonClicked,
onBack,
- isAutoProceed,
+ onAutoProceed,
)
}
@@ -148,14 +148,14 @@ private class ScreensProvider(
override fun HomeGesture(
onDoneButtonClicked: () -> Unit,
onBack: () -> Unit,
- isAutoProceed: Boolean,
+ onAutoProceed: (suspend () -> Unit)?,
) {
HomeGestureTutorialScreen(
homeGestureScreenViewModel,
easterEggGestureViewModel,
onDoneButtonClicked,
onBack,
- isAutoProceed,
+ onAutoProceed,
)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt
index c28483c55952f..2e2a97d9702fc 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt
@@ -33,7 +33,7 @@ fun BackGestureTutorialScreen(
easterEggGestureViewModel: EasterEggGestureViewModel,
onDoneButtonClicked: () -> Unit,
onBack: () -> Unit,
- isAutoProceed: Boolean = false,
+ onAutoProceed: (suspend () -> Unit)? = null,
) {
val screenConfig =
TutorialScreenConfig(
@@ -48,7 +48,6 @@ fun BackGestureTutorialScreen(
bodyErrorResId = R.string.touchpad_back_gesture_error_body,
),
animations = TutorialScreenConfig.Animations(educationResId = R.raw.trackpad_back_edu),
- hasNextButton = isAutoProceed,
)
GestureTutorialScreen(
screenConfig = screenConfig,
@@ -61,6 +60,7 @@ fun BackGestureTutorialScreen(
onEasterEggFinished = easterEggGestureViewModel::onEasterEggFinished,
onDoneButtonClicked = onDoneButtonClicked,
onBack = onBack,
+ onAutoProceed = onAutoProceed,
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt
index 47c82e309d9b1..db3e31ba2e61e 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt
@@ -49,6 +49,7 @@ fun GestureTutorialScreen(
onEasterEggFinished: () -> Unit,
onDoneButtonClicked: () -> Unit,
onBack: () -> Unit,
+ onAutoProceed: (suspend () -> Unit)? = null,
) {
BackHandler(onBack = onBack)
var cachedTutorialState: TutorialActionState by
@@ -64,7 +65,7 @@ fun GestureTutorialScreen(
easterEggTriggered,
onEasterEggFinished,
) {
- ActionTutorialContent(tutorialState, onDoneButtonClicked, screenConfig)
+ ActionTutorialContent(tutorialState, onDoneButtonClicked, screenConfig, onAutoProceed)
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt
index b238a8db31f89..3e27dfb076244 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt
@@ -32,7 +32,7 @@ fun HomeGestureTutorialScreen(
easterEggGestureViewModel: EasterEggGestureViewModel,
onDoneButtonClicked: () -> Unit,
onBack: () -> Unit,
- isAutoProceed: Boolean = false,
+ onAutoProceed: (suspend () -> Unit)? = null,
) {
val screenConfig =
TutorialScreenConfig(
@@ -47,7 +47,6 @@ fun HomeGestureTutorialScreen(
bodyErrorResId = R.string.touchpad_home_gesture_error_body,
),
animations = TutorialScreenConfig.Animations(educationResId = R.raw.trackpad_home_edu),
- hasNextButton = isAutoProceed,
)
GestureTutorialScreen(
screenConfig = screenConfig,
@@ -60,6 +59,7 @@ fun HomeGestureTutorialScreen(
onEasterEggFinished = easterEggGestureViewModel::onEasterEggFinished,
onDoneButtonClicked = onDoneButtonClicked,
onBack = onBack,
+ onAutoProceed = onAutoProceed,
)
}
--
GitLab
From 417905aece6d7935b7edfa638bbaddf6ea445a0c Mon Sep 17 00:00:00 2001
From: Jordan Demeulenaere
Date: Fri, 21 Feb 2025 08:24:34 -0800
Subject: [PATCH 104/111] Revert "Make Compose QS STL match the CUJ start/end
signals"
This reverts commit 8aca17bcc0d6ee3303a409751077d930c2b712e5.
Reason for revert: b/398046692
Change-Id: I6fd3f68d6d2d239e45e8f750ef89dd01a0201e15
---
.../com/android/systemui/plugins/qs/QS.java | 2 -
.../qs/composefragment/QSFragmentCompose.kt | 53 ++++++-------------
.../viewmodel/QSFragmentComposeViewModel.kt | 4 +-
.../shade/QuickSettingsControllerImpl.java | 15 ++----
4 files changed, 21 insertions(+), 53 deletions(-)
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
index a0bf7f00b11cd..d3218ad8c9fb5 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
@@ -203,8 +203,6 @@ public interface QS extends FragmentBase {
*/
void setIsNotificationPanelFullWidth(boolean isFullWidth);
- default void setQSExpandingOrCollapsing(boolean isQSExpandingOrCollapsing) {}
-
/**
* Callback for when QSPanel container is scrolled
*/
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
index 56c7be0b13211..28540d4f12599 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt
@@ -305,7 +305,6 @@ constructor(
sceneState,
viewModel.containerViewModel.editModeViewModel.isEditing,
snapshotFlow { viewModel.expansionState }.map { it.progress },
- snapshotFlow { viewModel.isQSExpandingOrCollapsing },
)
}
@@ -537,10 +536,6 @@ constructor(
return qqsVisible.value
}
- override fun setQSExpandingOrCollapsing(isQSExpandingOrCollapsing: Boolean) {
- viewModel.isQSExpandingOrCollapsing = isQSExpandingOrCollapsing
- }
-
private fun setListenerCollections() {
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
@@ -881,7 +876,6 @@ private suspend fun synchronizeQsState(
state: MutableSceneTransitionLayoutState,
editMode: Flow,
expansion: Flow,
- isQSExpandingOrCollapsing: Flow,
) {
coroutineScope {
val animationScope = this
@@ -893,46 +887,31 @@ private suspend fun synchronizeQsState(
currentTransition = null
}
- var lastValidProgress = 0f
- combine(editMode, expansion, isQSExpandingOrCollapsing, ::Triple).collectLatest {
- (editMode, progress, isQSExpandingOrCollapsing) ->
+ editMode.combine(expansion, ::Pair).collectLatest { (editMode, progress) ->
if (editMode && state.currentScene != SceneKeys.EditMode) {
state.setTargetScene(SceneKeys.EditMode, animationScope)?.second?.join()
} else if (!editMode && state.currentScene == SceneKeys.EditMode) {
state.setTargetScene(SceneKeys.QuickSettings, animationScope)?.second?.join()
}
-
if (!editMode) {
- if (!isQSExpandingOrCollapsing) {
- if (progress == 0f) {
- snapTo(QuickQuickSettings)
- return@collectLatest
- }
+ when (progress) {
+ 0f -> snapTo(QuickQuickSettings)
+ 1f -> snapTo(QuickSettings)
+ else -> {
+ val transition = currentTransition
+ if (transition != null) {
+ transition.progress = progress
+ return@collectLatest
+ }
- if (progress == 1f) {
- snapTo(QuickSettings)
- return@collectLatest
+ val newTransition =
+ ExpansionTransition(progress).also { currentTransition = it }
+ state.startTransitionImmediately(
+ animationScope = animationScope,
+ transition = newTransition,
+ )
}
}
-
- var progress = progress
- if (progress >= 0f || progress <= 1f) {
- lastValidProgress = progress
- } else {
- progress = lastValidProgress
- }
-
- val transition = currentTransition
- if (transition != null) {
- transition.progress = progress
- return@collectLatest
- }
-
- val newTransition = ExpansionTransition(progress).also { currentTransition = it }
- state.startTransitionImmediately(
- animationScope = animationScope,
- transition = newTransition,
- )
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
index d8056c07f7013..c09d319f82f54 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt
@@ -35,6 +35,7 @@ import com.android.systemui.animation.ShadeInterpolation
import com.android.systemui.classifier.Classifier
import com.android.systemui.classifier.domain.interactor.FalsingInteractor
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
+import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.Edge
@@ -307,8 +308,6 @@ constructor(
val animateTilesExpansion: Boolean
get() = inFirstPage && !mediaSuddenlyAppearingInLandscape
- var isQSExpandingOrCollapsing by mutableStateOf(false)
-
private val inFirstPage: Boolean
get() = inFirstPageViewModel.inFirstPage
@@ -542,7 +541,6 @@ constructor(
println("proposedTranslation", proposedTranslation)
println("expansionState", expansionState)
println("forceQS", forceQs)
- println("isShadeExpandingOrCollapsing", isQSExpandingOrCollapsing)
printSection("Derived values") {
println("headerTranslation", headerTranslation)
println("translationScaleY", translationScaleY)
diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
index 34b3324f81da2..d05837261b892 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java
@@ -105,14 +105,15 @@ import com.android.systemui.util.kotlin.JavaAdapter;
import dalvik.annotation.optimization.NeverCompile;
+import dagger.Lazy;
+
+import kotlin.Unit;
+
import java.io.PrintWriter;
import javax.inject.Inject;
import javax.inject.Provider;
-import dagger.Lazy;
-import kotlin.Unit;
-
/** Handles QuickSettings touch handling, expansion and animation state. */
@SysUISingleton
public class QuickSettingsControllerImpl implements QuickSettingsController, Dumpable {
@@ -2365,16 +2366,8 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum
return;
}
if (startTracing) {
- if (mQs != null) {
- mQs.setQSExpandingOrCollapsing(true);
- }
-
monitor.begin(mPanelView, Cuj.CUJ_NOTIFICATION_SHADE_QS_EXPAND_COLLAPSE);
} else {
- if (mQs != null) {
- mQs.setQSExpandingOrCollapsing(false);
- }
-
if (wasCancelled) {
monitor.cancel(Cuj.CUJ_NOTIFICATION_SHADE_QS_EXPAND_COLLAPSE);
} else {
--
GitLab
From 7ae5bb201e3d45c15bbda4e9e414513720f08c77 Mon Sep 17 00:00:00 2001
From: Ady Abraham
Date: Fri, 21 Feb 2025 09:27:39 -0800
Subject: [PATCH 105/111] Add adyabr to ADPF_OWNERS
Bug: N/A
Change-Id: I2381fdc22aeaae97d4b5515203e5474cc7077b48
Test: N/A
Flag: EXEMPT owners
---
ADPF_OWNERS | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/ADPF_OWNERS b/ADPF_OWNERS
index bcdc33825a13f..c7ff4640b1856 100644
--- a/ADPF_OWNERS
+++ b/ADPF_OWNERS
@@ -1,4 +1,5 @@
-sumir@google.com
+adyabr@google.com
chingtangyu@google.com
-xwxw@google.com
mattbuckley@google.com
+sumir@google.com
+xwxw@google.com
\ No newline at end of file
--
GitLab
From 8e5f9a2218e5a2dfd559a786f3824f2b1209feb2 Mon Sep 17 00:00:00 2001
From: Anton Potapov
Date: Fri, 21 Feb 2025 17:30:08 +0000
Subject: [PATCH 106/111] Fix slider width on tv platform
Flag: com.android.systemui.volume_redesign
Bug: 387284759
Test: atest VolumeDialogScreenshotTest
Change-Id: I23d7477ba7f3ace7898f3400de15f364f8dc9305
---
packages/SystemUI/res/values-land-television/dimens.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/SystemUI/res/values-land-television/dimens.xml b/packages/SystemUI/res/values-land-television/dimens.xml
index d3bafbca4bb72..b1a46a6805ffe 100644
--- a/packages/SystemUI/res/values-land-television/dimens.xml
+++ b/packages/SystemUI/res/values-land-television/dimens.xml
@@ -20,7 +20,7 @@
48dp24dp24dp
- 4dp
+ 4dp@dimen/volume_dialog_slider_width31dp136dp
--
GitLab
From 2b309c889f5b4130e81193e439ccab37feb716de Mon Sep 17 00:00:00 2001
From: Ioana Alexandru
Date: Fri, 21 Feb 2025 10:19:25 -0800
Subject: [PATCH 107/111] [Notif redesign] Include imageMessageContainer in
animation
A redesign change accidentally excluded the imageMessageContainer from the list of drawables used in the conversation animation. While it's true that it's now nullable where previously it was not (since it doesn't exist in the collapsed layout), we should still include it when not null.
Change-Id: Ia0e780f8de71e7dea6921bc3a9dcfa99e8fa9cb6
Fix: 397900637
Flag: android.app.notifications_redesign_templates
Test: NotificationConversationTemplateViewWrapperTest
---
...NotificationConversationTemplateViewWrapperTest.kt | 11 ++++++-----
.../NotificationConversationTemplateViewWrapper.kt | 3 ++-
2 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapperTest.kt
index 081f52c4ff3b0..bf6ee92534181 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapperTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapperTest.kt
@@ -75,9 +75,10 @@ class NotificationConversationTemplateViewWrapperTest : SysuiTestCase() {
// Creates a mocked out NotificationEntry of ConversationLayout type,
// with a mock imageMessage.drawable embedded in its MessagingImageMessages
// (both top level, and in a group).
- val mockDrawable = mock()
- val mockDrawable2 = mock()
- val mockLayoutView: View = fakeConversationLayout(mockDrawable, mockDrawable2)
+ val mockDrawableGroupMessage = mock()
+ val mockDrawableImageMessage = mock()
+ val mockLayoutView: View =
+ fakeConversationLayout(mockDrawableGroupMessage, mockDrawableImageMessage)
val wrapper: NotificationViewWrapper =
NotificationConversationTemplateViewWrapper(mContext, mockLayoutView, mRow)
@@ -85,8 +86,8 @@ class NotificationConversationTemplateViewWrapperTest : SysuiTestCase() {
wrapper.setAnimationsRunning(false)
// Verifies that each AnimatedImageDrawable is started animating.
- verify(mockDrawable).stop()
- verify(mockDrawable2).stop()
+ verify(mockDrawableGroupMessage).stop()
+ verify(mockDrawableImageMessage).stop()
}
private fun fakeConversationLayout(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt
index 6a96fba8f28d4..3d5f9e4cafdd6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt
@@ -174,7 +174,8 @@ class NotificationConversationTemplateViewWrapper(
// and the top level image message container.
val containers =
messageContainers.asSequence().map { it.messageContainer } +
- if (notificationsRedesignTemplates()) emptySequence()
+ if (notificationsRedesignTemplates() && imageMessageContainer == null)
+ emptySequence()
else sequenceOf(imageMessageContainer!!)
val drawables =
containers
--
GitLab
From a46e0d4111ff3057370e06628fa3c48e8b5ea035 Mon Sep 17 00:00:00 2001
From: Tetiana Meronyk
Date: Mon, 17 Feb 2025 18:40:03 +0000
Subject: [PATCH 108/111] Add I/O tests for UserWakeupStore
Tests verify that after adding entries to the UserWakeupStore they are correctly persisted in the file.
Bug: 330264023
Test: atest UserWakeupStoreTest
Flag: EXEMPT adding tests to existing feature
Change-Id: I7d6d5e8e86a90895c872322adcd9eb327e90bd0e
---
.../res/xml/expectedUserWakeupList_1.xml | 20 +++++++
.../res/xml/expectedUserWakeupList_2.xml | 19 +++++++
.../server/alarm/UserWakeupStoreTest.java | 56 ++++++++++++++++++-
3 files changed, 93 insertions(+), 2 deletions(-)
create mode 100644 services/tests/mockingservicestests/res/xml/expectedUserWakeupList_1.xml
create mode 100644 services/tests/mockingservicestests/res/xml/expectedUserWakeupList_2.xml
diff --git a/services/tests/mockingservicestests/res/xml/expectedUserWakeupList_1.xml b/services/tests/mockingservicestests/res/xml/expectedUserWakeupList_1.xml
new file mode 100644
index 0000000000000..21e6dab518fc1
--- /dev/null
+++ b/services/tests/mockingservicestests/res/xml/expectedUserWakeupList_1.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/services/tests/mockingservicestests/res/xml/expectedUserWakeupList_2.xml b/services/tests/mockingservicestests/res/xml/expectedUserWakeupList_2.xml
new file mode 100644
index 0000000000000..d0b371f060daa
--- /dev/null
+++ b/services/tests/mockingservicestests/res/xml/expectedUserWakeupList_2.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/UserWakeupStoreTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/UserWakeupStoreTest.java
index 72883e269a650..240284a42406a 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/UserWakeupStoreTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/UserWakeupStoreTest.java
@@ -23,15 +23,21 @@ import static com.android.server.alarm.UserWakeupStore.USER_START_TIME_DEVIATION
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import android.content.res.AssetManager;
+import android.content.res.XmlResourceParser;
import android.os.Environment;
import android.os.FileUtils;
import android.os.SystemClock;
+import android.util.Xml;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.os.BackgroundThread;
+import com.android.internal.util.XmlUtils;
+import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.testing.ExtendedMockitoRule;
import org.junit.After;
@@ -40,8 +46,11 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
+import org.xmlpull.v1.XmlPullParserException;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.ExecutorService;
@@ -55,6 +64,7 @@ public class UserWakeupStoreTest {
private static final File TEST_SYSTEM_DIR = new File(InstrumentationRegistry
.getInstrumentation().getContext().getDataDir(), "alarmsTestDir");
private static final File ROOT_DIR = new File(TEST_SYSTEM_DIR, UserWakeupStore.ROOT_DIR_NAME);
+ private static final String USERS_FILE_NAME = "usersWithAlarmClocks.xml";
private ExecutorService mMockExecutorService = null;
UserWakeupStore mUserWakeupStore;
@@ -105,7 +115,7 @@ public class UserWakeupStoreTest {
Collections.sort(userWakeups);
assertEquals(userIds, userWakeups);
- final File file = new File(ROOT_DIR , "usersWithAlarmClocks.xml");
+ final File file = new File(ROOT_DIR, USERS_FILE_NAME);
assertTrue(file.exists());
}
@@ -178,5 +188,47 @@ public class UserWakeupStoreTest {
assertTrue(mUserWakeupStore.getWakeupTimeForUser(USER_ID_2) - realtime
< 3 * BUFFER_TIME_MS + USER_START_TIME_DEVIATION_LIMIT_MS);
}
- //TODO: b/330264023 - Add tests for I/O in usersWithAlarmClocks.xml.
+
+ @Test
+ public void testWriteWakeups_xmlIsOrdered() {
+ mUserWakeupStore.addUserWakeup(USER_ID_1, TEST_TIMESTAMP - 19_000);
+ mUserWakeupStore.addUserWakeup(USER_ID_2, TEST_TIMESTAMP - 7_000);
+ assertFileContentsMatchExpectedXml("res/xml/expectedUserWakeupList_1.xml");
+ }
+
+ @Test
+ public void testWriteWakeups_containsOneEntryPerUser() {
+ mUserWakeupStore.addUserWakeup(USER_ID_1, TEST_TIMESTAMP - 19_000);
+ mUserWakeupStore.addUserWakeup(USER_ID_1, TEST_TIMESTAMP - 7_000);
+ assertFileContentsMatchExpectedXml("res/xml/expectedUserWakeupList_2.xml");
+ }
+
+ private static void assertFileContentsMatchExpectedXml(String expectedContentsFile) {
+ final File actual = new File(ROOT_DIR, USERS_FILE_NAME);
+ AssetManager assetManager =
+ InstrumentationRegistry.getInstrumentation().getContext().getAssets();
+ try (FileInputStream actualFis = new FileInputStream(actual)) {
+ final TypedXmlPullParser actualParser = Xml.resolvePullParser(actualFis);
+ final XmlResourceParser expectedParser = assetManager.openXmlResourceParser(
+ expectedContentsFile);
+ for (XmlUtils.nextElement(expectedParser), XmlUtils.nextElement(actualParser);
+ actualParser.getEventType() != XmlResourceParser.END_DOCUMENT
+ && expectedParser.getEventType() != XmlResourceParser.END_DOCUMENT;
+ XmlUtils.nextElement(actualParser), XmlUtils.nextElement(expectedParser)) {
+ assertEquals("Event types differ ", expectedParser.getEventType(),
+ actualParser.getEventType());
+ for (int i = 0; i < expectedParser.getAttributeCount(); i++) {
+ assertEquals("Attribute names differ at index " + i,
+ expectedParser.getAttributeName(i), actualParser.getAttributeName(i));
+ assertEquals("Attribute values differ at index " + i,
+ expectedParser.getAttributeValue(i), actualParser.getAttributeValue(i));
+ }
+ }
+ // Ensure they are both at the end of document
+ assertEquals("One of the parsers has not reached the EOF",
+ expectedParser.getEventType(), actualParser.getEventType());
+ } catch (IOException | XmlPullParserException e) {
+ fail(e.getLocalizedMessage());
+ }
+ }
}
--
GitLab
From 3034d408668b5f51eb822af209edcc8fe59be56f Mon Sep 17 00:00:00 2001
From: Pinyao Ting
Date: Fri, 21 Feb 2025 10:45:31 -0800
Subject: [PATCH 109/111] Disable failing tests in ShortcutService
Bug: 398127821
Bug: 398143156
Change-Id: I501c8b4c46212570b9bb0c2647b1a729c0b24fee
Test: manual
Flag: TEST_ONLY
---
.../android/server/pm/ShortcutManagerTest1.java | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
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 ad1537e270e82..d6de31406b5a7 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -159,7 +159,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
/**
* Test for the first launch path, no settings file available.
*/
- public void testFirstInitialize() {
+ public void disabled_testFirstInitialize() {
assertResetTimes(START_TIME, START_TIME + INTERVAL);
}
@@ -266,7 +266,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
}
/** Test for {@link android.content.pm.ShortcutManager#getRemainingCallCount()} */
- public void testGetRemainingCallCount() {
+ public void disabled_testGetRemainingCallCount() {
assertEquals(MAX_UPDATES_PER_INTERVAL, mManager.getRemainingCallCount());
}
@@ -1782,7 +1782,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
// === Test for launcher side APIs ===
- public void testGetShortcuts() {
+ public void disabled_testGetShortcuts() {
// Set up shortcuts.
@@ -2158,7 +2158,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
});
}
- public void testGetShortcuts_personsFlag() {
+ public void disabled_testGetShortcuts_personsFlag() {
ShortcutInfo s = new ShortcutInfo.Builder(mClientContext, "id")
.setShortLabel("label")
.setActivity(new ComponentName(mClientContext, ShortcutActivity2.class))
@@ -2206,7 +2206,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
}
// TODO resource
- public void testGetShortcutInfo() {
+ public void disabled_testGetShortcutInfo() {
// Create shortcuts.
setCaller(CALLING_PACKAGE_1);
final ShortcutInfo s1_1 = makeShortcut(
@@ -6913,12 +6913,12 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest {
mManager.hasShareTargets(CALLING_PACKAGE_1);
}
- public void testDumpsys_crossProfile() {
+ public void disabled_testDumpsys_crossProfile() {
prepareCrossProfileDataSet();
dumpsysOnLogcat("test1", /* force= */ true);
}
- public void testDumpsys_withIcons() throws IOException {
+ public void disabled_testDumpsys_withIcons() throws IOException {
testIcons();
// Dump after having some icons.
dumpsysOnLogcat("test1", /* force= */ true);
--
GitLab
From 7535a18c67584b9e8ab1af01add35488eb822d96 Mon Sep 17 00:00:00 2001
From: Evan Severson
Date: Thu, 6 Feb 2025 15:20:52 -0800
Subject: [PATCH 110/111] Add package to appops state earlier
Use the same entry point that the permission manager service uses when
a package is being installed. This is needed since the package added
broadcast and the non broadcast based PackageMonitor mechanism are both
invoked later than the permission manager service entry point. It had
been observed installed apps were already executing code before the
former two callbacks invoked leading to appop checks from other services
that the app had interacted with or test apps attempting to mutate appop
state.
Test: CtsAppOpsTestCases
Bug: 388994751
Flag: EXEMPT bugfix
Change-Id: I65b9f446c136d37633a8d1540cbced972678e61d
---
.../android/app/AppOpsManagerInternal.java | 5 +
.../android/server/appop/AppOpsService.java | 92 +++++++++++--------
.../server/pm/InstallPackageHelper.java | 2 +
.../server/pm/PackageManagerService.java | 2 +
.../pm/PackageManagerServiceInjector.java | 8 ++
.../src/com/android/server/pm/MockSystem.kt | 5 +
6 files changed, 78 insertions(+), 36 deletions(-)
diff --git a/core/java/android/app/AppOpsManagerInternal.java b/core/java/android/app/AppOpsManagerInternal.java
index 8b7ea0f8b46a2..a0f193089f4bf 100644
--- a/core/java/android/app/AppOpsManagerInternal.java
+++ b/core/java/android/app/AppOpsManagerInternal.java
@@ -233,4 +233,9 @@ public abstract class AppOpsManagerInternal {
*/
public abstract int getOpRestrictionCount(int code, UserHandle user, String pkg,
String attributionTag);
+
+ /**
+ * Invoke when a package is added.
+ */
+ public abstract void onPackageAdded(String pkgName, int uid);
}
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 2a9762caaf79e..c8b8909f203f9 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -66,7 +66,6 @@ import static android.app.AppOpsManager.opRestrictsRead;
import static android.app.AppOpsManager.opToName;
import static android.app.AppOpsManager.opToPublicName;
import static android.companion.virtual.VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT;
-import static android.content.Intent.ACTION_PACKAGE_ADDED;
import static android.content.Intent.ACTION_PACKAGE_REMOVED;
import static android.content.Intent.EXTRA_REPLACING;
import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS;
@@ -363,8 +362,6 @@ public class AppOpsService extends IAppOpsService.Stub {
@GuardedBy("this")
@VisibleForTesting
final SparseArray mUidStates = new SparseArray<>();
- @GuardedBy("this")
- private boolean mUidStatesInitialized;
// A rate limiter to prevent excessive Atom pushing. Used by noteOperation.
private static final Duration RATE_LIMITER_WINDOW = Duration.ofMillis(10);
@@ -415,6 +412,9 @@ public class AppOpsService extends IAppOpsService.Stub {
@GuardedBy("this")
private ArraySet mRarelyUsedPackages = new ArraySet<>();
+ @GuardedBy("this")
+ private boolean mRarelyUsedPackagesInitialized;
+
/** Sampling strategy used for current session */
@GuardedBy("this")
@AppOpsManager.SamplingStrategy
@@ -1076,41 +1076,53 @@ public class AppOpsService extends IAppOpsService.Stub {
String pkgName = intent.getData().getEncodedSchemeSpecificPart().intern();
int uid = intent.getIntExtra(Intent.EXTRA_UID, Process.INVALID_UID);
- if (action.equals(ACTION_PACKAGE_ADDED)
- && !intent.getBooleanExtra(EXTRA_REPLACING, false)) {
- PackageInfo pi = getPackageManagerInternal().getPackageInfo(pkgName,
- PackageManager.GET_PERMISSIONS, Process.myUid(),
- UserHandle.getUserId(uid));
- boolean isSamplingTarget = isSamplingTarget(pi);
- synchronized (AppOpsService.this) {
- if (isSamplingTarget) {
- mRarelyUsedPackages.add(pkgName);
- }
- UidState uidState = getUidStateLocked(uid, true);
- if (!uidState.pkgOps.containsKey(pkgName)) {
- uidState.pkgOps.put(pkgName,
- new Ops(pkgName, uidState));
- }
-
- createSandboxUidStateIfNotExistsForAppLocked(uid, null);
- }
- } else if (action.equals(ACTION_PACKAGE_REMOVED) && !intent.hasExtra(EXTRA_REPLACING)) {
- synchronized (AppOpsService.this) {
- packageRemovedLocked(uid, pkgName);
- }
+ if (action.equals(ACTION_PACKAGE_REMOVED) && !intent.hasExtra(EXTRA_REPLACING)) {
+ onPackageRemoved(pkgName, uid);
} else if (action.equals(Intent.ACTION_PACKAGE_REPLACED)) {
- AndroidPackage pkg = getPackageManagerInternal().getPackage(pkgName);
- if (pkg == null) {
- return;
- }
-
- synchronized (AppOpsService.this) {
- refreshAttributionsLocked(pkg, uid);
- }
+ onPackageReplaced(pkgName, uid);
}
}
};
+ private void onPackageAdded(String pkgName, int uid) {
+ PackageInfo pi = getPackageManagerInternal().getPackageInfo(pkgName,
+ PackageManager.GET_PERMISSIONS, Process.myUid(),
+ UserHandle.getUserId(uid));
+ synchronized (AppOpsService.this) {
+ boolean isSamplingTarget = false;
+ if (mRarelyUsedPackagesInitialized) {
+ isSamplingTarget = isSamplingTarget(pi);
+ }
+ if (isSamplingTarget) {
+ mRarelyUsedPackages.add(pkgName);
+ }
+ UidState uidState = getUidStateLocked(uid, true);
+ if (!uidState.pkgOps.containsKey(pkgName)) {
+ uidState.pkgOps.put(pkgName,
+ new Ops(pkgName, uidState));
+ }
+
+ createSandboxUidStateIfNotExistsForAppLocked(uid, null);
+ }
+ }
+
+ private void onPackageRemoved(String pkgName, int uid) {
+ synchronized (AppOpsService.this) {
+ packageRemovedLocked(uid, pkgName);
+ }
+ }
+
+ private void onPackageReplaced(String pkgName, int uid) {
+ AndroidPackage pkg = getPackageManagerInternal().getPackage(pkgName);
+ if (pkg == null) {
+ return;
+ }
+
+ synchronized (AppOpsService.this) {
+ refreshAttributionsLocked(pkg, uid);
+ }
+ }
+
public void systemReady() {
mVirtualDeviceManagerInternal = LocalServices.getService(
VirtualDeviceManagerInternal.class);
@@ -1121,7 +1133,6 @@ public class AppOpsService extends IAppOpsService.Stub {
mHistoricalRegistry.systemReady(mContext.getContentResolver());
IntentFilter packageUpdateFilter = new IntentFilter();
- packageUpdateFilter.addAction(ACTION_PACKAGE_ADDED);
packageUpdateFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
packageUpdateFilter.addAction(ACTION_PACKAGE_REMOVED);
packageUpdateFilter.addDataScheme("package");
@@ -1236,7 +1247,6 @@ public class AppOpsService extends IAppOpsService.Stub {
}
trimUidStatesLocked(knownUids, packageStates);
- mUidStatesInitialized = true;
}
}
}
@@ -7182,12 +7192,13 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
}
- synchronized (this) {
+ synchronized (AppOpsService.this) {
int numPkgs = mRarelyUsedPackages.size();
for (int i = 0; i < numPkgs; i++) {
candidates.add(mRarelyUsedPackages.valueAt(i));
}
mRarelyUsedPackages = candidates;
+ mRarelyUsedPackagesInitialized = true;
}
}
});
@@ -7495,6 +7506,15 @@ public class AppOpsService extends IAppOpsService.Stub {
return number;
}
+
+ @Override
+ public void onPackageAdded(String pkgName, int appId) {
+ int[] userIds = AppOpsService.this.getUserManagerInternal().getUserIds();
+ for (int i = 0; i < userIds.length; i++) {
+ int userId = userIds[i];
+ AppOpsService.this.onPackageAdded(pkgName, UserHandle.getUid(userId, appId));
+ }
+ }
}
/**
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 15688c0f73660..fca6cab08963c 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -1358,6 +1358,8 @@ final class InstallPackageHelper {
Map createdAppId, boolean success) {
if (success) {
for (InstallRequest request : requests) {
+ mInjector.getAppOpsManagerInternal().onPackageAdded(
+ request.getName(), request.getAppId());
if (request.getDataLoaderType() != DataLoaderType.INCREMENTAL) {
continue;
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 2464a291b4dd1..c63be12802bc3 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -56,6 +56,7 @@ import android.annotation.WorkerThread;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.AppOpsManager;
+import android.app.AppOpsManagerInternal;
import android.app.ApplicationExitInfo;
import android.app.ApplicationPackageManager;
import android.app.BroadcastOptions;
@@ -1690,6 +1691,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
(i, pm) -> new ComponentResolver(i.getUserManagerService(), pm.mUserNeedsBadging),
(i, pm) -> PermissionManagerService.create(context,
i.getSystemConfig().getAvailableFeatures()),
+ (i, pm) -> LocalServices.getService(AppOpsManagerInternal.class),
(i, pm) -> new UserManagerService(context, pm,
new UserDataPreparer(installer, installLock, context), lock),
(i, pm) -> new Settings(Environment.getDataDirectory(),
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java b/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java
index ae2eaeb31f81a..a9d367e570a0d 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java
@@ -17,6 +17,7 @@
package com.android.server.pm;
import android.app.ActivityManagerInternal;
+import android.app.AppOpsManagerInternal;
import android.app.backup.IBackupManager;
import android.content.ComponentName;
import android.content.Context;
@@ -96,6 +97,7 @@ public class PackageManagerServiceInjector {
mComponentResolverProducer;
private final Singleton
mPermissionManagerServiceProducer;
+ private final Singleton mAppOpsManagerInternalProducer;
private final Singleton
mUserManagerProducer;
private final Singleton mSettingsProducer;
@@ -149,6 +151,7 @@ public class PackageManagerServiceInjector {
List systemPartitions,
Producer componentResolverProducer,
Producer permissionManagerServiceProducer,
+ Producer appOpsManagerInternalProducer,
Producer userManagerProducer,
Producer settingsProducer,
Producer appsFilterProducer,
@@ -194,6 +197,7 @@ public class PackageManagerServiceInjector {
componentResolverProducer);
mPermissionManagerServiceProducer = new Singleton<>(
permissionManagerServiceProducer);
+ mAppOpsManagerInternalProducer = new Singleton<>(appOpsManagerInternalProducer);
mUserManagerProducer = new Singleton<>(userManagerProducer);
mSettingsProducer = new Singleton<>(settingsProducer);
mAppsFilterProducer = new Singleton<>(appsFilterProducer);
@@ -290,6 +294,10 @@ public class PackageManagerServiceInjector {
return mPermissionManagerServiceProducer.get(this, mPackageManager);
}
+ public AppOpsManagerInternal getAppOpsManagerInternal() {
+ return mAppOpsManagerInternalProducer.get(this, mPackageManager);
+ }
+
public Context getContext() {
return mContext;
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
index b53dbc8343517..1b2ab2702d49e 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt
@@ -16,6 +16,7 @@
package com.android.server.pm
import android.app.AppOpsManager
+import android.app.AppOpsManagerInternal
import android.app.PropertyInvalidatedCache
import android.content.Context
import android.content.Intent
@@ -195,6 +196,7 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) {
val componentResolver: ComponentResolver = mock()
val permissionManagerInternal: PermissionManagerServiceInternal = mock()
val appOpsManager: AppOpsManager = mock()
+ val appOpsManagerInternal: AppOpsManagerInternal = mock()
val incrementalManager: IncrementalManager = mock()
val platformCompat: PlatformCompat = mock()
val settings: Settings = mock()
@@ -286,6 +288,9 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) {
whenever(mocks.injector.permissionManagerServiceInternal) {
mocks.permissionManagerInternal
}
+ whenever(mocks.injector.appOpsManagerInternal) {
+ mocks.appOpsManagerInternal
+ }
whenever(mocks.injector.incrementalManager).thenReturn(mocks.incrementalManager)
whenever(mocks.injector.compatibility).thenReturn(mocks.platformCompat)
whenever(mocks.injector.settings).thenReturn(mocks.settings)
--
GitLab
From cf1648107aab44b4fdcee1a2a96ec9abb6e0c2a7 Mon Sep 17 00:00:00 2001
From: Tom Chan
Date: Wed, 19 Feb 2025 21:13:48 +0000
Subject: [PATCH 111/111] Store the entire certificate revocation list locally
Compared to the previous approach which stores previously seen pairs, storing the entire CRL avoids edge cases where
a rotated certificate causes an attestation failure because it is not
seen before.
Test: Manually, also atest AttestationVerificationTest:com.android.server.security.CertificateRevocationStatusManagerTest
Bug: 389088384
Flag: EXEMPT bug fix
Change-Id: Ia7ae905018d140ff76671d5eb5fc911acaa94897
---
.../CertificateRevocationStatusManager.java | 281 +++++-------------
...CertificateRevocationStatusJobService.java | 28 +-
...ertificateRevocationStatusManagerTest.java | 267 ++++++++---------
3 files changed, 208 insertions(+), 368 deletions(-)
diff --git a/services/core/java/com/android/server/security/CertificateRevocationStatusManager.java b/services/core/java/com/android/server/security/CertificateRevocationStatusManager.java
index 4cd4b3b849108..799157520ca5e 100644
--- a/services/core/java/com/android/server/security/CertificateRevocationStatusManager.java
+++ b/services/core/java/com/android/server/security/CertificateRevocationStatusManager.java
@@ -24,7 +24,7 @@ import android.content.Context;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Environment;
-import android.os.PersistableBundle;
+import android.util.AtomicFile;
import android.util.Slog;
import com.android.internal.R;
@@ -35,6 +35,7 @@ import org.json.JSONObject;
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -42,52 +43,27 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.security.cert.CertPathValidatorException;
import java.security.cert.X509Certificate;
-import java.time.Duration;
-import java.time.LocalDate;
import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.format.DateTimeParseException;
+import java.time.OffsetDateTime;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
-import java.util.Map;
-import java.util.Set;
/** Manages the revocation status of certificates used in remote attestation. */
class CertificateRevocationStatusManager {
private static final String TAG = "AVF_CRL";
// Must be unique within system server
private static final int JOB_ID = 1737671340;
- private static final String REVOCATION_STATUS_FILE_NAME = "certificate_revocation_status.txt";
- private static final String REVOCATION_STATUS_FILE_FIELD_DELIMITER = ",";
+ private static final String REVOCATION_LIST_FILE_NAME = "certificate_revocation_list.json";
+ @VisibleForTesting static final int MAX_OFFLINE_REVOCATION_LIST_AGE_DAYS = 30;
- /**
- * The number of days since last update for which a stored revocation status can be accepted.
- */
- @VisibleForTesting static final int MAX_DAYS_SINCE_LAST_CHECK = 30;
-
- @VisibleForTesting static final int NUM_HOURS_BEFORE_NEXT_CHECK = 24;
-
- /**
- * The number of days since issue date for an intermediary certificate to be considered fresh
- * and not require a revocation list check.
- */
- private static final int FRESH_INTERMEDIARY_CERT_DAYS = 70;
-
- /**
- * The expected number of days between a certificate's issue date and notBefore date. Used to
- * infer a certificate's issue date from its notBefore date.
- */
- private static final int DAYS_BETWEEN_ISSUE_AND_NOT_BEFORE_DATES = 2;
+ @VisibleForTesting static final int NUM_HOURS_BEFORE_NEXT_FETCH = 24;
private static final String TOP_LEVEL_JSON_PROPERTY_KEY = "entries";
private static final Object sFileLock = new Object();
private final Context mContext;
private final String mTestRemoteRevocationListUrl;
- private final File mTestRevocationStatusFile;
+ private final File mTestStoredRevocationListFile;
private final boolean mShouldScheduleJob;
CertificateRevocationStatusManager(Context context) {
@@ -98,29 +74,22 @@ class CertificateRevocationStatusManager {
CertificateRevocationStatusManager(
Context context,
String testRemoteRevocationListUrl,
- File testRevocationStatusFile,
+ File testStoredRevocationListFile,
boolean shouldScheduleJob) {
mContext = context;
mTestRemoteRevocationListUrl = testRemoteRevocationListUrl;
- mTestRevocationStatusFile = testRevocationStatusFile;
+ mTestStoredRevocationListFile = testStoredRevocationListFile;
mShouldScheduleJob = shouldScheduleJob;
}
/**
* Check the revocation status of the provided {@link X509Certificate}s.
*
- *
The provided certificates should have been validated and ordered from leaf to a
- * certificate issued by the trust anchor, per the convention specified in the javadoc of {@link
- * java.security.cert.CertPath}.
- *
* @param certificates List of certificates to be checked
* @throws CertPathValidatorException if the check failed
*/
void checkRevocationStatus(List certificates)
throws CertPathValidatorException {
- if (!needToCheckRevocationStatus(certificates)) {
- return;
- }
List serialNumbers = new ArrayList<>();
for (X509Certificate certificate : certificates) {
String serialNumber = certificate.getSerialNumber().toString(16);
@@ -129,217 +98,124 @@ class CertificateRevocationStatusManager {
}
serialNumbers.add(serialNumber);
}
+ LocalDateTime now = LocalDateTime.now();
+ JSONObject revocationList;
try {
- if (isLastCheckedWithin(Duration.ofHours(NUM_HOURS_BEFORE_NEXT_CHECK), serialNumbers)) {
- Slog.d(
- TAG,
- "All certificates have been checked for revocation recently. No need to"
- + " check this time.");
+ if (getLastModifiedDateTime(getRevocationListFile())
+ .isAfter(now.minusHours(NUM_HOURS_BEFORE_NEXT_FETCH))) {
+ Slog.d(TAG, "CRL is fetched recently, do not fetch again.");
+ revocationList = getStoredRevocationList();
+ checkRevocationStatus(revocationList, serialNumbers);
return;
}
- } catch (IOException ignored) {
- // Proceed to check the revocation status
+ } catch (IOException | JSONException ignored) {
+ // Proceed to fetch the remote revocation list
}
try {
- JSONObject revocationList = fetchRemoteRevocationList();
- Map areCertificatesRevoked = new HashMap<>();
- for (String serialNumber : serialNumbers) {
- areCertificatesRevoked.put(serialNumber, revocationList.has(serialNumber));
- }
- updateLastRevocationCheckData(areCertificatesRevoked);
- for (Map.Entry entry : areCertificatesRevoked.entrySet()) {
- if (entry.getValue()) {
- throw new CertPathValidatorException(
- "Certificate " + entry.getKey() + " has been revoked.");
- }
- }
+ byte[] revocationListBytes = fetchRemoteRevocationListBytes();
+ silentlyStoreRevocationList(revocationListBytes);
+ revocationList = parseRevocationList(revocationListBytes);
+ checkRevocationStatus(revocationList, serialNumbers);
} catch (IOException | JSONException ex) {
Slog.d(TAG, "Fallback to check stored revocation status", ex);
if (ex instanceof IOException && mShouldScheduleJob) {
- scheduleJobToUpdateStoredDataWithRemoteRevocationList(serialNumbers);
- }
- for (X509Certificate certificate : certificates) {
- // Assume recently issued certificates are not revoked.
- if (isIssuedWithinDays(certificate, MAX_DAYS_SINCE_LAST_CHECK)) {
- String serialNumber = certificate.getSerialNumber().toString(16);
- serialNumbers.remove(serialNumber);
- }
+ scheduleJobToFetchRemoteRevocationJob();
}
try {
- if (!isLastCheckedWithin(
- Duration.ofDays(MAX_DAYS_SINCE_LAST_CHECK), serialNumbers)) {
- throw new CertPathValidatorException(
- "Unable to verify the revocation status of one of the certificates "
- + serialNumbers);
- }
- } catch (IOException ex2) {
+ revocationList = getStoredRevocationList();
+ checkRevocationStatus(revocationList, serialNumbers);
+ } catch (IOException | JSONException ex2) {
throw new CertPathValidatorException(
- "Unable to load stored revocation status", ex2);
+ "Unable to load or parse stored revocation status", ex2);
}
}
}
- private boolean isLastCheckedWithin(Duration lastCheckedWithin, List serialNumbers)
- throws IOException {
- Map lastRevocationCheckData = getLastRevocationCheckData();
+ private static void checkRevocationStatus(JSONObject revocationList, List serialNumbers)
+ throws CertPathValidatorException {
for (String serialNumber : serialNumbers) {
- if (!lastRevocationCheckData.containsKey(serialNumber)
- || lastRevocationCheckData
- .get(serialNumber)
- .isBefore(LocalDateTime.now().minus(lastCheckedWithin))) {
- return false;
+ if (revocationList.has(serialNumber)) {
+ throw new CertPathValidatorException(
+ "Certificate has been revoked: " + serialNumber);
}
}
- return true;
}
- private static boolean needToCheckRevocationStatus(
- List certificatesOrderedLeafFirst) {
- if (certificatesOrderedLeafFirst.isEmpty()) {
- return false;
- }
- // A certificate isn't revoked when it is first issued, so we treat it as checked on its
- // issue date.
- if (!isIssuedWithinDays(certificatesOrderedLeafFirst.get(0), MAX_DAYS_SINCE_LAST_CHECK)) {
- return true;
+ private JSONObject getStoredRevocationList() throws IOException, JSONException {
+ File offlineRevocationListFile = getRevocationListFile();
+ if (!offlineRevocationListFile.exists()
+ || isRevocationListExpired(offlineRevocationListFile)) {
+ throw new FileNotFoundException("Offline copy does not exist or has expired.");
}
- for (int i = 1; i < certificatesOrderedLeafFirst.size(); i++) {
- if (!isIssuedWithinDays(
- certificatesOrderedLeafFirst.get(i), FRESH_INTERMEDIARY_CERT_DAYS)) {
- return true;
+ synchronized (sFileLock) {
+ try (FileInputStream inputStream = new FileInputStream(offlineRevocationListFile)) {
+ return parseRevocationList(inputStream.readAllBytes());
}
}
- return false;
}
- private static boolean isIssuedWithinDays(X509Certificate certificate, int days) {
- LocalDate notBeforeDate =
- LocalDate.ofInstant(certificate.getNotBefore().toInstant(), ZoneId.systemDefault());
- LocalDate expectedIssueData =
- notBeforeDate.plusDays(DAYS_BETWEEN_ISSUE_AND_NOT_BEFORE_DATES);
- return LocalDate.now().minusDays(days + 1).isBefore(expectedIssueData);
+ private boolean isRevocationListExpired(File offlineRevocationListFile) {
+ LocalDateTime acceptableLastModifiedDate =
+ LocalDateTime.now().minusDays(MAX_OFFLINE_REVOCATION_LIST_AGE_DAYS);
+ LocalDateTime lastModifiedDate = getLastModifiedDateTime(offlineRevocationListFile);
+ return lastModifiedDate.isBefore(acceptableLastModifiedDate);
}
- void updateLastRevocationCheckDataForAllPreviouslySeenCertificates(
- JSONObject revocationList, Collection otherCertificatesToCheck) {
- Set allCertificatesToCheck = new HashSet<>(otherCertificatesToCheck);
- try {
- allCertificatesToCheck.addAll(getLastRevocationCheckData().keySet());
- } catch (IOException ex) {
- Slog.e(TAG, "Unable to update last check date of stored data.", ex);
- }
- Map areCertificatesRevoked = new HashMap<>();
- for (String serialNumber : allCertificatesToCheck) {
- areCertificatesRevoked.put(serialNumber, revocationList.has(serialNumber));
- }
- updateLastRevocationCheckData(areCertificatesRevoked);
+ private static LocalDateTime getLastModifiedDateTime(File file) {
+ // if the file does not exist, file.lastModified() returns 0, so this method returns the
+ // epoch time
+ return LocalDateTime.ofEpochSecond(
+ file.lastModified() / 1000, 0, OffsetDateTime.now().getOffset());
}
/**
- * Update the last revocation check data stored on this device.
+ * Store the provided bytes to the local revocation list file.
+ *
+ *
This method does not throw an exception even if it fails to store the bytes.
*
- * @param areCertificatesRevoked A Map whose keys are certificate serial numbers and values are
- * whether that certificate has been revoked
+ *
This method internally synchronize file access with other methods in this class.
+ *
+ * @param revocationListBytes The bytes to store to the local revocation list file.
*/
- void updateLastRevocationCheckData(Map areCertificatesRevoked) {
- LocalDateTime now = LocalDateTime.now();
+ void silentlyStoreRevocationList(byte[] revocationListBytes) {
synchronized (sFileLock) {
- Map lastRevocationCheckData;
+ AtomicFile atomicRevocationListFile = new AtomicFile(getRevocationListFile());
+ FileOutputStream fileOutputStream = null;
try {
- lastRevocationCheckData = getLastRevocationCheckData();
+ fileOutputStream = atomicRevocationListFile.startWrite();
+ fileOutputStream.write(revocationListBytes);
+ atomicRevocationListFile.finishWrite(fileOutputStream);
+ Slog.d(TAG, "Successfully stored revocation list.");
} catch (IOException ex) {
- Slog.e(TAG, "Unable to updateLastRevocationCheckData", ex);
- return;
- }
- for (Map.Entry entry : areCertificatesRevoked.entrySet()) {
- if (entry.getValue()) {
- lastRevocationCheckData.remove(entry.getKey());
- } else {
- lastRevocationCheckData.put(entry.getKey(), now);
+ Slog.e(TAG, "Failed to store the certificate revocation list.", ex);
+ // this happens when fileOutputStream.write fails
+ if (fileOutputStream != null) {
+ atomicRevocationListFile.failWrite(fileOutputStream);
}
}
- storeLastRevocationCheckData(lastRevocationCheckData);
}
}
- Map getLastRevocationCheckData() throws IOException {
- Map data = new HashMap<>();
- File dataFile = getLastRevocationCheckDataFile();
- synchronized (sFileLock) {
- if (!dataFile.exists()) {
- return data;
- }
- String dataString;
- try (FileInputStream in = new FileInputStream(dataFile)) {
- dataString = new String(in.readAllBytes(), UTF_8);
- }
- for (String line : dataString.split(System.lineSeparator())) {
- String[] elements = line.split(REVOCATION_STATUS_FILE_FIELD_DELIMITER);
- if (elements.length != 2) {
- continue;
- }
- try {
- data.put(elements[0], LocalDateTime.parse(elements[1]));
- } catch (DateTimeParseException ex) {
- Slog.e(
- TAG,
- "Unable to parse last checked LocalDateTime from file. Deleting the"
- + " potentially corrupted file.",
- ex);
- dataFile.delete();
- return data;
- }
- }
+ private File getRevocationListFile() {
+ if (mTestStoredRevocationListFile != null) {
+ return mTestStoredRevocationListFile;
}
- return data;
+ return new File(Environment.getDataSystemDirectory(), REVOCATION_LIST_FILE_NAME);
}
- @VisibleForTesting
- void storeLastRevocationCheckData(Map lastRevocationCheckData) {
- StringBuilder dataStringBuilder = new StringBuilder();
- for (Map.Entry entry : lastRevocationCheckData.entrySet()) {
- dataStringBuilder
- .append(entry.getKey())
- .append(REVOCATION_STATUS_FILE_FIELD_DELIMITER)
- .append(entry.getValue())
- .append(System.lineSeparator());
- }
- synchronized (sFileLock) {
- try (FileOutputStream fileOutputStream =
- new FileOutputStream(getLastRevocationCheckDataFile())) {
- fileOutputStream.write(dataStringBuilder.toString().getBytes(UTF_8));
- Slog.d(TAG, "Successfully stored revocation status data.");
- } catch (IOException ex) {
- Slog.e(TAG, "Failed to store revocation status data.", ex);
- }
- }
- }
-
- private File getLastRevocationCheckDataFile() {
- if (mTestRevocationStatusFile != null) {
- return mTestRevocationStatusFile;
- }
- return new File(Environment.getDataSystemDirectory(), REVOCATION_STATUS_FILE_NAME);
- }
-
- private void scheduleJobToUpdateStoredDataWithRemoteRevocationList(List serialNumbers) {
+ private void scheduleJobToFetchRemoteRevocationJob() {
JobScheduler jobScheduler = mContext.getSystemService(JobScheduler.class);
if (jobScheduler == null) {
Slog.e(TAG, "Unable to get job scheduler.");
return;
}
Slog.d(TAG, "Scheduling job to fetch remote CRL.");
- PersistableBundle extras = new PersistableBundle();
- extras.putStringArray(
- UpdateCertificateRevocationStatusJobService.EXTRA_KEY_CERTIFICATES_TO_CHECK,
- serialNumbers.toArray(new String[0]));
jobScheduler.schedule(
new JobInfo.Builder(
JOB_ID,
new ComponentName(
mContext,
UpdateCertificateRevocationStatusJobService.class))
- .setExtras(extras)
.setRequiredNetwork(
new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
@@ -351,13 +227,11 @@ class CertificateRevocationStatusManager {
* Fetches the revocation list from the URL specified in
* R.string.vendor_required_attestation_revocation_list_url
*
- * @return The remote revocation list entries in a JSONObject
+ * @return The remote revocation list entries in a byte[].
* @throws CertPathValidatorException if the URL is not defined or is malformed.
* @throws IOException if the URL is valid but the fetch failed.
- * @throws JSONException if the revocation list content cannot be parsed
*/
- JSONObject fetchRemoteRevocationList()
- throws CertPathValidatorException, IOException, JSONException {
+ byte[] fetchRemoteRevocationListBytes() throws CertPathValidatorException, IOException {
String urlString = getRemoteRevocationListUrl();
if (urlString == null || urlString.isEmpty()) {
throw new CertPathValidatorException(
@@ -369,10 +243,13 @@ class CertificateRevocationStatusManager {
} catch (MalformedURLException ex) {
throw new CertPathValidatorException("Unable to parse the URL " + urlString, ex);
}
- byte[] revocationListBytes;
try (InputStream inputStream = url.openStream()) {
- revocationListBytes = inputStream.readAllBytes();
+ return inputStream.readAllBytes();
}
+ }
+
+ private JSONObject parseRevocationList(byte[] revocationListBytes)
+ throws IOException, JSONException {
JSONObject revocationListJson = new JSONObject(new String(revocationListBytes, UTF_8));
return revocationListJson.getJSONObject(TOP_LEVEL_JSON_PROPERTY_KEY);
}
diff --git a/services/core/java/com/android/server/security/UpdateCertificateRevocationStatusJobService.java b/services/core/java/com/android/server/security/UpdateCertificateRevocationStatusJobService.java
index 768c812f47a30..7d1a70eb40947 100644
--- a/services/core/java/com/android/server/security/UpdateCertificateRevocationStatusJobService.java
+++ b/services/core/java/com/android/server/security/UpdateCertificateRevocationStatusJobService.java
@@ -20,17 +20,15 @@ import android.app.job.JobParameters;
import android.app.job.JobService;
import android.util.Slog;
-import org.json.JSONObject;
-
-import java.util.Arrays;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-/** A {@link JobService} that fetches the certificate revocation list from a remote location. */
+/**
+ * A {@link JobService} that fetches the certificate revocation list from a remote location and
+ * stores it locally.
+ */
public class UpdateCertificateRevocationStatusJobService extends JobService {
- static final String EXTRA_KEY_CERTIFICATES_TO_CHECK =
- "com.android.server.security.extra.CERTIFICATES_TO_CHECK";
private static final String TAG = "AVF_CRL";
private ExecutorService mExecutorService;
@@ -48,20 +46,12 @@ public class UpdateCertificateRevocationStatusJobService extends JobService {
CertificateRevocationStatusManager certificateRevocationStatusManager =
new CertificateRevocationStatusManager(this);
Slog.d(TAG, "Starting to fetch remote CRL from job service.");
- JSONObject revocationList =
- certificateRevocationStatusManager.fetchRemoteRevocationList();
- String[] certificatesToCheckFromJobParams =
- params.getExtras().getStringArray(EXTRA_KEY_CERTIFICATES_TO_CHECK);
- if (certificatesToCheckFromJobParams == null) {
- Slog.e(TAG, "Extras not found: " + EXTRA_KEY_CERTIFICATES_TO_CHECK);
- return;
- }
- certificateRevocationStatusManager
- .updateLastRevocationCheckDataForAllPreviouslySeenCertificates(
- revocationList,
- Arrays.asList(certificatesToCheckFromJobParams));
+ byte[] revocationList =
+ certificateRevocationStatusManager.fetchRemoteRevocationListBytes();
+ certificateRevocationStatusManager.silentlyStoreRevocationList(
+ revocationList);
} catch (Throwable t) {
- Slog.e(TAG, "Unable to update the stored revocation status.", t);
+ Slog.e(TAG, "Unable to update the stored revocation list.", t);
}
jobFinished(params, false);
});
diff --git a/tests/AttestationVerificationTest/src/com/android/server/security/CertificateRevocationStatusManagerTest.java b/tests/AttestationVerificationTest/src/com/android/server/security/CertificateRevocationStatusManagerTest.java
index 586bb76388f61..3854ae6dc9b31 100644
--- a/tests/AttestationVerificationTest/src/com/android/server/security/CertificateRevocationStatusManagerTest.java
+++ b/tests/AttestationVerificationTest/src/com/android/server/security/CertificateRevocationStatusManagerTest.java
@@ -20,18 +20,17 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import android.content.Context;
-import android.os.SystemClock;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
-import org.json.JSONObject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.security.cert.CertPathValidatorException;
@@ -39,33 +38,34 @@ import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
@RunWith(AndroidJUnit4.class)
public class CertificateRevocationStatusManagerTest {
private static final String TEST_CERTIFICATE_FILE_1 = "test_attestation_with_root_certs.pem";
private static final String TEST_CERTIFICATE_FILE_2 = "test_attestation_wrong_root_certs.pem";
- private static final String TEST_REVOCATION_LIST_FILE_NAME = "test_revocation_list.json";
+ private static final String TEST_REMOTE_REVOCATION_LIST_FILE_NAME =
+ "test_remote_revocation_list.json";
private static final String REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST =
"test_revocation_list_no_test_certs.json";
private static final String REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST =
"test_revocation_list_with_test_certs.json";
- private static final String TEST_REVOCATION_STATUS_FILE_NAME = "test_revocation_status.txt";
+ private static final String TEST_STORED_REVOCATION_LIST_FILE_NAME =
+ "test_stored_revocation_list.json";
private static final String FILE_URL_PREFIX = "file://";
private final Context mContext = InstrumentationRegistry.getInstrumentation().getContext();
private CertificateFactory mFactory;
private List mCertificates1;
private List mCertificates2;
- private File mRevocationListFile;
+ private File mRemoteRevocationListFile;
private String mRevocationListUrl;
private String mNonExistentRevocationListUrl;
- private File mRevocationStatusFile;
+ private File mStoredRevocationListFile;
private CertificateRevocationStatusManager mCertificateRevocationStatusManager;
@Before
@@ -73,27 +73,29 @@ public class CertificateRevocationStatusManagerTest {
mFactory = CertificateFactory.getInstance("X.509");
mCertificates1 = getCertificateChain(TEST_CERTIFICATE_FILE_1);
mCertificates2 = getCertificateChain(TEST_CERTIFICATE_FILE_2);
- mRevocationListFile = new File(mContext.getFilesDir(), TEST_REVOCATION_LIST_FILE_NAME);
- mRevocationListUrl = FILE_URL_PREFIX + mRevocationListFile.getAbsolutePath();
+ mRemoteRevocationListFile =
+ new File(mContext.getFilesDir(), TEST_REMOTE_REVOCATION_LIST_FILE_NAME);
+ mRevocationListUrl = FILE_URL_PREFIX + mRemoteRevocationListFile.getAbsolutePath();
File noSuchFile = new File(mContext.getFilesDir(), "file_does_not_exist");
mNonExistentRevocationListUrl = FILE_URL_PREFIX + noSuchFile.getAbsolutePath();
- mRevocationStatusFile = new File(mContext.getFilesDir(), TEST_REVOCATION_STATUS_FILE_NAME);
+ mStoredRevocationListFile =
+ new File(mContext.getFilesDir(), TEST_STORED_REVOCATION_LIST_FILE_NAME);
}
@After
public void tearDown() throws Exception {
- mRevocationListFile.delete();
- mRevocationStatusFile.delete();
+ mRemoteRevocationListFile.delete();
+ mStoredRevocationListFile.delete();
}
@Test
public void checkRevocationStatus_doesNotExistOnRemoteRevocationList_noException()
throws Exception {
copyFromAssetToFile(
- REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+ REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mRevocationListUrl, mRevocationStatusFile, false);
+ mContext, mRevocationListUrl, mStoredRevocationListFile, false);
mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
}
@@ -102,10 +104,10 @@ public class CertificateRevocationStatusManagerTest {
public void checkRevocationStatus_existsOnRemoteRevocationList_throwsException()
throws Exception {
copyFromAssetToFile(
- REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+ REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mRevocationListUrl, mRevocationStatusFile, false);
+ mContext, mRevocationListUrl, mStoredRevocationListFile, false);
assertThrows(
CertPathValidatorException.class,
@@ -118,7 +120,7 @@ public class CertificateRevocationStatusManagerTest {
throws Exception {
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mNonExistentRevocationListUrl, mRevocationStatusFile, false);
+ mContext, mNonExistentRevocationListUrl, mStoredRevocationListFile, false);
assertThrows(
CertPathValidatorException.class,
@@ -128,49 +130,56 @@ public class CertificateRevocationStatusManagerTest {
@Test
public void checkRevocationStatus_savesRevocationStatus() throws Exception {
copyFromAssetToFile(
- REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+ REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mRevocationListUrl, mRevocationStatusFile, false);
+ mContext, mRevocationListUrl, mStoredRevocationListFile, false);
mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
- assertThat(mRevocationStatusFile.length()).isGreaterThan(0);
+ assertThat(mStoredRevocationListFile.length()).isGreaterThan(0);
}
@Test
- public void checkRevocationStatus_cannotReachRemoteList_certsSaved_noException()
+ public void checkRevocationStatus_cannotReachRemoteList_listSaved_noException()
throws Exception {
// call checkRevocationStatus once to save the revocation status
copyFromAssetToFile(
- REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+ REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mRevocationListUrl, mRevocationStatusFile, false);
+ mContext, mRevocationListUrl, mStoredRevocationListFile, false);
mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
// call checkRevocationStatus again with mNonExistentRevocationListUrl
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mNonExistentRevocationListUrl, mRevocationStatusFile, false);
+ mContext, mNonExistentRevocationListUrl, mStoredRevocationListFile, false);
mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
}
@Test
- public void checkRevocationStatus_cannotReachRemoteList_someCertsNotSaved_exception()
+ public void checkRevocationStatus_cannotReachRemoteList_storedListTooOld_exception()
throws Exception {
- // call checkRevocationStatus once to save the revocation status for mCertificates2
+ // call checkRevocationStatus once to save the revocation status
copyFromAssetToFile(
- REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+ REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mRevocationListUrl, mRevocationStatusFile, false);
- mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates2);
- // call checkRevocationStatus again with mNonExistentRevocationListUrl, this time for
- // mCertificates1
+ mContext, mRevocationListUrl, mStoredRevocationListFile, false);
+ mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+ // set the last modified date of the stored list to an expired date
+ LocalDateTime now = LocalDateTime.now();
+ LocalDateTime expiredListDate =
+ now.minusDays(
+ CertificateRevocationStatusManager.MAX_OFFLINE_REVOCATION_LIST_AGE_DAYS
+ + 1);
+ mStoredRevocationListFile.setLastModified(
+ expiredListDate.toEpochSecond(OffsetDateTime.now().getOffset()) * 1000);
+ // call checkRevocationStatus again with mNonExistentRevocationListUrl
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mNonExistentRevocationListUrl, mRevocationStatusFile, false);
+ mContext, mNonExistentRevocationListUrl, mStoredRevocationListFile, false);
assertThrows(
CertPathValidatorException.class,
@@ -178,143 +187,112 @@ public class CertificateRevocationStatusManagerTest {
}
@Test
- public void checkRevocationStatus_cannotReachRemoteList_someCertsStatusTooOld_exception()
+ public void checkRevocationStatus_cannotReachRemoteList_storedListIsFresh_noException()
throws Exception {
+ // call checkRevocationStatus once to save the revocation status
+ copyFromAssetToFile(
+ REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mNonExistentRevocationListUrl, mRevocationStatusFile, false);
+ mContext, mRevocationListUrl, mStoredRevocationListFile, false);
+ mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+ // set the last modified date of the stored list to a barely not expired date
LocalDateTime now = LocalDateTime.now();
- LocalDateTime expiredStatusDate =
- now.minusDays(CertificateRevocationStatusManager.MAX_DAYS_SINCE_LAST_CHECK + 1);
- Map lastRevocationCheckData = new HashMap<>();
- lastRevocationCheckData.put(getSerialNumber(mCertificates1.get(0)), expiredStatusDate);
- for (int i = 1; i < mCertificates1.size(); i++) {
- lastRevocationCheckData.put(getSerialNumber(mCertificates1.get(i)), now);
- }
- mCertificateRevocationStatusManager.storeLastRevocationCheckData(lastRevocationCheckData);
-
- assertThrows(
- CertPathValidatorException.class,
- () -> mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1));
- }
-
- @Test
- public void checkRevocationStatus_cannotReachRemoteList_allCertResultsFresh_noException()
- throws Exception {
+ LocalDateTime barelyFreshDate =
+ now.minusDays(
+ CertificateRevocationStatusManager.MAX_OFFLINE_REVOCATION_LIST_AGE_DAYS
+ - 1);
+ mStoredRevocationListFile.setLastModified(
+ barelyFreshDate.toEpochSecond(OffsetDateTime.now().getOffset()) * 1000);
+ // call checkRevocationStatus again with mNonExistentRevocationListUrl
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mNonExistentRevocationListUrl, mRevocationStatusFile, false);
- LocalDateTime bearlyNotExpiredStatusDate =
- LocalDateTime.now()
- .minusDays(
- CertificateRevocationStatusManager.MAX_DAYS_SINCE_LAST_CHECK - 1);
- Map lastRevocationCheckData = new HashMap<>();
- for (X509Certificate certificate : mCertificates1) {
- lastRevocationCheckData.put(getSerialNumber(certificate), bearlyNotExpiredStatusDate);
- }
- mCertificateRevocationStatusManager.storeLastRevocationCheckData(lastRevocationCheckData);
+ mContext, mNonExistentRevocationListUrl, mStoredRevocationListFile, false);
mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
}
@Test
- public void updateLastRevocationCheckData_correctlySavesStatus() throws Exception {
+ public void silentlyStoreRevocationList_storesCorrectly() throws Exception {
+ copyFromAssetToFile(
+ REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mNonExistentRevocationListUrl, mRevocationStatusFile, false);
- Map areCertificatesRevoked = new HashMap<>();
- for (X509Certificate certificate : mCertificates1) {
- areCertificatesRevoked.put(getSerialNumber(certificate), false);
- }
+ mContext, mRevocationListUrl, mStoredRevocationListFile, false);
+ byte[] revocationList =
+ mCertificateRevocationStatusManager.fetchRemoteRevocationListBytes();
- mCertificateRevocationStatusManager.updateLastRevocationCheckData(areCertificatesRevoked);
+ mCertificateRevocationStatusManager.silentlyStoreRevocationList(revocationList);
- // no exception
- mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
- // revoke one certificate and try again
- areCertificatesRevoked.put(getSerialNumber(mCertificates1.getLast()), true);
- mCertificateRevocationStatusManager.updateLastRevocationCheckData(areCertificatesRevoked);
- assertThrows(
- CertPathValidatorException.class,
- () -> mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1));
+ byte[] bytesFromRemoteList;
+ byte[] bytesFromStoredList;
+ try (FileInputStream remoteListInputStream =
+ new FileInputStream(mRemoteRevocationListFile)) {
+ bytesFromRemoteList = remoteListInputStream.readAllBytes();
+ }
+ try (FileInputStream storedListInputStream =
+ new FileInputStream(mStoredRevocationListFile)) {
+ bytesFromStoredList = storedListInputStream.readAllBytes();
+ }
+ assertThat(bytesFromStoredList).isEqualTo(bytesFromRemoteList);
}
@Test
- public void updateLastRevocationCheckDataForAllPreviouslySeenCertificates_updatesCorrectly()
+ public void checkRevocationStatus_recentlyChecked_doesNotFetchRemoteCrl()
throws Exception {
copyFromAssetToFile(
- REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+ REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mRevocationListUrl, mRevocationStatusFile, false);
- // populate the revocation status file
+ mContext, mRevocationListUrl, mStoredRevocationListFile, false);
+ mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+ // indirectly verifies the remote list is not fetched by simulating a remote revocation
+ copyFromAssetToFile(
+ REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
+
+ // no exception
mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
- // Sleep for 2 second so that the current time changes
- SystemClock.sleep(2000);
- LocalDateTime timestampBeforeUpdate = LocalDateTime.now();
- JSONObject revocationList = mCertificateRevocationStatusManager.fetchRemoteRevocationList();
- List otherCertificatesToCheck = new ArrayList<>();
- String serialNumber1 = "1234567"; // not revoked
- String serialNumber2 = "8350192447815228107"; // revoked
- String serialNumber3 = "987654"; // not revoked
- otherCertificatesToCheck.add(serialNumber1);
- otherCertificatesToCheck.add(serialNumber2);
- otherCertificatesToCheck.add(serialNumber3);
-
- mCertificateRevocationStatusManager
- .updateLastRevocationCheckDataForAllPreviouslySeenCertificates(
- revocationList, otherCertificatesToCheck);
-
- Map lastRevocationCheckData =
- mCertificateRevocationStatusManager.getLastRevocationCheckData();
- assertThat(lastRevocationCheckData.get(serialNumber1)).isAtLeast(timestampBeforeUpdate);
- assertThat(lastRevocationCheckData).doesNotContainKey(serialNumber2); // revoked
- assertThat(lastRevocationCheckData.get(serialNumber3)).isAtLeast(timestampBeforeUpdate);
- // validate that the existing certificates on the file got updated too
- for (X509Certificate certificate : mCertificates1) {
- assertThat(lastRevocationCheckData.get(getSerialNumber(certificate)))
- .isAtLeast(timestampBeforeUpdate);
- }
}
@Test
- public void checkRevocationStatus_allCertificatesRecentlyChecked_doesNotFetchRemoteCrl()
+ public void checkRevocationStatus_recentlyCheckedAndRevoked_exception()
throws Exception {
copyFromAssetToFile(
- REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+ REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mRevocationListUrl, mRevocationStatusFile, false);
- mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
- // indirectly verifies the remote list is not fetched by simulating a remote revocation
- copyFromAssetToFile(
- REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+ mContext, mRevocationListUrl, mStoredRevocationListFile, false);
+ assertThrows(
+ CertPathValidatorException.class,
+ () -> mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1));
- // no exception
- mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+ assertThrows(
+ CertPathValidatorException.class,
+ () -> mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1));
}
@Test
- public void checkRevocationStatus_allCertificatesBarelyRecentlyChecked_doesNotFetchRemoteCrl()
+ public void checkRevocationStatus_barelyRecentlyChecked_doesNotFetchRemoteCrl()
throws Exception {
copyFromAssetToFile(
- REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+ REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mRevocationListUrl, mRevocationStatusFile, false);
- Map lastCheckedDates = new HashMap<>();
- LocalDateTime barelyRecently =
- LocalDateTime.now()
- .minusHours(
- CertificateRevocationStatusManager.NUM_HOURS_BEFORE_NEXT_CHECK - 1);
- for (X509Certificate certificate : mCertificates1) {
- lastCheckedDates.put(getSerialNumber(certificate), barelyRecently);
- }
- mCertificateRevocationStatusManager.storeLastRevocationCheckData(lastCheckedDates);
+ mContext, mRevocationListUrl, mStoredRevocationListFile, false);
+ mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+ // set the last modified date of the stored list to a barely recent date
+ LocalDateTime now = LocalDateTime.now();
+ LocalDateTime barelyRecentDate =
+ now.minusHours(CertificateRevocationStatusManager.NUM_HOURS_BEFORE_NEXT_FETCH - 1);
+ mStoredRevocationListFile.setLastModified(
+ barelyRecentDate.toEpochSecond(OffsetDateTime.now().getOffset()) * 1000);
+ // indirectly verifies the remote list is not fetched by simulating a remote revocation
+ copyFromAssetToFile(
+ REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
// Indirectly verify the remote CRL is not checked by checking there is no exception despite
- // a certificate being revoked. This test differs from the next only in the lastCheckedDate,
- // one before the NUM_HOURS_BEFORE_NEXT_CHECK cutoff and one after
+ // a certificate being revoked. This test differs from the next only in the stored list last
+ // modified date, one before the NUM_HOURS_BEFORE_NEXT_FETCH cutoff and one after
mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
}
@@ -322,21 +300,20 @@ public class CertificateRevocationStatusManagerTest {
public void checkRevocationStatus_certificatesRevokedAfterCheck_throwsException()
throws Exception {
copyFromAssetToFile(
- REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRevocationListFile);
+ REVOCATION_LIST_WITHOUT_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
mCertificateRevocationStatusManager =
new CertificateRevocationStatusManager(
- mContext, mRevocationListUrl, mRevocationStatusFile, false);
- Map lastCheckedDates = new HashMap<>();
- // To save network use, we do not check the remote CRL if all the certificates are recently
- // checked, so we set the lastCheckDate to some time not recent.
- LocalDateTime notRecently =
- LocalDateTime.now()
- .minusHours(
- CertificateRevocationStatusManager.NUM_HOURS_BEFORE_NEXT_CHECK + 1);
- for (X509Certificate certificate : mCertificates1) {
- lastCheckedDates.put(getSerialNumber(certificate), notRecently);
- }
- mCertificateRevocationStatusManager.storeLastRevocationCheckData(lastCheckedDates);
+ mContext, mRevocationListUrl, mStoredRevocationListFile, false);
+ mCertificateRevocationStatusManager.checkRevocationStatus(mCertificates1);
+ // set the last modified date of the stored list to a barely not recent date
+ LocalDateTime now = LocalDateTime.now();
+ LocalDateTime barelyNotRecentDate =
+ now.minusHours(CertificateRevocationStatusManager.NUM_HOURS_BEFORE_NEXT_FETCH + 1);
+ mStoredRevocationListFile.setLastModified(
+ barelyNotRecentDate.toEpochSecond(OffsetDateTime.now().getOffset()) * 1000);
+ // simulate a remote revocation
+ copyFromAssetToFile(
+ REVOCATION_LIST_WITH_CERTIFICATES_USED_IN_THIS_TEST, mRemoteRevocationListFile);
assertThrows(
CertPathValidatorException.class,
@@ -362,8 +339,4 @@ public class CertificateRevocationStatusManagerTest {
fileOutputStream.write(data);
}
}
-
- private String getSerialNumber(X509Certificate certificate) {
- return certificate.getSerialNumber().toString(16);
- }
}
--
GitLab