diff options
327 files changed, 7048 insertions, 1720 deletions
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 7b6835792370..27f5545d8f03 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -9599,6 +9599,7 @@ public class DevicePolicyManager { } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } catch (IllegalArgumentException ex) { + Log.e(TAG, "IllegalArgumentException checking isPackageSuspended", ex); throw new NameNotFoundException(packageName); } } diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java index efed6883a114..365f9130ddd7 100644 --- a/core/java/android/net/NetworkPolicyManager.java +++ b/core/java/android/net/NetworkPolicyManager.java @@ -16,6 +16,7 @@ package android.net; +import static android.app.ActivityManager.PROCESS_STATE_UNKNOWN; import static android.app.ActivityManager.procStateToString; import static android.content.pm.PackageManager.GET_SIGNATURES; @@ -805,6 +806,9 @@ public class NetworkPolicyManager { /** @hide */ public static boolean isProcStateAllowedWhileIdleOrPowerSaveMode( int procState, @ProcessCapability int capability) { + if (procState == PROCESS_STATE_UNKNOWN) { + return false; + } return procState <= FOREGROUND_THRESHOLD_STATE || (capability & ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK) != 0; } @@ -832,6 +836,9 @@ public class NetworkPolicyManager { /** @hide */ public static boolean isProcStateAllowedWhileOnRestrictBackground(int procState, @ProcessCapability int capabilities) { + if (procState == PROCESS_STATE_UNKNOWN) { + return false; + } return procState <= FOREGROUND_THRESHOLD_STATE // This is meant to be a user-initiated job, and therefore gets similar network // access to FGS. diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 7383e633fb93..9f9c2222f9d9 100755 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -493,7 +493,7 @@ public class Build { * @hide */ @TestApi - public static final int RESOURCES_SDK_INT = SDK_INT; + public static final int RESOURCES_SDK_INT = SDK_INT + ACTIVE_CODENAMES.length; /** * The current lowest supported value of app target SDK. Applications targeting diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java index 68cce4ae274a..79a4f54bac0a 100644 --- a/core/java/android/service/voice/VoiceInteractionService.java +++ b/core/java/android/service/voice/VoiceInteractionService.java @@ -101,7 +101,7 @@ public class VoiceInteractionService extends Service { public static final String SERVICE_META_DATA = "android.voice_interaction"; /** - * For apps targeting Build.VERSION_CODES.TRAMISU and above, implementors of this + * For apps targeting Build.VERSION_CODES.UPSIDE_DOWN_CAKE and above, implementors of this * service can create multiple AlwaysOnHotwordDetector instances in parallel. They will * also e ale to create a single SoftwareHotwordDetector in parallel with any other * active AlwaysOnHotwordDetector instances. @@ -128,7 +128,7 @@ public class VoiceInteractionService extends Service { * @hide */ @ChangeId - @EnabledSince(targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT) + @EnabledSince(targetSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) static final long MULTIPLE_ACTIVE_HOTWORD_DETECTORS = 193232191L; IVoiceInteractionService mInterface = new IVoiceInteractionService.Stub() { diff --git a/core/tests/coretests/src/android/util/RotationUtilsTest.java b/core/tests/coretests/src/android/util/RotationUtilsTest.java index 1b1ee4fb1a1c..06b28f5b58ef 100644 --- a/core/tests/coretests/src/android/util/RotationUtilsTest.java +++ b/core/tests/coretests/src/android/util/RotationUtilsTest.java @@ -19,6 +19,7 @@ package android.util; import static android.util.RotationUtils.rotateBounds; import static android.util.RotationUtils.rotatePoint; import static android.util.RotationUtils.rotatePointF; +import static android.view.Surface.ROTATION_0; import static android.view.Surface.ROTATION_180; import static android.view.Surface.ROTATION_270; import static android.view.Surface.ROTATION_90; @@ -103,4 +104,19 @@ public class RotationUtilsTest { assertEquals(560f, testResult.x, .1f); assertEquals(60f, testResult.y, .1f); } + + @Test + public void testReverseRotationDirectionAroundZAxis() { + assertEquals(ROTATION_90, + RotationUtils.reverseRotationDirectionAroundZAxis(ROTATION_270)); + assertEquals(ROTATION_270, + RotationUtils.reverseRotationDirectionAroundZAxis(ROTATION_90)); + assertEquals(ROTATION_0, + RotationUtils.reverseRotationDirectionAroundZAxis(ROTATION_0)); + assertEquals(ROTATION_180, + RotationUtils.reverseRotationDirectionAroundZAxis(ROTATION_180)); + + assertEquals(-1, + RotationUtils.reverseRotationDirectionAroundZAxis(-1)); + } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java index 27eda16f4171..94675788c514 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java @@ -193,8 +193,11 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition // This Transition animates a task to fullscreen after being dragged from the status // bar and then released back into the status bar area final SurfaceControl sc = change.getLeash(); - startT.setWindowCrop(sc, null); - startT.apply(); + // Hide the first (fullscreen) frame because the animation will start from the smaller + // scale size. + startT.hide(sc) + .setWindowCrop(sc, endBounds.width(), endBounds.height()) + .apply(); final ValueAnimator animator = new ValueAnimator(); animator.setFloatValues(DRAG_FREEFORM_SCALE, 1f); @@ -202,10 +205,10 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition final SurfaceControl.Transaction t = mTransactionSupplier.get(); animator.addUpdateListener(animation -> { final float scale = animation.getAnimatedFraction(); - t.setPosition(sc, mStartPosition.x * (1 - scale), - mStartPosition.y * (1 - scale)); - t.setScale(sc, scale, scale); - t.apply(); + t.setPosition(sc, mStartPosition.x * (1 - scale), mStartPosition.y * (1 - scale)) + .setScale(sc, scale, scale) + .show(sc) + .apply(); }); animator.addListener(new AnimatorListenerAdapter() { @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java index 248a5fce6884..fa3eee257a52 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandler.java @@ -129,8 +129,12 @@ public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionH final int screenWidth = metrics.widthPixels; final int screenHeight = metrics.heightPixels; final SurfaceControl sc = change.getLeash(); - startT.setCrop(sc, null); - startT.apply(); + final Rect endBounds = change.getEndAbsBounds(); + // Hide the first (fullscreen) frame because the animation will start from the freeform + // size. + startT.hide(sc) + .setWindowCrop(sc, endBounds.width(), endBounds.height()) + .apply(); final ValueAnimator animator = new ValueAnimator(); animator.setFloatValues(0f, 1f); animator.setDuration(FULLSCREEN_ANIMATION_DURATION); @@ -144,9 +148,10 @@ public class ExitDesktopTaskTransitionHandler implements Transitions.TransitionH float fraction = animation.getAnimatedFraction(); float currentScaleX = scaleX + ((1 - scaleX) * fraction); float currentScaleY = scaleY + ((1 - scaleY) * fraction); - t.setPosition(sc, startPos.x * (1 - fraction), startPos.y * (1 - fraction)); - t.setScale(sc, currentScaleX, currentScaleY); - t.apply(); + t.setPosition(sc, startPos.x * (1 - fraction), startPos.y * (1 - fraction)) + .setScale(sc, currentScaleX, currentScaleY) + .show(sc) + .apply(); }); animator.addListener(new AnimatorListenerAdapter() { @Override diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java index 2c5a5cd72c53..4fad05433d1c 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/ExitDesktopTaskTransitionHandlerTest.java @@ -71,12 +71,6 @@ public class ExitDesktopTaskTransitionHandlerTest extends ShellTestCase { @Mock Resources mResources; @Mock - SurfaceControl.Transaction mStartT; - @Mock - SurfaceControl.Transaction mFinishT; - @Mock - SurfaceControl.Transaction mAnimationT; - @Mock Transitions.TransitionFinishCallback mTransitionFinishCallback; @Mock ShellExecutor mExecutor; @@ -88,7 +82,7 @@ public class ExitDesktopTaskTransitionHandlerTest extends ShellTestCase { MockitoAnnotations.initMocks(this); doReturn(mExecutor).when(mTransitions).getMainExecutor(); - doReturn(mAnimationT).when(mTransactionFactory).get(); + doReturn(new SurfaceControl.Transaction()).when(mTransactionFactory).get(); doReturn(mResources).when(mContext).getResources(); doReturn(mDisplayMetrics).when(mResources).getDisplayMetrics(); when(mResources.getDisplayMetrics()) @@ -115,7 +109,9 @@ public class ExitDesktopTaskTransitionHandlerTest extends ShellTestCase { runOnUiThread(() -> { try { assertTrue(mExitDesktopTaskTransitionHandler - .startAnimation(mToken, info, mStartT, mFinishT, + .startAnimation(mToken, info, + new SurfaceControl.Transaction(), + new SurfaceControl.Transaction(), mTransitionFinishCallback)); } catch (Exception e) { exceptions.add(e); diff --git a/packages/CredentialManager/res/values/colors.xml b/packages/CredentialManager/res/values/colors.xml deleted file mode 100644 index 09837df62f44..000000000000 --- a/packages/CredentialManager/res/values/colors.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <color name="purple_200">#FFBB86FC</color> - <color name="purple_500">#FF6200EE</color> - <color name="purple_700">#FF3700B3</color> - <color name="teal_200">#FF03DAC5</color> - <color name="teal_700">#FF018786</color> - <color name="black">#FF000000</color> - <color name="white">#FFFFFFFF</color> -</resources>
\ No newline at end of file diff --git a/packages/CredentialManager/res/values/strings.xml b/packages/CredentialManager/res/values/strings.xml index 3e652517270d..905e0ca92733 100644 --- a/packages/CredentialManager/res/values/strings.xml +++ b/packages/CredentialManager/res/values/strings.xml @@ -1,4 +1,19 @@ <?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- The name of this application. Credential Manager is a service that centralizes and provides access to a user's credentials used to sign in to various apps. [CHAR LIMIT=80] --> diff --git a/packages/CredentialManager/res/values/themes.xml b/packages/CredentialManager/res/values/themes.xml index 428c85ac721f..22329e9ff2ce 100644 --- a/packages/CredentialManager/res/values/themes.xml +++ b/packages/CredentialManager/res/values/themes.xml @@ -1,4 +1,19 @@ <?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2023 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> <resources> <style name="Theme.CredentialSelector" parent="@*android:style/ThemeOverlay.DeviceDefault.Accent.DayNight"> <item name="android:windowContentOverlay">@null</item> diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt index 8b9c8b9a768f..6549b2d0187c 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialSelectorActivity.kt @@ -16,6 +16,7 @@ package com.android.credentialmanager +import android.app.Activity import android.content.Intent import android.credentials.ui.BaseDialogResult import android.credentials.ui.RequestInfo @@ -47,6 +48,8 @@ import com.android.credentialmanager.ui.theme.PlatformTheme class CredentialSelectorActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + overrideActivityTransition(Activity.OVERRIDE_TRANSITION_OPEN, + 0, 0) Log.d(Constants.LOG_TAG, "Creating new CredentialSelectorActivity") try { val (isCancellationRequest, shouldShowCancellationUi, _) = diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/material/ModalBottomSheet.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/material/ModalBottomSheet.kt index 10a75d436a5b..250e3b11dea9 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/common/material/ModalBottomSheet.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/common/material/ModalBottomSheet.kt @@ -454,7 +454,7 @@ internal fun Scrim( if (color.isSpecified) { val alpha by animateFloatAsState( targetValue = if (visible) 1f else 0f, - animationSpec = TweenSpec() + animationSpec = TweenSpec(durationMillis = SwipeableDefaults.DefaultDurationMillis) ) LocalConfiguration.current val resources = LocalContext.current.resources diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/material/Swipeable.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/material/Swipeable.kt index 3e2de8321006..e9aaeee5ce50 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/common/material/Swipeable.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/common/material/Swipeable.kt @@ -19,6 +19,7 @@ package com.android.credentialmanager.common.material import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.AnimationSpec import androidx.compose.animation.core.SpringSpec +import androidx.compose.animation.core.Spring import androidx.compose.foundation.gestures.DraggableState import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.gestures.draggable @@ -791,7 +792,12 @@ object SwipeableDefaults { /** * The default animation used by [SwipeableState]. */ - val AnimationSpec = SpringSpec<Float>() + val AnimationSpec = SpringSpec<Float>(stiffness = Spring.StiffnessMediumLow) + + /** + * The default animation duration used by Scrim in enter/exit transitions. + */ + val DefaultDurationMillis: Int = 400 /** * The default velocity threshold (1.8 dp per millisecond) used by [swipeable]. diff --git a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt index 53731f06816a..339968158a91 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/common/ui/BottomSheet.kt @@ -20,6 +20,11 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.ColumnScope import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import com.android.compose.rememberSystemUiController @@ -28,6 +33,8 @@ import com.android.credentialmanager.common.material.ModalBottomSheetValue import com.android.credentialmanager.common.material.rememberModalBottomSheetState import com.android.credentialmanager.ui.theme.EntryShape import com.android.credentialmanager.ui.theme.LocalAndroidColorScheme +import kotlinx.coroutines.launch + /** Draws a modal bottom sheet with the same styles and effects shared by various flows. */ @Composable @@ -35,8 +42,10 @@ fun ModalBottomSheet( sheetContent: @Composable ColumnScope.() -> Unit, onDismiss: () -> Unit ) { + var isInitialRender by remember { mutableStateOf(true) } + val scope = rememberCoroutineScope() val state = rememberModalBottomSheetState( - initialValue = ModalBottomSheetValue.Expanded, + initialValue = ModalBottomSheetValue.Hidden, skipHalfExpanded = true ) val sysUiController = rememberSystemUiController() @@ -54,7 +63,12 @@ fun ModalBottomSheet( ) {} LaunchedEffect(state.currentValue) { if (state.currentValue == ModalBottomSheetValue.Hidden) { - onDismiss() + if (isInitialRender) { + isInitialRender = false + scope.launch { state.show() } + } else { + onDismiss() + } } } }
\ No newline at end of file diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml index 2aa26e321a91..2c2ad92a7830 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml @@ -53,7 +53,7 @@ android:id="@+id/restricted_icon" android:layout_width="@dimen/settingslib_restricted_icon_size" android:layout_height="@dimen/settingslib_restricted_icon_size" - android:tint="?android:attr/colorAccent" + android:tint="@color/settingslib_accent_primary_variant" android:layout_gravity="center_vertical" android:layout_marginEnd="@dimen/settingslib_restricted_icon_margin_end" android:src="@drawable/settingslib_ic_info" diff --git a/packages/SettingsLib/ProfileSelector/res/values-de/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-de/strings.xml new file mode 100644 index 000000000000..d61ff964ef16 --- /dev/null +++ b/packages/SettingsLib/ProfileSelector/res/values-de/strings.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (C) 2022 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="settingslib_category_personal" msgid="1142302328104700620">"Privat"</string> + <string name="settingslib_category_work" msgid="4867750733682444676">"Dienstlich"</string> +</resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-ky/strings.xml b/packages/SettingsLib/SearchWidget/res/values-ky/strings.xml index e61ffdb50a68..88008d6d443f 100644 --- a/packages/SettingsLib/SearchWidget/res/values-ky/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-ky/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Жөндөөлөрдү издөө"</string> + <string name="search_menu" msgid="1914043873178389845">"Параметрлерди издөө"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-vi/strings.xml b/packages/SettingsLib/SearchWidget/res/values-vi/strings.xml index 90daf11c712d..ec6682eeea5f 100644 --- a/packages/SettingsLib/SearchWidget/res/values-vi/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-vi/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Tìm trong thông tin cài đặt"</string> + <string name="search_menu" msgid="1914043873178389845">"Tìm chế độ cài đặt"</string> </resources> diff --git a/packages/SettingsLib/SearchWidget/res/values-zu/strings.xml b/packages/SettingsLib/SearchWidget/res/values-zu/strings.xml index 900f4ba68a9c..3d36fa6d9d18 100644 --- a/packages/SettingsLib/SearchWidget/res/values-zu/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-zu/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="search_menu" msgid="1914043873178389845">"Sesha izilungiselelo"</string> + <string name="search_menu" msgid="1914043873178389845">"Amasethingi okusesha"</string> </resources> diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java index 5e8f3a18cbc0..fe8988385453 100644 --- a/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java +++ b/packages/SettingsLib/src/com/android/settingslib/applications/ApplicationsState.java @@ -734,7 +734,10 @@ public class ApplicationsState { private AppEntry getEntryLocked(ApplicationInfo info) { int userId = UserHandle.getUserId(info.uid); - AppEntry entry = mEntriesMap.get(userId).get(info.packageName); + AppEntry entry = null; + if (mEntriesMap.contains(userId)) { + entry = mEntriesMap.get(userId).get(info.packageName); + } if (DEBUG) { Log.i(TAG, "Looking up entry of pkg " + info.packageName + ": " + entry); } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java index 96e64ea1de71..1d081d7214cc 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ApplicationsStateRoboTest.java @@ -89,6 +89,7 @@ import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.UUID; @@ -801,4 +802,21 @@ public class ApplicationsStateRoboTest { assertThat(nonPrimaryUserApp1.shouldShowInPersonalTab(um, appInfo1.uid)).isTrue(); assertThat(nonPrimaryUserApp2.shouldShowInPersonalTab(um, appInfo2.uid)).isFalse(); } + + @Test + public void getEntry_validUserId_shouldReturnEntry() { + mApplicationsState.mEntriesMap.put(/* userId= */ 0, new HashMap<>()); + addApp(PKG_1, /* id= */ 1); + + assertThat(mApplicationsState.getEntry(PKG_1, /* userId= */ 0).info.packageName) + .isEqualTo(PKG_1); + } + + @Test + public void getEntry_invalidUserId_shouldReturnNull() { + mApplicationsState.mEntriesMap.put(/* userId= */ 0, new HashMap<>()); + addApp(PKG_1, /* id= */ 1); + + assertThat(mApplicationsState.getEntry(PKG_1, /* userId= */ -1)).isNull(); + } } diff --git a/packages/SettingsProvider/res/values-ky/strings.xml b/packages/SettingsProvider/res/values-ky/strings.xml index 7ab6582cebcb..830182b26594 100644 --- a/packages/SettingsProvider/res/values-ky/strings.xml +++ b/packages/SettingsProvider/res/values-ky/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="app_label" msgid="4567566098528588863">"Жөндөөлөрдү сактоо"</string> + <string name="app_label" msgid="4567566098528588863">"Параметрлерди сактоо"</string> <string name="wifi_softap_config_change" msgid="5688373762357941645">"Байланыш түйүнү параметрлери өзгөрдү"</string> <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Чоо-жайын билүү үчүн басыңыз"</string> </resources> diff --git a/packages/Shell/res/values-am/strings.xml b/packages/Shell/res/values-am/strings.xml index fe1f2289f0af..6cc13eceaaee 100644 --- a/packages/Shell/res/values-am/strings.xml +++ b/packages/Shell/res/values-am/strings.xml @@ -25,9 +25,9 @@ <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"የሳንካ ሪፖርቱ ከትንሽ ጊዜ በኋላ በስልኩ ላይ ይመጣል"</string> <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"የሳንካ ሪፖርትዎን ለማጋራት ይምረጡ"</string> <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"የሳንካ ሪፖርትዎን ለማጋራት መታ ያድርጉ"</string> - <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"የእርስዎን የሳንካ ሪፖርት ያለ ቅጽበታዊ ማያ ገጽ ለማጋራት ይምረጡ ወይም ቅጽበታዊ ማያ ገጹ እስኪጨርስ ይጠብቁ"</string> - <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"የእርስዎን የሳንካ ሪፖርት ያለ ቅጽበታዊ ማያ ገጽ ለማጋራት መታ ያድርጉ ወይም ቅጽበታዊ ማያ ገጹ እስኪጨርስ ይጠብቁ"</string> - <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"የእርስዎን የሳንካ ሪፖርት ያለ ቅጽበታዊ ማያ ገጽ ለማጋራት መታ ያድርጉ ወይም ቅጽበታዊ ማያ ገጹ እስኪጨርስ ይጠብቁ"</string> + <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"የእርስዎን የሳንካ ሪፖርት ያለ ቅጽበታዊ ማያ ገፅ ለማጋራት ይምረጡ ወይም ቅጽበታዊ ማያ ገጹ እስኪጨርስ ይጠብቁ"</string> + <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"የእርስዎን የሳንካ ሪፖርት ያለ ቅጽበታዊ ማያ ገፅ ለማጋራት መታ ያድርጉ ወይም ቅጽበታዊ ማያ ገጹ እስኪጨርስ ይጠብቁ"</string> + <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"የእርስዎን የሳንካ ሪፖርት ያለ ቅጽበታዊ ማያ ገፅ ለማጋራት መታ ያድርጉ ወይም ቅጽበታዊ ማያ ገጹ እስኪጨርስ ይጠብቁ"</string> <string name="bugreport_confirm" msgid="5917407234515812495">"የሳንካ ሪፖርቶች ከተለያዩ የስርዓቱ የምዝግብ ማስታወሻ ፋይሎች የመጣ ውሂብ ይዘዋል፣ እነዚህም እርስዎ ሚስጥራዊነት ያለው ብለው የሚቆጥሯቸው (እንደ የመተግበሪያ አጠቃቀም እና የአካባቢ ውሂብ ያለ) ሊያካትቱ ይችላሉ። የሳንካ ሪፖርቶች ለሚያምኗቸው ሰዎች እና መተግበሪያዎች ብቻ ያጋሩ።"</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"ዳግም አታሳይ"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"የሳንካ ሪፖርቶች"</string> @@ -35,9 +35,9 @@ <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"የሳንካ ሪፖርት ዝርዝሮችን ወደ ዚፕ ፋይል ማከል አልተቻለም"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"ያልተሰየመ"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"ዝርዝሮች"</string> - <string name="bugreport_screenshot_action" msgid="8677781721940614995">"ቅጽበታዊ ገጽ እይታ"</string> - <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"ቅጽበታዊ ገጽ እይታ በተሳካ ሁኔታ ተነስቷል"</string> - <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ቅጽበታዊ ገጽ እይታ ሊነሳ አይችልም"</string> + <string name="bugreport_screenshot_action" msgid="8677781721940614995">"ቅጽበታዊ ገፅ እይታ"</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"ቅጽበታዊ ገፅ እይታ በተሳካ ሁኔታ ተነስቷል"</string> + <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ቅጽበታዊ ገፅ እይታ ሊነሳ አይችልም"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"የሳንካ ሪፖርት <xliff:g id="ID">#%d</xliff:g> ዝርዝሮች"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"የፋይል ስም"</string> <string name="bugreport_info_title" msgid="2306030793918239804">"የሳንካ ርዕስ"</string> diff --git a/packages/Shell/res/values-zh-rHK/strings.xml b/packages/Shell/res/values-zh-rHK/strings.xml index ccbea4d371cc..91b17709fa38 100644 --- a/packages/Shell/res/values-zh-rHK/strings.xml +++ b/packages/Shell/res/values-zh-rHK/strings.xml @@ -28,7 +28,7 @@ <string name="bugreport_finished_pending_screenshot_text" product="tv" msgid="2343263822812016950">"選擇以分享錯誤報告 (不包含螢幕擷取畫面),或等待螢幕畫面擷取完成"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"輕按以分享錯誤報告 (不包含螢幕擷圖),或等待螢幕畫面擷取完成"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"輕按以分享錯誤報告 (不包含螢幕擷圖),或等待螢幕畫面擷取完成"</string> - <string name="bugreport_confirm" msgid="5917407234515812495">"錯誤報告包含來自系統多個記錄檔案的資料,並可能涉及對您而言敏感的資料 (例如應用程式使用情況和位置資料)。您只應與信任的人和應用程式分享錯誤報告。"</string> + <string name="bugreport_confirm" msgid="5917407234515812495">"錯誤報告包含來自系統多個記錄檔案的資料,並可能涉及對你而言敏感的資料 (例如應用程式使用情況和位置資料)。你只應與信任的人和應用程式分享錯誤報告。"</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"不要再顯示"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"錯誤報告"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"無法讀取錯誤報告檔案"</string> diff --git a/packages/SoundPicker/res/values-fi/strings.xml b/packages/SoundPicker/res/values-fi/strings.xml index 9f64f8379b43..fcda098b6aa6 100644 --- a/packages/SoundPicker/res/values-fi/strings.xml +++ b/packages/SoundPicker/res/values-fi/strings.xml @@ -18,7 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="ringtone_default" msgid="798836092118824500">"Oletussoittoääni"</string> <string name="notification_sound_default" msgid="8133121186242636840">"Ilmoituksen oletusääni"</string> - <string name="alarm_sound_default" msgid="4787646764557462649">"Herätyksen oletusääni"</string> + <string name="alarm_sound_default" msgid="4787646764557462649">"Hälytyksen oletusääni"</string> <string name="add_ringtone_text" msgid="6642389991738337529">"Lisää soittoääni"</string> <string name="add_alarm_text" msgid="3545497316166999225">"Lisää hälytys"</string> <string name="add_notification_text" msgid="4431129543300614788">"Lisää ilmoitus"</string> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml index f215e857bb27..0aeb410d5e28 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml @@ -2,25 +2,25 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="accessibility_menu_service_name" msgid="730136711554740131">"የተደራሽነት ምናሌ"</string> - <string name="accessibility_menu_intro" msgid="3164193281544042394">"የተደራሽነት ምናሌ መሣሪያዎን ለመቆጣጠር ትልቅ የማያ ገጽ ላይ ምናሌን ያቀርባል። የእርስዎን መሣሪያ መቆለፍ፣ ድምፅን እና ብሩህነትን መቆጣጠር፣ ቅጽበታዊ ገጽ ዕይታዎችን ማንሳት እና ተጨማሪ ነገሮችን ማድረግ ይችላሉ።"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"የተደራሽነት ምናሌ መሣሪያዎን ለመቆጣጠር ትልቅ የማያ ገፅ ላይ ምናሌን ያቀርባል። የእርስዎን መሣሪያ መቆለፍ፣ ድምፅን እና ብሩህነትን መቆጣጠር፣ ቅጽበታዊ ገፅ ዕይታዎችን ማንሳት እና ተጨማሪ ነገሮችን ማድረግ ይችላሉ።"</string> <string name="assistant_label" msgid="6796392082252272356">"ረዳት"</string> <string name="assistant_utterance" msgid="65509599221141377">"ረዳት"</string> <string name="a11y_settings_label" msgid="3977714687248445050">"የተደራሽነት ቅንብሮች"</string> <string name="power_label" msgid="7699720321491287839">"ኃይል"</string> <string name="power_utterance" msgid="7444296686402104807">"የኃይል አማራጮች"</string> <string name="recent_apps_label" msgid="6583276995616385847">"የቅርብ ጊዜ መተግበሪያዎች"</string> - <string name="lockscreen_label" msgid="648347953557887087">"ማያ ገጽ ቁልፍ"</string> + <string name="lockscreen_label" msgid="648347953557887087">"ማያ ገፅ ቁልፍ"</string> <string name="quick_settings_label" msgid="2999117381487601865">"ፈጣን ቅንብሮች"</string> <string name="notifications_label" msgid="6829741046963013567">"ማሳወቂያዎች"</string> - <string name="screenshot_label" msgid="863978141223970162">"ቅጽበታዊ ገጽ እይታ"</string> - <string name="screenshot_utterance" msgid="1430760563401895074">"ቅጽበታዊ ገጽ እይታን ያነሳል"</string> + <string name="screenshot_label" msgid="863978141223970162">"ቅጽበታዊ ገፅ እይታ"</string> + <string name="screenshot_utterance" msgid="1430760563401895074">"ቅጽበታዊ ገፅ እይታን ያነሳል"</string> <string name="volume_up_label" msgid="8592766918780362870">"ድምፅ ጨምር"</string> <string name="volume_down_label" msgid="8574981863656447346">"ድምፅ ቀንስ"</string> <string name="brightness_up_label" msgid="8010753822854544846">"ብሩህነት ጨምር"</string> <string name="brightness_down_label" msgid="7115662941913272072">"ብሩህነት ቀንስ"</string> - <string name="previous_button_content_description" msgid="840869171117765966">"ወደ ቀዳሚው ማያ ገጽ ይሂዱ"</string> - <string name="next_button_content_description" msgid="6810058269847364406">"ወደ ቀጣዩ ማያ ገጽ ይሂዱ"</string> - <string name="accessibility_menu_description" msgid="4458354794093858297">"የተደራሽነት ምናሌ መሣሪያዎን ለመቆጣጠር ትልቅ የማያ ገጽ ላይ ምናሌን ያቀርባል። የእርስዎን መሣሪያ መቆለፍ፣ ድምፅን እና ብሩህነትን መቆጣጠር፣ ቅጽበታዊ ገጽ ዕይታዎችን ማንሳት እና ተጨማሪ ነገሮችን ማድረግ ይችላሉ።"</string> + <string name="previous_button_content_description" msgid="840869171117765966">"ወደ ቀዳሚው ማያ ገፅ ይሂዱ"</string> + <string name="next_button_content_description" msgid="6810058269847364406">"ወደ ቀጣዩ ማያ ገፅ ይሂዱ"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"የተደራሽነት ምናሌ መሣሪያዎን ለመቆጣጠር ትልቅ የማያ ገፅ ላይ ምናሌን ያቀርባል። የእርስዎን መሣሪያ መቆለፍ፣ ድምፅን እና ብሩህነትን መቆጣጠር፣ ቅጽበታዊ ገፅ ዕይታዎችን ማንሳት እና ተጨማሪ ነገሮችን ማድረግ ይችላሉ።"</string> <string name="accessibility_menu_summary" msgid="340071398148208130">"መሣሪያውን በትልቅ ምናሌ በኩል ይቆጣጠሩ"</string> <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"የተደራሽነት ምናሌ ቅንብሮች"</string> <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ትልቅ አዝራሮች"</string> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-cs/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-cs/strings.xml index c0d9d4566e6f..e5dd693505cf 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-cs/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-cs/strings.xml @@ -21,7 +21,7 @@ <string name="previous_button_content_description" msgid="840869171117765966">"Zpět na předchozí obrazovku"</string> <string name="next_button_content_description" msgid="6810058269847364406">"Přejít na další obrazovku"</string> <string name="accessibility_menu_description" msgid="4458354794093858297">"Nabídka usnadnění přístupu zobrazuje na obrazovce velkou nabídku k ovládání zařízení. Můžete zamknout zařízení, upravit hlasitost a jas, pořídit snímek obrazovky apod."</string> - <string name="accessibility_menu_summary" msgid="340071398148208130">"Ovládejte zařízení pomocí velké nabídky"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Ovládat zařízení pomocí velké nabídky"</string> <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Nastavení nabídky usnadnění přístupu"</string> <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Velká tlačítka"</string> <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Zvětšit tlačítka v nabídce přístupnosti"</string> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr-rCA/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr-rCA/strings.xml index 1715d56ede7a..87a95037178e 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr-rCA/strings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="accessibility_menu_service_name" msgid="730136711554740131">"menu Accessibilité"</string> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu Accessibilité"</string> <string name="accessibility_menu_intro" msgid="3164193281544042394">"Le menu Accessibilité propose un grand espace à l\'écran à l\'aide duquel vous pouvez contrôler votre appareil. Utilisez-le pour verrouiller votre appareil, régler le volume et la luminosité, prendre des captures d\'écran et plus."</string> <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr/strings.xml index 10c6169b3365..140caffaa6d4 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-fr/strings.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu d\'accessibilité"</string> + <string name="accessibility_menu_service_name" msgid="730136711554740131">"Menu Accessibilité"</string> <string name="accessibility_menu_intro" msgid="3164193281544042394">"Le menu d\'accessibilité s\'affiche en grand sur votre écran pour vous permettre de contrôler votre appareil. Vous pouvez verrouiller votre appareil, ajuster le volume et la luminosité, réaliser des captures d\'écran, et plus encore."</string> <string name="assistant_label" msgid="6796392082252272356">"Assistant"</string> <string name="assistant_utterance" msgid="65509599221141377">"Assistant"</string> @@ -21,7 +21,7 @@ <string name="previous_button_content_description" msgid="840869171117765966">"Revenir à l\'écran précédent"</string> <string name="next_button_content_description" msgid="6810058269847364406">"Accéder à l\'écran suivant"</string> <string name="accessibility_menu_description" msgid="4458354794093858297">"Le menu d\'accessibilité s\'affiche en grand sur votre écran pour vous permettre de contrôler votre appareil. Vous pouvez verrouiller votre appareil, ajuster le volume et la luminosité, réaliser des captures d\'écran, et plus encore."</string> - <string name="accessibility_menu_summary" msgid="340071398148208130">"Contrôlez votre appareil via un grand menu"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Contrôler l\'appareil via un grand menu"</string> <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Paramètres du menu d\'accessibilité"</string> <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Boutons de grande taille"</string> <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Augmenter la taille des boutons du menu d\'accessibilité"</string> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-my/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-my/strings.xml index dacd68ad409d..1097f87c0be9 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-my/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-my/strings.xml @@ -21,7 +21,7 @@ <string name="previous_button_content_description" msgid="840869171117765966">"ယခင် မျက်နှာပြင်သို့ သွားရန်"</string> <string name="next_button_content_description" msgid="6810058269847364406">"နောက်မျက်နှာပြင်သို့ ဆက်သွားရန်"</string> <string name="accessibility_menu_description" msgid="4458354794093858297">"‘အများသုံးနိုင်မှု မီနူး’ တွင် သင့်စက်ပစ္စည်းကို စီမံရန် ကြီးမားသည့်ဖန်သားပြင်မီနူး ပါဝင်သည်။ စက်ပစ္စည်းလော့ခ်ချခြင်း၊ အသံအတိုးအကျယ်နှင့် အလင်းအမှောင် ထိန်းချုပ်ခြင်း၊ ဖန်သားပြင်ဓာတ်ပုံရိုက်ခြင်း စသည်တို့ ပြုလုပ်နိုင်သည်။"</string> - <string name="accessibility_menu_summary" msgid="340071398148208130">"ကြီးမားသည့်မီးနူးဖြင့် စက်ပစ္စည်းကို စီမံနိုင်သည်"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"ကြီးမားသည့်မီနူးဖြင့် စက်ပစ္စည်းကို စီမံနိုင်သည်"</string> <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"အများသုံးနိုင်မှု မီနူးဆက်တင်များ"</string> <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"ခလုတ်အကြီးများ"</string> <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"\'အများသုံးနိုင်မှု မီနူး ခလုတ်များ\' ၏ အရွယ်အစားတိုးရန်"</string> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml index c4bf89a4c443..c29002b38c5a 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-sk/strings.xml @@ -21,7 +21,7 @@ <string name="previous_button_content_description" msgid="840869171117765966">"Prejsť na predchádzajúcu obrazovku"</string> <string name="next_button_content_description" msgid="6810058269847364406">"Prejsť na ďalšiu obrazovku"</string> <string name="accessibility_menu_description" msgid="4458354794093858297">"Ponuka dostupnosti spustí na obrazovke telefónu veľkú ponuku, pomocou ktorej môžete ovládať svoje zariadenie. Môžete ho uzamknúť, ovládať hlasitosť a jas, vytvárať snímky obrazovky a mnoho ďalšieho."</string> - <string name="accessibility_menu_summary" msgid="340071398148208130">"Ovládajte zariadenie pomocou veľkej ponuky"</string> + <string name="accessibility_menu_summary" msgid="340071398148208130">"Ovládať zariadenie pomocou veľkej ponuky"</string> <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"Nastavenia ponuky dostupnosti"</string> <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"Veľké tlačidlá"</string> <string name="accessibility_menu_large_buttons_summary" msgid="236873938502785311">"Zväčšiť tlačidlá ponuky dostupnosti"</string> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rHK/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rHK/strings.xml index 9f4033cb0bf1..fed2e9cafc5e 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-zh-rHK/strings.xml @@ -2,7 +2,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="accessibility_menu_service_name" msgid="730136711554740131">"無障礙功能選單"</string> - <string name="accessibility_menu_intro" msgid="3164193281544042394">"「無障礙功能選單」是螢幕上的大型選單,用來控制裝置,方便您鎖定裝置、控制音量和亮度、擷取螢幕畫面及執行其他功能。"</string> + <string name="accessibility_menu_intro" msgid="3164193281544042394">"「無障礙功能選單」是螢幕上的大型選單,用來控制裝置,方便你鎖定裝置、控制音量和亮度、擷取螢幕畫面及執行其他功能。"</string> <string name="assistant_label" msgid="6796392082252272356">"Google 助理"</string> <string name="assistant_utterance" msgid="65509599221141377">"Google 助理"</string> <string name="a11y_settings_label" msgid="3977714687248445050">"無障礙功能設定"</string> @@ -20,7 +20,7 @@ <string name="brightness_down_label" msgid="7115662941913272072">"調暗亮度"</string> <string name="previous_button_content_description" msgid="840869171117765966">"前往上一個畫面"</string> <string name="next_button_content_description" msgid="6810058269847364406">"前往下一個畫面"</string> - <string name="accessibility_menu_description" msgid="4458354794093858297">"「無障礙功能選單」是螢幕上的大型選單,用來控制裝置,方便您鎖定裝置、控制音量和亮度、擷取螢幕截圖及執行其他功能。"</string> + <string name="accessibility_menu_description" msgid="4458354794093858297">"「無障礙功能選單」是螢幕上的大型選單,用來控制裝置,方便你鎖定裝置、控制音量和亮度、擷取螢幕截圖及執行其他功能。"</string> <string name="accessibility_menu_summary" msgid="340071398148208130">"透過大型選單控制裝置"</string> <string name="accessibility_menu_settings_name" msgid="1716888058785672611">"無障礙功能選單設定"</string> <string name="accessibility_menu_large_buttons_title" msgid="8978499601044961736">"大按鈕"</string> diff --git a/packages/SystemUI/animation/Android.bp b/packages/SystemUI/animation/Android.bp index 8eb012d2e41c..5b5871f95fb3 100644 --- a/packages/SystemUI/animation/Android.bp +++ b/packages/SystemUI/animation/Android.bp @@ -43,7 +43,6 @@ android_library { "androidx.core_core-ktx", "androidx.annotation_annotation", "SystemUIShaderLib", - "animationlib", ], manifest: "AndroidManifest.xml", diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt index 2e803798fccb..296c2ae5cf99 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt @@ -39,9 +39,9 @@ import android.view.animation.Interpolator import android.view.animation.PathInterpolator import androidx.annotation.BinderThread import androidx.annotation.UiThread -import com.android.app.animation.Interpolators import com.android.internal.annotations.VisibleForTesting import com.android.internal.policy.ScreenDecorationsUtils +import java.lang.IllegalArgumentException import kotlin.math.roundToInt private const val TAG = "ActivityLaunchAnimator" diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt index 48dd08f206c1..42a86363bf01 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt @@ -33,10 +33,10 @@ import android.view.WindowInsets import android.view.WindowManager import android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS import android.widget.FrameLayout -import com.android.app.animation.Interpolators import com.android.internal.jank.InteractionJankMonitor import com.android.internal.jank.InteractionJankMonitor.CujType import com.android.systemui.util.registerAnimationOnBackInvoked +import java.lang.IllegalArgumentException import kotlin.math.roundToInt private const val TAG = "DialogLaunchAnimator" diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java b/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java new file mode 100644 index 000000000000..9dbb9205b90e --- /dev/null +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/Interpolators.java @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.animation; + +import android.graphics.Path; +import android.util.MathUtils; +import android.view.animation.AccelerateDecelerateInterpolator; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.BounceInterpolator; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; +import android.view.animation.LinearInterpolator; +import android.view.animation.PathInterpolator; + +/** + * Utility class to receive interpolators from. + * + * Make sure that changes made to this class are also reflected in {@link InterpolatorsAndroidX}. + * Please consider using the androidx dependencies featuring better testability altogether. + */ +public class Interpolators { + + /* + * ============================================================================================ + * Emphasized interpolators. + * ============================================================================================ + */ + + /** + * The default emphasized interpolator. Used for hero / emphasized movement of content. + */ + public static final Interpolator EMPHASIZED = createEmphasizedInterpolator(); + + /** + * The accelerated emphasized interpolator. Used for hero / emphasized movement of content that + * is disappearing e.g. when moving off screen. + */ + public static final Interpolator EMPHASIZED_ACCELERATE = new PathInterpolator( + 0.3f, 0f, 0.8f, 0.15f); + + /** + * The decelerating emphasized interpolator. Used for hero / emphasized movement of content that + * is appearing e.g. when coming from off screen + */ + public static final Interpolator EMPHASIZED_DECELERATE = new PathInterpolator( + 0.05f, 0.7f, 0.1f, 1f); + + + /* + * ============================================================================================ + * Standard interpolators. + * ============================================================================================ + */ + + /** + * The standard interpolator that should be used on every normal animation + */ + public static final Interpolator STANDARD = new PathInterpolator( + 0.2f, 0f, 0f, 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. + */ + public static final Interpolator STANDARD_DECELERATE = new PathInterpolator( + 0f, 0f, 0f, 1f); + + /* + * ============================================================================================ + * Legacy + * ============================================================================================ + */ + + /** + * The default legacy interpolator as defined in Material 1. Also known as FAST_OUT_SLOW_IN. + */ + public static final Interpolator LEGACY = new PathInterpolator(0.4f, 0f, 0.2f, 1f); + + /** + * The default legacy accelerating interpolator as defined in Material 1. + * Also known as FAST_OUT_LINEAR_IN. + */ + public static final Interpolator LEGACY_ACCELERATE = new PathInterpolator(0.4f, 0f, 1f, 1f); + + /** + * The default legacy decelerating interpolator as defined in Material 1. + * Also known as LINEAR_OUT_SLOW_IN. + */ + public static final Interpolator LEGACY_DECELERATE = new PathInterpolator(0f, 0f, 0.2f, 1f); + + /** + * Linear interpolator. Often used if the interpolator is for different properties who need + * different interpolations. + */ + public static final Interpolator LINEAR = new LinearInterpolator(); + + /* + * ============================================================================================ + * Custom interpolators + * ============================================================================================ + */ + + public static final Interpolator FAST_OUT_SLOW_IN = LEGACY; + public static final Interpolator FAST_OUT_LINEAR_IN = LEGACY_ACCELERATE; + public static final Interpolator LINEAR_OUT_SLOW_IN = LEGACY_DECELERATE; + + /** + * Like {@link #FAST_OUT_SLOW_IN}, but used in case the animation is played in reverse (i.e. t + * goes from 1 to 0 instead of 0 to 1). + */ + public static final Interpolator FAST_OUT_SLOW_IN_REVERSE = + new PathInterpolator(0.8f, 0f, 0.6f, 1f); + public static final Interpolator SLOW_OUT_LINEAR_IN = new PathInterpolator(0.8f, 0f, 1f, 1f); + public static final Interpolator ALPHA_IN = new PathInterpolator(0.4f, 0f, 1f, 1f); + public static final Interpolator ALPHA_OUT = new PathInterpolator(0f, 0f, 0.8f, 1f); + public static final Interpolator ACCELERATE = new AccelerateInterpolator(); + public static final Interpolator ACCELERATE_DECELERATE = new AccelerateDecelerateInterpolator(); + public static final Interpolator DECELERATE_QUINT = new DecelerateInterpolator(2.5f); + public static final Interpolator CUSTOM_40_40 = new PathInterpolator(0.4f, 0f, 0.6f, 1f); + public static final Interpolator ICON_OVERSHOT = new PathInterpolator(0.4f, 0f, 0.2f, 1.4f); + public static final Interpolator ICON_OVERSHOT_LESS = new PathInterpolator(0.4f, 0f, 0.2f, + 1.1f); + public static final Interpolator PANEL_CLOSE_ACCELERATED = new PathInterpolator(0.3f, 0, 0.5f, + 1); + public static final Interpolator BOUNCE = new BounceInterpolator(); + /** + * For state transitions on the control panel that lives in GlobalActions. + */ + public static final Interpolator CONTROL_STATE = new PathInterpolator(0.4f, 0f, 0.2f, + 1.0f); + + /** + * Interpolator to be used when animating a move based on a click. Pair with enough duration. + */ + public static final Interpolator TOUCH_RESPONSE = + new PathInterpolator(0.3f, 0f, 0.1f, 1f); + + /** + * Like {@link #TOUCH_RESPONSE}, but used in case the animation is played in reverse (i.e. t + * goes from 1 to 0 instead of 0 to 1). + */ + public static final Interpolator TOUCH_RESPONSE_REVERSE = + new PathInterpolator(0.9f, 0f, 0.7f, 1f); + + /* + * ============================================================================================ + * Functions / Utilities + * ============================================================================================ + */ + + /** + * Calculate the amount of overshoot using an exponential falloff function with desired + * properties, where the overshoot smoothly transitions at the 1.0f boundary into the + * overshoot, retaining its acceleration. + * + * @param progress a progress value going from 0 to 1 + * @param overshootAmount the amount > 0 of overshoot desired. A value of 0.1 means the max + * value of the overall progress will be at 1.1. + * @param overshootStart the point in (0,1] where the result should reach 1 + * @return the interpolated overshoot + */ + public static float getOvershootInterpolation(float progress, float overshootAmount, + float overshootStart) { + if (overshootAmount == 0.0f || overshootStart == 0.0f) { + throw new IllegalArgumentException("Invalid values for overshoot"); + } + float b = MathUtils.log((overshootAmount + 1) / (overshootAmount)) / overshootStart; + return MathUtils.max(0.0f, + (float) (1.0f - Math.exp(-b * progress)) * (overshootAmount + 1.0f)); + } + + /** + * Similar to {@link #getOvershootInterpolation(float, float, float)} but the overshoot + * starts immediately here, instead of first having a section of non-overshooting + * + * @param progress a progress value going from 0 to 1 + */ + public static float getOvershootInterpolation(float progress) { + return MathUtils.max(0.0f, (float) (1.0f - Math.exp(-4 * progress))); + } + + // Create the default emphasized interpolator + private static PathInterpolator createEmphasizedInterpolator() { + Path path = new Path(); + // Doing the same as fast_out_extra_slow_in + path.moveTo(0f, 0f); + path.cubicTo(0.05f, 0f, 0.133333f, 0.06f, 0.166666f, 0.4f); + path.cubicTo(0.208333f, 0.82f, 0.25f, 1f, 1f, 1f); + return new PathInterpolator(path); + } +} diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/InterpolatorsAndroidX.java b/packages/SystemUI/animation/src/com/android/systemui/animation/InterpolatorsAndroidX.java new file mode 100644 index 000000000000..8da87feb1fee --- /dev/null +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/InterpolatorsAndroidX.java @@ -0,0 +1,219 @@ +/* + * Copyright (C) 2022 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; + +import android.graphics.Path; +import android.util.MathUtils; + +import androidx.core.animation.AccelerateDecelerateInterpolator; +import androidx.core.animation.AccelerateInterpolator; +import androidx.core.animation.BounceInterpolator; +import androidx.core.animation.DecelerateInterpolator; +import androidx.core.animation.Interpolator; +import androidx.core.animation.LinearInterpolator; +import androidx.core.animation.PathInterpolator; + +/** + * Utility class to receive interpolators from. (androidx compatible version) + * + * This is the androidx compatible version of {@link Interpolators}. Make sure that changes made to + * this class are also reflected in {@link Interpolators}. + * + * Using the androidx versions of {@link androidx.core.animation.ValueAnimator} or + * {@link androidx.core.animation.ObjectAnimator} improves animation testability. This file provides + * the androidx compatible versions of the interpolators defined in {@link Interpolators}. + * AnimatorTestRule can be used in Tests to manipulate the animation under test (e.g. artificially + * advancing the time). + */ +public class InterpolatorsAndroidX { + + /* + * ============================================================================================ + * Emphasized interpolators. + * ============================================================================================ + */ + + /** + * The default emphasized interpolator. Used for hero / emphasized movement of content. + */ + public static final Interpolator EMPHASIZED = createEmphasizedInterpolator(); + + /** + * The accelerated emphasized interpolator. Used for hero / emphasized movement of content that + * is disappearing e.g. when moving off screen. + */ + public static final Interpolator EMPHASIZED_ACCELERATE = new PathInterpolator( + 0.3f, 0f, 0.8f, 0.15f); + + /** + * The decelerating emphasized interpolator. Used for hero / emphasized movement of content that + * is appearing e.g. when coming from off screen + */ + public static final Interpolator EMPHASIZED_DECELERATE = new PathInterpolator( + 0.05f, 0.7f, 0.1f, 1f); + + + /* + * ============================================================================================ + * Standard interpolators. + * ============================================================================================ + */ + + /** + * The standard interpolator that should be used on every normal animation + */ + public static final Interpolator STANDARD = new PathInterpolator( + 0.2f, 0f, 0f, 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. + */ + public static final Interpolator STANDARD_DECELERATE = new PathInterpolator( + 0f, 0f, 0f, 1f); + + /* + * ============================================================================================ + * Legacy + * ============================================================================================ + */ + + /** + * The default legacy interpolator as defined in Material 1. Also known as FAST_OUT_SLOW_IN. + */ + public static final Interpolator LEGACY = new PathInterpolator(0.4f, 0f, 0.2f, 1f); + + /** + * The default legacy accelerating interpolator as defined in Material 1. + * Also known as FAST_OUT_LINEAR_IN. + */ + public static final Interpolator LEGACY_ACCELERATE = new PathInterpolator(0.4f, 0f, 1f, 1f); + + /** + * The default legacy decelerating interpolator as defined in Material 1. + * Also known as LINEAR_OUT_SLOW_IN. + */ + public static final Interpolator LEGACY_DECELERATE = new PathInterpolator(0f, 0f, 0.2f, 1f); + + /** + * Linear interpolator. Often used if the interpolator is for different properties who need + * different interpolations. + */ + public static final Interpolator LINEAR = new LinearInterpolator(); + + /* + * ============================================================================================ + * Custom interpolators + * ============================================================================================ + */ + + public static final Interpolator FAST_OUT_SLOW_IN = LEGACY; + public static final Interpolator FAST_OUT_LINEAR_IN = LEGACY_ACCELERATE; + public static final Interpolator LINEAR_OUT_SLOW_IN = LEGACY_DECELERATE; + + /** + * Like {@link #FAST_OUT_SLOW_IN}, but used in case the animation is played in reverse (i.e. t + * goes from 1 to 0 instead of 0 to 1). + */ + public static final Interpolator FAST_OUT_SLOW_IN_REVERSE = + new PathInterpolator(0.8f, 0f, 0.6f, 1f); + public static final Interpolator SLOW_OUT_LINEAR_IN = new PathInterpolator(0.8f, 0f, 1f, 1f); + public static final Interpolator ALPHA_IN = new PathInterpolator(0.4f, 0f, 1f, 1f); + public static final Interpolator ALPHA_OUT = new PathInterpolator(0f, 0f, 0.8f, 1f); + public static final Interpolator ACCELERATE = new AccelerateInterpolator(); + public static final Interpolator ACCELERATE_DECELERATE = new AccelerateDecelerateInterpolator(); + public static final Interpolator DECELERATE_QUINT = new DecelerateInterpolator(2.5f); + public static final Interpolator CUSTOM_40_40 = new PathInterpolator(0.4f, 0f, 0.6f, 1f); + public static final Interpolator ICON_OVERSHOT = new PathInterpolator(0.4f, 0f, 0.2f, 1.4f); + public static final Interpolator ICON_OVERSHOT_LESS = new PathInterpolator(0.4f, 0f, 0.2f, + 1.1f); + public static final Interpolator PANEL_CLOSE_ACCELERATED = new PathInterpolator(0.3f, 0, 0.5f, + 1); + public static final Interpolator BOUNCE = new BounceInterpolator(); + /** + * For state transitions on the control panel that lives in GlobalActions. + */ + public static final Interpolator CONTROL_STATE = new PathInterpolator(0.4f, 0f, 0.2f, + 1.0f); + + /** + * Interpolator to be used when animating a move based on a click. Pair with enough duration. + */ + public static final Interpolator TOUCH_RESPONSE = + new PathInterpolator(0.3f, 0f, 0.1f, 1f); + + /** + * Like {@link #TOUCH_RESPONSE}, but used in case the animation is played in reverse (i.e. t + * goes from 1 to 0 instead of 0 to 1). + */ + public static final Interpolator TOUCH_RESPONSE_REVERSE = + new PathInterpolator(0.9f, 0f, 0.7f, 1f); + + /* + * ============================================================================================ + * Functions / Utilities + * ============================================================================================ + */ + + /** + * Calculate the amount of overshoot using an exponential falloff function with desired + * properties, where the overshoot smoothly transitions at the 1.0f boundary into the + * overshoot, retaining its acceleration. + * + * @param progress a progress value going from 0 to 1 + * @param overshootAmount the amount > 0 of overshoot desired. A value of 0.1 means the max + * value of the overall progress will be at 1.1. + * @param overshootStart the point in (0,1] where the result should reach 1 + * @return the interpolated overshoot + */ + public static float getOvershootInterpolation(float progress, float overshootAmount, + float overshootStart) { + if (overshootAmount == 0.0f || overshootStart == 0.0f) { + throw new IllegalArgumentException("Invalid values for overshoot"); + } + float b = MathUtils.log((overshootAmount + 1) / (overshootAmount)) / overshootStart; + return MathUtils.max(0.0f, + (float) (1.0f - Math.exp(-b * progress)) * (overshootAmount + 1.0f)); + } + + /** + * Similar to {@link #getOvershootInterpolation(float, float, float)} but the overshoot + * starts immediately here, instead of first having a section of non-overshooting + * + * @param progress a progress value going from 0 to 1 + */ + public static float getOvershootInterpolation(float progress) { + return MathUtils.max(0.0f, (float) (1.0f - Math.exp(-4 * progress))); + } + + // Create the default emphasized interpolator + private static PathInterpolator createEmphasizedInterpolator() { + Path path = new Path(); + // Doing the same as fast_out_extra_slow_in + path.moveTo(0f, 0f); + path.cubicTo(0.05f, 0f, 0.133333f, 0.06f, 0.166666f, 0.4f); + path.cubicTo(0.208333f, 0.82f, 0.25f, 1f, 1f, 1f); + return new PathInterpolator(path); + } +} diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/LaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/LaunchAnimator.kt index 142fd21d4a16..3417ffd6b83a 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/LaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/LaunchAnimator.kt @@ -28,7 +28,7 @@ import android.util.MathUtils import android.view.View import android.view.ViewGroup import android.view.animation.Interpolator -import com.android.app.animation.Interpolators.LINEAR +import com.android.systemui.animation.Interpolators.LINEAR import kotlin.math.roundToInt private const val TAG = "LaunchAnimator" diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/TextInterpolator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/TextInterpolator.kt index a041926bf5d2..79189bc3e5c3 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/TextInterpolator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/TextInterpolator.kt @@ -217,12 +217,14 @@ class TextInterpolator( run.fontRuns.forEach { fontRun -> fontRun.baseFont = fontInterpolator.lerp(fontRun.baseFont, fontRun.targetFont, progress) - val tmpFontVariationsArray = mutableListOf<FontVariationAxis>() - fontRun.baseFont.axes.forEach { - tmpFontVariationsArray.add(FontVariationAxis(it.tag, it.styleValue)) - } - basePaint.fontVariationSettings = + val fvar = run { + val tmpFontVariationsArray = mutableListOf<FontVariationAxis>() + fontRun.baseFont.axes.forEach { + tmpFontVariationsArray.add(FontVariationAxis(it.tag, it.styleValue)) + } FontVariationAxis.toFontVariationSettings(tmpFontVariationsArray) + } + basePaint.typeface = typefaceCache.getTypefaceForVariant(fvar, basePaint) } } } diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ViewHierarchyAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ViewHierarchyAnimator.kt index 8e79e3ce1742..58ffef25cb42 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/ViewHierarchyAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ViewHierarchyAnimator.kt @@ -25,7 +25,6 @@ import android.util.IntProperty import android.view.View import android.view.ViewGroup import android.view.animation.Interpolator -import com.android.app.animation.Interpolators import kotlin.math.max import kotlin.math.min diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/back/BackAnimationSpec.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/back/BackAnimationSpec.kt index dd32851a97cf..f3d8b1782486 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/back/BackAnimationSpec.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/back/BackAnimationSpec.kt @@ -19,7 +19,7 @@ package com.android.systemui.animation.back import android.util.DisplayMetrics import android.view.animation.Interpolator import android.window.BackEvent -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.util.dpToPx /** Used to convert [BackEvent] into a [BackTransformation]. */ diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt index 3688f9e35e63..9d1dd1b67801 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AnimatableClockView.kt @@ -29,9 +29,9 @@ import android.text.format.DateFormat import android.util.AttributeSet import android.util.MathUtils import android.widget.TextView -import com.android.app.animation.Interpolators import com.android.internal.annotations.VisibleForTesting import com.android.systemui.animation.GlyphCallback +import com.android.systemui.animation.Interpolators import com.android.systemui.animation.TextAnimator import com.android.systemui.customization.R import com.android.systemui.plugins.log.LogBuffer diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt index 34adcc79dd11..f57432c073c1 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt @@ -403,12 +403,14 @@ open class ClockRegistry( } scope.launch(bgDispatcher) { + Log.i(TAG, "verifyLoadedProviders: ${availableClocks.size}") if (keepAllLoaded) { // Enforce that all plugins are loaded if requested for ((_, info) in availableClocks) { info.manager?.loadPlugin() } isVerifying.set(false) + Log.i(TAG, "verifyLoadedProviders: keepAllLoaded=true, load all") return@launch } @@ -419,16 +421,21 @@ open class ClockRegistry( info.manager?.unloadPlugin() } isVerifying.set(false) + Log.i(TAG, "verifyLoadedProviders: currentClock unavailable, unload all") return@launch } val currentManager = currentClock.manager currentManager?.loadPlugin() + Log.i(TAG, "verifyLoadedProviders: load ${currentClock.metadata.clockId}") for ((_, info) in availableClocks) { val manager = info.manager if (manager != null && manager.isLoaded && currentManager != manager) { + Log.i(TAG, "verifyLoadedProviders: unload ${info.metadata.clockId}") manager.unloadPlugin() + } else { + Log.i(TAG, "verifyLoadedProviders: skip unload of ${info.metadata.clockId}") } } isVerifying.set(false) diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java index 6d4dbf632d76..33c7c117dc95 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java @@ -102,6 +102,33 @@ public interface ActivityStarter { void dismissKeyguardThenExecute(OnDismissAction action, @Nullable Runnable cancel, boolean afterKeyguardGone, @Nullable String customMessage); + /** Starts an activity and dismisses keyguard. */ + void startActivityDismissingKeyguard(Intent intent, + boolean onlyProvisioned, + boolean dismissShade, + boolean disallowEnterPictureInPictureWhileLaunching, + Callback callback, + int flags, + @Nullable ActivityLaunchAnimator.Controller animationController, + UserHandle userHandle); + + /** Execute a runnable after dismissing keyguard. */ + void executeRunnableDismissingKeyguard(Runnable runnable, + Runnable cancelAction, + boolean dismissShade, + boolean afterKeyguardGone, + boolean deferred); + + /** Execute a runnable after dismissing keyguard. */ + void executeRunnableDismissingKeyguard( + Runnable runnable, + Runnable cancelAction, + boolean dismissShade, + boolean afterKeyguardGone, + boolean deferred, + boolean willAnimateOnKeyguard, + @Nullable String customMessage); + interface Callback { void onActivityStarted(int resultCode); } diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml index 686891fc0049..5ecf15abe070 100644 --- a/packages/SystemUI/res-keyguard/values-as/strings.xml +++ b/packages/SystemUI/res-keyguard/values-as/strings.xml @@ -31,8 +31,8 @@ <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • বেতাঁৰৰ জৰিয়তে চাৰ্জ কৰি থকা হৈছে"</string> <string name="keyguard_plugged_in_dock" msgid="2122073051904360987">"<xliff:g id="PERCENTAGE">%s</xliff:g> • চাৰ্জ কৰি থকা হৈছে"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • চ্চার্জ কৰি থকা হৈছে"</string> - <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • দ্ৰুত গতিৰে চ্চাৰ্জ কৰি থকা হৈছে"</string> - <string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • লাহে লাহে চ্চাৰ্জ কৰি থকা হৈছে"</string> + <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • দ্ৰুত গতিৰে চাৰ্জ কৰি থকা হৈছে"</string> + <string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • লাহে লাহে চাৰ্জ কৰি থকা হৈছে"</string> <string name="keyguard_plugged_in_charging_limited" msgid="1053130519456324630">"<xliff:g id="PERCENTAGE">%s</xliff:g> • বেটাৰী সুৰক্ষিত কৰিবলৈ চাৰ্জিং অপ্টিমাইজ কৰা হৈছে"</string> <string name="keyguard_plugged_in_incompatible_charger" msgid="3687961801947819076">"<xliff:g id="PERCENTAGE">%s</xliff:g> • চাৰ্জিঙৰ আনুষংগিক সামগ্ৰীত সমস্যা হৈছে"</string> <string name="keyguard_instructions_when_pattern_disabled" msgid="8448804180089936954">"আনলক কৰিবলৈ মেনু টিপক।"</string> diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml index 6e2dd24c3068..fb18f1a25818 100644 --- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml @@ -27,7 +27,7 @@ <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Unesite lozinku"</string> <string name="keyguard_enter_password" msgid="6483623792371009758">"Unesite lozinku"</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Nevažeća kartica."</string> - <string name="keyguard_charged" msgid="5478247181205188995">"Napunjena je"</string> + <string name="keyguard_charged" msgid="5478247181205188995">"Napunjeno"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Bežično punjenje"</string> <string name="keyguard_plugged_in_dock" msgid="2122073051904360987">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Puni se"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Puni se"</string> diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml index 42965f669309..da1c52b511ce 100644 --- a/packages/SystemUI/res-keyguard/values-bg/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml @@ -124,5 +124,5 @@ <string name="clock_title_default" msgid="6342735240617459864">"Стандартен"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"Балонен"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Аналогов"</string> - <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Отключете устройството си, за да продължите"</string> + <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Отключете устройството, за да продължите"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml index 4e168e4859cb..05fcced76a8b 100644 --- a/packages/SystemUI/res-keyguard/values-de/strings.xml +++ b/packages/SystemUI/res-keyguard/values-de/strings.xml @@ -21,14 +21,11 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Gib deine PIN ein"</string> - <!-- no translation found for keyguard_enter_pin (8114529922480276834) --> - <skip /> + <string name="keyguard_enter_pin" msgid="8114529922480276834">"Gib die PIN ein"</string> <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Muster eingeben"</string> - <!-- no translation found for keyguard_enter_pattern (7616595160901084119) --> - <skip /> + <string name="keyguard_enter_pattern" msgid="7616595160901084119">"Zeichne das Muster"</string> <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Passwort eingeben"</string> - <!-- no translation found for keyguard_enter_password (6483623792371009758) --> - <skip /> + <string name="keyguard_enter_password" msgid="6483623792371009758">"Gib das Passwort ein"</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Ungültige Karte."</string> <string name="keyguard_charged" msgid="5478247181205188995">"Aufgeladen"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Kabelloses Laden"</string> @@ -58,68 +55,38 @@ <string name="error_disable_esim_msg" msgid="2441188596467999327">"Die eSim kann aufgrund eines Fehlers nicht deaktiviert werden."</string> <string name="keyboardview_keycode_enter" msgid="6727192265631761174">"Eingabe"</string> <string name="kg_wrong_pattern" msgid="5907301342430102842">"Falsches Muster"</string> - <!-- no translation found for kg_wrong_pattern_try_again (3603524940234151881) --> - <skip /> + <string name="kg_wrong_pattern_try_again" msgid="3603524940234151881">"Muster ist falsch. Versuche es noch einmal."</string> <string name="kg_wrong_password" msgid="4143127991071670512">"Falsches Passwort"</string> - <!-- no translation found for kg_wrong_password_try_again (6602878676125765920) --> - <skip /> + <string name="kg_wrong_password_try_again" msgid="6602878676125765920">"Passwort ist falsch. Versuche es noch einmal."</string> <string name="kg_wrong_pin" msgid="4160978845968732624">"Falsche PIN"</string> - <!-- no translation found for kg_wrong_pin_try_again (3129729383303430190) --> - <skip /> - <!-- no translation found for kg_wrong_input_try_fp_suggestion (3143861542242024833) --> - <skip /> - <!-- no translation found for kg_fp_not_recognized (5183108260932029241) --> - <skip /> - <!-- no translation found for bouncer_face_not_recognized (1666128054475597485) --> - <skip /> - <!-- no translation found for kg_bio_try_again_or_pin (4752168242723808390) --> - <skip /> - <!-- no translation found for kg_bio_try_again_or_password (1473132729225398039) --> - <skip /> - <!-- no translation found for kg_bio_try_again_or_pattern (4867893307468801501) --> - <skip /> - <!-- no translation found for kg_bio_too_many_attempts_pin (5850845723433047605) --> - <skip /> - <!-- no translation found for kg_bio_too_many_attempts_password (5551690347827728042) --> - <skip /> - <!-- no translation found for kg_bio_too_many_attempts_pattern (736884689355181602) --> - <skip /> - <!-- no translation found for kg_unlock_with_pin_or_fp (5635161174698729890) --> - <skip /> - <!-- no translation found for kg_unlock_with_password_or_fp (2251295907826814237) --> - <skip /> - <!-- no translation found for kg_unlock_with_pattern_or_fp (2391870539909135046) --> - <skip /> - <!-- no translation found for kg_prompt_after_dpm_lock (6002804765868345917) --> - <skip /> - <!-- no translation found for kg_prompt_after_user_lockdown_pin (5374732179740050373) --> - <skip /> - <!-- no translation found for kg_prompt_after_user_lockdown_password (9097968458291129795) --> - <skip /> - <!-- no translation found for kg_prompt_after_user_lockdown_pattern (215072203613597906) --> - <skip /> - <!-- no translation found for kg_prompt_unattended_update (8223448855578632202) --> - <skip /> - <!-- no translation found for kg_prompt_pin_auth_timeout (5868644725126275245) --> - <skip /> - <!-- no translation found for kg_prompt_password_auth_timeout (5809110458491920871) --> - <skip /> - <!-- no translation found for kg_prompt_pattern_auth_timeout (1860605401869262178) --> - <skip /> - <!-- no translation found for kg_prompt_auth_timeout (6620679830980315048) --> - <skip /> - <!-- no translation found for kg_face_locked_out (2751559491287575) --> - <skip /> - <!-- no translation found for kg_fp_locked_out (6228277682396768830) --> - <skip /> - <!-- no translation found for kg_trust_agent_disabled (5400691179958727891) --> - <skip /> - <!-- no translation found for kg_primary_auth_locked_out_pin (5492230176361601475) --> - <skip /> - <!-- no translation found for kg_primary_auth_locked_out_pattern (8266214607346180952) --> - <skip /> - <!-- no translation found for kg_primary_auth_locked_out_password (6170245108400198659) --> - <skip /> + <string name="kg_wrong_pin_try_again" msgid="3129729383303430190">"PIN ist falsch. Versuche es noch einmal.."</string> + <string name="kg_wrong_input_try_fp_suggestion" msgid="3143861542242024833">"Oder Gerät per Fingerabdruck entsperren"</string> + <string name="kg_fp_not_recognized" msgid="5183108260932029241">"Fingerabdruck nicht erkannt"</string> + <string name="bouncer_face_not_recognized" msgid="1666128054475597485">"Gesicht nicht erkannt"</string> + <string name="kg_bio_try_again_or_pin" msgid="4752168242723808390">"Bitte noch einmal versuchen oder PIN eingeben"</string> + <string name="kg_bio_try_again_or_password" msgid="1473132729225398039">"Bitte noch einmal versuchen oder Passwort eingeben"</string> + <string name="kg_bio_try_again_or_pattern" msgid="4867893307468801501">"Bitte noch einmal versuchen oder Muster zeichnen"</string> + <string name="kg_bio_too_many_attempts_pin" msgid="5850845723433047605">"Nach zu vielen Versuchen wird die PIN abgefragt"</string> + <string name="kg_bio_too_many_attempts_password" msgid="5551690347827728042">"Nach zu vielen Versuchen wird das Passwort abgefragt"</string> + <string name="kg_bio_too_many_attempts_pattern" msgid="736884689355181602">"Nach zu vielen Versuchen wird das Muster abgefragt"</string> + <string name="kg_unlock_with_pin_or_fp" msgid="5635161174698729890">"Entsperrung mit PIN/Fingerabdruck"</string> + <string name="kg_unlock_with_password_or_fp" msgid="2251295907826814237">"Entsperrung mit Passwort/Fingerabdruck"</string> + <string name="kg_unlock_with_pattern_or_fp" msgid="2391870539909135046">"Entsperrung mit Muster/Fingerabdruck"</string> + <string name="kg_prompt_after_dpm_lock" msgid="6002804765868345917">"Gerät vom Admin aus Sicherheitsgründen gesperrt"</string> + <string name="kg_prompt_after_user_lockdown_pin" msgid="5374732179740050373">"Nach einer Sperre muss die PIN eingegeben werden"</string> + <string name="kg_prompt_after_user_lockdown_password" msgid="9097968458291129795">"Nach einer Sperre muss das Passwort eingegeben werden"</string> + <string name="kg_prompt_after_user_lockdown_pattern" msgid="215072203613597906">"Nach einer Sperre muss das Muster gezeichnet werden"</string> + <string name="kg_prompt_unattended_update" msgid="8223448855578632202">"Update wird installiert, wenn das Gerät inaktiv ist"</string> + <string name="kg_prompt_pin_auth_timeout" msgid="5868644725126275245">"Zusätzliche Sicherheitsmaßnahme erforderlich. Die PIN wurde länger nicht genutzt."</string> + <string name="kg_prompt_password_auth_timeout" msgid="5809110458491920871">"Zusätzliche Sicherheitsmaßnahme erforderlich. Passwort wurde länger nicht genutzt."</string> + <string name="kg_prompt_pattern_auth_timeout" msgid="1860605401869262178">"Zusätzliche Sicherheitsmaßnahme erforderlich. Muster wurde länger nicht genutzt."</string> + <string name="kg_prompt_auth_timeout" msgid="6620679830980315048">"Zusätzliche Sicherheitsmaßnahme erforderlich. Gerät wurde länger nicht entsperrt."</string> + <string name="kg_face_locked_out" msgid="2751559491287575">"Entsperrung mit Gesicht geht nicht. Zu oft versucht."</string> + <string name="kg_fp_locked_out" msgid="6228277682396768830">"Entsperrung mit Finger geht nicht. Zu oft versucht."</string> + <string name="kg_trust_agent_disabled" msgid="5400691179958727891">"Trust Agent nicht verfügbar"</string> + <string name="kg_primary_auth_locked_out_pin" msgid="5492230176361601475">"Zu viele Versuche mit falscher PIN"</string> + <string name="kg_primary_auth_locked_out_pattern" msgid="8266214607346180952">"Zu viele Versuche mit falschem Muster"</string> + <string name="kg_primary_auth_locked_out_password" msgid="6170245108400198659">"Zu viele Versuche mit falschem Passwort"</string> <string name="kg_too_many_failed_attempts_countdown" msgid="2038195171919795529">"{count,plural, =1{In # Sekunde noch einmal versuchen.}other{In # Sekunden noch einmal versuchen.}}"</string> <string name="kg_sim_pin_instructions" msgid="1942424305184242951">"Gib die SIM-PIN ein"</string> <string name="kg_sim_pin_instructions_multi" msgid="3639863309953109649">"Gib die SIM-PIN für \"<xliff:g id="CARRIER">%1$s</xliff:g>\" ein."</string> @@ -142,12 +109,9 @@ <string name="kg_password_puk_failed" msgid="6778867411556937118">"Fehler beim Entsperren der SIM-Karte mithilfe des PUK-Codes."</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Eingabemethode wechseln"</string> <string name="airplane_mode" msgid="2528005343938497866">"Flugmodus"</string> - <!-- no translation found for kg_prompt_reason_restart_pattern (3321211830602827742) --> - <skip /> - <!-- no translation found for kg_prompt_reason_restart_pin (2672166323886110512) --> - <skip /> - <!-- no translation found for kg_prompt_reason_restart_password (3967993994418885887) --> - <skip /> + <string name="kg_prompt_reason_restart_pattern" msgid="3321211830602827742">"Nach Geräteneustart ist das Muster erforderlich"</string> + <string name="kg_prompt_reason_restart_pin" msgid="2672166323886110512">"Nach Geräteneustart ist die PIN erforderlich"</string> + <string name="kg_prompt_reason_restart_password" msgid="3967993994418885887">"Nach Geräteneustart ist das Passwort erforderlich"</string> <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Verwende für mehr Sicherheit stattdessen dein Muster"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Verwende für mehr Sicherheit stattdessen deine PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Verwende für mehr Sicherheit stattdessen dein Passwort"</string> diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index bef61050b4ce..ef1e3f196c53 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Saisissez le code d\'accès"</string> <string name="keyguard_enter_pin" msgid="8114529922480276834">"Saisissez le code"</string> - <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Tracez le schéma"</string> + <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Tracez votre schéma"</string> <string name="keyguard_enter_pattern" msgid="7616595160901084119">"Dessinez un schéma"</string> <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Saisissez votre mot de passe"</string> <string name="keyguard_enter_password" msgid="6483623792371009758">"Saisissez le mot de passe"</string> diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml index 05bd2ba51440..28d19106faaf 100644 --- a/packages/SystemUI/res-keyguard/values-ja/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml @@ -124,5 +124,5 @@ <string name="clock_title_default" msgid="6342735240617459864">"デフォルト"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"バブル"</string> <string name="clock_title_analog" msgid="8409262532900918273">"アナログ"</string> - <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"続行するにはデバイスのロックを解除してください"</string> + <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"続行するにはデバイスのロックを解除します"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml index 3060cb2e7c6e..c97964196e1e 100644 --- a/packages/SystemUI/res-keyguard/values-ka/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml @@ -124,5 +124,5 @@ <string name="clock_title_default" msgid="6342735240617459864">"ნაგულისხმევი"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"ბუშტი"</string> <string name="clock_title_analog" msgid="8409262532900918273">"ანალოგური"</string> - <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"გასაგრძელებლად განბლოკეთ თქვენი მოწყობილობა"</string> + <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"გასაგრძელებლად განბლოკეთ მოწყობილობა"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml index ecf8350d9bb7..97658c1f858e 100644 --- a/packages/SystemUI/res-keyguard/values-kk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml @@ -31,7 +31,7 @@ <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Сымсыз зарядталуда"</string> <string name="keyguard_plugged_in_dock" msgid="2122073051904360987">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Зарядталып жатыр."</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Зарядталуда"</string> - <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Жылдам зарядталуда"</string> + <string name="keyguard_plugged_in_charging_fast" msgid="4386594091107340426">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Жылдам зарядтау"</string> <string name="keyguard_plugged_in_charging_slowly" msgid="217655355424210">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Баяу зарядталуда"</string> <string name="keyguard_plugged_in_charging_limited" msgid="1053130519456324630">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Батареяны қорғау үшін зарядтау оңтайландырылды"</string> <string name="keyguard_plugged_in_incompatible_charger" msgid="3687961801947819076">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Зарядтау құрылғысына қатысты мәселе туындады."</string> @@ -124,5 +124,5 @@ <string name="clock_title_default" msgid="6342735240617459864">"Әдепкі"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"Көпіршік"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Аналогтық"</string> - <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Жалғастыру үшін құрылғының құлпын ашыңыз"</string> + <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Жалғастыру үшін құлыпты ашыңыз"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index 79ef007d1144..e08ffae35dd2 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"PIN кодуңузду киргизиңиз"</string> <string name="keyguard_enter_pin" msgid="8114529922480276834">"PIN кодду киргизиңиз"</string> - <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Графикалык ачкычты киргизиңиз"</string> + <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Графикалык ачкычты тартыңыз"</string> <string name="keyguard_enter_pattern" msgid="7616595160901084119">"Графикалык ачкчты тартңыз"</string> <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Сырсөзүңүздү киргизиңиз"</string> <string name="keyguard_enter_password" msgid="6483623792371009758">"Сырсөздү киргизиңиз"</string> diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml index 9e64abe63a17..deb6a157c3d2 100644 --- a/packages/SystemUI/res-keyguard/values-lo/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml @@ -27,7 +27,7 @@ <string name="keyguard_enter_your_password" msgid="7225626204122735501">"ປ້ອນລະຫັດຜ່ານຂອງທ່ານ"</string> <string name="keyguard_enter_password" msgid="6483623792371009758">"ໃສ່ລະຫັດຜ່ານ"</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"ບັດບໍ່ຖືກຕ້ອງ."</string> - <string name="keyguard_charged" msgid="5478247181205188995">"ສາກເຕັມແລ້ວ."</string> + <string name="keyguard_charged" msgid="5478247181205188995">"ສາກເຕັມແລ້ວ"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ກຳລັງສາກໄຟໄຮ້ສາຍ"</string> <string name="keyguard_plugged_in_dock" msgid="2122073051904360987">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ກຳລັງສາກໄຟ"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • ກຳລັງສາກ"</string> diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml index d2f7f087cd03..c4df119a5d50 100644 --- a/packages/SystemUI/res-keyguard/values-lt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml @@ -124,5 +124,5 @@ <string name="clock_title_default" msgid="6342735240617459864">"Numatytasis"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"Debesėlis"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analoginis"</string> - <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Įrenginio atrakinimas norint tęsti"</string> + <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Atrakinkite įrenginį norėdami tęsti"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml index 4b215ae4aaf1..abb175b3812d 100644 --- a/packages/SystemUI/res-keyguard/values-ne/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"आफ्नो PIN प्रविष्टि गर्नुहोस्"</string> <string name="keyguard_enter_pin" msgid="8114529922480276834">"PIN हाल्नुहोस्"</string> - <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"आफ्नो ढाँचा प्रविष्टि गर्नुहोस्"</string> + <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"प्याटर्न हाल्नुहोस्"</string> <string name="keyguard_enter_pattern" msgid="7616595160901084119">"प्याटर्न कोर्नुहोस्"</string> <string name="keyguard_enter_your_password" msgid="7225626204122735501">"आफ्नो पासवर्ड प्रविष्ट गर्नु…"</string> <string name="keyguard_enter_password" msgid="6483623792371009758">"पासवर्ड हाल्नुहोस्"</string> diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index 1fcde869e124..3be5b7ff984b 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -124,5 +124,5 @@ <string name="clock_title_default" msgid="6342735240617459864">"Domyślna"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"Bąbelkowy"</string> <string name="clock_title_analog" msgid="8409262532900918273">"Analogowy"</string> - <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Odblokuj urządzenie, aby kontynuować"</string> + <string name="keyguard_unlock_to_continue" msgid="7509503484250597743">"Aby przejść dalej, odblokuj urządzenie"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml index b12c9d30da12..08bf30de6b97 100644 --- a/packages/SystemUI/res-keyguard/values-sk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Zadajte PIN"</string> <string name="keyguard_enter_pin" msgid="8114529922480276834">"Zadajte PIN"</string> - <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Zadajte vzor"</string> + <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Zadajte svoj vzor"</string> <string name="keyguard_enter_pattern" msgid="7616595160901084119">"Nakreslite vzor"</string> <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Zadajte heslo"</string> <string name="keyguard_enter_password" msgid="6483623792371009758">"Zadajte heslo"</string> diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml index bded34a69b82..cabf94f6f86a 100644 --- a/packages/SystemUI/res-keyguard/values-sr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml @@ -27,7 +27,7 @@ <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Унесите лозинку"</string> <string name="keyguard_enter_password" msgid="6483623792371009758">"Унесите лозинку"</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Неважећа картица."</string> - <string name="keyguard_charged" msgid="5478247181205188995">"Напуњена је"</string> + <string name="keyguard_charged" msgid="5478247181205188995">"Напуњено"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Бежично пуњење"</string> <string name="keyguard_plugged_in_dock" msgid="2122073051904360987">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Пуни се"</string> <string name="keyguard_plugged_in" msgid="8169926454348380863">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Пуни се"</string> diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml index 20a0360178ab..ba40a6510f2a 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml @@ -73,9 +73,9 @@ <string name="kg_unlock_with_password_or_fp" msgid="2251295907826814237">"使用密碼或指紋解鎖"</string> <string name="kg_unlock_with_pattern_or_fp" msgid="2391870539909135046">"使用解鎖圖案或指紋解鎖"</string> <string name="kg_prompt_after_dpm_lock" msgid="6002804765868345917">"為提高安全性,公司政策已鎖定裝置"</string> - <string name="kg_prompt_after_user_lockdown_pin" msgid="5374732179740050373">"需要輸入 PIN 才能解除禁閉模式"</string> - <string name="kg_prompt_after_user_lockdown_password" msgid="9097968458291129795">"需要輸入密碼解才能解除禁閉模式"</string> - <string name="kg_prompt_after_user_lockdown_pattern" msgid="215072203613597906">"需要畫出解鎖圖案才能解除禁閉模式"</string> + <string name="kg_prompt_after_user_lockdown_pin" msgid="5374732179740050373">"需要輸入 PIN 才能解除鎖定"</string> + <string name="kg_prompt_after_user_lockdown_password" msgid="9097968458291129795">"需要輸入密碼解才能解除鎖定"</string> + <string name="kg_prompt_after_user_lockdown_pattern" msgid="215072203613597906">"需要畫出解鎖圖案才能解除鎖定"</string> <string name="kg_prompt_unattended_update" msgid="8223448855578632202">"裝置會在閒置時安裝更新"</string> <string name="kg_prompt_pin_auth_timeout" msgid="5868644725126275245">"需要加強安全設定:已有一段時間沒有使用 PIN。"</string> <string name="kg_prompt_password_auth_timeout" msgid="5809110458491920871">"需要加強安全設定:已有一段時間沒有使用密碼。"</string> @@ -98,13 +98,13 @@ <string name="kg_sim_unlock_progress_dialog_message" msgid="1123048780346295748">"正在解鎖 SIM 卡…"</string> <string name="kg_invalid_sim_pin_hint" msgid="2762202646949552978">"請輸入 4 至 8 位數的 PIN 碼。"</string> <string name="kg_invalid_sim_puk_hint" msgid="5319756880543857694">"PUK 碼應由 8 個或以上數字組成。"</string> - <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="544687656831558971">"您已輸入錯誤的 PIN 碼 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string> - <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"您已輸入錯誤的密碼 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string> - <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"您已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string> - <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"SIM 卡 PIN 碼不正確,您現在必須聯絡流動網絡供應商為您的裝置解鎖。"</string> - <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{SIM 卡的 PIN 碼不正確,您還可以再試 # 次。如果仍然輸入錯誤,您必須聯絡流動網絡供應商解鎖您的裝置。}other{SIM 卡的 PIN 碼不正確,您還可以再試 # 次。}}"</string> - <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"SIM 卡無法使用,請聯絡您的流動網絡供應商。"</string> - <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{SIM 卡的 PUK 碼不正確,您還可以再試 # 次。如果仍然輪入錯誤,SIM 卡將永久無法使用。}other{SIM 卡的 PUK 碼不正確,您還可以再試 # 次。如果仍然輪入錯誤,SIM 卡將永久無法使用。}}"</string> + <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="544687656831558971">"你已輸入錯誤的 PIN 碼 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string> + <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="190984061975729494">"你已輸入錯誤的密碼 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string> + <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4252405904570284368">"你已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。\n\n請在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒後再試一次。"</string> + <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"SIM 卡 PIN 碼不正確,你現在必須聯絡流動網絡供應商為你的裝置解鎖。"</string> + <string name="kg_password_wrong_pin_code" msgid="5629415765976820357">"{count,plural, =1{SIM 卡的 PIN 碼不正確,你還可以再試 # 次。如果仍然輸入錯誤,你必須聯絡流動網絡供應商解鎖你的裝置。}other{SIM 卡的 PIN 碼不正確,你還可以再試 # 次。}}"</string> + <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"SIM 卡無法使用,請聯絡你的流動網絡供應商。"</string> + <string name="kg_password_wrong_puk_code" msgid="6820515467645087827">"{count,plural, =1{SIM 卡的 PUK 碼不正確,你還可以再試 # 次。如果仍然輪入錯誤,SIM 卡將永久無法使用。}other{SIM 卡的 PUK 碼不正確,你還可以再試 # 次。如果仍然輪入錯誤,SIM 卡將永久無法使用。}}"</string> <string name="kg_password_pin_failed" msgid="5136259126330604009">"無法使用 SIM 卡 PIN 碼解鎖!"</string> <string name="kg_password_puk_failed" msgid="6778867411556937118">"無法使用 SIM 卡 PUK 碼解鎖!"</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"轉換輸入方法"</string> @@ -119,8 +119,8 @@ <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"使用者已手動將裝置上鎖"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"未能識別"</string> <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"如要使用「面孔解鎖」,請在「設定」開啟相機存取權"</string> - <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{輸入 SIM 卡的 PIN,您還可以再試 # 次。如果仍然輸入錯誤,您必須聯絡流動網絡供應商解鎖您的裝置。}other{輸入 SIM 卡的 PIN。您還可以再試 # 次。}}"</string> - <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 # 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請向流動網絡供應商查詢。}other{SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 # 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請向流動網絡供應商查詢。}}"</string> + <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{輸入 SIM 卡的 PIN,你還可以再試 # 次。如果仍然輸入錯誤,你必須聯絡流動網絡供應商解鎖你的裝置。}other{輸入 SIM 卡的 PIN。你還可以再試 # 次。}}"</string> + <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{SIM 卡已停用。請輸入 PUK 碼以繼續進行。你還可以再試 # 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請向流動網絡供應商查詢。}other{SIM 卡已停用。請輸入 PUK 碼以繼續進行。你還可以再試 # 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請向流動網絡供應商查詢。}}"</string> <string name="clock_title_default" msgid="6342735240617459864">"預設"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"泡泡"</string> <string name="clock_title_analog" msgid="8409262532900918273">"指針"</string> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 4d43b193bfa6..e7c7068ea656 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"As jy met jou volgende poging \'n verkeerde patroon invoer, sal jou werkprofiel en die data daarvan uitgevee word."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"As jy met jou volgende poging \'n verkeerde PIN invoer, sal jou werkprofiel en die data daarvan uitgevee word."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"As jy met jou volgende poging \'n verkeerde wagwoord invoer, sal jou werkprofiel en die data daarvan uitgevee word."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Raak die vingerafdruksensor"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Kan nie gesig herken nie. Gebruik eerder vingerafdruk."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Skakel oor na werkprofiel"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Maak toe"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Pasmaak sluitskerm"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Ontsluit om sluitskerm te pasmaak"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-fi is nie beskikbaar nie"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera is geblokkeer"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera en mikrofoon is geblokkeer"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoon is geblokkeer"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteitmodus is aan"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistent-aandag is aan"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Stel versteknotasapp in Instellings"</string> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 8adb7823341a..7a452c3c3220 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -68,37 +68,37 @@ <string name="usb_port_enabled" msgid="531823867664717018">"ኃይል መሙያዎችን እና ተጨማሪ መሣሪያዎችን ፈልጎ ለማግኘት የነቃ የዩኤስቢ ወደብ"</string> <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"ዩኤስቢ አንቃ"</string> <string name="learn_more" msgid="4690632085667273811">"የበለጠ ለመረዳት"</string> - <string name="global_action_screenshot" msgid="2760267567509131654">"ቅጽበታዊ ገጽ እይታ"</string> + <string name="global_action_screenshot" msgid="2760267567509131654">"ቅጽበታዊ ገፅ እይታ"</string> <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"መክፈትን አራዝም ተሰናክሏል"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ምስል ተልኳል"</string> - <string name="screenshot_saving_title" msgid="2298349784913287333">"ቅጽበታዊ ገጽ እይታ በማስቀመጥ ላይ..."</string> - <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ቅጽበታዊ ገጽ እይታን ወደ የስራ መገለጫ በማስቀመጥ ላይ…"</string> - <string name="screenshot_saved_title" msgid="8893267638659083153">"ቅጽበታዊ ገጽ እይታ ተቀምጧል"</string> - <string name="screenshot_failed_title" msgid="3259148215671936891">"ቅጽበታዊ ገጽ ዕይታን ማስቀመጥ አልተቻለም"</string> - <string name="screenshot_failed_to_save_user_locked_text" msgid="6156607948256936920">"ቅጽበታዊ ገጽ እይታ ከመቀመጡ በፊት መሣሪያ መከፈት አለበት"</string> - <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"ቅጽበታዊ ገጽ ዕይታን እንደገና ማንሳት ይሞክሩ"</string> - <string name="screenshot_failed_to_save_text" msgid="7232739948999195960">"ቅጽበታዊ ገጽ እይታን ማስቀመጥ አልተቻለም"</string> - <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ቅጽበታዊ ገጽ እይታዎችን ማንሳት በመተግበሪያው ወይም በእርስዎ ድርጅት አይፈቀድም"</string> - <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ቅጽበታዊ ገጽ እይታዎችን ማንሳት በእርስዎ አይቲ አስተዳዳሪ ታግዷል"</string> + <string name="screenshot_saving_title" msgid="2298349784913287333">"ቅጽበታዊ ገፅ እይታ በማስቀመጥ ላይ..."</string> + <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ቅጽበታዊ ገፅ እይታን ወደ የስራ መገለጫ በማስቀመጥ ላይ…"</string> + <string name="screenshot_saved_title" msgid="8893267638659083153">"ቅጽበታዊ ገፅ እይታ ተቀምጧል"</string> + <string name="screenshot_failed_title" msgid="3259148215671936891">"ቅጽበታዊ ገፅ ዕይታን ማስቀመጥ አልተቻለም"</string> + <string name="screenshot_failed_to_save_user_locked_text" msgid="6156607948256936920">"ቅጽበታዊ ገፅ እይታ ከመቀመጡ በፊት መሣሪያ መከፈት አለበት"</string> + <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"ቅጽበታዊ ገፅ ዕይታን እንደገና ማንሳት ይሞክሩ"</string> + <string name="screenshot_failed_to_save_text" msgid="7232739948999195960">"ቅጽበታዊ ገፅ እይታን ማስቀመጥ አልተቻለም"</string> + <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ቅጽበታዊ ገፅ እይታዎችን ማንሳት በመተግበሪያው ወይም በእርስዎ ድርጅት አይፈቀድም"</string> + <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"ቅጽበታዊ ገፅ እይታዎችን ማንሳት በእርስዎ አይቲ አስተዳዳሪ ታግዷል"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"አርትዕ ያድርጉ"</string> - <string name="screenshot_edit_description" msgid="3333092254706788906">"ቅጽበታዊ ገጽ ዕይታን አርትዕ ያድርጉ"</string> - <string name="screenshot_share_description" msgid="2861628935812656612">"ቅጽበታዊ ገጽ እይታን ያጋሩ"</string> + <string name="screenshot_edit_description" msgid="3333092254706788906">"ቅጽበታዊ ገፅ ዕይታን አርትዕ ያድርጉ"</string> + <string name="screenshot_share_description" msgid="2861628935812656612">"ቅጽበታዊ ገፅ እይታን ያጋሩ"</string> <string name="screenshot_scroll_label" msgid="2930198809899329367">"ተጨማሪ ይቅረጹ"</string> - <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ቅጽበታዊ ገጽ ዕይታን አሰናብት"</string> + <string name="screenshot_dismiss_description" msgid="4702341245899508786">"ቅጽበታዊ ገፅ ዕይታን አሰናብት"</string> <string name="screenshot_dismiss_work_profile" msgid="3101530842987697045">"የስራ መገለጫ መልዕክትን ያሰናብታል"</string> - <string name="screenshot_preview_description" msgid="7606510140714080474">"የቅጽበታዊ ገጽ ዕይታ ቅድመ-ዕይታ"</string> + <string name="screenshot_preview_description" msgid="7606510140714080474">"የቅጽበታዊ ገፅ ዕይታ ቅድመ-ዕይታ"</string> <string name="screenshot_top_boundary_pct" msgid="2520148599096479332">"የላይ ወሰን <xliff:g id="PERCENT">%1$d</xliff:g> በመቶ"</string> <string name="screenshot_bottom_boundary_pct" msgid="3880821519814946478">"የታች ወሰን <xliff:g id="PERCENT">%1$d</xliff:g> በመቶ"</string> <string name="screenshot_left_boundary_pct" msgid="8502323556112287469">"የግራ ወሰን <xliff:g id="PERCENT">%1$d</xliff:g> በመቶ"</string> <string name="screenshot_right_boundary_pct" msgid="1201150713021779321">"የቀኝ ወሰን <xliff:g id="PERCENT">%1$d</xliff:g> በመቶ"</string> <string name="screenshot_work_profile_notification" msgid="203041724052970693">"<xliff:g id="APP">%1$s</xliff:g> ውስጥ የስራ መገለጫው ውስጥ ተቀምጧል"</string> <string name="screenshot_default_files_app_name" msgid="8721579578575161912">"ፋይሎች"</string> - <string name="screenshot_detected_template" msgid="7940376642921719915">"<xliff:g id="APPNAME">%1$s</xliff:g> ይህን ቅጽበታዊ ገጽ እይታ ለይቷል።"</string> - <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> እና ሌሎች ክፍት መተግበሪያዎች ይህን ቅጽበታዊ ገጽ እይታ ለይተዋል።"</string> + <string name="screenshot_detected_template" msgid="7940376642921719915">"<xliff:g id="APPNAME">%1$s</xliff:g> ይህን ቅጽበታዊ ገፅ እይታ ለይቷል።"</string> + <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> እና ሌሎች ክፍት መተግበሪያዎች ይህን ቅጽበታዊ ገፅ እይታ ለይተዋል።"</string> <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"ወደ ማስታወሻ አክል"</string> <string name="screenrecord_name" msgid="2596401223859996572">"የማያ መቅጃ"</string> - <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"የማያ ገጽ ቀረጻን በማሰናዳት ላይ"</string> - <string name="screenrecord_channel_description" msgid="4147077128486138351">"ለአንድ የማያ ገጽ ቀረጻ ክፍለ-ጊዜ በመካሄድ ያለ ማሳወቂያ"</string> + <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"የማያ ገፅ ቀረጻን በማሰናዳት ላይ"</string> + <string name="screenrecord_channel_description" msgid="4147077128486138351">"ለአንድ የማያ ገፅ ቀረጻ ክፍለ-ጊዜ በመካሄድ ያለ ማሳወቂያ"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"መቅረጽ ይጀመር?"</string> <string name="screenrecord_description" msgid="1123231719680353736">"እየቀረጹ ሳለ የAndroid ስርዓት በማያ ገጽዎ ላይ የሚታይ ወይም በመሣሪያዎ ላይ የሚጫወት ማንኛውም ሚስጥራዊነት ያለው መረጃን መያዝ ይችላል። ይህ የይለፍ ቃላትን፣ የክፍያ መረጃን፣ ፎቶዎችን፣ መልዕክቶችን እና ኦዲዮን ያካትታል።"</string> <string name="screenrecord_option_entire_screen" msgid="1732437834603426934">"መላው ማያ ገጹን ቅረጽ"</string> @@ -114,13 +114,13 @@ <string name="screenrecord_start" msgid="330991441575775004">"ጀምር"</string> <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"ማያ ገጽን በመቅረጽ ላይ"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"ማያ ገጽን እና ኦዲዮን በመቅረጽ ላይ"</string> - <string name="screenrecord_taps_label" msgid="1595690528298857649">"በማያ ገጽ ላይ ያሉ ንክኪዎችን አሳይ"</string> + <string name="screenrecord_taps_label" msgid="1595690528298857649">"በማያ ገፅ ላይ ያሉ ንክኪዎችን አሳይ"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"አቁም"</string> <string name="screenrecord_share_label" msgid="5025590804030086930">"አጋራ"</string> - <string name="screenrecord_save_title" msgid="1886652605520893850">"የማያ ገጽ ቀረጻ ተቀምጧል"</string> + <string name="screenrecord_save_title" msgid="1886652605520893850">"የማያ ገፅ ቀረጻ ተቀምጧል"</string> <string name="screenrecord_save_text" msgid="3008973099800840163">"ለመመልከት መታ ያድርጉ"</string> - <string name="screenrecord_delete_error" msgid="2870506119743013588">"የማያ ገጽ ቀረጻን መሰረዝ ላይ ስህተት"</string> - <string name="screenrecord_start_error" msgid="2200660692479682368">"የማያ ገጽ ቀረጻን መጀመር ላይ ስህተት"</string> + <string name="screenrecord_delete_error" msgid="2870506119743013588">"የማያ ገፅ ቀረጻን መሰረዝ ላይ ስህተት"</string> + <string name="screenrecord_start_error" msgid="2200660692479682368">"የማያ ገፅ ቀረጻን መጀመር ላይ ስህተት"</string> <string name="accessibility_back" msgid="6530104400086152611">"ተመለስ"</string> <string name="accessibility_home" msgid="5430449841237966217">"መነሻ"</string> <string name="accessibility_menu" msgid="2701163794470513040">"ምናሌ"</string> @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"በሚቀጥለው ሙከራ ላይ ትክክል ያልሆነ ሥርዓተ ጥለት ካስገቡ የእርስዎ የሥራ መገለጫ እና ውሂቡ ይሰረዛሉ።"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"በሚቀጥለው ሙከራ ላይ ትክክል ያልሆነ ፒን ካስገቡ የእርስዎ የሥራ መገለጫ እና ውሂቡ ይሰረዛሉ።"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"በሚቀጥለው ሙከራ ላይ ትክክል ያልሆነ የይለፍ ቃል ካስገቡ የእርስዎ የሥራ መገለጫ እና ውሂቡ ይሰረዛሉ።"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"የጣት አሻራ ዳሳሹን ይንኩ"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"መልክን መለየት አልተቻለም። በምትኩ የጣት አሻራ ይጠቀሙ።"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -198,10 +226,10 @@ <string name="accessibility_desc_notification_shade" msgid="5355229129428759989">"የማሳወቂያ ጥላ።"</string> <string name="accessibility_desc_quick_settings" msgid="4374766941484719179">"ፈጣን ቅንብሮች።"</string> <string name="accessibility_desc_qs_notification_shade" msgid="8327226953072700376">"ፈጣን ቅንብሮች እና የማሳወቂያ ጥላ።"</string> - <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ማያ ገጽ ቆልፍ።"</string> - <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"የስራ ማያ ገጽ ቁልፍ"</string> + <string name="accessibility_desc_lock_screen" msgid="5983125095181194887">"ማያ ገፅ ቆልፍ።"</string> + <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"የስራ ማያ ገፅ ቁልፍ"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"ዝጋ"</string> - <string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ሙሉ ለሙሉ ጸጥታ"</string> + <string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"ሙሉ ለሙሉ ፀጥታ"</string> <string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"ማንቂያዎች ብቻ"</string> <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"አትረብሽ።"</string> <string name="accessibility_quick_settings_bluetooth" msgid="8250942386687551283">"ብሉቱዝ።"</string> @@ -209,7 +237,7 @@ <string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"ማንቂያ ለ<xliff:g id="TIME">%s</xliff:g> ተዋቅሯል።"</string> <string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"ተጨማሪ ጊዜ።"</string> <string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"ያነሰ ጊዜ።"</string> - <string name="accessibility_casting_turned_off" msgid="1387906158563374962">"ማያ ገጽ መውሰድ ቆሟል።"</string> + <string name="accessibility_casting_turned_off" msgid="1387906158563374962">"ማያ ገፅ መውሰድ ቆሟል።"</string> <string name="accessibility_brightness" msgid="5391187016177823721">"ብሩህነት ያሳዩ"</string> <string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"የተንቀሳቃሽ ስልክ ውሂብ ባለበት ቆሟል"</string> <string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ውሂብ ላፍታ ቆሟል"</string> @@ -220,10 +248,10 @@ <string name="accessibility_clear_all" msgid="970525598287244592">"ሁሉንም ማሳወቂያዎች አጽዳ"</string> <string name="notification_group_overflow_indicator" msgid="7605120293801012648">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="notification_group_overflow_description" msgid="7176322877233433278">"{count,plural, =1{# ተጨማሪ ማሳወቂያ ከውስጥ አለ።}one{# ተጨማሪ ማሳወቂያ ከውስጥ አለ።}other{# ተጨማሪ ማሳወቂያዎች ከውስጥ አሉ።}}"</string> - <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"ማያ ገጽ በወርድ ገፅ አቀማመጥ ተቆልፏል።"</string> - <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"ማያ ገጽ በቁም ገፅ አቀማመጥ ተቆልፏል።"</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"ማያ ገፅ በወርድ ገፅ አቀማመጥ ተቆልፏል።"</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"ማያ ገፅ በቁም ገፅ አቀማመጥ ተቆልፏል።"</string> <string name="dessert_case" msgid="9104973640704357717">"የማወራረጃ ምግቦች መያዣ"</string> - <string name="start_dreams" msgid="9131802557946276718">"የማያ ገጽ ማቆያ"</string> + <string name="start_dreams" msgid="9131802557946276718">"የማያ ገፅ ማቆያ"</string> <string name="ethernet_label" msgid="2203544727007463351">"ኤተርኔት"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"አትረብሽ"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ብሉቱዝ"</string> @@ -237,7 +265,7 @@ <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"በራስ ሰር አሽከርክር"</string> <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"ማያ ገጽን በራስ-አሽከርክር"</string> <string name="quick_settings_location_label" msgid="2621868789013389163">"አካባቢ"</string> - <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"የማያ ገጽ ማቆያ"</string> + <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"የማያ ገፅ ማቆያ"</string> <string name="quick_settings_camera_label" msgid="5612076679385269339">"የካሜራ መዳረሻ"</string> <string name="quick_settings_mic_label" msgid="8392773746295266375">"የማይክሮፎን መዳረሻ"</string> <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"ይገኛል"</string> @@ -250,7 +278,7 @@ <string name="quick_settings_networks_unavailable" msgid="1167847013337940082">"አውታረ መረቦች አይገኙም"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"ምንም የWi-Fi አውታረ መረቦች የሉም"</string> <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"በማብራት ላይ..."</string> - <string name="quick_settings_cast_title" msgid="2279220930629235211">"የማያ ገጽ መውሰድ"</string> + <string name="quick_settings_cast_title" msgid="2279220930629235211">"የማያ ገፅ መውሰድ"</string> <string name="quick_settings_casting" msgid="1435880708719268055">"በመውሰድ ላይ"</string> <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"ያልተሰየመ መሣሪያ"</string> <string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"ምንም መሣሪያዎች አይገኙም"</string> @@ -355,11 +383,11 @@ <string name="phone_hint" msgid="6682125338461375925">"ለስልክ ከአዶ ላይ ጠረግ ያድርጉ"</string> <string name="voice_hint" msgid="7476017460191291417">"ለድምጽ ረዳት ከአዶ ጠረግ ያድርጉ"</string> <string name="camera_hint" msgid="4519495795000658637">"ለካሜራ ከአዶ ላይ ጠረግ ያድርጉ"</string> - <string name="interruption_level_none_with_warning" msgid="8394434073508145437">"አጠቃላይ ጸጥታ። ይህ በተጨማሪ ማያ ገጽ አንባቢን ፀጥ ያደርጋል።"</string> - <string name="interruption_level_none" msgid="219484038314193379">"ሙሉ ለሙሉ ጸጥታ"</string> + <string name="interruption_level_none_with_warning" msgid="8394434073508145437">"አጠቃላይ ፀጥታ። ይህ በተጨማሪ ማያ ገፅ አንባቢን ፀጥ ያደርጋል።"</string> + <string name="interruption_level_none" msgid="219484038314193379">"ሙሉ ለሙሉ ፀጥታ"</string> <string name="interruption_level_priority" msgid="661294280016622209">"ቅድሚያ የሚሰጠው ብቻ"</string> <string name="interruption_level_alarms" msgid="2457850481335846959">"ማንቂያዎች ብቻ"</string> - <string name="interruption_level_none_twoline" msgid="8579382742855486372">"ሙሉ ለሙሉ\nጸጥታ"</string> + <string name="interruption_level_none_twoline" msgid="8579382742855486372">"ሙሉ ለሙሉ\nፀጥታ"</string> <string name="interruption_level_priority_twoline" msgid="8523482736582498083">"ቅድሚያ ተሰጪ\nብቻ"</string> <string name="interruption_level_alarms_twoline" msgid="2045067991335708767">"ማንቂያዎች\nብቻ"</string> <string name="keyguard_indication_charging_time_wireless" msgid="577856646141738675">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • በገመድ-አልባ ኃይል በመሙላት ላይ • በ<xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> ውስጥ ይሞላል"</string> @@ -382,12 +410,12 @@ <string name="user_remove_user_title" msgid="9124124694835811874">"ተጠቃሚ ይወገድ?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"ሁሉም የዚህ ተጠቃሚ መተግበሪያዎች እና ውሂብ ይሰረዛሉ።"</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"አስወግድ"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> በእርስዎ ማያ ገጽ ላይ ያለን ወይም በእርስዎ መሣሪያ ላይ በመጫወት ላይ ያለን ሁሉንም መረጃ በቀረጻ ወይም casting ላይ እያለ መዳረሻ ይኖረዋል። ይህ እንደ የይለፍ ቃላት፣ የክፍያ ዝርዝሮች፣ ፎቶዎች፣ መልዕክቶች እና እርስዎ የሚጫውቱት ኦዲዮን የመሳሰለ መረጃን ያካትታል።"</string> - <string name="media_projection_dialog_service_text" msgid="958000992162214611">"ይህን ተግባር የሚያቀርበው አገልግሎት በእርስዎ ማያ ገጽ ላይ ያለን ወይም በእርስዎ መሣሪያ ላይ በመጫወት ላይ ያለን ሁሉንም መረጃ በቀረጻ ወይም casting ላይ እያለ መዳረሻ ይኖረዋል። ይህ እንደ የይለፍ ቃላት፣ የክፍያ ዝርዝሮች፣ ፎቶዎች፣ መልዕክቶች እና እርስዎ የሚጫውቱት ኦዲዮን የመሳሰለ መረጃን ያካትታል።"</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> በእርስዎ ማያ ገፅ ላይ ያለን ወይም በእርስዎ መሣሪያ ላይ በመጫወት ላይ ያለን ሁሉንም መረጃ በቀረጻ ወይም casting ላይ እያለ መዳረሻ ይኖረዋል። ይህ እንደ የይለፍ ቃላት፣ የክፍያ ዝርዝሮች፣ ፎቶዎች፣ መልዕክቶች እና እርስዎ የሚጫውቱት ኦዲዮን የመሳሰለ መረጃን ያካትታል።"</string> + <string name="media_projection_dialog_service_text" msgid="958000992162214611">"ይህን ተግባር የሚያቀርበው አገልግሎት በእርስዎ ማያ ገፅ ላይ ያለን ወይም በእርስዎ መሣሪያ ላይ በመጫወት ላይ ያለን ሁሉንም መረጃ በቀረጻ ወይም casting ላይ እያለ መዳረሻ ይኖረዋል። ይህ እንደ የይለፍ ቃላት፣ የክፍያ ዝርዝሮች፣ ፎቶዎች፣ መልዕክቶች እና እርስዎ የሚጫውቱት ኦዲዮን የመሳሰለ መረጃን ያካትታል።"</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ቀረጻ ወይም cast ማድረግ ይጀምር?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"ከ<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ጋር ቀረጻ ወይም casting ይጀምር?"</string> <string name="media_projection_permission_dialog_title" msgid="7130975432309482596">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> እንዲያጋራ ወይም እንዲቀርጽ ይፈቀድለት?"</string> - <string name="media_projection_permission_dialog_option_entire_screen" msgid="392086473225692983">"መላው ማያ ገጽ"</string> + <string name="media_projection_permission_dialog_option_entire_screen" msgid="392086473225692983">"መላው ማያ ገፅ"</string> <string name="media_projection_permission_dialog_option_single_app" msgid="1591110238124910521">"አንድ ነጠላ መተግበሪያ"</string> <string name="media_projection_permission_dialog_warning_entire_screen" msgid="3989078820637452717">"ሲያጋሩ፣ ሲቀርጹ ወይም cast ሲያደርጉ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> በማያ ገጽዎ ላይ ለሚታይ ወይም በመሣሪያዎ ላይ ለሚጫወት ማንኛውም ነገር መዳረሻ አለው። ስለዚህ በይለፍ ቃላት፣ በክፍያ ዝርዝሮች፣ በመልዕክቶች ወይም በሌሎች ልዩ ጥንቃቄ የሚያስፈልጋቸው መረጃዎች ላይ ጥንቃቄ ያድርጉ።"</string> <string name="media_projection_permission_dialog_warning_single_app" msgid="1659532781536753059">"አንድን መተግበሪያ ሲያጋሩ፣ ሲቀርጹ ወይም cast ሲያደርጉ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> በዚያ መተግበሪያ ላይ ለሚታይ ወይም ለሚጫወት ማንኛውም ነገር መዳረሻ አለው። ስለዚህ በይለፍ ቃላት፣ በክፍያ ዝርዝሮች፣ በመልዕክቶች ወይም በሌሎች ልዩ ጥንቃቄ የሚያስፈልጋቸው መረጃዎች ላይ ጥንቃቄ ያድርጉ።"</string> @@ -397,7 +425,7 @@ <string name="media_projection_permission_dialog_system_service_warning_entire_screen" msgid="8801616203805837575">"ሲያጋሩ፣ ሲቀርጹ ወይም cast ሲያደርጉ ይህ መተግበሪያ በማያ ገጽዎ ላይ ለሚታይ ወይም በመሣሪያዎ ላይ ለሚጫወት ማንኛውም ነገር መዳረሻ አለው። ስለዚህ በይለፍ ቃላት፣ በክፍያ ዝርዝሮች፣ በመልዕክቶች ወይም በሌሎች ልዩ ጥንቃቄ የሚያስፈልጋቸው መረጃዎች ላይ ጥንቃቄ ያድርጉ።"</string> <string name="media_projection_permission_dialog_system_service_warning_single_app" msgid="543310680568419338">"አንድን መተግበሪያ ሲያጋሩ፣ ሲቀርጹ ወይም cast ሲያደርጉ ይህ መተግበሪያ በዚያ መተግበሪያ ላይ ለሚታይ ወይም ለሚጫወት ማንኛውም ነገር መዳረሻ አለው። ስለዚህ በይለፍ ቃላት፣ በክፍያ ዝርዝሮች፣ በመልዕክቶች ወይም በሌሎች ልዩ ጥንቃቄ የሚያስፈልጋቸው መረጃዎች ላይ ጥንቃቄ ያድርጉ።"</string> <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"በእርስዎ የአይቲ አስተዳዳሪ ታግዷል"</string> - <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"የማያ ገጽ ቀረጻ በመሣሪያ መመሪያ ተሰናክሏል"</string> + <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"የማያ ገፅ ቀረጻ በመሣሪያ መመሪያ ተሰናክሏል"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"ሁሉንም አጽዳ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ያቀናብሩ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ታሪክ"</string> @@ -450,7 +478,7 @@ <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"የእርስዎ ግላዊ መተግበሪያዎች በ<xliff:g id="VPN_APP">%1$s</xliff:g> በኩል ከበይነመረብ ጋር ተገናኝተዋል። ኢሜይሎችን እና የአሰሳ ውሂብን ጨምሮ የአውታረ መረብ እንቅስቃሴዎ ለVPN አቅራቢዎ ይታያል።"</string> <string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string> <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"የቪፒኤን ቅንብሮችን ይክፈቱ"</string> - <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"ይህ መሣሪያ በእርስዎ ወላጅ የሚተዳደር ነው። ወላጅዎ የሚጠቀሙባቸውን መተግበሪያዎች፣ አካባቢዎን እና የማያ ገጽ ጊዜዎን የመሳሰሉ መረጃዎችን ማየት እና ማስተዳደር ይችላል።"</string> + <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"ይህ መሣሪያ በእርስዎ ወላጅ የሚተዳደር ነው። ወላጅዎ የሚጠቀሙባቸውን መተግበሪያዎች፣ አካባቢዎን እና የማያ ገፅ ጊዜዎን የመሳሰሉ መረጃዎችን ማየት እና ማስተዳደር ይችላል።"</string> <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string> <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"በ TrustAgent እንደተከፈተ ቀርቷል"</string> <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>። <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> @@ -538,7 +566,7 @@ <string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"አብራ"</string> <string name="tuner_full_importance_settings" msgid="1388025816553459059">"የኃይል ማሳወቂያ መቆጣጠሪያዎች"</string> <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"በርቷል - መልክ ላይ የተመሠረተ"</string> - <string name="power_notification_controls_description" msgid="1334963837572708952">"በኃይል ማሳወቂያ መቆጣጠሪያዎች አማካኝነት የአንድ መተግበሪያ ማሳወቂያዎች የአስፈላጊነት ደረጃ ከ0 እስከ 5 ድረስ ማዘጋጀት ይችላሉ። \n\n"<b>"ደረጃ 5"</b>" \n- በማሳወቂያ ዝርዝሩ አናት ላይ አሳይ \n- የሙሉ ማያ ገጽ ማቋረጥን ፍቀድ \n- ሁልጊዜ አጮልቀው ይመልከቱ \n\n"<b>"ደረጃ 4"</b>" \n- የሙሉ ማያ ገጽ ማቋረጥን ከልክል \n- ሁልጊዜ አጮልቀው ይመልከቱ \n\n"<b>"ደረጃ 3"</b>" \n- የሙሉ ማያ ገጽ ማቋረጥን ከልክል \n- በፍጹም አጮልቀው አይምልከቱ \n\n"<b>"ደረጃ 2"</b>" \n- የሙሉ ማያ ገጽ ማቋረጥን ይከልክሉ \n- በፍጹም አጮልቀው አይመልከቱ \n- ድምፅ እና ንዝረትን በፍጹም አይኑር \n\n"<b>"ደረጃ 1"</b>" \n- የሙሉ ማያ ገጽ ማቋረጥን ይከልክሉ \n- በፍጹም አጮልቀው አይመልከቱ \n- ድምፅ ወይም ንዝረትን በፍጹም አያደርጉ \n- ከመቆለፊያ ገጽ እና የሁኔታ አሞሌ ይደብቁ \n- በማሳወቂያ ዝርዝር ግርጌ ላይ አሳይ \n\n"<b>"ደረጃ 0"</b>" \n- ሁሉንም የመተግበሪያው ማሳወቂያዎች ያግዱ"</string> + <string name="power_notification_controls_description" msgid="1334963837572708952">"በኃይል ማሳወቂያ መቆጣጠሪያዎች አማካኝነት የአንድ መተግበሪያ ማሳወቂያዎች የአስፈላጊነት ደረጃ ከ0 እስከ 5 ድረስ ማዘጋጀት ይችላሉ። \n\n"<b>"ደረጃ 5"</b>" \n- በማሳወቂያ ዝርዝሩ አናት ላይ አሳይ \n- የሙሉ ማያ ገፅ ማቋረጥን ፍቀድ \n- ሁልጊዜ አጮልቀው ይመልከቱ \n\n"<b>"ደረጃ 4"</b>" \n- የሙሉ ማያ ገፅ ማቋረጥን ከልክል \n- ሁልጊዜ አጮልቀው ይመልከቱ \n\n"<b>"ደረጃ 3"</b>" \n- የሙሉ ማያ ገፅ ማቋረጥን ከልክል \n- በፍጹም አጮልቀው አይምልከቱ \n\n"<b>"ደረጃ 2"</b>" \n- የሙሉ ማያ ገፅ ማቋረጥን ይከልክሉ \n- በፍጹም አጮልቀው አይመልከቱ \n- ድምፅ እና ንዝረትን በፍጹም አይኑር \n\n"<b>"ደረጃ 1"</b>" \n- የሙሉ ማያ ገፅ ማቋረጥን ይከልክሉ \n- በፍጹም አጮልቀው አይመልከቱ \n- ድምፅ ወይም ንዝረትን በፍጹም አያደርጉ \n- ከመቆለፊያ ገፅ እና የሁኔታ አሞሌ ይደብቁ \n- በማሳወቂያ ዝርዝር ግርጌ ላይ አሳይ \n\n"<b>"ደረጃ 0"</b>" \n- ሁሉንም የመተግበሪያው ማሳወቂያዎች ያግዱ"</string> <string name="inline_done_button" msgid="6043094985588909584">"ተከናውኗል"</string> <string name="inline_ok_button" msgid="603075490581280343">"ተግብር"</string> <string name="inline_turn_off_notifications" msgid="8543989584403106071">"ማሳወቂያዎችን አጥፋ"</string> @@ -554,10 +582,10 @@ <string name="notification_channel_summary_automatic_silenced" msgid="7403004439649872047">"<b>ሁኔታ:</b> ወደ ዝምታ ዝቅ ተደርጓል"</string> <string name="notification_channel_summary_automatic_promoted" msgid="1301710305149590426">"<b>ሁኔታ:</b> ክፍተኛ ደረጃ ተሰጥቶታል"</string> <string name="notification_channel_summary_automatic_demoted" msgid="1831303964660807700">"<b>ሁኔታ:</b> ዝቅተኛ ደረጃ ተሰጥቶታል"</string> - <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገጽ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል"</string> - <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገጽ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል፣ እንደ አረፋ ሆኖ ይታያል"</string> - <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገጽ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል፣ አትረብሽን ያቋርጣል"</string> - <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገጽ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል፣ እንደ አረፋ ሆኖ ይታያል፣ አትረብሽን ያቋርጣል"</string> + <string name="notification_channel_summary_priority_baseline" msgid="46674690072551234">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገፅ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል"</string> + <string name="notification_channel_summary_priority_bubble" msgid="1275413109619074576">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገፅ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል፣ እንደ አረፋ ሆኖ ይታያል"</string> + <string name="notification_channel_summary_priority_dnd" msgid="6665395023264154361">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገፅ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል፣ አትረብሽን ያቋርጣል"</string> + <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገፅ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል፣ እንደ አረፋ ሆኖ ይታያል፣ አትረብሽን ያቋርጣል"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ቅድሚያ"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> የውይይት ባህሪያትን አይደግፍም"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።"</string> @@ -604,8 +632,8 @@ <string name="keyboard_key_media_previous" msgid="5637875709190955351">"ቀዳሚ"</string> <string name="keyboard_key_media_rewind" msgid="3450387734224327577">"ወደኋላ አጠንጥን"</string> <string name="keyboard_key_media_fast_forward" msgid="3572444327046911822">"በፍጥነት አሳልፍ"</string> - <string name="keyboard_key_page_up" msgid="173914303254199845">"ገጽ ወደ ላይ"</string> - <string name="keyboard_key_page_down" msgid="9035902490071829731">"ገጽ ወደ ታች"</string> + <string name="keyboard_key_page_up" msgid="173914303254199845">"ገፅ ወደ ላይ"</string> + <string name="keyboard_key_page_down" msgid="9035902490071829731">"ገፅ ወደ ታች"</string> <string name="keyboard_key_forward_del" msgid="5325501825762733459">"ሰርዝ"</string> <string name="keyboard_key_move_home" msgid="3496502501803911971">"መነሻ"</string> <string name="keyboard_key_move_end" msgid="99190401463834854">"መጨረሻ"</string> @@ -629,10 +657,10 @@ <string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"መተግበሪያዎችን ይክፈቱ"</string> <string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"የአሁኑ መተግበሪያ"</string> <string name="group_system_access_notification_shade" msgid="7116898151485382275">"የማሳወቂያ ጥላ መዳረሻ"</string> - <string name="group_system_full_screenshot" msgid="7389040853798023211">"ሙሉ ቅጽበታዊ ገጽ እይታ ያነሳል"</string> + <string name="group_system_full_screenshot" msgid="7389040853798023211">"ሙሉ ቅጽበታዊ ገፅ እይታ ያነሳል"</string> <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"የሥርዓት / የመተግበሪያ አቋራጮች ዝርዝር መዳረሻ"</string> <string name="group_system_go_back" msgid="8838454003680364227">"ተመለስ፦ ወደ ቀዳሚው ሁኔታ ይመለሳል (ተመለስ አዝራር)"</string> - <string name="group_system_access_home_screen" msgid="1857344316928441909">"የመነሻ ማያ ገጽ መዳረሻ"</string> + <string name="group_system_access_home_screen" msgid="1857344316928441909">"የመነሻ ማያ ገፅ መዳረሻ"</string> <string name="group_system_overview_open_apps" msgid="6897128761003265350">"የክፍት መተግበሪያዎች አጠቃላይ እይታ"</string> <string name="group_system_cycle_forward" msgid="9202444850838205990">"የቅርብ ጊዜ መተግበሪያዎች ላይ ዑደት ያደርጋል (ወደ ፊት)"</string> <string name="group_system_cycle_back" msgid="5163464503638229131">"የቅርብ ጊዜ መተግበሪያዎች ላይ ዑደት ያደርጋል (ወደ ኋላ)"</string> @@ -640,13 +668,13 @@ <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"የተግባር አሞሌን ይደብቃል እና (እንደገና) ያሳያል"</string> <string name="group_system_access_system_settings" msgid="7961639365383008053">"የሥርዓት ቅንብሮች መዳረሻ"</string> <string name="group_system_access_google_assistant" msgid="1186152943161483864">"የGoogle ረዳት መዳረሻ"</string> - <string name="group_system_lock_screen" msgid="7391191300363416543">"ማያ ገጽ ቁልፍ"</string> + <string name="group_system_lock_screen" msgid="7391191300363416543">"ማያ ገፅ ቁልፍ"</string> <string name="group_system_quick_memo" msgid="2914234890158583919">"ለፈጣን ማስታወሻ የማስታወሻዎች መተግበሪያን ያወጣል"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"የሥርዓት ብዙ ተግባራትን በተመሳሳይ ጊዜ ማከናወን"</string> - <string name="system_multitasking_rhs" msgid="6593269428880305699">"ለአርኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገጽ ይገባል"</string> - <string name="system_multitasking_lhs" msgid="8839380725557952846">"ለኤልኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገጽ ይገባል"</string> - <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ከየተከፈለ ማያ ገጽ ወደ ሙሉ ገጽ ዕይታ ይቀይራል"</string> - <string name="system_multitasking_replace" msgid="844285282472557186">"በተከፈለ ማያ ገጽ ወቅት፦ መተግበሪያን ከአንዱ ወደ ሌላው ይተካል"</string> + <string name="system_multitasking_rhs" msgid="6593269428880305699">"ለአርኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገፅ ይገባል"</string> + <string name="system_multitasking_lhs" msgid="8839380725557952846">"ለኤልኤችኤስ በአሁኑ መተግበሪያ ወደ የተከፈለ ማያ ገፅ ይገባል"</string> + <string name="system_multitasking_full_screen" msgid="1962084334200006297">"ከየተከፈለ ማያ ገፅ ወደ ሙሉ ገፅ ዕይታ ይቀይራል"</string> + <string name="system_multitasking_replace" msgid="844285282472557186">"በተከፈለ ማያ ገፅ ወቅት፦ መተግበሪያን ከአንዱ ወደ ሌላው ይተካል"</string> <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"ግቤት"</string> <string name="input_switch_input_language_next" msgid="3394291576873633793">"የግቤት ቋንቋን ይቀይራል (ቀጣይ ቋንቋ)"</string> <string name="input_switch_input_language_previous" msgid="8823659252918609216">"ግቤት ቋንቋን ይቀይራል (ቀዳሚ ቋንቋ)"</string> @@ -737,8 +765,8 @@ <string name="accessibility_quick_settings_open_settings" msgid="536838345505030893">"የ<xliff:g id="ID_1">%s</xliff:g> ቅንብሮችን ክፈት።"</string> <string name="accessibility_quick_settings_edit" msgid="1523745183383815910">"የቅንብሮድ ቅደም-ተከተል አርትዕ።"</string> <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"የኃይል ምናሌ"</string> - <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"ገጽ <xliff:g id="ID_1">%1$d</xliff:g> ከ <xliff:g id="ID_2">%2$d</xliff:g>"</string> - <string name="tuner_lock_screen" msgid="2267383813241144544">"ማያ ገጽ ቁልፍ"</string> + <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"ገፅ <xliff:g id="ID_1">%1$d</xliff:g> ከ <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="tuner_lock_screen" msgid="2267383813241144544">"ማያ ገፅ ቁልፍ"</string> <string name="thermal_shutdown_title" msgid="2702966892682930264">"ስልክ በሙቀት ምክንያት ጠፍቷል"</string> <string name="thermal_shutdown_message" msgid="6142269839066172984">"የእርስዎ ስልክ በመደበኛ ሁኔታ እየሠራ ነው።\nለተጨማሪ መረጃ መታ ያድርጉ"</string> <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"የእርስዎ ስልክ በጣም ግሎ ነበር፣ ስለዚህ እንዲቀዘቅዝ ጠፍቷል። የእርስዎ ስልክ አሁን በመደበኝነት እያሄደ ነው።\n\nየሚከተሉትን ካደረጉ የእርስዎ በጣም ሊግል ይችላል፦\n • ኃይል በጣም የሚጠቀሙ መተግበሪያዎችን (እንደ ጨዋታ፣ ቪዲዮ ወይም የአሰሳ መተግበሪያዎች ያሉ) ከተጠቀሙ\n • ትላልቅ ፋይሎችን ካወረዱ ወይም ከሰቀሉ\n • ስልክዎን በከፍተኛ ሙቀት ውስጥ ከተጠቀሙ"</string> @@ -766,7 +794,7 @@ <string name="tuner_app" msgid="6949280415826686972">"የ<xliff:g id="APP">%1$s</xliff:g> መተግበሪያ"</string> <string name="notification_channel_alerts" msgid="3385787053375150046">"ማንቂያዎች"</string> <string name="notification_channel_battery" msgid="9219995638046695106">"ባትሪ"</string> - <string name="notification_channel_screenshot" msgid="7665814998932211997">"ቅጽበታዊ ገጽ እይታዎች"</string> + <string name="notification_channel_screenshot" msgid="7665814998932211997">"ቅጽበታዊ ገፅ እይታዎች"</string> <string name="notification_channel_instant" msgid="7556135423486752680">"ቅጽበታዊ መተግበሪያዎች"</string> <string name="notification_channel_setup" msgid="7660580986090760350">"ውቅረት"</string> <string name="notification_channel_storage" msgid="2720725707628094977">"ማከማቻ"</string> @@ -836,7 +864,7 @@ <string name="accessibility_control_move_left" msgid="8156206978511401995">"ወደ ግራ ውሰድ"</string> <string name="accessibility_control_move_right" msgid="8926821093629582888">"ወደ ቀኝ ውሰድ"</string> <string name="magnification_mode_switch_description" msgid="2698364322069934733">"የማጉላት ማብሪያ/ማጥፊያ"</string> - <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"ሙሉ ገጽ እይታን ያጉሉ"</string> + <string name="magnification_mode_switch_state_full_screen" msgid="5229653514979530561">"ሙሉ ገፅ እይታን ያጉሉ"</string> <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"የማያ ገጹን ክፍል አጉላ"</string> <string name="magnification_open_settings_click_label" msgid="6151849212725923363">"የማጉያ ቅንብሮችን ክፈት"</string> <string name="magnification_drag_corner_to_resize" msgid="1249766311052418130">"መጠን ለመቀየር ጠርዙን ይዘው ይጎትቱ"</string> @@ -854,7 +882,7 @@ <string name="accessibility_magnification_medium" msgid="6994632616884562625">"መካከለኛ"</string> <string name="accessibility_magnification_small" msgid="8144502090651099970">"ትንሽ"</string> <string name="accessibility_magnification_large" msgid="6602944330021308774">"ትልቅ"</string> - <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"ሙሉ ገጽ ዕይታ"</string> + <string name="accessibility_magnification_fullscreen" msgid="5043514702759201964">"ሙሉ ገፅ ዕይታ"</string> <string name="accessibility_magnification_done" msgid="263349129937348512">"ተከናውኗል"</string> <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"አርትዕ"</string> <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"የማጉያ መስኮት ቅንብሮች"</string> @@ -902,9 +930,9 @@ <string name="controls_dialog_remove" msgid="3775288002711561936">"አስወግድ"</string> <string name="controls_dialog_message" msgid="342066938390663844">"በ<xliff:g id="APP">%s</xliff:g> የተጠቆመ"</string> <string name="controls_tile_locked" msgid="731547768182831938">"መሣሪያ ተቆልፏል"</string> - <string name="controls_settings_show_controls_dialog_title" msgid="3357852503553809554">"ከማያ ገጽ ቆልፍ ላይ መሳሪያዎች ይታዩ እና ይቆጣጠሩ?"</string> - <string name="controls_settings_show_controls_dialog_message" msgid="7666211700524587969">"ለውጫዊ መሳሪያዎችዎ መቆጣጠሪያዎችን ወደ ማያ ገጽ ቆልፍ ማከል ይችላሉ።\n\nየእርስዎ መሣሪያ መተግበሪያ የእርስዎን ስልክ ወይም ጡባዊ ሳይከፍቱ አንዳንድ መሣሪያዎችን እንዲቆጣጠሩ ሊፈቅድልዎ ይችላል።\n\nበቅንብሮች ውስጥ በማንኛውም ጊዜ ለውጦችን ማድረግ ይችላሉ።"</string> - <string name="controls_settings_trivial_controls_dialog_title" msgid="7593188157655036677">"መሳሪያዎች ከማያ ገጽ ቆልፍ ይቆጣጠሩ?"</string> + <string name="controls_settings_show_controls_dialog_title" msgid="3357852503553809554">"ከማያ ገፅ ቆልፍ ላይ መሳሪያዎች ይታዩ እና ይቆጣጠሩ?"</string> + <string name="controls_settings_show_controls_dialog_message" msgid="7666211700524587969">"ለውጫዊ መሳሪያዎችዎ መቆጣጠሪያዎችን ወደ ማያ ገፅ ቆልፍ ማከል ይችላሉ።\n\nየእርስዎ መሣሪያ መተግበሪያ የእርስዎን ስልክ ወይም ጡባዊ ሳይከፍቱ አንዳንድ መሣሪያዎችን እንዲቆጣጠሩ ሊፈቅድልዎ ይችላል።\n\nበቅንብሮች ውስጥ በማንኛውም ጊዜ ለውጦችን ማድረግ ይችላሉ።"</string> + <string name="controls_settings_trivial_controls_dialog_title" msgid="7593188157655036677">"መሳሪያዎች ከማያ ገፅ ቆልፍ ይቆጣጠሩ?"</string> <string name="controls_settings_trivial_controls_dialog_message" msgid="397178734990952575">"የእርስዎን ስልክ ወይም ጡባዊ ሳይከፍቱ አንዳንድ መሣሪያዎችን መቆጣጠር ይችላሉ። የእርስዎ መሣሪያ መተግበሪያ የትኞቹን መሣሪያዎች በዚህ መንገድ መቆጣጠር እንደሚቻል ይወስናል።"</string> <string name="controls_settings_dialog_neutral_button" msgid="4514446354793124140">"አይ፣ አመሰግናለሁ"</string> <string name="controls_settings_dialog_positive_button" msgid="436070672551674863">"አዎ"</string> @@ -1075,7 +1103,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"አርትዕ"</string> <string name="add" msgid="81036585205287996">"አክል"</string> <string name="manage_users" msgid="1823875311934643849">"ተጠቃሚዎችን ያስተዳድሩ"</string> - <string name="drag_split_not_supported" msgid="7173481676120546121">"ይህ ማሳወቂያ ወደ የተከፈለ ማያ ገጽ መጎተትን አይደግፍም"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"ይህ ማሳወቂያ ወደ የተከፈለ ማያ ገፅ መጎተትን አይደግፍም"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"Wi‑Fi አይገኝም"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"የቅድሚያ ሁነታ"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"ማንቂያ ተቀናብሯል"</string> @@ -1123,15 +1151,13 @@ <string name="call_from_work_profile_text" msgid="3458704745640229638">"የሥራ መመሪያዎ እርስዎ ከሥራ መገለጫው ብቻ ጥሪ እንዲያደርጉ ይፈቅድልዎታል"</string> <string name="call_from_work_profile_action" msgid="2937701298133010724">"ወደ የሥራ መገለጫ ቀይር"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ዝጋ"</string> - <string name="lock_screen_settings" msgid="6152703934761402399">"ማያ ገጽ ቁልፍን አብጅ"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="lock_screen_settings" msgid="6152703934761402399">"ማያ ገፅ ቁልፍን አብጅ"</string> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"የማያ ገጽ ቁልፍን ለማበጀት ይክፈቱ"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi አይገኝም"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ካሜራ ታግዷል"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ካሜራ እና ማይክሮፎን ታግደዋል"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ማይክሮፎን ታግዷል"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"የቅድሚያ ሁነታ በርቷል"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"የረዳት ትኩረት በርቷል"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"በቅንብሮች ውስጥ ነባሪ የማስታወሻዎች መተግበሪያን ያቀናብሩ"</string> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 29a7c50ab10b..22e3c496176b 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"عند إدخال نقش غير صحيح في المحاولة التالية، سيتم حذف ملفك الشخصي للعمل وبياناته."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"عند إدخال رقم تعريف شخصي غير صحيح في المحاولة التالية، سيتم حذف ملفك الشخصي للعمل وبياناته."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"عند إدخال كلمة مرور غير صحيحة في المحاولة التالية، سيتم حذف ملفك الشخصي للعمل وبياناته."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"المس أداة استشعار بصمة الإصبع"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"يتعذّر التعرّف على الوجه. استخدِم بصمة الإصبع بدلاً من ذلك."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"التبديل إلى الملف الشخصي للعمل"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"إغلاق"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"تخصيص شاشة القفل"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"الفتح لتخصيص شاشة القفل"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"لا يتوفّر اتصال Wi-Fi."</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"استخدام الكاميرا محظور."</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"استخدام الكاميرا والميكروفون محظور."</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"استخدام الميكروفون محظور."</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"وضع الأولوية مفعّل."</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"ميزة لفت انتباه \"مساعد Google\" مفعّلة."</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"يمكنك ضبط تطبيق تدوين الملاحظات التلقائي في \"الإعدادات\"."</string> </resources> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 775c8d4d38de..6df58a3fb7e8 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -24,7 +24,7 @@ <string name="battery_low_description" msgid="3282977755476423966">"আপোনাৰ <xliff:g id="PERCENTAGE">%s</xliff:g> বেটাৰী বাকী আছে। বেটাৰী সঞ্চয়কাৰীয়ে গাঢ় ৰঙৰ থীম অন কৰে, নেপথ্যৰ কাৰ্যকলাপ সীমাবদ্ধ কৰে আৰু জাননী পলম কৰে।"</string> <string name="battery_low_intro" msgid="5148725009653088790">"বেটাৰী সঞ্চয়কাৰীয়ে গাঢ় ৰঙৰ থীম অন কৰে, নেপথ্যৰ কাৰ্যকলাপ সীমাবদ্ধ কৰে আৰু জাননী পলম কৰে।"</string> <string name="battery_low_percent_format" msgid="4276661262843170964">"<xliff:g id="PERCENTAGE">%s</xliff:g> বাকী আছে"</string> - <string name="invalid_charger_title" msgid="938685362320735167">"ইউএছবি জৰিয়তে চ্চাৰ্জ কৰিব নোৱাৰি"</string> + <string name="invalid_charger_title" msgid="938685362320735167">"ইউএছবি জৰিয়তে চাৰ্জ কৰিব নোৱাৰি"</string> <string name="invalid_charger_text" msgid="2339310107232691577">"আপোনাৰ ডিভাইচৰ লগত পোৱা চ্চাৰ্জাৰটো ব্যৱহাৰ কৰক।"</string> <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"বেটাৰী সঞ্চয়কাৰী অন কৰিবনে?"</string> <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"বেটাৰী সঞ্চয়কাৰীৰ বিষয়ে"</string> @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"আপুনি পৰৱৰ্তী প্ৰয়াসত এটা ভুল আৰ্হি দিলে, আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইল আৰু ইয়াৰ ডেটা মচি পেলোৱা হ’ব।"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"আপুনি পৰৱৰ্তী প্ৰয়াসত এটা ভুল পিন দিলে, আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইল আৰু ইয়াৰ ডেটা মচি পেলোৱা হ’ব।"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"আপুনি পৰৱৰ্তী প্ৰয়াসত এটা ভুল পাছৱৰ্ড দিলে, আপোনাৰ কৰ্মস্থানৰ প্ৰ’ফাইল আৰু ইয়াৰ ডেটা মচি পেলোৱা হ’ব।"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"মুখাৱয়ব চিনিব নোৱাৰি। ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক।"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -712,7 +740,7 @@ </string-array> <string-array name="battery_options"> <item msgid="7714004721411852551">"সদায় শতাংশত দেখুৱাব"</item> - <item msgid="3805744470661798712">"চ্চাৰ্জ কৰি থকাৰ সময়ত শতাংশ দেখুৱাওক (ডিফ\'ল্ট)"</item> + <item msgid="3805744470661798712">"চাৰ্জ কৰি থকাৰ সময়ত শতাংশ দেখুৱাওক (ডিফ\'ল্ট)"</item> <item msgid="8619482474544321778">"এই আইকনটো নেদেখুৱাব"</item> </string-array> <string name="tuner_low_priority" msgid="8412666814123009820">"কম গুৰুত্বপূৰ্ণ জাননীৰ আইকনসমূহ দেখুৱাওক"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index c30b2830d76c..d9ecaee66da2 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Növbəti cəhddə yanlış model daxil etsəniz, iş profili və datası silinəcək."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Növbəti cəhddə yanlış PIN daxil etsəniz, iş profili və datası silinəcək."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Növbəti cəhddə yanlış parol daxil etsəniz, iş profili və datası silinəcək."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Barmaq izi sensoruna klikləyin"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Tanımaq olmur. Barmaq izini işlədin."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"İş profilinə keçin"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Bağlayın"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Kilid ekranını fərdiləşdirin"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Kilid ekranını fərdiləşdirmək üçün kiliddən çıxarın"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi əlçatan deyil"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera bloklanıb"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera və mikrofon bloklanıb"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon bloklanıb"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritet rejimi aktivdir"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistent aktivdir"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ayarlarda defolt qeydlər tətbiqi ayarlayın"</string> </resources> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 81e2eff57d9d..fca07c846255 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Ako unesete netačan šablon pri sledećem pokušaju, izbrisaćemo poslovni profil i njegove podatke."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Ako unesete netačan PIN pri sledećem pokušaju, izbrisaćemo poslovni profil i njegove podatke."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Ako unesete netačnu lozinku pri sledećem pokušaju, izbrisaćemo poslovni profil i njegove podatke."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dodirnite senzor za otisak prsta"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Lice nije prepoznato. Koristite otisak prsta."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Prevucite da biste videli još"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Učitavaju se preporuke"</string> <string name="controls_media_title" msgid="1746947284862928133">"Mediji"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Želite li da sakrijete ovu kontrolu za medije za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Želite da sakrijete ovu kontrolu za medije za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Aktuelna sesija medija ne može da bude sakrivena."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Sakrij"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Nastavi"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Pređi na poslovni profil"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Zatvori"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Prilagodi zaključani ekran"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Otključajte da biste prilagodili zaključani ekran"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"WiFi nije dostupan"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokirana"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon su blokirani"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritetni režim je uključen"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Pomoćnik je u aktivnom stanju"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Podesite podrazumevanu aplikaciju za beleške u Podešavanjima"</string> </resources> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index e742c019a046..196e030f8e87 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Калі вы ўведзяце няправільны ўзор разблакіроўкі яшчэ раз, ваш працоўны профіль і звязаныя з ім даныя будуць выдалены."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Калі вы ўведзяце няправільны PIN-код яшчэ раз, ваш працоўны профіль і звязаныя з ім даныя будуць выдалены."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Калі вы ўведзяце няправільны пароль яшчэ раз, ваш працоўны профіль і звязаныя з ім даныя будуць выдалены."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Дакраніцеся да сканера адбіткаў пальцаў"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Твар не распазнаны. Скарыстайце адбітак пальца."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Пераключыцца на працоўны профіль"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Закрыць"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Наладзіць экран блакіроўкі"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Разблакіруйце, каб наладзіць экран блакіроўкі"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Сетка Wi-Fi недаступная"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера заблакіравана"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера і мікрафон заблакіраваны"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Мікрафон заблакіраваны"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Прыярытэтны рэжым уключаны"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Памочнік гатовы выконваць каманды"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайце ў Наладах стандартную праграму для нататак"</string> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 910ecfc867aa..8cd1efd20c39 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Ако въведете неправилна фигура при следващия опит, служебният ви потребителски профил и данните в него ще бъдат изтрити."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Ако въведете неправилен ПИН код при следващия опит, служебният ви потребителски профил и данните в него ще бъдат изтрити."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Ако въведете неправилна парола при следващия опит, служебният ви потребителски профил и данните в него ще бъдат изтрити."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Докоснете сензора за отпечатъци"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Лицето не е разпознато. Използвайте отпечатък."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Прекарайте пръст, за да видите повече"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Препоръките се зареждат"</string> <string name="controls_media_title" msgid="1746947284862928133">"Мултимедия"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Скриване за <xliff:g id="APP_NAME">%1$s</xliff:g> на контролата за мултимедия?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Скриване на мултимед. контрола за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Текущата сесия за мултимедия не бе скрита."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Скриване"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Възобновяване"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Превключване към служебния потребителски профил"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Затваряне"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Персонализ. на заключения екран"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Отключете, за да персонализирате заключения екран"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi не е налице"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Достъпът до камерата е блокиран"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Достъпът до камерата и микрофона е блокиран"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Достъпът до микрофона е блокиран"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Приоритетният режим е включен"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Функцията за активиране на Асистент е включена"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайте стандартно приложение за бележки от настройките"</string> </resources> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 9e029dc18f9b..692a2dcb0cd2 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -168,6 +168,20 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"আপনি পরের বারও ভুল প্যাটার্ন দিলে আপনার অফিস প্রোফাইল এবং তার ডেটা মুছে দেওয়া হবে।"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"আপনি পরের বারও ভুল পিন দিলে আপনার অফিস প্রোফাইল এবং তার ডেটা মুছে দেওয়া হবে।"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"আপনি পরের বারও ভুল পাসওয়ার্ড দিলে আপনার অফিস প্রোফাইল এবং তার ডেটা মুছে দেওয়া হবে।"</string> + <string name="biometric_re_enroll_dialog_confirm" msgid="3049858021857801836">"সেট-আপ করুন"</string> + <string name="biometric_re_enroll_dialog_cancel" msgid="93760939407091417">"এখন নয়"</string> + <string name="biometric_re_enroll_notification_content" msgid="8685925877186288180">"সুরক্ষা ও পারফর্ম্যান্স উন্নত করতে এটি প্রয়োজন"</string> + <string name="fingerprint_re_enroll_notification_title" msgid="4539432429683916604">"\'ফিঙ্গারপ্রিন্ট আনলক\' আবার সেট-আপ করুন"</string> + <string name="fingerprint_re_enroll_notification_name" msgid="630798657797645704">"ফিঙ্গারপ্রিন্ট আনলক"</string> + <string name="fingerprint_re_enroll_dialog_title" msgid="3526033128113925780">"\'ফিঙ্গারপ্রিন্ট আনলক\' সেট-আপ করুন"</string> + <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"\'ফিঙ্গারপ্রিন্ট আনলক\' আবার সেট-আপ করতে, আপনার বর্তমানে থাকা ফিঙ্গারপ্রিন্ট ইমেজ ও মডেল মুছে ফেলা হবে।\n\nমুছে ফেলা হয়ে গেলে, আপনার ফোন আনলক করতে অথবা নিজের পরিচয় যাচাই করার জন্য ফিঙ্গারপ্রিন্ট ব্যবহার করতে হলে আপনাকে আবার \'ফিঙ্গারপ্রিন্ট আনলক\' সেট-আপ করতে হবে।"</string> + <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"\'ফিঙ্গারপ্রিন্ট আনলক\' আবার সেট-আপ করতে, আপনার বর্তমানে থাকা ফিঙ্গারপ্রিন্ট ইমেজ ও মডেল মুছে ফেলা হবে।\n\nমুছে ফেলা হয়ে গেলে, আপনার ফোন আনলক করতে অথবা নিজের পরিচয় যাচাই করার জন্য ফিঙ্গারপ্রিন্ট ব্যবহার করতে হলে আপনাকে আবার \'ফিঙ্গারপ্রিন্ট আনলক\' সেট-আপ করতে হবে।"</string> + <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"\'ফিঙ্গারপ্রিন্ট আনলক\' সেট-আপ করা যায়নি। আবার চেষ্টা করতে সেটিংসে যান।"</string> + <string name="face_re_enroll_notification_title" msgid="1850838867718410520">"\'ফেস আনলক\' আবার সেট আপ করুন"</string> + <string name="face_re_enroll_notification_name" msgid="7384545252206120659">"ফেস আনলক"</string> + <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"\'ফেস আনলক\' সেট-আপ করুন"</string> + <string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"\'ফেস আনলক\' আবার সেট-আপ করতে, বর্তমানে থাকা আপনার ফেস মডেলটি মুছে ফেলা হবে।\n\nফেস ব্যবহার করে আপনার ফোন আনলক করার জন্য আপনাকে আবার এই ফিচার সেট-আপ করতে হবে।"</string> + <string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"\'ফেস আনলক\' সেট-আপ করা যায়নি। আবার চেষ্টা করতে সেটিংসে যান।"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"আঙ্গুলের ছাপের সেন্সর স্পর্শ করুন"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"মুখ শনাক্ত করতে পারছি না। পরিবর্তে আঙ্গুলের ছাপ ব্যবহার করুন।"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -885,8 +899,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"পছন্দসই থেকে সরান"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"<xliff:g id="NUMBER">%d</xliff:g> অবস্থানে সরান"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"নিয়ন্ত্রণ"</string> - <!-- no translation found for controls_favorite_subtitle (5818709315630850796) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="5818709315630850796">"ঝটপট অ্যাক্সেস করতে, ডিভাইস সংক্রান্ত কন্ট্রোল বেছে নিন"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"কন্ট্রোলগুলিকে আবার সাজানোর জন্য ধরে রেখে টেনে আনুন"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"সমস্ত কন্ট্রোল সরানো হয়েছে"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"পরিবর্তন সেভ করা হয়নি"</string> @@ -1124,14 +1137,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"অফিস প্রোফাইলে পাল্টে নিন"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"বন্ধ করুন"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"লক স্ক্রিন কাস্টমাইজ করুন"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"লক স্ক্রিন কাস্টমাইজ করতে আনলক করুন"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"ওয়াই-ফাই উপলভ্য নয়"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ক্যামেরার অ্যাক্সেস ব্লক করা আছে"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ক্যামেরা এবং মাইক্রোফোনের অ্যাক্সেস ব্লক করা আছে"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"মাইক্রোফোনের অ্যাক্সেস ব্লক করা আছে"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"\'প্রায়োরিটি\' মোড চালু করা আছে"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"অ্যাসিস্ট্যান্ট আপনার কথা শোনার জন্য চালু করা আছে"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"\'সেটিংস\' থেকে ডিফল্ট নোট নেওয়ার অ্যাপ সেট করুন"</string> </resources> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 34dc7f5e900b..82d59df928b0 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -168,6 +168,20 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Ako u sljedećem pokušaju unesete neispravan uzorak, vaš radni profil i njegovi podaci će se izbrisati."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Ako u sljedećem pokušaju unesete neispravan PIN, vaš radni profil i njegovi podaci će se izbrisati."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Ako u sljedećem pokušaju unesete neispravnu lozinku, vaš radni profil i njegovi podaci će se izbrisati."</string> + <string name="biometric_re_enroll_dialog_confirm" msgid="3049858021857801836">"Postavi"</string> + <string name="biometric_re_enroll_dialog_cancel" msgid="93760939407091417">"Ne sada"</string> + <string name="biometric_re_enroll_notification_content" msgid="8685925877186288180">"Ovo je potrebno radi poboljšanja sigurnosti i performansi"</string> + <string name="fingerprint_re_enroll_notification_title" msgid="4539432429683916604">"Ponovo postavite otključavanje otiskom prsta"</string> + <string name="fingerprint_re_enroll_notification_name" msgid="630798657797645704">"Otključavanje otiskom prsta"</string> + <string name="fingerprint_re_enroll_dialog_title" msgid="3526033128113925780">"Postavite otključavanje otiskom prsta"</string> + <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"Da ponovo postavite otključavanje otiskom prsta, trenutne slike i modeli otiska prsta će se izbrisati.\n\nNakon što se izbrišu, morat ćete ponovo postaviti otključavanje otiskom prsta da koristite otisak prsta za otključavanje telefona ili potvrdu identiteta."</string> + <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"Da ponovo postavite otključavanje otiskom prsta, trenutne slike i model otiska prsta će se izbrisati.\n\nNakon što se izbrišu, morat ćete ponovo postaviti otključavanje otiskom prsta da koristite otisak prsta za otključavanje telefona ili potvrdu identiteta."</string> + <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"Postavljanje otključavanja otiskom prsta nije uspjelo. Idite u Postavke da pokušate ponovo."</string> + <string name="face_re_enroll_notification_title" msgid="1850838867718410520">"Ponovo postavite otključavanje licem"</string> + <string name="face_re_enroll_notification_name" msgid="7384545252206120659">"Otključavanje licem"</string> + <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"Postavite otključavanje licem"</string> + <string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"Da ponovo postavite otključavanje licem, trenutni model lica će se izbrisati.\n\nMorat ćete ponovo postaviti ovu funkciju da koristite lice za otključavanje telefona."</string> + <string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"Postavljanje otključavanja licem nije uspjelo. Idite u Postavke da pokušate ponovo."</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dodirnite senzor za otisak prsta"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nije moguće prepoznati lice. Koristite otisak prsta."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -885,8 +899,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"uklonite iz omiljenog"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"Premjesti na poziciju <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontrole"</string> - <!-- no translation found for controls_favorite_subtitle (5818709315630850796) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="5818709315630850796">"Odaberite kontrole uređaja da pristupite brzo"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Držite i prevucite da preuredite kontrole"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Sve kontrole su uklonjene"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Promjene nisu sačuvane"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 1a8239b027f4..b34a0a179b82 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Si tornes a introduir un patró incorrecte, se suprimirà el perfil de treball i les dades que contingui."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Si tornes a introduir un PIN incorrecte, se suprimirà el perfil de treball i les dades que contingui."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Si tornes a introduir una contrasenya incorrecta, se suprimirà el perfil de treball i les dades que contingui."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toca el sensor d\'empremtes digitals"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"No podem detectar la cara. Usa l\'empremta digital."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Llisca per veure\'n més"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Carregant les recomanacions"</string> <string name="controls_media_title" msgid="1746947284862928133">"Multimèdia"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Vols amagar aquest control multimèdia per a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Amagar aquest control multimèdia per a <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"La sessió multimèdia actual no es pot amagar."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Amaga"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Reprèn"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Canvia al perfil de treball"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Tanca"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Personalitza pantalla de bloqueig"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloqueja per personalitzar la pantalla de bloqueig"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"No hi ha cap Wi‑Fi disponible"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"La càmera està bloquejada"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"La càmera i el micròfon estan bloquejats"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"El micròfon està bloquejat"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"El mode Prioritat està activat"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"L\'Assistent està activat"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defineix l\'aplicació de notes predeterminada a Configuració"</string> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index c26bd88be3d8..380635d85f1c 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Pokud při příštím pokusu zadáte nesprávné gesto, váš pracovní profil a přidružená data budou smazána."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Pokud při příštím pokusu zadáte nesprávný PIN, váš pracovní profil a přidružená data budou smazána."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Pokud při příštím pokusu zadáte nesprávné heslo, váš pracovní profil a přidružená data budou smazána."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dotkněte se snímače otisků prstů"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Obličej se nepodařilo rozpoznat. Použijte místo něj otisk prstu."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Přepnout na pracovní profil"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Zavřít"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Přizpůsobit zámek obrazovky"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Pokud chcete upravit obrazovku uzamčení, odemkněte zařízení"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Síť Wi-Fi není dostupná"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokována"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera a mikrofon jsou blokovány"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokován"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Režim priority je zapnutý"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Pozornost Asistenta je zapnutá"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Výchozí aplikaci pro poznámky nastavíte v Nastavení"</string> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index bb3841d71420..f3409a33d45b 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -168,6 +168,20 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Hvis du angiver et forkert mønster i næste forsøg, slettes din arbejdsprofil og de tilhørende data."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Hvis du angiver en forkert pinkode i næste forsøg, slettes din arbejdsprofil og de tilhørende data."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Hvis du angiver en forkert adgangskode i næste forsøg, slettes din arbejdsprofil og de tilhørende data."</string> + <string name="biometric_re_enroll_dialog_confirm" msgid="3049858021857801836">"Konfigurer"</string> + <string name="biometric_re_enroll_dialog_cancel" msgid="93760939407091417">"Ikke nu"</string> + <string name="biometric_re_enroll_notification_content" msgid="8685925877186288180">"Dette er påkrævet for at forbedre sikkerheden og ydeevnen"</string> + <string name="fingerprint_re_enroll_notification_title" msgid="4539432429683916604">"Konfigurer oplåsning med fingeraftryk igen"</string> + <string name="fingerprint_re_enroll_notification_name" msgid="630798657797645704">"Oplåsning med fingeraftryk"</string> + <string name="fingerprint_re_enroll_dialog_title" msgid="3526033128113925780">"Konfigurer oplåsning med fingeraftryk"</string> + <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"Hvis du vil konfigurere oplåsning med fingeraftryk igen, bliver dine nuværende fingeraftryksbilleder og -modeller slettet.\n\nNår de er slettet, skal du konfigurere oplåsning med fingeraftryk igen for at bruge dit fingeraftryk til at låse din telefon op eller verificere din identitet."</string> + <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"Hvis du vil konfigurere oplåsning med fingeraftryk igen, bliver dine nuværende fingeraftryksbilleder og -modeller slettet.\n\nNår de er slettet, skal du konfigurere oplåsning med fingeraftryk igen for at bruge dit fingeraftryk til at låse din telefon op eller verificere din identitet."</string> + <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"Oplåsning med fingeraftryk kunne ikke konfigureres. Gå til Indstillinger for at prøve igen."</string> + <string name="face_re_enroll_notification_title" msgid="1850838867718410520">"Konfigurer ansigtslås igen"</string> + <string name="face_re_enroll_notification_name" msgid="7384545252206120659">"Ansigtslås"</string> + <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"Konfigurer ansigtslås"</string> + <string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"Hvis du vil konfigurere ansigtslås igen, bliver din nuværende ansigtsmodel slettet.\n\nDu skal konfigurere funktionen igen for at bruge ansigtsgenkendelse til at låse din telefon op."</string> + <string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"Ansigtslås kunne ikke konfigureres. Gå til Indstillinger for at prøve igen."</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Sæt fingeren på fingeraftrykssensoren"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ansigtet kan ikke genkendes. Brug fingeraftryk i stedet."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -885,8 +899,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"fjern fra favoritter"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"Flyt til position <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Betjeningselementer"</string> - <!-- no translation found for controls_favorite_subtitle (5818709315630850796) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="5818709315630850796">"Vælg, hvilke enhedsindstillinger du vil have hurtig adgang til"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Flyt et felt ved at holde det nede og trække"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle styringselementerne blev fjernet"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Ændringerne blev ikke gemt"</string> @@ -1124,14 +1137,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Skift til arbejdsprofil"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Luk"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Tilpas låseskærm"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Lås op for at tilpasse låseskærmen"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi er ikke tilgængeligt"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kameraet er blokeret"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Der er blokeret for kameraet og mikrofonen"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen er blokeret"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritetstilstand er aktiveret"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistent lytter"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Angiv standardapp til noter i Indstillinger"</string> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 23ba2fe227da..415a4304a0b7 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Wenn du beim nächsten Versuch ein falsches Muster eingibst, werden dein Arbeitsprofil und die zugehörigen Daten gelöscht."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Wenn du beim nächsten Versuch eine falsche PIN eingibst, werden dein Arbeitsprofil und die zugehörigen Daten gelöscht."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Wenn du beim nächsten Versuch ein falsches Passwort eingibst, werden dein Arbeitsprofil und die zugehörigen Daten gelöscht."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Berühre den Fingerabdrucksensor"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Gesicht wurde nicht erkannt. Verwende stattdessen den Fingerabdruck."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -643,10 +671,10 @@ <string name="group_system_lock_screen" msgid="7391191300363416543">"Sperrbildschirm"</string> <string name="group_system_quick_memo" msgid="2914234890158583919">"Notizen-App für schnelles Memo aufrufen"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"System-Multitasking"</string> - <string name="system_multitasking_rhs" msgid="6593269428880305699">"Geteilten Bildschirm aktivieren, aktuelle App rechts"</string> - <string name="system_multitasking_lhs" msgid="8839380725557952846">"Geteilten Bildschirm aktivieren, aktuelle App links"</string> - <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Vom geteilten Bildschirm zum Vollbild wechseln"</string> - <string name="system_multitasking_replace" msgid="844285282472557186">"Im geteilten Bildschirm: eine App durch eine andere ersetzen"</string> + <string name="system_multitasking_rhs" msgid="6593269428880305699">"Splitscreen aktivieren, aktuelle App rechts"</string> + <string name="system_multitasking_lhs" msgid="8839380725557952846">"Splitscreen aktivieren, aktuelle App links"</string> + <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Vom Splitscreen zum Vollbild wechseln"</string> + <string name="system_multitasking_replace" msgid="844285282472557186">"Im Splitscreen: eine App durch eine andere ersetzen"</string> <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Eingabe"</string> <string name="input_switch_input_language_next" msgid="3394291576873633793">"Eingabesprache ändern (nächste Sprache)"</string> <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Eingabesprache ändern (vorherige Sprache)"</string> @@ -891,12 +919,9 @@ <string name="controls_favorite_removed" msgid="5276978408529217272">"Alle Steuerelemente entfernt"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Änderungen nicht gespeichert"</string> <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Andere Apps ansehen"</string> - <!-- no translation found for controls_favorite_rearrange_button (2942788904364641185) --> - <skip /> - <!-- no translation found for controls_favorite_add_controls (1221420435546694004) --> - <skip /> - <!-- no translation found for controls_favorite_back_to_editing (184125114090062713) --> - <skip /> + <string name="controls_favorite_rearrange_button" msgid="2942788904364641185">"Neu anordnen"</string> + <string name="controls_favorite_add_controls" msgid="1221420435546694004">"Steuerelemente hinzufügen"</string> + <string name="controls_favorite_back_to_editing" msgid="184125114090062713">"Zurück zum Bearbeiten"</string> <string name="controls_favorite_load_error" msgid="5126216176144877419">"Steuerelemente konnten nicht geladen werden. Prüfe in der <xliff:g id="APP">%s</xliff:g> App, ob die Einstellungen möglicherweise geändert wurden."</string> <string name="controls_favorite_load_none" msgid="7687593026725357775">"Kompatible Steuerelemente nicht verfügbar"</string> <string name="controls_favorite_other_zone_header" msgid="9089613266575525252">"Andere"</string> @@ -920,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Wischen, um weitere zu sehen"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Empfehlungen werden geladen"</string> <string name="controls_media_title" msgid="1746947284862928133">"Medien"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Dieses Mediensteuerelement für <xliff:g id="APP_NAME">%1$s</xliff:g> ausblenden?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Mediensteuerung für <xliff:g id="APP_NAME">%1$s</xliff:g> ausblenden?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Die Mediensitzung kann nicht ausgeblendet werden."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Ausblenden"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Fortsetzen"</string> @@ -1078,7 +1103,7 @@ <string name="clipboard_edit" msgid="4500155216174011640">"bearbeiten"</string> <string name="add" msgid="81036585205287996">"Hinzufügen"</string> <string name="manage_users" msgid="1823875311934643849">"Nutzer verwalten"</string> - <string name="drag_split_not_supported" msgid="7173481676120546121">"Diese Benachrichtigung lässt sich nicht auf einen geteilten Bildschirm ziehen"</string> + <string name="drag_split_not_supported" msgid="7173481676120546121">"Diese Benachrichtigung lässt sich nicht auf einen Splitscreen ziehen"</string> <string name="dream_overlay_status_bar_wifi_off" msgid="4497069245055003582">"WLAN nicht verfügbar"</string> <string name="dream_overlay_status_bar_priority_mode" msgid="5428462123314728739">"Prioritätsmodus"</string> <string name="dream_overlay_status_bar_alarm_set" msgid="566707328356590886">"Wecker gestellt"</string> @@ -1127,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Zum Arbeitsprofil wechseln"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Schließen"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Sperrbildschirm personalisieren"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Zum Anpassen des Sperrbildschirms entsperren"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Kein WLAN verfügbar"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera blockiert"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera und Mikrofon blockiert"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon blockiert"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritätsmodus an"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant-Aktivierung an"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standard-Notizen-App in den Einstellungen einrichten"</string> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index b7ad7b9765fb..c3d3477f7342 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Εάν εισαγάγετε εσφαλμένο μοτίβο στην επόμενη προσπάθεια, το προφίλ εργασίας σας και τα δεδομένα του θα διαγραφούν."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Εάν εισαγάγετε εσφαλμένο PIN στην επόμενη προσπάθεια, το προφίλ εργασίας σας και τα δεδομένα του θα διαγραφούν."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Εάν εισαγάγετε εσφαλμένο κωδικό πρόσβασης στην επόμενη προσπάθεια, το προφίλ εργασίας σας και τα δεδομένα του θα διαγραφούν."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Αγγίξτε τον αισθητήρα δακτυλικού αποτυπώματος"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Το πρόσωπο δεν αναγνωρίζεται. Χρησιμ. δακτ. αποτ."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Σύρετε για να δείτε περισσότερα."</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Φόρτωση προτάσεων"</string> <string name="controls_media_title" msgid="1746947284862928133">"Μέσα"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Απόκρυψη στοιχείων ελέγχου μέσων για την εφαρμ. <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Απόκρυψη στοιχ. ελέγχου μέσων για <xliff:g id="APP_NAME">%1$s</xliff:g>;"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Αδυναμία απόκρ. τρέχουσας περιόδ. λειτουργ. μέσου."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Απόκρυψη"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Συνέχιση"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Εναλλαγή σε προφίλ εργασίας"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Κλείσιμο"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Προσαρμογή οθόνης κλειδώματος"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Ξεκλειδώστε για προσαρμογή της οθόνης κλειδώματος"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Δεν υπάρχει διαθέσιμο δίκτυο Wi-Fi"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Η κάμερα έχει αποκλειστεί"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Η κάμερα και το μικρόφωνο έχουν αποκλειστεί"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Το μικρόφωνο έχει αποκλειστεί"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Η λειτουργία προτεραιότητας είναι ενεργοποιημένη"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Ο Βοηθός βρίσκεται σε αναμονή"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ορίστε την προεπιλεγμένη εφαρμογή σημειώσεων στις Ρυθμίσεις"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index bed2089db164..7c47b52af22a 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"If you enter an incorrect pattern on the next attempt, your work profile and its data will be deleted."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"If you enter an incorrect PIN on the next attempt, your work profile and its data will be deleted."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"If you enter an incorrect password on the next attempt, your work profile and its data will be deleted."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 01cccacd4e2c..f1a1e669761d 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -168,6 +168,20 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"If you enter an incorrect pattern on the next attempt, your work profile and its data will be deleted."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"If you enter an incorrect PIN on the next attempt, your work profile and its data will be deleted."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"If you enter an incorrect password on the next attempt, your work profile and its data will be deleted."</string> + <string name="biometric_re_enroll_dialog_confirm" msgid="3049858021857801836">"Set up"</string> + <string name="biometric_re_enroll_dialog_cancel" msgid="93760939407091417">"Not now"</string> + <string name="biometric_re_enroll_notification_content" msgid="8685925877186288180">"This is required to improve security and performance"</string> + <string name="fingerprint_re_enroll_notification_title" msgid="4539432429683916604">"Set up Fingerprint Unlock again"</string> + <string name="fingerprint_re_enroll_notification_name" msgid="630798657797645704">"Fingerprint Unlock"</string> + <string name="fingerprint_re_enroll_dialog_title" msgid="3526033128113925780">"Set up Fingerprint Unlock"</string> + <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"To set up Fingerprint Unlock again, your current fingerprint images and models will be deleted.\n\nAfter theyre deleted, youll need to set up Fingerprint Unlock again to use your fingerprint to unlock your phone or verify its you."</string> + <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"To set up Fingerprint Unlock again, your current fingerprint images and model will be deleted.\n\nAfter theyre deleted, youll need to set up Fingerprint Unlock again to use your fingerprint to unlock your phone or verify its you."</string> + <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"Couldn’t set up fingerprint unlock. Go to Settings to try again."</string> + <string name="face_re_enroll_notification_title" msgid="1850838867718410520">"Set up Face Unlock again"</string> + <string name="face_re_enroll_notification_name" msgid="7384545252206120659">"Face Unlock"</string> + <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"Set up Face Unlock"</string> + <string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"To set up Face Unlock again, your current face model will be deleted.\n\nYoull need to set up this feature again to use your face to unlock your phone."</string> + <string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"Couldn’t set up face unlock. Go to Settings to try again."</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognize face. Use fingerprint instead."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -465,15 +479,15 @@ <string name="csd_lowered_title" product="default" msgid="1786173629015030856">"Lowered to safer volume"</string> <string name="csd_system_lowered_text" product="default" msgid="2001603282316829500">"The volume has been high for longer than recommended"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"App is pinned"</string> - <string name="screen_pinning_description" msgid="8699395373875667743">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> - <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string> + <string name="screen_pinning_description" msgid="8699395373875667743">"This keeps it in view until you unpin. Touch and hold Back and Overview to unpin."</string> + <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"This keeps it in view until you unpin. Touch and hold Back and Home to unpin."</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"This keeps it in view until you unpin. Swipe up & hold to unpin."</string> - <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string> - <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"This keeps it in view until you unpin. Touch & hold Home to unpin."</string> + <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"This keeps it in view until you unpin. Touch and hold Overview to unpin."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"This keeps it in view until you unpin. Touch and hold Home to unpin."</string> <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Personal data may be accessible (such as contacts and email content)."</string> <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Pinned app may open other apps."</string> - <string name="screen_pinning_toast" msgid="8177286912533744328">"To unpin this app, touch & hold Back and Overview buttons"</string> - <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"To unpin this app, touch & hold Back and Home buttons"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"To unpin this app, touch and hold the Back and Overview buttons"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"To unpin this app, touch and hold the Back and Home buttons"</string> <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"To unpin this app, swipe up & hold"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Got it"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"No thanks"</string> @@ -885,8 +899,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"unfavorite"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"Move to position <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Controls"</string> - <!-- no translation found for controls_favorite_subtitle (5818709315630850796) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="5818709315630850796">"Choose device controls to access quickly"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Hold & drag to rearrange controls"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"All controls removed"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Changes not saved"</string> @@ -1106,7 +1119,7 @@ <string name="keyguard_affordance_enablement_dialog_qr_scanner_instruction" msgid="5355839079232119791">"• Install a camera app"</string> <string name="keyguard_affordance_enablement_dialog_home_instruction_1" msgid="8438311171750568633">"• The app is set up"</string> <string name="keyguard_affordance_enablement_dialog_home_instruction_2" msgid="8308525385889021652">"• At least one device is available"</string> - <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Touch & hold shortcut"</string> + <string name="keyguard_affordance_press_too_short" msgid="8145437175134998864">"Touch and hold shortcut"</string> <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Cancel"</string> <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Switch screens now"</string> <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Unfold phone"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index bed2089db164..7c47b52af22a 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"If you enter an incorrect pattern on the next attempt, your work profile and its data will be deleted."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"If you enter an incorrect PIN on the next attempt, your work profile and its data will be deleted."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"If you enter an incorrect password on the next attempt, your work profile and its data will be deleted."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index bed2089db164..7c47b52af22a 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"If you enter an incorrect pattern on the next attempt, your work profile and its data will be deleted."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"If you enter an incorrect PIN on the next attempt, your work profile and its data will be deleted."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"If you enter an incorrect password on the next attempt, your work profile and its data will be deleted."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognise face. Use fingerprint instead."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 885acd1c5e02..b91ee56fd798 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -168,6 +168,20 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"If you enter an incorrect pattern on the next attempt, your work profile and its data will be deleted."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"If you enter an incorrect PIN on the next attempt, your work profile and its data will be deleted."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"If you enter an incorrect password on the next attempt, your work profile and its data will be deleted."</string> + <string name="biometric_re_enroll_dialog_confirm" msgid="3049858021857801836">"Set up"</string> + <string name="biometric_re_enroll_dialog_cancel" msgid="93760939407091417">"Not now"</string> + <string name="biometric_re_enroll_notification_content" msgid="8685925877186288180">"This is required to improve security and performance"</string> + <string name="fingerprint_re_enroll_notification_title" msgid="4539432429683916604">"Set up Fingerprint Unlock again"</string> + <string name="fingerprint_re_enroll_notification_name" msgid="630798657797645704">"Fingerprint Unlock"</string> + <string name="fingerprint_re_enroll_dialog_title" msgid="3526033128113925780">"Set up Fingerprint Unlock"</string> + <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"To set up Fingerprint Unlock again, your current fingerprint images and models will be deleted.\n\nAfter theyre deleted, youll need to set up Fingerprint Unlock again to use your fingerprint to unlock your phone or verify its you."</string> + <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"To set up Fingerprint Unlock again, your current fingerprint images and model will be deleted.\n\nAfter theyre deleted, youll need to set up Fingerprint Unlock again to use your fingerprint to unlock your phone or verify its you."</string> + <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"Couldn’t set up fingerprint unlock. Go to Settings to try again."</string> + <string name="face_re_enroll_notification_title" msgid="1850838867718410520">"Set up Face Unlock again"</string> + <string name="face_re_enroll_notification_name" msgid="7384545252206120659">"Face Unlock"</string> + <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"Set up Face Unlock"</string> + <string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"To set up Face Unlock again, your current face model will be deleted.\n\nYoull need to set up this feature again to use your face to unlock your phone."</string> + <string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"Couldn’t set up face unlock. Go to Settings to try again."</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touch the fingerprint sensor"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Can’t recognize face. Use fingerprint instead."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -885,8 +899,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"unfavorite"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"Move to position <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Controls"</string> - <!-- no translation found for controls_favorite_subtitle (5818709315630850796) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="5818709315630850796">"Choose device controls to access quickly"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Hold & drag to rearrange controls"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"All controls removed"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Changes not saved"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index f63abf21edcc..9445bc43e241 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Si ingresas un patrón incorrecto en el próximo intento, se borrarán tu perfil de trabajo y sus datos."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Si ingresas un PIN incorrecto en el próximo intento, se borrarán tu perfil de trabajo y sus datos."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Si ingresas una contraseña incorrecta en el próximo intento, se borrarán tu perfil de trabajo y sus datos."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toca el sensor de huellas dactilares"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"No se reconoce el rostro. Usa la huella dactilar."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Cambiar al perfil de trabajo"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Cerrar"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar pantalla de bloqueo"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloquea para personalizar la pantalla de bloqueo"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi no disponible"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"La cámara está bloqueada"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"La cámara y el micrófono están bloqueados"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"El micrófono está bloqueado"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"El modo de prioridad está activado"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Asistente está prestando atención"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Configura la app de notas predeterminada en Configuración"</string> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 371425371d7c..61f50e3d3aaf 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Si vuelves a introducir un patrón incorrecto, tu perfil de trabajo y sus datos se eliminarán."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Si vuelves a introducir un PIN incorrecto, tu perfil de trabajo y sus datos se eliminarán."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Si vuelves a introducir una contraseña incorrecta, tu perfil de trabajo y sus datos se eliminarán."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toca el sensor de huellas digitales"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"No se reconoce la cara. Usa la huella digital."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Cambiar al perfil de trabajo"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Cerrar"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar pantalla de bloqueo"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloquea para personalizar la pantalla de bloqueo"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Red Wi-Fi no disponible"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Cámara bloqueada"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Cámara y micrófono bloqueados"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Micrófono bloqueado"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modo Prioridad activado"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"El Asistente está activado"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Configura la aplicación de notas predeterminada en Ajustes"</string> </resources> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index bb9b4fc1a75f..09efa50a01e9 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Kui sisestate järgmisel katsel vale mustri, kustutatakse teie tööprofiil ja selle andmed."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Kui sisestate järgmisel katsel vale PIN-koodi, kustutatakse teie tööprofiil ja selle andmed."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Kui sisestate järgmisel katsel vale parooli, kustutatakse teie tööprofiil ja selle andmed."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Puudutage sõrmejäljeandurit"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nägu ei õnnestu tuvastada. Kasutage sõrmejälge."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -871,7 +899,7 @@ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Teisalda servast eemale ja kuva"</string> <string name="accessibility_floating_button_action_remove_menu" msgid="6730432848162552135">"Eemalda"</string> <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"lülita"</string> - <string name="quick_controls_title" msgid="6839108006171302273">"Seadmete juhikud"</string> + <string name="quick_controls_title" msgid="6839108006171302273">"Seadmete juhtimisvidinad"</string> <string name="controls_providers_title" msgid="6879775889857085056">"Valige juhtelementide lisamiseks rakendus"</string> <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{Lisati # juhtnupp.}other{Lisati # juhtnuppu.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Eemaldatud"</string> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Pühkige sõrmega, et näha rohkem"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Soovituste laadimine"</string> <string name="controls_media_title" msgid="1746947284862928133">"Meedia"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Kas peita rakenduses <xliff:g id="APP_NAME">%1$s</xliff:g> see meediajuhik?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Kas peita see rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> meediajuhik?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Praegust meediaseanssi ei saa peita."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Peida"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Jätka"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 7a6b8f8a8d73..aded22cc934c 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Hurrengo saiakeran eredua oker marrazten baduzu, laneko profila eta bertako datuak ezabatuko dira."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Hurrengo saiakeran PINa oker idazten baduzu, laneko profila eta bertako datuak ezabatuko dira."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Hurrengo saiakeran pasahitza oker idazten baduzu, laneko profila eta bertako datuak ezabatuko dira."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Sakatu hatz-marken sentsorea"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ezin da hauteman aurpegia. Erabili hatz-marka."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -824,7 +852,7 @@ <string name="privacy_type_media_projection" msgid="8136723828804251547">"pantaila-grabaketa"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Ez du izenik"</string> <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Egonean"</string> - <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Letraren tamaina"</string> + <string name="font_scaling_dialog_title" msgid="6273107303850248375">"Letra-tamaina"</string> <string name="font_scaling_smaller" msgid="1012032217622008232">"Txikitu"</string> <string name="font_scaling_larger" msgid="5476242157436806760">"Handitu"</string> <string name="magnification_window_title" msgid="4863914360847258333">"Lupa-leihoa"</string> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Pasatu hatza aukera gehiago ikusteko"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Gomendioak kargatzen"</string> <string name="controls_media_title" msgid="1746947284862928133">"Multimedia-edukia"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren multimedia kontr. aukerak ezkutatu?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Multimedia kontrolatzeko aukerak (<xliff:g id="APP_NAME">%1$s</xliff:g>) ezkutatu?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Ezin da ezkutatu multimedia-saioa."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Ezkutatu"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Berrekin"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Aldatu laneko profilera"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Itxi"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Pertsonalizatu pantaila blokeatua"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desblokeatu eta pertsonalizatu pantaila blokeatua"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wifi-konexioa ez dago erabilgarri"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera blokeatuta dago"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera eta mikrofonoa blokeatuta daude"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonoa blokeatuta dago"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Lehentasun modua aktibatuta dago"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Laguntzailea zerbitzuak arreta jarrita dauka"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ezarri oharren aplikazio lehenetsia ezarpenetan"</string> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index f12ca754e6a2..ce08dd67f649 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"اگر در تلاش بعدی الگوی نادرستی وارد کنید، دادههای نمایه کاری شما و دادههای آن حذف خواهد شد."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"اگر در تلاش بعدی پین نادرستی وارد کنید، نمایه کاری شما و دادههای آن حذف خواهند شد."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"اگر در تلاش بعدی گذرواژه نادرستی وارد کنید، نمایه کاری شما و دادههای آن حذف خواهند شد."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"حسگر اثر انگشت را لمس کنید"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"چهره شناسایی نشد. درعوض از اثر انگشت استفاده کنید."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -796,7 +824,7 @@ <string name="auto_data_switch_disable_message" msgid="5885533647399535852">"وضعیت داده تلفن همراه بهطور خودکار براساس دردسترس بودن تغییر نخواهد کرد"</string> <string name="auto_data_switch_dialog_negative_button" msgid="2370876875999891444">"نه متشکرم"</string> <string name="auto_data_switch_dialog_positive_button" msgid="8531782041263087564">"بله، عوض شود"</string> - <string name="touch_filtered_warning" msgid="8119511393338714836">"چون برنامهای درحال ایجاد تداخل در درخواست مجوز است، «تنظیمات» نمیتواند پاسخ شما را تأیید کند."</string> + <string name="touch_filtered_warning" msgid="8119511393338714836">"چون برنامهای درحال ایجاد تداخل در درخواست اجازه است، «تنظیمات» نمیتواند پاسخ شما را تأیید کند."</string> <string name="slice_permission_title" msgid="3262615140094151017">"به <xliff:g id="APP_0">%1$s</xliff:g> اجازه داده شود تکههای <xliff:g id="APP_2">%2$s</xliff:g> را نشان دهد؟"</string> <string name="slice_permission_text_1" msgid="6675965177075443714">"- میتواند اطلاعات <xliff:g id="APP">%1$s</xliff:g> را بخواند"</string> <string name="slice_permission_text_2" msgid="6758906940360746983">"- میتواند در <xliff:g id="APP">%1$s</xliff:g> اقدام انجام دهد"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"رفتن به نمایه کاری"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"بستن"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"سفارشیسازی صفحه قفل"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"برای سفارشیسازی صفحه قفل، قفل را باز کنید"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi دردسترس نیست"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"دوربین مسدود شده است"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"دوربین و میکروفون مسدود شدهاند"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"میکروفون مسدود شده است"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"حالت اولویت روشن است"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"توجه «دستیار» روشن است"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"برنامه پیشفرض یادداشت را در «تنظیمات» تنظیم کنید"</string> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 435cfc925a05..f989a48dd840 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Jos annat väärän kuvion seuraavalla yrityskerralla, työprofiilisi ja sen data poistetaan."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Jos annat väärän PIN-koodin seuraavalla yrityskerralla, työprofiilisi ja sen data poistetaan."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Jos annat väärän salasanan seuraavalla yrityskerralla, työprofiilisi ja sen data poistetaan."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Kosketa sormenjälkitunnistinta"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Kasvoja ei voi tunnistaa. Käytä sormenjälkeä."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Vaihda työprofiiliin"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Sulje"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Customize lukitusnäyttöä"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Avaa lukitus muokataksesi lukitusnäyttöä"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi-yhteys ei ole käytettävissä"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera estetty"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera ja mikrofoni estetty"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoni estetty"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Tärkeät-tila on päällä"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant on aktiivinen"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Aseta oletusmuistiinpanosovellus Asetuksista"</string> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 71b6ad82d367..190eaa86d0d9 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -95,7 +95,7 @@ <string name="screenshot_default_files_app_name" msgid="8721579578575161912">"Fichiers"</string> <string name="screenshot_detected_template" msgid="7940376642921719915">"<xliff:g id="APPNAME">%1$s</xliff:g> a détecté cette capture d\'écran."</string> <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> et d\'autres applications ouvertes ont détecté cette capture d\'écran."</string> - <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Ajouter à l\'application de prise de notes"</string> + <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Ajouter à une note"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Enregistreur d\'écran"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Trait. de l\'enregist. d\'écran…"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notification en cours pour une session d\'enregistrement d\'écran"</string> @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Si vous entrez un schéma incorrect à la prochaine tentative suivante, votre profil professionnel et ses données seront supprimés."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Si vous entrez un NIP incorrect à la prochaine tentative, votre profil professionnel et ses données seront supprimés."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Si vous entrez un mot de passe incorrect à la prochaine tentative suivante, votre profil professionnel et ses données seront supprimés."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Touchez le capteur d\'empreintes digitales"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Visage non reconnu. Utilisez plutôt l\'empreinte digitale."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -701,7 +729,7 @@ <string name="right_icon" msgid="1103955040645237425">"Icône droite"</string> <string name="drag_to_add_tiles" msgid="8933270127508303672">"Sélectionnez et faites glisser les tuiles pour les ajouter"</string> <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Faites glisser les tuiles pour les réorganiser"</string> - <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Faites glisser les tuiles ici pour les supprimer"</string> + <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Faites glisser les tuiles ici pour les retirer"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"Vous avez besoin d\'au moins <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> tuiles"</string> <string name="qs_edit" msgid="5583565172803472437">"Modifier"</string> <string name="tuner_time" msgid="2450785840990529997">"Heure"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 8f96d2c43a41..9bbe15e6a39c 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Si vous dessinez un schéma incorrect lors de la prochaine tentative, votre profil professionnel et les données associées seront supprimés."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Si vous saisissez un code incorrect lors de la prochaine tentative, votre profil professionnel et les données associées seront supprimés."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Si vous saisissez un mot de passe incorrect lors de la prochaine tentative, votre profil professionnel et les données associées seront supprimés."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Appuyez sur le lecteur d\'empreinte digitale"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Visage non reconnu. Utilisez votre empreinte."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Passer au profil professionnel"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Fermer"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Personnaliser écran verrouillage"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Déverrouiller pour personnaliser l\'écran de verrouillage"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi non disponible"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Caméra bloquée"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Caméra et micro bloqués"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Micro bloqué"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Mode Prioritaire activé"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant à l\'écoute"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Définir une appli de notes par défaut dans les paramètres"</string> </resources> diff --git a/packages/SystemUI/res/values-fr/tiles_states_strings.xml b/packages/SystemUI/res/values-fr/tiles_states_strings.xml index 12fa44d409dc..0a38851d529a 100644 --- a/packages/SystemUI/res/values-fr/tiles_states_strings.xml +++ b/packages/SystemUI/res/values-fr/tiles_states_strings.xml @@ -43,7 +43,7 @@ </string-array> <string-array name="tile_states_cell"> <item msgid="1235899788959500719">"Indisponibles"</item> - <item msgid="2074416252859094119">"Désactivées"</item> + <item msgid="2074416252859094119">"Désactivé"</item> <item msgid="287997784730044767">"Activées"</item> </string-array> <string-array name="tile_states_battery"> @@ -148,7 +148,7 @@ </string-array> <string-array name="tile_states_controls"> <item msgid="8199009425335668294">"Indisponibles"</item> - <item msgid="4544919905196727508">"Désactivées"</item> + <item msgid="4544919905196727508">"Désactivé"</item> <item msgid="3422023746567004609">"Activées"</item> </string-array> <string-array name="tile_states_wallet"> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index e2f625d335bd..f97bebf9f437 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Se indicas un padrón incorrecto no seguinte intento, eliminaranse o teu perfil de traballo e os datos asociados."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Se indicas un PIN incorrecto no seguinte intento, eliminaranse o teu perfil de traballo e os datos asociados."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Se indicas un contrasinal incorrecto no seguinte intento, eliminaranse o teu perfil de traballo e os datos asociados."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toca o sensor de impresión dixital"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Non se recoñeceu a cara. Usa a impresión dixital."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Cambiar ao perfil de traballo"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Pechar"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar pantalla de bloqueo"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Para personalizar a pantalla de bloqueo, primeiro desbloquea o dispositivo"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wifi non dispoñible"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"A cámara está bloqueada"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"A cámara e o micrófono están bloqueados"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"O micrófono está bloqueado"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"O modo de prioridade está activado"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"A atención do Asistente está activada"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Establece a aplicación de notas predeterminada en Configuración"</string> </resources> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index b78d852dd2a3..910c7e59201a 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"જો તમે આગલા પ્રયત્નમાં ખોટી પૅટર્ન દાખલ કરશો, તો તમારી કાર્યાલયની પ્રોફાઇલ અને તેનો ડેટા ડિલીટ કરવામાં આવશે."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"જો તમે આગલા પ્રયત્નમાં ખોટો પિન દાખલ કરશો, તો તમારી કાર્યાલયની પ્રોફાઇલ અને તેનો ડેટા ડિલીટ કરવામાં આવશે."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"જો તમે આગલા પ્રયત્નમાં ખોટો પાસવર્ડ દાખલ કરશો, તો તમારી કાર્યાલયની પ્રોફાઇલ અને તેનો ડેટા ડિલીટ કરવામાં આવશે."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ફિંગરપ્રિન્ટના સેન્સરને સ્પર્શ કરો"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ચહેરો ઓળખી શકતા નથી. તેને બદલે ફિંગરપ્રિન્ટ વાપરો."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -819,7 +847,7 @@ <string name="ongoing_privacy_dialog_attribution_label" msgid="3385241594101496292">"(<xliff:g id="ATTRIBUTION_LABEL">%s</xliff:g>)"</string> <string name="ongoing_privacy_dialog_attribution_proxy_label" msgid="1111829599659403249">"(<xliff:g id="ATTRIBUTION_LABEL">%1$s</xliff:g> • <xliff:g id="PROXY_LABEL">%2$s</xliff:g>)"</string> <string name="privacy_type_camera" msgid="7974051382167078332">"કૅમેરા"</string> - <string name="privacy_type_location" msgid="7991481648444066703">"સ્થાન"</string> + <string name="privacy_type_location" msgid="7991481648444066703">"લોકેશન"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"માઇક્રોફોન"</string> <string name="privacy_type_media_projection" msgid="8136723828804251547">"સ્ક્રીન રેકોર્ડિંગ"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"કોઈ શીર્ષક નથી"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ઑફિસની પ્રોફાઇલ પર સ્વિચ કરો"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"બંધ કરો"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"લૉક સ્ક્રીન કસ્ટમાઇઝ કરો"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"લૉક સ્ક્રીનને કસ્ટમાઇઝ કરવા માટે અનલૉક કરો"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"વાઇ-ફાઇ ઉપલબ્ધ નથી"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"કૅમેરા બ્લૉક કરેલો છે"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"કૅમેરા અને માઇક્રોફોન બ્લૉક કરેલા છે"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"માઇક્રોફોન બ્લૉક કરેલો છે"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"પ્રાધાન્યતા મોડ ચાલુ છે"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant સક્રિય છે"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"સેટિંગમાં નોંધની ડિફૉલ્ટ ઍપ સેટ કરો"</string> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 946b19330f6f..9ef950393b6c 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"अगर आप फिर से गलत पैटर्न डालते हैं, तो आपकी वर्क प्रोफ़ाइल और उसका डेटा मिटा दिया जाएगा."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"अगर आप फिर से गलत पिन डालते हैं, तो आपकी वर्क प्रोफ़ाइल और उसका डेटा मिटा दिया जाएगा."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"अगर आप फिर से गलत पासवर्ड डालते हैं, तो आपकी वर्क प्रोफ़ाइल और उसका डेटा मिटा दिया जाएगा."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"फ़िंगरप्रिंट सेंसर को छुएं"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"चेहरे की पहचान नहीं हुई. फ़िंगरप्रिंट इस्तेमाल करें."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -545,7 +573,7 @@ <string name="notification_silence_title" msgid="8608090968400832335">"बिना आवाज़ के सूचनाएं दिखाएं"</string> <string name="notification_alert_title" msgid="3656229781017543655">"डिफ़ॉल्ट"</string> <string name="notification_automatic_title" msgid="3745465364578762652">"अपने-आप"</string> - <string name="notification_channel_summary_low" msgid="4860617986908931158">"किसी तरह की आवाज़ या वाइब्रेशन न हो"</string> + <string name="notification_channel_summary_low" msgid="4860617986908931158">"आवाज़ या वाइब्रेशन न हो"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"इससे किसी तरह की आवाज़ या वाइब्रेशन नहीं होता और बातचीत, सेक्शन में सबसे नीचे दिखती है"</string> <string name="notification_channel_summary_default" msgid="777294388712200605">"डिवाइस की सेटिंग के आधार पर, सूचना आने पर घंटी बज सकती है या वाइब्रेशन हो सकता है"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="3482483084451555344">"डिवाइस की सेटिंग के आधार पर, सूचना आने पर घंटी बज सकती है या वाइब्रेशन हो सकता है. <xliff:g id="APP_NAME">%1$s</xliff:g> पर होने वाली बातचीत, डिफ़ॉल्ट रूप से बबल के तौर पर दिखती है."</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 8a13b54d969a..522394ead053 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Ako pri sljedećem pokušaju unesete netočan uzorak, izbrisat će se vaš poslovni profil i njegovi podaci."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Ako pri sljedećem pokušaju unesete netočan PIN, izbrisat će se vaš poslovni profil i njegovi podaci."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Ako pri sljedećem pokušaju unesete netočnu zaporku, izbrisat će se vaš poslovni profil i njegovi podaci."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dodirnite senzor otiska prsta"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Prepoznavanje lica nije uspjelo. Upotrijebite otisak prsta."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Prijeđite na poslovni profil"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Zatvori"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Prilagodi zaključavanje zaslona"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Otključajte da biste prilagodili zaključan zaslon"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi nije dostupan"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokirana"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Blokirani su kamera i mikrofon"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon je blokiran"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Uključen je prioritetni način rada"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Pažnja Asistenta je aktivirana"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Postavite zadanu aplikaciju za bilješke u postavkama"</string> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 4163cb90055c..f63b1167e921 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Amennyiben helytelen mintát ad meg a következő kísérletnél, a rendszer törli munkaprofilját és a kapcsolódó adatokat."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Amennyiben helytelen PIN-kódot ad meg a következő kísérletnél, a rendszer törli munkaprofilját és a kapcsolódó adatokat."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Amennyiben helytelen jelszót ad meg a következő kísérletnél, a rendszer törli munkaprofilját és a kapcsolódó adatokat."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Érintse meg az ujjlenyomat-érzékelőt"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Az arc nem felismerhető. Használjon ujjlenyomatot."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Váltás munkaprofilra"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Bezárás"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Lezárási képernyő testreszabása"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Oldja fel a zárolást a lezárási képernyő testreszabásához"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Nem áll rendelkezésre Wi-Fi"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera letiltva"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera és mikrofon letiltva"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon letiltva"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritás mód bekapcsolva"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"A Segéd figyel"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Állítson be alapértelmezett jegyzetkészítő alkalmazást a Beállításokban"</string> </resources> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index bdfb8b0758a1..caefabe01ec2 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Հաջորդ փորձի ժամանակ սխալ նախշ մուտքագրելու դեպքում ձեր աշխատանքային պրոֆիլը և դրա տվյալները կջնջվեն։"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Հաջորդ փորձի ժամանակ սխալ PIN կոդ մուտքագրելու դեպքում աշխատանքային պրոֆիլը և դրա տվյալները կջնջվեն։"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Հաջորդ փորձի ժամանակ սխալ գաղտնաբառ մուտքագրելու դեպքում աշխատանքային պրոֆիլը և դրա տվյալները կջնջվեն։"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Հպեք մատնահետքի սկաներին"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Դեմքը չի հաջողվում ճանաչել։ Օգտագործեք մատնահետքը։"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -918,7 +946,7 @@ <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Բեռնման խորհուրդներ"</string> <string name="controls_media_title" msgid="1746947284862928133">"Մեդիա"</string> <string name="controls_media_close_session" msgid="4780485355795635052">"Թաքցնե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g>-ի մեդիա աշխատաշրջանի կառավարման տարրը։"</string> - <string name="controls_media_active_session" msgid="3146882316024153337">"Չհաջողվեց թաքցնել մեդիայի ընթացիկ աշխատաշրջանը։"</string> + <string name="controls_media_active_session" msgid="3146882316024153337">"Չհաջողվեց թաքցնել ընթացիկ մուլտիմեդիա աշխատաշրջանը։"</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Թաքցնել"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Շարունակել"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Կարգավորումներ"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Անցնել աշխատանքային պրոֆիլ"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Փակել"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Անհատականացնել կողպէկրանը"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Ապակողպեք սարքը՝ կողպէկրանը կարգավորելու համար"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi ցանց հասանելի չէ"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Տեսախցիկն արգելափակված է"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Տեսախցիկն ու խոսափողը արգելափակված են"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Խոսափողն արգելափակված է"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Առաջնահերթության ռեժիմը միացված է"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Օգնականը լսում է"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Կարգավորեք նշումների կանխադրված հավելված Կարգավորումներում"</string> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index ce3e7e3d0467..1e16aa310f27 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Jika Anda memasukkan pola yang salah saat mencoba lagi, profil kerja dan datanya akan dihapus."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Jika Anda memasukkan PIN yang salah saat mencoba lagi, profil kerja dan datanya akan dihapus."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Jika Anda memasukkan sandi yang salah saat mencoba lagi, profil kerja dan datanya akan dihapus."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Sentuh sensor sidik jari"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Tidak dapat mengenali wajah. Gunakan sidik jari."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -455,7 +483,7 @@ <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"Tetap terbuka kuncinya oleh TrustAgent"</string> <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> <string name="accessibility_volume_settings" msgid="1458961116951564784">"Setelan suara"</string> - <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Otomatis beri teks ke media"</string> + <string name="volume_odi_captions_tip" msgid="8825655463280990941">"Otomatis beri teks di media"</string> <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"Tutup tooltip teks"</string> <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Overlay teks"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktifkan"</string> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Geser untuk melihat selengkapnya"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Memuat rekomendasi"</string> <string name="controls_media_title" msgid="1746947284862928133">"Media"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Sembunyikan kontrol media ini untuk <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Sembunyikan kontrol media untuk <xliff:g id="APP_NAME">%1$s</xliff:g> ini?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Sesi media aktif tidak dapat disembunyikan."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Sembunyikan"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Lanjutkan"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Beralih ke profil kerja"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Tutup"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Sesuaikan layar kunci"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Buka kunci untuk menyesuaikan layar kunci"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi tidak tersedia"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera diblokir"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera dan mikrofon diblokir"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon diblokir"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Mode prioritas diaktifkan"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Asisten sedang memerhatikan"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setel aplikasi catatan default di Setelan"</string> </resources> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 0f29c29f2abb..73047a2f7e8c 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Ef þú slærð inn rangt mynstur í næstu tilraun verður vinnusniðinu þínu og gögnum þess eytt."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Ef þú slærð inn rangt PIN-númer í næstu tilraun verður vinnusniðinu þínu og gögnum þess eytt."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Ef þú slærð inn rangt aðgangsorð í næstu tilraun verður vinnusniðinu þínu og gögnum þess eytt."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Snertu fingrafaralesarann"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Andlit þekkist ekki. Notaðu fingrafar í staðinn."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Skipta yfir í vinnusnið"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Loka"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Sérsníða lásskjá"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Taktu úr lás til að sérsníða lásskjá"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi er ekki til staðar"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Lokað fyrir myndavél"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Lokað fyrir myndavél og hljóðnema"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Lokað fyrir hljóðnema"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Kveikt er á forgangsstillingu"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Hjálparinn er að hlusta"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Stilltu sjálfgefið glósuforrit í stillingunum"</string> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 908a42df671e..4da1c50e2ccd 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Se al prossimo tentativo inserirai una sequenza sbagliata, il tuo profilo di lavoro e i relativi dati verranno eliminati."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Se al prossimo tentativo inserirai un PIN sbagliato, il tuo profilo di lavoro e i relativi dati verranno eliminati."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Se al prossimo tentativo inserirai una password sbagliata, il tuo profilo di lavoro e i relativi dati verranno eliminati."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Tocca il sensore di impronte"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Impossibile riconoscere il volto. Usa l\'impronta."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index b632953f4526..4c01b6b8e4a6 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"הזנת קו ביטול נעילה שגוי בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"הזנה של קוד אימות שגוי בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"הזנת סיסמה שגויה בניסיון הבא תגרום למחיקת פרופיל העבודה והנתונים המשויכים אליו."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"יש לגעת בחיישן טביעות האצבע"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"לא ניתן לזהות את הפנים. יש להשתמש בטביעת אצבע במקום."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"מעבר לפרופיל עבודה"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"סגירה"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"התאמה אישית של מסך הנעילה"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"כדי להתאים אישית את מסך הנעילה, יש לבטל את הנעילה"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"ה-Wi-Fi לא זמין"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"המצלמה חסומה"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"המצלמה והמיקרופון חסומים"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"המיקרופון חסום"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"מצב \'עדיפות\' מופעל"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant מאזינה"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"צריך להגדיר את אפליקציית ברירת המחדל לפתקים ב\'הגדרות\'"</string> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 54b989a1d34c..99a2edd85a15 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"パターンをあと 1 回間違えると、仕事用プロファイルと関連データが削除されます。"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"PIN をあと 1 回間違えると、仕事用プロファイルと関連データが削除されます。"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"パスワードをあと 1 回間違えると、仕事用プロファイルと関連データが削除されます。"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"指紋認証センサーをタッチ"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"顔を認識できません。指紋認証を使用してください。"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 9d46a755f362..33e08dead5f2 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -168,6 +168,20 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"შემდეგი მცდელობისას განმბლოკავი ნიმუშის არასწორად შეყვანის შემთხვევაში, თქვენი სამსახურის პროფილი და მისი მონაცემები წაიშლება."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"შემდეგი მცდელობისას PIN-კოდის არასწორად შეყვანის შემთხვევაში, თქვენი სამსახურის პროფილი და მისი მონაცემები წაიშლება."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"შემდეგი მცდელობისას პაროლის არასწორად შეყვანის შემთხვევაში, თქვენი სამსახურის პროფილი და მისი მონაცემები წაიშლება."</string> + <string name="biometric_re_enroll_dialog_confirm" msgid="3049858021857801836">"დაყენება"</string> + <string name="biometric_re_enroll_dialog_cancel" msgid="93760939407091417">"ახლა არა"</string> + <string name="biometric_re_enroll_notification_content" msgid="8685925877186288180">"საჭიროა უსაფრთხოებისა და ეფექტურობის გასაუმჯობესებლად"</string> + <string name="fingerprint_re_enroll_notification_title" msgid="4539432429683916604">"ანაბეჭდით განბლოკვის ხელახლა დაყენება"</string> + <string name="fingerprint_re_enroll_notification_name" msgid="630798657797645704">"ანაბეჭდით განბლოკვა"</string> + <string name="fingerprint_re_enroll_dialog_title" msgid="3526033128113925780">"თითის ანაბეჭდით განბლოკვის დაყენება"</string> + <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"ანაბეჭდით განბლოკვის ხელახლა დასაყენებლად ამჟამინდელი ანაბეჭდის ფოტოები და მოდელები წაიშლება.\n\nმათი წაშლის შემდეგ მოგიწევთ ანაბეჭდით განბლოკვის ხელახლა დაყენება, ტელეფონის ანაბეჭდით განსაბლოკად ან ვინაობის დასადასტურებლად."</string> + <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"ანაბეჭდით განბლოკვის ხელახლა დასაყენებლად ამჟამინდელი ანაბეჭდის ფოტოები და მოდელები წაიშლება.\n\nმათი წაშლის შემდეგ მოგიწევთ ანაბეჭდით განბლოკვის ხელახლა დაყენება, ტელეფონის ანაბეჭდით განსაბლოკად ან ვინაობის დასადასტურებლად."</string> + <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"ანაბეჭდით განბლოკვის დაყენება ვერ მოხერხდა. გადადით პარამეტრებზე და ცადეთ ხელახლა."</string> + <string name="face_re_enroll_notification_title" msgid="1850838867718410520">"დააყენეთ სახით განბლოკვა ხელახლა"</string> + <string name="face_re_enroll_notification_name" msgid="7384545252206120659">"განბლოკვა სახით"</string> + <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"სახით განბლოკვის პარამეტრების დაყენება"</string> + <string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"სახით განბლოკვის ისევ დასაყენებლად თქვენი ამჟამინდელი სახის მოდელი წაიშლება.\n\nთქვენ მოგიწევთ ამ ფუნქციის ხელახლა დაყენება სახის მეშვეობით ტელეფონის განსაბლოკად."</string> + <string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"სახით განბლოკვის დაყენება ვერ მოხერხდა. გადადით პარამეტრებზე და ცადეთ ხელახლა."</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"შეეხეთ თითის ანაბეჭდის სენსორს"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"სახის ამოცნობა ვერ ხერხდება. სანაცვლოდ თითის ანაბეჭდი გამოიყენეთ."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -885,8 +899,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"რჩეულებიდან ამოღება"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"გადატანა პოზიციაზე <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"მართვის საშუალებები"</string> - <!-- no translation found for controls_favorite_subtitle (5818709315630850796) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="5818709315630850796">"სწრაფად წვდომისთვის აირჩიეთ მოწყობილობების მართვის საშუალებები"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"მართვის საშუალებების გადაწყობა შეგიძლიათ მათი ჩავლებით გადატანით"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"მართვის ყველა საშუალება ამოიშალა"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"ცვლილებები არ შენახულა"</string> @@ -1124,14 +1137,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"სამსახურის პროფილზე გადართვა"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"დახურვა"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"ჩაკეთილი ეკრანის მორგება"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"ჩაკეტილი ეკრანის მოსარგებად გაბლოკეთ"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi მიუწვდომელია"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"კამერა დაბლოკილია"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"კამერა და მიკროფონი დაბლოკილია"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"მიკროფონი დაბლოკილია"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"პრიორიტეტული რეჟიმი ჩართულია"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"ასისტენტის ყურადღების ფუნქცია ჩართულია"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"დააყენეთ ნაგულისხმევი შენიშვნების აპი პარამეტრებში"</string> </resources> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 7eb7a93cb067..c4a161bde5bd 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Келесі әрекет кезінде қате өрнек енгізсеңіз, жұмыс профиліңіз бен оның деректері жойылады."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Келесі әрекет кезінде қате PIN кодын енгізсеңіз, жұмыс профиліңіз бен оның деректері жойылады."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Келесі әрекет кезінде қате құпия сөз енгізсеңіз, жұмыс профиліңіз бен оның деректері жойылады."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Саусақ ізін оқу сканерін түртіңіз"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Бет танылмады. Орнына саусақ ізін пайдаланыңыз."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -364,12 +392,12 @@ <string name="interruption_level_alarms_twoline" msgid="2045067991335708767">"Тек\nдабылдар"</string> <string name="keyguard_indication_charging_time_wireless" msgid="577856646141738675">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Сымсыз зарядталуда • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string> <string name="keyguard_indication_charging_time" msgid="6492711711891071502">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Зарядталуда • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string> - <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Жылдам зарядталуда • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string> + <string name="keyguard_indication_charging_time_fast" msgid="8390311020603859480">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Жылдам зарядтау • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string> <string name="keyguard_indication_charging_time_slowly" msgid="301936949731705417">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Баяу зарядталуда • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string> <string name="keyguard_indication_charging_time_dock" msgid="3149328898931741271">"<xliff:g id="PERCENTAGE">%2$s</xliff:g> • Зарядталып жатыр. • Толуына <xliff:g id="CHARGING_TIME_LEFT">%1$s</xliff:g> қалды."</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Пайдаланушыны ауыстыру"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"ашылмалы мәзір"</string> - <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Осы сеанстағы барлық қолданбалар мен деректер жойылады."</string> + <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Осы сеанстағы барлық қолданба мен дерек жойылады."</string> <string name="guest_wipe_session_title" msgid="7147965814683990944">"Қош келдіңіз, қонақ!"</string> <string name="guest_wipe_session_message" msgid="3393823610257065457">"Сеансты жалғастыру керек пе?"</string> <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Қайта бастау"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Жұмыс профиліне ауысу"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Жабу"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Құлып экранын бейімдеу"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Құлып экранын бейімдеу үшін құлыпты ашыңыз"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi қолжетімсіз."</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера бөгелген."</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера мен микрофон бөгелген."</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон бөгелген."</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"\"Маңызды\" режимі қосулы."</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant қосулы."</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Параметрлерден әдепкі жазба қолданбасын орнатыңыз."</string> </resources> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 4eafd9849349..97f4b85be994 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"ប្រសិនបើអ្នកបញ្ចូលលំនាំមិនត្រឹមត្រូវ នៅពេលព្យាយាមបញ្ចូលលើកក្រោយ កម្រងព័ត៌មានការងាររបស់អ្នក និងទិន្នន័យរបស់កម្រងព័ត៌មាននេះនឹងត្រូវបានលុប។"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"ប្រសិនបើអ្នកបញ្ចូលកូដ PIN មិនត្រឹមត្រូវ នៅពេលព្យាយាមបញ្ចូលលើកក្រោយ កម្រងព័ត៌មានការងាររបស់អ្នក និងទិន្នន័យរបស់កម្រងព័ត៌មាននេះនឹងត្រូវបានលុប។"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"ប្រសិនបើអ្នកបញ្ចូលពាក្យសម្ងាត់មិនត្រឹមត្រូវ នៅពេលព្យាយាមបញ្ចូលលើកក្រោយ កម្រងព័ត៌មានការងាររបស់អ្នក និងទិន្នន័យរបស់កម្រងព័ត៌មាននេះនឹងត្រូវបានលុប។"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ប៉ះឧបករណ៍ចាប់ស្នាមម្រាមដៃ"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"មិនអាចសម្គាល់មុខបានទេ។ សូមប្រើស្នាមម្រាមដៃជំនួសវិញ។"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index b0193f043dda..854ae9fa06c0 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"ಮುಂದಿನ ಪ್ರಯತ್ನದಲ್ಲಿ ನೀವು ತಪ್ಪಾದ ಪ್ಯಾಟರ್ನ್ ನಮೂದಿಸಿದರೆ, ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"ಮುಂದಿನ ಪ್ರಯತ್ನದಲ್ಲಿ ನೀವು ತಪ್ಪಾದ ಪಿನ್ ನಮೂದಿಸಿದರೆ, ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಅದರ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"ಮುಂದಿನ ಪ್ರಯತ್ನದಲ್ಲಿ ನೀವು ತಪ್ಪಾದ ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿದರೆ, ನಿಮ್ಮ ಉದ್ಯೋಗದ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಅದರ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ಮುಖ ಗುರುತಿಸಲಾಗುತ್ತಿಲ್ಲ ಬದಲಿಗೆ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಬಳಸಿ."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -382,7 +410,7 @@ <string name="user_remove_user_title" msgid="9124124694835811874">"ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕುವುದೇ?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"ಈ ಬಳಕೆದಾರರ ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುವುದು."</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"ತೆಗೆದುಹಾಕಿ"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"ರೆಕಾರ್ಡ್ ಮಾಡುವಾಗ ಅಥವಾ ಬಿತ್ತರಿಸುವಾಗ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಕಾಣಿಸುವ ಸಕಲ ಮಾಹಿತಿಗೂ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಪ್ರವೇಶ ಹೊಂದಿರುತ್ತದೆ. ಇದು ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಫೋಟೋಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಆಡಿಯೋ ಪ್ಲೇಬ್ಯಾಕ್ನಂತಹ ಮಾಹಿತಿಯನ್ನು ಕೂಡ ಒಳಗೊಂಡಿರುತ್ತದೆ."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"ರೆಕಾರ್ಡ್ ಮಾಡುವಾಗ ಅಥವಾ ಬಿತ್ತರಿಸುವಾಗ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಕಾಣಿಸುವ ಸಕಲ ಮಾಹಿತಿಗೂ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಆ್ಯಕ್ಸೆಸ್ ಹೊಂದಿರುತ್ತದೆ. ಇದು ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಫೋಟೋಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಆಡಿಯೋ ಪ್ಲೇಬ್ಯಾಕ್ನಂತಹ ಮಾಹಿತಿಯನ್ನು ಕೂಡ ಒಳಗೊಂಡಿರುತ್ತದೆ."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"ಈ ವೈಶಿಷ್ಟ್ಯವು ಒದಗಿಸುವ ಸೇವೆಗಳು, ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಗೋಚರಿಸುವ ಅಥವಾ ರೆಕಾರ್ಡಿಂಗ್ ಅಥವಾ ಬಿತ್ತರಿಸುವಾಗ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಆಗುವ ಎಲ್ಲಾ ಮಾಹಿತಿಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುತ್ತವೆ. ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಫೋಟೋಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಆಡಿಯೋ ಪ್ಲೇಬ್ಯಾಕ್ನಂತಹ ಮಾಹಿತಿಯನ್ನು ಇದು ಒಳಗೊಂಡಿದೆ."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ರೆಕಾರ್ಡಿಂಗ್ ಅಥವಾ ಬಿತ್ತರಿಸುವಿಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಬೇಕೆ?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಮೂಲಕ ರೆಕಾರ್ಡಿಂಗ್, ಬಿತ್ತರಿಸುವುದನ್ನು ಪ್ರಾರಂಭಿಸುವುದೇ?"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ಗೆ ಬದಲಿಸಿ"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ಮುಚ್ಚಿರಿ"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"ಲಾಕ್ ಸ್ಕ್ರೀನ್ ಕಸ್ಟಮೈಸ್ ಮಾಡಿ"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"ಲಾಕ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಅನ್ಲಾಕ್ ಮಾಡಿ"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"ವೈ-ಫೈ ಲಭ್ಯವಿಲ್ಲ"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ಕ್ಯಾಮರಾವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ಆದ್ಯತೆಯ ಮೋಡ್ ಆನ್ ಆಗಿದೆ"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant ನಿಮ್ಮ ಮಾತನ್ನು ಆಲಿಸುತ್ತಿದೆ"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಡೀಫಾಲ್ಟ್ ಟಿಪ್ಪಣಿಗಳ ಆ್ಯಪ್ ಅನ್ನು ಸೆಟ್ ಮಾಡಿ"</string> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 32e27eecc43f..c4abe6037f04 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"다음번 시도에서 잘못된 패턴을 입력하면 직장 프로필 및 관련 데이터가 삭제됩니다."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"다음번 시도에서 잘못된 PIN을 입력하면 직장 프로필 및 관련 데이터가 삭제됩니다."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"다음번 시도에서 잘못된 비밀번호를 입력하면 직장 프로필 및 관련 데이터가 삭제됩니다."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"지문 센서를 터치하세요."</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"얼굴을 인식할 수 없습니다. 대신 지문을 사용하세요."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"자세히 보려면 스와이프하세요."</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"추천 제어 기능 로드 중"</string> <string name="controls_media_title" msgid="1746947284862928133">"미디어"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g>에 대한 미디어 컨트롤을 숨길까요?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g>의 미디어 컨트롤을 숨길까요?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"현재 미디어 세션은 숨길 수 없습니다."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"숨기기"</string> <string name="controls_media_resume" msgid="1933520684481586053">"다시 시작"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"직장 프로필로 전환"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"닫기"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"잠금 화면 맞춤 설정"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"잠금 화면 맞춤설정을 위해 잠금 해제"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi를 사용할 수 없음"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"카메라 차단됨"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"카메라 및 마이크 차단됨"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"마이크 차단됨"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"우선순위 모드 설정됨"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"어시스턴트가 대기 중임"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"설정에서 기본 메모 앱 설정"</string> </resources> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 6b78db832a14..8ea9fb2d91df 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Эгер графикалык ачкычты дагы бир жолу туура эмес киргизсеңиз, жумуш профилиңиз жана андагы маалыматтын баары өчөт."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Эгер PIN кодду дагы бир жолу туура эмес киргизсеңиз, жумуш профилиңиз жана андагы маалыматтын баары өчөт."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Эгер сырсөздү дагы бир жолу туура эмес киргизсеңиз, жумуш профилиңиз жана андагы маалыматтын баары өчөт."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Манжа изинин сенсорун басыңыз"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Жүз таанылбай жатат. Манжа изин колдонуңуз."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -436,9 +464,9 @@ <string name="monitoring_subtitle_ca_certificate" msgid="8588092029755175800">"Тастыктоочу борбордун тастыктамасы"</string> <string name="monitoring_button_view_policies" msgid="3869724835853502410">"Саясаттарды карап көрүү"</string> <string name="monitoring_button_view_controls" msgid="8316440345340701117">"Башкаруу элементтерин көрүү"</string> - <string name="monitoring_description_named_management" msgid="505833016545056036">"Бул түзмөк <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> уюмуна таандык.\n\nАдминистраторуңуз бул түзмөктөгү жөндөөлөрдү, корпоративдик ресурстарды пайдалануу мүмкүнчүлүгүн берген параметрлерди жана колдонмолорду, түзмөгүңүзгө байланыштуу маалыматтарды (мисалы, түзмөгүңүздүн жайгашкан жери сыяктуу) көзөмөлдөп башкара алат.\n\nТолугураак маалымат алуу үчүн IT администраторуңузга кайрылыңыз."</string> + <string name="monitoring_description_named_management" msgid="505833016545056036">"Бул түзмөк <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> уюмуна таандык.\n\nАдминистраторуңуз бул түзмөктөгү параметрлерди, корпоративдик ресурстарды пайдалануу мүмкүнчүлүгүн берген параметрлерди жана колдонмолорду, түзмөгүңүзгө байланыштуу маалыматтарды (мисалы, түзмөгүңүздүн жайгашкан жери сыяктуу) көзөмөлдөп башкара алат.\n\nТолугураак маалымат алуу үчүн IT администраторуңузга кайрылыңыз."</string> <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> бул түзмөк менен байланышкан маалыматты көрүп, колдонмолорду башкарып, анын параметрлерин өзгөртө алат.\n\nЭгер суроолоруңуз болсо, <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g> уюмуна кайрылыңыз."</string> - <string name="monitoring_description_management" msgid="4308879039175729014">"Бул түзмөк уюмуңузга таандык.\n\nАдминистраторуңуз бул түзмөктөгү жөндөөлөрдү, корпоративдик ресурстарды пайдалануу мүмкүнчүлүгүн берген параметрлерди жана колдонмолорду, түзмөгүңүзгө байланыштуу маалыматтарды (мисалы, түзмөгүңүздүн жайгашкан жери сыяктуу) көзөмөлдөп башкара алат.\n\nТолугураак маалымат алуу үчүн IT администраторуңузга кайрылыңыз."</string> + <string name="monitoring_description_management" msgid="4308879039175729014">"Бул түзмөк уюмуңузга таандык.\n\nАдминистраторуңуз бул түзмөктөгү параметрлерди, корпоративдик ресурстарды пайдалануу мүмкүнчүлүгүн берген параметрлерди жана колдонмолорду, түзмөгүңүзгө байланыштуу маалыматтарды (мисалы, түзмөгүңүздүн жайгашкан жери сыяктуу) көзөмөлдөп башкара алат.\n\nТолугураак маалымат алуу үчүн IT администраторуңузга кайрылыңыз."</string> <string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"Ишканаңыз бул түзмөккө тастыктоочу борборду орнотту. Коопсуз тармагыңыздын трафиги көзөмөлдөнүп же өзгөртүлүшү мүмкүн."</string> <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Ишканаңыз жумуш профилиңизге тастыктоочу борборду орнотту. Коопсуз тармагыңыздын трафиги көзөмөлдөнүп же өзгөртүлүшү мүмкүн."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Бул түзмөктө тастыктоочу борбор орнотулган. Коопсуз тармагыңыздын трафиги көзөмөлдөнүп же өзгөртүлүшү мүмкүн."</string> @@ -666,7 +694,7 @@ <string name="volume_dnd_silent" msgid="4154597281458298093">"Үндү көзөмөлдөөчү баскычтардын кыска жолдору"</string> <string name="battery" msgid="769686279459897127">"Батарея"</string> <string name="headset" msgid="4485892374984466437">"Гарнитура"</string> - <string name="accessibility_long_click_tile" msgid="210472753156768705">"Жөндөөлөрдү ачуу"</string> + <string name="accessibility_long_click_tile" msgid="210472753156768705">"Параметрлерди ачуу"</string> <string name="accessibility_status_bar_headphones" msgid="1304082414912647414">"Гарнитуралар туташкан"</string> <string name="accessibility_status_bar_headset" msgid="2699275863720926104">"Гарнитура туташты"</string> <string name="data_saver" msgid="3484013368530820763">"Трафикти үнөмдөө"</string> @@ -728,9 +756,9 @@ <string name="accessibility_qs_edit_tile_removed" msgid="1175925632436612036">"Карта өчүрүлдү"</string> <string name="accessibility_desc_quick_settings_edit" msgid="741658939453595297">"Ыкчам параметрлер түзөткүчү."</string> <string name="accessibility_desc_notification_icon" msgid="7331265967584178674">"<xliff:g id="ID_1">%1$s</xliff:g> эскертмеси: <xliff:g id="ID_2">%2$s</xliff:g>"</string> - <string name="accessibility_quick_settings_settings" msgid="7098489591715844713">"Жөндөөлөрдү ачуу."</string> - <string name="accessibility_quick_settings_expand" msgid="2609275052412521467">"Ыкчам жөндөөлөрдү ачуу."</string> - <string name="accessibility_quick_settings_collapse" msgid="4674876336725041982">"Ыкчам жөндөөлөрдү жабуу."</string> + <string name="accessibility_quick_settings_settings" msgid="7098489591715844713">"Параметрлерди ачуу."</string> + <string name="accessibility_quick_settings_expand" msgid="2609275052412521467">"Ыкчам параметрлерди ачуу."</string> + <string name="accessibility_quick_settings_collapse" msgid="4674876336725041982">"Ыкчам параметрлерди жабуу."</string> <string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> аккаунту менен кирди"</string> <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"колдонуучуну тандоо"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"Интернет жок"</string> @@ -858,7 +886,7 @@ <string name="accessibility_magnification_done" msgid="263349129937348512">"Бүттү"</string> <string name="accessibility_magnifier_edit" msgid="1522877239671820636">"Түзөтүү"</string> <string name="accessibility_magnification_magnifier_window_settings" msgid="2834685072221468434">"Чоңойткуч терезесинин параметрлери"</string> - <string name="accessibility_floating_button_migration_tooltip" msgid="5217151214439341902">"Атайын мүмкүнчүлүктөрдү ачуу үчүн басыңыз. Бул баскычты Жөндөөлөрдөн өзгөртүңүз.\n\n"<annotation id="link">"Жөндөөлөрдү көрүү"</annotation></string> + <string name="accessibility_floating_button_migration_tooltip" msgid="5217151214439341902">"Атайын мүмкүнчүлүктөрдү ачуу үчүн басыңыз. Бул баскычты Жөндөөлөрдөн өзгөртүңүз.\n\n"<annotation id="link">"Параметрлерди көрүү"</annotation></string> <string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"Баскычты убактылуу жашыра туруу үчүн экрандын четине жылдырыңыз"</string> <string name="accessibility_floating_button_undo" msgid="511112888715708241">"Кайтаруу"</string> <string name="accessibility_floating_button_undo_message_label_text" msgid="9017658016426242640">"<xliff:g id="FEATURE_NAME">%s</xliff:g> ыкчам баскычы өчүрүлдү"</string> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Дагы көрүү үчүн экранды сүрүп коюңуз"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Сунуштар жүктөлүүдө"</string> <string name="controls_media_title" msgid="1746947284862928133">"Медиа"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунда ушул нерсени жашырасызбы?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"<xliff:g id="APP_NAME">%1$s</xliff:g> \'да ушул медиа башкарууну жашырасызбы?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Учурдагы медиа сеансын жашыруу мүмкүн эмес."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Жашыруу"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Улантуу"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Жумуш профилине которулуу"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Жабуу"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Кулпу экранын тууралоо"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Кулпуланган экранды тууралоо үчүн кулпусун ачыңыз"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi жеткиликтүү эмес"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера бөгөттөлдү"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера менен микрофон бөгөттөлдү"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон бөгөттөлдү"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Маанилүү сүйлөшүүлөр режими күйүк"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Жардамчы иштетилди"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Параметрлерден демейки кыска жазуулар колдонмосун тууралаңыз"</string> </resources> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 5b0170597bed..46fb2c244432 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"ຫາກທ່ານໃສ່ຣູບແບບຜິດໃນຄວາມພະຍາຍາມເທື່ອຕໍ່ໄປ, ໂປຣໄຟລ໌ບ່ອນເຣັດວຽກຂອງທ່ານ ແລະ ຂໍ້ມູນຂອງມັນຈະຖືກລຶບອອກ."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"ຫາກທ່ານໃສ່ລະຫັດ PIN ຜິດໃນຄວາມພະຍາຍາມເທື່ອຕໍ່ໄປ, ໂປຣໄຟລ໌ບ່ອນເຣັດວຽກຂອງທ່ານ ແລະ ຂໍ້ມູນຂອງມັນຈະຖືກລຶບອອກ."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"ຫາກທ່ານໃສ່ລະຫັດຜິດໃນຄວາມພະຍາຍາມເທື່ອຕໍ່ໄປ, ໂປຣໄຟລ໌ບ່ອນເຣັດວຽກຂອງທ່ານ ແລະ ຂໍ້ມູນຂອງມັນຈະຖືກລຶບອອກ."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ແຕະໃສ່ເຊັນເຊີລາຍນິ້ວມື"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ບໍ່ສາມາດຈຳແນກໜ້າໄດ້. ກະລຸນາໃຊ້ລາຍນິ້ວມືແທນ."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ສະຫຼັບໄປໃຊ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ປິດ"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"ປັບແຕ່ງໜ້າຈໍລັອກ"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"ປົດລັອກເພື່ອປັບແຕ່ງໜ້າຈໍລັອກ"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi ບໍ່ພ້ອມໃຫ້ນຳໃຊ້"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ກ້ອງຖ່າຍຮູບຖືກບລັອກຢູ່"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ກ້ອງຖ່າຍຮູບ ແລະ ໄມໂຄຣໂຟນຖືກບລັອກຢູ່"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ໄມໂຄຣໂຟນຖືກບລັອກຢູ່"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ໂໝດຄວາມສຳຄັນເປີດຢູ່"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"ການເອີ້ນໃຊ້ຜູ້ຊ່ວຍເປີດຢູ່"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ຕັ້ງຄ່າແອັບຈົດບັນທຶກເລີ່ມຕົ້ນໃນການຕັ້ງຄ່າ"</string> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index c0de81339dc8..eeb81011c204 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Jei kitu bandymu nupiešite netinkamą atrakinimo piešinį, darbo profilis ir jo duomenys bus ištrinti."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Jei kitu bandymu įvesite netinkamą PIN kodą, darbo profilis ir jo duomenys bus ištrinti."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Jei kitu bandymu įvesite netinkamą slaptažodį, darbo profilis ir jo duomenys bus ištrinti."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Palieskite piršto antspaudo jutiklį"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Veidas neatpažintas. Naudokite kontrolinį kodą."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Perjungti į darbo profilį"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Uždaryti"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Užrakinimo ekrano tinkinimas"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Atrakinę tinkinkite užrakinimo ekraną"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"„Wi-Fi“ ryšys nepasiekiamas"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Fotoaparatas užblokuotas"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Fotoaparatas ir mikrofonas užblokuoti"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonas užblokuotas"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteto režimas įjungtas"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Padėjėjas klauso"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nustatykite numatytąją užrašų programą Nustatymuose"</string> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 3ec0e207ced6..2ae34bbac5e4 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Ja nākamajā mēģinājumā ievadīsiet nepareizu kombināciju, jūsu darba profils un ar to saistītie dati tiks dzēsti."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Ja nākamajā mēģinājumā ievadīsiet nepareizu PIN, jūsu darba profils un ar to saistītie dati tiks dzēsti."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Ja nākamajā mēģinājumā ievadīsiet nepareizu paroli, jūsu darba profils un ar to saistītie dati tiks dzēsti."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Pieskarieties pirksta nospieduma sensoram"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nevar atpazīt seju. Lietojiet pirksta nospiedumu."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Pārslēgties uz darba profilu"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Aizvērt"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Pielāgot bloķēšanas ekrānu"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Bloķēšanas ekrāna pielāgošana pēc atbloķēšanas"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi nav pieejams"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera ir bloķēta"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameras un mikrofona lietošana ir bloķēta"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofons ir bloķēts"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritātes režīms ir ieslēgts"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Asistents klausās"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Iestatījumos iestatiet noklusējuma piezīmju lietotni."</string> </resources> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 09cd589378ee..eb2f70c93bf0 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Ако внесете погрешна шема при следниот обид, работниот профил и неговите податоци ќе се избришат."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Ако внесете погрешен PIN при следниот обид, работниот профил и неговите податоци ќе се избришат."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Ако внесете погрешна лозинка при следниот обид, работниот профил и неговите податоци ќе се избришат."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Допрете го сензорот за отпечатоци"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Не се препознава ликот. Користете отпечаток."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -223,7 +251,7 @@ <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"Екранот е заклучен во ориентација на пејзаж."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"Екранот е заклучен во ориентација на портрет."</string> <string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string> - <string name="start_dreams" msgid="9131802557946276718">"Заштитник на екран"</string> + <string name="start_dreams" msgid="9131802557946276718">"Штедач на екран"</string> <string name="ethernet_label" msgid="2203544727007463351">"Етернет"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Не вознемирувај"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> @@ -237,7 +265,7 @@ <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"Автоматско ротирање"</string> <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"Автоматско ротирање на екранот"</string> <string name="quick_settings_location_label" msgid="2621868789013389163">"Локација"</string> - <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Заштитник на екран"</string> + <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Штедач на екран"</string> <string name="quick_settings_camera_label" msgid="5612076679385269339">"Пристап до камерата"</string> <string name="quick_settings_mic_label" msgid="8392773746295266375">"Пристап до микрофонот"</string> <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Дозволен"</string> @@ -538,7 +566,7 @@ <string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"Вклучи"</string> <string name="tuner_full_importance_settings" msgid="1388025816553459059">"Контроли за известувањата за напојување"</string> <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"Вклучено - според лице"</string> - <string name="power_notification_controls_description" msgid="1334963837572708952">"Со контролите за известувањата за напојување, може да поставите ниво на важност од 0 до 5 за известувањата на која било апликација. \n\n"<b>"Ниво 5"</b>" \n- Прикажувај на врвот на списокот со известувања \n- Дозволи прекин во цел екран \n- Секогаш користи појавување \n\n"<b>"Ниво 4"</b>" \n- Спречи прекин во цел екран \n- Секогаш користи појавување \n\n"<b>"Ниво 3"</b>" \n- Спречи прекин во цел екран \n- Без појавување \n\n"<b>"Ниво 2"</b>" \n- Спречи прекин во цел екран \n- Без појавување \n- Без звук и вибрации \n\n"<b>"Ниво 1"</b>" \n- Спречи прекин во цел екран \n- Без појавување \n- Без звук и вибрации \n- Сокриј од заклучен екран и статусна лента \n- Прикажувај на дното на списокот со известувања \n\n"<b>"Ниво 0"</b>" \n- Блокирај ги сите известувања од апликацијата"</string> + <string name="power_notification_controls_description" msgid="1334963837572708952">"Со контролите за известувањата за напојување, може да поставите ниво на важност од 0 до 5 за известувањата на која било апликација. \n\n"<b>"Ниво 5"</b>" \n- Прикажувај на врвот на списокот со известувања \n- Дозволи прекин во цел екран \n- Секогаш користи појавување \n\n"<b>"Ниво 4"</b>" \n- Спречи прекин во цел екран \n- Секогаш користи појавување \n\n"<b>"Ниво 3"</b>" \n- Спречи прекин во цел екран \n- Без појавување \n\n"<b>"Ниво 2"</b>" \n- Спречи прекин во цел екран \n- Без појавување \n- Без звук и вибрации \n\n"<b>"Ниво 1"</b>" \n- Спречи прекин во цел екран \n- Без појавување \n- Без звук и вибрации \n- Скриј од заклучен екран и статусна лента \n- Прикажувај на дното на списокот со известувања \n\n"<b>"Ниво 0"</b>" \n- Блокирај ги сите известувања од апликацијата"</string> <string name="inline_done_button" msgid="6043094985588909584">"Готово"</string> <string name="inline_ok_button" msgid="603075490581280343">"Примени"</string> <string name="inline_turn_off_notifications" msgid="8543989584403106071">"Исклучи известувања"</string> @@ -637,7 +665,7 @@ <string name="group_system_cycle_forward" msgid="9202444850838205990">"Прелистувајте ги неодамнешните апликации (напред)"</string> <string name="group_system_cycle_back" msgid="5163464503638229131">"Прелистувајте ги неодамнешните апликации (назад)"</string> <string name="group_system_access_all_apps_search" msgid="488070738028991753">"Отв. список со сите аплик. и пребарувајте (т.е. Пребарување/Стартер)"</string> - <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Сокриј и (повторно) прикажи ја лентата со задачи"</string> + <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"Скриј и (повторно) прикажи ја лентата со задачи"</string> <string name="group_system_access_system_settings" msgid="7961639365383008053">"Пристапете до поставките на системот"</string> <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Пристапете до „Помошник на Google“"</string> <string name="group_system_lock_screen" msgid="7391191300363416543">"Заклучен екран"</string> @@ -917,9 +945,9 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Повлечете за да видите повеќе"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Се вчитуваат препораки"</string> <string name="controls_media_title" msgid="1746947284862928133">"Аудиовизуелни содржини"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Да се сокријат контролите за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> - <string name="controls_media_active_session" msgid="3146882316024153337">"Аудиовизуелнава сесија не може да се сокрие."</string> - <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Сокриј"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Да се скријат контролите за <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="controls_media_active_session" msgid="3146882316024153337">"Аудиовизуелнава сесија не може да се скрие."</string> + <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Скриј"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Продолжи"</string> <string name="controls_media_settings_button" msgid="5815790345117172504">"Поставки"</string> <string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="SONG_NAME">%1$s</xliff:g> од <xliff:g id="ARTIST_NAME">%2$s</xliff:g> е пуштено на <xliff:g id="APP_LABEL">%3$s</xliff:g>"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Префрли се на работен профил"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Затвори"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Приспособете го заклучениот екран"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Отклучување за приспособување на заклучениот екран"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi не е достапно"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камерата е блокирана"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камерата и микрофонот се блокирани"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофонот е блокиран"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Приоритетниот режим е вклучен"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Вниманието на „Помошникот“ е вклучено"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Поставете стандардна апликација за белешки во „Поставки“"</string> </resources> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index aa61976d7ab4..407e80a3dadd 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -168,6 +168,20 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"അടുത്ത തവണയും നിങ്ങൾ തെറ്റായ പാറ്റേൺ നൽകിയാൽ, നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലും അതിന്റെ ഡാറ്റയും ഇല്ലാതാക്കപ്പെടും."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"അടുത്ത തവണയും നിങ്ങൾ തെറ്റായ പിൻ നൽകിയാൽ, നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലും അതിന്റെ ഡാറ്റയും ഇല്ലാതാക്കപ്പെടും."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"അടുത്ത തവണയും നിങ്ങൾ തെറ്റായ പാസ്വേഡ് നൽകിയാൽ, നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈലും അതിന്റെ ഡാറ്റയും ഇല്ലാതാക്കപ്പെടും."</string> + <string name="biometric_re_enroll_dialog_confirm" msgid="3049858021857801836">"സജ്ജീകരിക്കുക"</string> + <string name="biometric_re_enroll_dialog_cancel" msgid="93760939407091417">"ഇപ്പോൾ വേണ്ട"</string> + <string name="biometric_re_enroll_notification_content" msgid="8685925877186288180">"സുരക്ഷയും പ്രകടനവും മെച്ചപ്പെടുത്താൻ ഇത് ആവശ്യമാണ്"</string> + <string name="fingerprint_re_enroll_notification_title" msgid="4539432429683916604">"ഫിംഗർപ്രിന്റ് അൺലോക്ക് വീണ്ടും സജ്ജീകരിക്കുക"</string> + <string name="fingerprint_re_enroll_notification_name" msgid="630798657797645704">"ഫിംഗർപ്രിന്റ് അൺലോക്ക്"</string> + <string name="fingerprint_re_enroll_dialog_title" msgid="3526033128113925780">"ഫിംഗർപ്രിന്റ് അൺലോക്ക് സജ്ജീകരിക്കുക"</string> + <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"ഫിംഗർപ്രിന്റ് അൺലോക്ക് വീണ്ടും സജ്ജീകരിക്കാൻ, നിങ്ങളുടെ നിലവിലുള്ള ഫിംഗർപ്രിന്റ് ചിത്രങ്ങളും മോഡലുകളും ഇല്ലാതാക്കും.\n\nഅവ ഇല്ലാതാക്കിയ ശേഷം, ഫോൺ അൺലോക്ക് ചെയ്യാനോ ഇത് നിങ്ങൾ തന്നെയാണെന്ന് പരിശോധിച്ചുറപ്പിക്കാനോ ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കുന്നതിന്, ഫിംഗർപ്രിന്റ് അൺലോക്ക് വീണ്ടും സജ്ജീകരിക്കേണ്ടതുണ്ട്."</string> + <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"ഫിംഗർപ്രിന്റ് അൺലോക്ക് വീണ്ടും സജ്ജീകരിക്കാൻ, നിങ്ങളുടെ നിലവിലുള്ള ഫിംഗർപ്രിന്റ് ചിത്രങ്ങളും മോഡലും ഇല്ലാതാക്കും.\n\nഅവ ഇല്ലാതാക്കിയ ശേഷം, ഫോൺ അൺലോക്ക് ചെയ്യാനോ ഇത് നിങ്ങൾ തന്നെയാണെന്ന് പരിശോധിച്ചുറപ്പിക്കാനോ ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കുന്നതിന്, ഫിംഗർപ്രിന്റ് അൺലോക്ക് വീണ്ടും സജ്ജീകരിക്കേണ്ടതുണ്ട്."</string> + <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"ഫിംഗർപ്രിന്റ് അൺലോക്ക് സജ്ജീകരിക്കാനായില്ല. വീണ്ടും ശ്രമിക്കാൻ ക്രമീകരണത്തിലേക്ക് പോകുക."</string> + <string name="face_re_enroll_notification_title" msgid="1850838867718410520">"ഫെയ്സ് അൺലോക്ക് വീണ്ടും സജ്ജീകരിക്കുക"</string> + <string name="face_re_enroll_notification_name" msgid="7384545252206120659">"ഫെയ്സ് അൺലോക്ക്"</string> + <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"ഫെയ്സ് അൺലോക്ക് സജ്ജീകരിക്കുക"</string> + <string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"ഫെയ്സ് അൺലോക്ക് വീണ്ടും സജ്ജീകരിക്കാൻ, നിങ്ങളുടെ നിലവിലുള്ള മുഖ മോഡൽ ഇല്ലാതാക്കും.\n\nഫോൺ അൺലോക്ക് ചെയ്യാൻ നിങ്ങളുടെ മുഖം ഉപയോഗിക്കുന്നതിന് ഈ ഫീച്ചർ വീണ്ടും സജ്ജീകരിക്കേണ്ടതുണ്ട്."</string> + <string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"ഫെയ്സ് അൺലോക്ക് സജ്ജീകരിക്കാനായില്ല. വീണ്ടും ശ്രമിക്കാൻ ക്രമീകരണത്തിലേക്ക് പോകുക."</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ഫിംഗർപ്രിന്റ് സെൻസർ സ്പർശിക്കുക"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"മുഖം തിരിച്ചറിയാനായില്ല. പകരം ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കൂ."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -885,8 +899,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"പ്രിയപ്പെട്ടതല്ലാതാക്കുക"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"<xliff:g id="NUMBER">%d</xliff:g>-ാം സ്ഥാനത്തേയ്ക്ക് നീക്കുക"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"നിയന്ത്രണങ്ങൾ"</string> - <!-- no translation found for controls_favorite_subtitle (5818709315630850796) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="5818709315630850796">"വേഗത്തിൽ ആക്സസ് ചെയ്യാൻ ഉപകരണ നിയന്ത്രണങ്ങൾ തിരഞ്ഞെടുക്കുക"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"നിയന്ത്രണങ്ങൾ പുനഃക്രമീകരിക്കാൻ അമർത്തിപ്പിടിച്ച് വലിച്ചിടുക"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"എല്ലാ നിയന്ത്രണങ്ങളും നീക്കം ചെയ്തു"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"മാറ്റങ്ങൾ സംരക്ഷിച്ചിട്ടില്ല"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 7d0d8a2acf52..37a9e969cadf 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Та дараагийн оролдлогоор буруу хээ оруулбал таны ажлын профайлыг өгөгдөлтэй нь цуг устгах болно."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Та дараагийн оролдлогоор буруу ПИН оруулбал таны ажлын профайлыг өгөгдөлтэй нь цуг устгах болно."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Та дараагийн оролдлогоор буруу нууц үг оруулбал таны ажлын профайлыг өгөгдөлтэй нь цуг устгах болно."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Хурууны хээ мэдрэгчид хүрэх"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Царай таних боломжгүй. Оронд нь хурууны хээ ашигла"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -892,7 +920,7 @@ <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Өөрчлөлтийг хадгалаагүй"</string> <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Бусад аппыг харах"</string> <string name="controls_favorite_rearrange_button" msgid="2942788904364641185">"Дахин эмхлэх"</string> - <string name="controls_favorite_add_controls" msgid="1221420435546694004">"Тохиргоо нэмэх"</string> + <string name="controls_favorite_add_controls" msgid="1221420435546694004">"Хяналт нэмэх"</string> <string name="controls_favorite_back_to_editing" msgid="184125114090062713">"Засах руу буцах"</string> <string name="controls_favorite_load_error" msgid="5126216176144877419">"Хяналтыг ачаалж чадсангүй. Аппын тохиргоог өөрчлөөгүй эсэхийг нягтлахын тулд <xliff:g id="APP">%s</xliff:g> аппыг шалгана уу."</string> <string name="controls_favorite_load_none" msgid="7687593026725357775">"Тохирох хяналт байхгүй"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Ажлын профайл руу сэлгэх"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Хаах"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Түгжигдсэн дэлгэцийг өөрчлөх"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Түгжээтэй дэлгэцийг өөрчлөхийн тулд түгжээг тайлна уу"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi боломжгүй байна"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камерыг блоклосон"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камер болон микрофоныг блоклосон"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофоныг блоклосон"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Чухал горим асаалттай байна"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Туслах анхаарлаа хандуулж байна"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Тохиргоонд тэмдэглэлийн өгөгдмөл апп тохируулна уу"</string> </resources> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 4135188bd285..7e1f44536939 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"तुम्ही पुढील प्रयत्नात चुकीचा पॅटर्न एंटर केल्यास, तुमची कार्य प्रोफाइल आणि तिचा डेटा हटवला जाईल."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"तुम्ही पुढील प्रयत्नात चुकीचा पिन एंटर केल्यास, तुमची कार्य प्रोफाइल आणि तिचा डेटा हटवला जाईल."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"तुम्ही पुढील प्रयत्नात चुकीचा पासवर्ड एंटर केल्यास, तुमची कार्य प्रोफाइल आणि तिचा डेटा हटवला जाईल."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"फिंगरप्रिंट सेन्सरला स्पर्श करा"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"चेहरा ओळखू शकत नाही. त्याऐवजी फिंगरप्रिंट वापरा."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"कार्य प्रोफाइलवर स्विच करा"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"बंद करा"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"कस्टमाइझ लॉक स्क्रीन"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"लॉक स्क्रीन कस्टमाइझ करण्यासाठी अनलॉक करा"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"वाय-फाय उपलब्ध नाही"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"कॅमेरा ब्लॉक केला"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"कॅमेरा आणि मायक्रोफोन ब्लॉक केले आहेत"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"मायक्रोफोन ब्लॉक केला"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"प्राधान्य मोड सुरू आहे"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant चे लक्ष हे आता अॅक्टिव्ह आहे"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिंग्ज मध्ये डीफॉल्ट टिपा अॅप सेट करा"</string> </resources> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index dd0a8960e701..8a16efc072bf 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Jika anda memasukkan corak yang salah pada percubaan seterusnya, profil kerja anda dan data profil itu akan dipadamkan."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Jika anda memasukkan PIN yang salah pada percubaan seterusnya, profil kerja anda dan data profil itu akan dipadamkan."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Jika anda memasukkan kata laluan yang salah pada percubaan seterusnya, profil kerja anda dan data profil itu akan dipadamkan."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Sentuh penderia cap jari"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Tidak mengenali wajah. Gunakan cap jari."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Tukar kepada profil kerja"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Tutup"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Sesuaikan skrin kunci"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Buka kunci untuk menyesuaikan skrin kunci"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi tidak tersedia"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera disekat"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera dan mikrofon disekat"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon disekat"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Mod keutamaan dihidupkan"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Perhatian pembantu dihidupkan"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Tetapkan apl nota lalai dalam Tetapan"</string> </resources> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 925fb98522dc..a05010266835 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"မှားယွင်းသည့် ပုံစံကို နောက်တစ်ကြိမ်ထည့်သွင်းပါက သင်၏အလုပ်ပရိုဖိုင်နှင့် ၎င်း၏ ဒေတာများကို ဖျက်လိုက်ပါမည်။"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"မှားယွင်းသည့် ပင်နံပါတ်ကို နောက်တစ်ကြိမ်ထည့်သွင်းပါက သင်၏အလုပ်ပရိုဖိုင်နှင့် ၎င်း၏ဒေတာများကို ဖျက်လိုက်ပါမည်။"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"မှားယွင်းသည့် စကားဝှက်ကို နောက်တစ်ကြိမ်ထည့်သွင်းပါက သင်၏အလုပ်ပရိုဖိုင်နှင့် ၎င်း၏ ဒေတာများကို ဖျက်လိုက်ပါမည်။"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"လက်ဗွေအာရုံခံကိရိယာကို တို့ပါ"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"မျက်နှာကို မမှတ်မိပါ။ လက်ဗွေကို အစားထိုးသုံးပါ။"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -223,7 +251,7 @@ <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"ဖန်သားပြင် အနေအထားက အလျားလိုက်အဖြစ် ပုံသေ လုပ်ထားပါသည်"</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"ဖန်သားပြင် အနေအထားက ဒေါင်လိုက်အဖြစ် ပုံသေ လုပ်ထားပါသည်"</string> <string name="dessert_case" msgid="9104973640704357717">"မုန့်ထည့်သော ပုံး"</string> - <string name="start_dreams" msgid="9131802557946276718">"စခရင်နားချိန်"</string> + <string name="start_dreams" msgid="9131802557946276718">"စခရင်နားချိန်ပုံ"</string> <string name="ethernet_label" msgid="2203544727007463351">"အီသာနက်"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"မနှောင့်ယှက်ရ"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"ဘလူးတုသ်"</string> @@ -237,7 +265,7 @@ <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"အော်တို-လည်"</string> <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"မျက်နှာပြင်အား အလိုအလျောက်လှည့်ခြင်း"</string> <string name="quick_settings_location_label" msgid="2621868789013389163">"တည်နေရာ"</string> - <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"စကရင်နားချိန်"</string> + <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"စခရင်နားချိန်ပုံ"</string> <string name="quick_settings_camera_label" msgid="5612076679385269339">"ကင်မရာသုံးခွင့်"</string> <string name="quick_settings_mic_label" msgid="8392773746295266375">"မိုက်သုံးခွင့်"</string> <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"ရနိုင်သည်"</string> @@ -295,7 +323,7 @@ <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC ကို ပိတ်ထားသည်"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC ကို ဖွင့်ထားသည်"</string> - <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"စကရင် ရိုက်ကူးရန်"</string> + <string name="quick_settings_screen_record_label" msgid="8650355346742003694">"စခရင် ရိုက်ကူးရန်"</string> <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"စတင်ရန်"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"ရပ်ရန်"</string> <string name="quick_settings_onehanded_label" msgid="2416537930246274991">"လက်တစ်ဖက်သုံးမုဒ်"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"အလုပ်ပရိုဖိုင်သို့ ပြောင်းရန်"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ပိတ်ရန်"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"လော့ခ်မျက်နှာပြင်စိတ်ကြိုက်လုပ်ရန်"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"လော့ခ်မျက်နှာပြင် စိတ်ကြိုက်လုပ်ရန် ဖွင့်ပါ"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi မရနိုင်ပါ"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ကင်မရာကို ပိတ်ထားသည်"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ကင်မရာနှင့် မိုက်ခရိုဖုန်းကို ပိတ်ထားသည်"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"မိုက်ခရိုဖုန်းကို ပိတ်ထားသည်"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ဦးစားပေးမုဒ် ဖွင့်ထားသည်"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant နားထောင်နေသည်"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ဆက်တင်များတွင် မူရင်းမှတ်စုများအက်ပ် သတ်မှတ်ပါ"</string> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 72bb06aaf042..a1d6c4440674 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Hvis du oppgir feil mønster på neste forsøk, slettes jobbprofilen din og tilknyttede data."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Hvis du skriver inn feil PIN-kode på neste forsøk, slettes jobbprofilen din og tilknyttede data."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Hvis du skriver inn feil passord på neste forsøk, slettes jobbprofilen din og tilknyttede data."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Trykk på fingeravtrykkssensoren"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ansiktet gjenkjennes ikke. Bruk fingeravtrykk."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Bytt til jobbprofilen"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Lukk"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Tilpass låseskjermen"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Du må låse opp enheten for å tilpasse låseskjermen"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wifi er ikke tilgjengelig"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kameraet er blokkert"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameraet og mikrofonen er blokkert"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen er blokkert"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteringsmodus er på"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistentoppmerksomhet er på"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Du kan velge en standardapp for notater i Innstillinger"</string> </resources> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index eb5d3dbcf08a..9f022ef25570 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -95,7 +95,7 @@ <string name="screenshot_default_files_app_name" msgid="8721579578575161912">"Files"</string> <string name="screenshot_detected_template" msgid="7940376642921719915">"<xliff:g id="APPNAME">%1$s</xliff:g> ले यो स्क्रिनसट भेट्टाएको छ।"</string> <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> र खुला रहेका अन्य एपहरूले यो स्क्रिनसट भेट्टाएका छन्।"</string> - <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"नोट एपमा सेभ गर्नुहोस्"</string> + <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"नोटमा सेभ गर्नुहोस्"</string> <string name="screenrecord_name" msgid="2596401223859996572">"स्क्रिन रेकर्डर"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"स्क्रिन रेकर्डिङको प्रक्रिया अघि बढाइँदै"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"कुनै स्क्रिन रेकर्ड गर्ने सत्रका लागि चलिरहेको सूचना"</string> @@ -168,6 +168,20 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"तपाईंले अर्को पटक पनि गलत ढाँचा प्रविष्टि गर्नुभयो भने यो कार्य प्रोफाइल र त्यहाँको डेटा मेटाइने छ।"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"तपाईंले अर्को पटक पनि गलत PIN प्रविष्टि गर्नुभयो भने तपाईंको कार्य प्रोफाइल र त्यहाँको डेटा मेटाइने छ।"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"तपाईंले अर्को पटक पनि गलत पासवर्ड प्रविष्टि गर्नुभयो भने तपाईंको कार्य प्रोफाइल र त्यहाँको डेटा मेटाइने छ।"</string> + <string name="biometric_re_enroll_dialog_confirm" msgid="3049858021857801836">"सेटअप गर्नुहोस्"</string> + <string name="biometric_re_enroll_dialog_cancel" msgid="93760939407091417">"अहिले होइन"</string> + <string name="biometric_re_enroll_notification_content" msgid="8685925877186288180">"सुरक्षाको गुणस्तर तथा पर्फर्मेन्स सुधार गर्न यो अनुमति दिनु पर्ने हुन्छ"</string> + <string name="fingerprint_re_enroll_notification_title" msgid="4539432429683916604">"फिंगरप्रिन्ट अनलक फेरि सेटअप गर्नुहोस्"</string> + <string name="fingerprint_re_enroll_notification_name" msgid="630798657797645704">"फिंगरप्रिन्ट अनलक"</string> + <string name="fingerprint_re_enroll_dialog_title" msgid="3526033128113925780">"फिंगरप्रिन्ट अनलक सेटअप गर्नुहोस्"</string> + <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"फिंगरप्रिन्ट अनलक फेरि सेटअप गर्न तपाईंका हालका फिंगरप्रिन्टका फोटो तथा मोडेलहरू मेटाइने छन्।\n\nती फोटो तथा मोडेलहरू मेटाइएपछि तपाईंले आफ्नो फिंगरप्रिन्ट प्रयोग गरेर फोन अनलक गर्न वा आफ्नो पहिचान पुष्टि गर्न फिंगरप्रिन्ट अनलक फेरि सेटअप गर्नु पर्ने हुन्छ।"</string> + <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"फिंगरप्रिन्ट अनलक फेरि सेटअप गर्न तपाईंका हालका फिंगरप्रिन्टका फोटो तथा मोडेल मेटाइने छन्।\n\nती फोटो तथा मोडेलहरू मेटाइएपछि तपाईंले आफ्नो फिंगरप्रिन्ट प्रयोग गरेर फोन अनलक गर्न वा आफ्नो पहिचान पुष्टि गर्न फिंगरप्रिन्ट अनलक फेरि सेटअप गर्नु पर्ने हुन्छ।"</string> + <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"फिंगरप्रिन्ट अनलक सेटअप गर्न सकिएन। फेरि प्रयास गर्न सेटिङमा जानुहोस्।"</string> + <string name="face_re_enroll_notification_title" msgid="1850838867718410520">"फेस अनलक फेरि सेटअप गर्नुहोस्"</string> + <string name="face_re_enroll_notification_name" msgid="7384545252206120659">"फेस अनलक"</string> + <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"फेस अनलक सेटअप गर्नुहोस्"</string> + <string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"फेस अनलक फेरि सेटअप गर्न तपाईंको हालको फेस मोडेल मेटाइने छ।\n\nतपाईं आफ्नो अनुहार प्रयोग गरेर फोन अनलक गर्न चाहनुहुन्छ भने तपाईंले यो सुविधा फेरि सेटअप गर्नु पर्ने हुन्छ।"</string> + <string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"फेस अनलक सेटअप गर्न सकिएन। फेरि प्रयास गर्न सेटिङमा जानुहोस्।"</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"फिंगरप्रिन्ट सेन्सरमा छुनुहोस्"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"अनुहार पहिचान गर्न सकिएन। बरु फिंगरप्रिन्ट प्रयोग गर्नुहोस्।"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -885,8 +899,7 @@ <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"मन पर्ने कुराहरूको सूचीमा नराख्नुहोस्"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"<xliff:g id="NUMBER">%d</xliff:g>ले निर्देश गर्ने ठाउँमा सार्नुहोस्"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"नियन्त्रणहरू"</string> - <!-- no translation found for controls_favorite_subtitle (5818709315630850796) --> - <skip /> + <string name="controls_favorite_subtitle" msgid="5818709315630850796">"द्रुत रूपमा एक्सेस गर्न डिभाइस नियन्त्रण गर्ने विजेटहरू छनौट गर्नुहोस्"</string> <string name="controls_favorite_rearrange" msgid="5616952398043063519">"कन्ट्रोललाई होल्ड एण्ड ड्र्याग गरी कन्ट्रोलको क्रम मिलाउनुहोस्"</string> <string name="controls_favorite_removed" msgid="5276978408529217272">"सबै कन्ट्रोल हटाइए"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"परिवर्तनहरू सुरक्षित गरिएका छैनन्"</string> @@ -933,7 +946,7 @@ <string name="controls_media_smartspace_rec_description" msgid="4136242327044070732">"<xliff:g id="APP_LABEL">%1$s</xliff:g> खोल्नुहोस्"</string> <string name="controls_media_smartspace_rec_item_description" msgid="2189271793070870883">"<xliff:g id="ARTIST_NAME">%2$s</xliff:g> को <xliff:g id="SONG_NAME">%1$s</xliff:g> बोलको गीत <xliff:g id="APP_LABEL">%3$s</xliff:g> मा बजाउनुहोस्"</string> <string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"<xliff:g id="SONG_NAME">%1$s</xliff:g> बोलको गीत <xliff:g id="APP_LABEL">%2$s</xliff:g> मा बजाउनुहोस्"</string> - <string name="controls_media_smartspace_rec_header" msgid="5053461390357112834">"तपाईंको लागि सिफारिस गरिएका"</string> + <string name="controls_media_smartspace_rec_header" msgid="5053461390357112834">"तपाईंका लागि सिफारिस गरिएका"</string> <string name="media_transfer_undo" msgid="1895606387620728736">"अन्डू गर्नुहोस्"</string> <string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"<xliff:g id="DEVICENAME">%1$s</xliff:g> मा प्ले गर्न आफ्नो डिभाइस नजिकै लैजानुहोस्"</string> <string name="media_move_closer_to_end_cast" msgid="7302555909119374738">"यो डिभाइसमा प्ले गर्न <xliff:g id="DEVICENAME">%1$s</xliff:g> को अझ नजिक जानुहोस्"</string> @@ -1124,14 +1137,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"कार्य प्रोफाइल प्रयोग गर्नुहोस्"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"बन्द गर्नुहोस्"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"लक स्क्रिन कस्टमाइज गर्नुहोस्"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"लक स्क्रिन कस्टमाइज गर्न अनलक गर्नुहोस्"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi उपलब्ध छैन"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"क्यामेरा ब्लक गरिएको छ"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"क्यामेरा र माइक्रोफोन ब्लक गरिएको छ"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"माइक्रोफोन ब्लक गरिएको छ"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"प्राथमिकता मोड अन छ"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"सहायकले सुनिरहेको छ"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिङमा गई नोट बनाउने डिफल्ट एप तोक्नुहोस्"</string> </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 958980430cc0..e152c110fd2d 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Als je bij de volgende poging een onjuist patroon opgeeft, worden je werkprofiel en de bijbehorende gegevens verwijderd."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Als je bij de volgende poging een onjuiste pincode opgeeft, worden je werkprofiel en de bijbehorende gegevens verwijderd."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Als je bij de volgende poging een onjuist wachtwoord opgeeft, worden je werkprofiel en de bijbehorende gegevens verwijderd."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Raak de vingerafdruksensor aan"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Gezicht niet herkend. Gebruik je vingerafdruk."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Overschakelen naar werkprofiel"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Sluiten"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Vergrendelscherm aanpassen"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Ontgrendelen om het vergrendelscherm aan te passen"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wifi niet beschikbaar"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera geblokkeerd"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera en microfoon geblokkeerd"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfoon geblokkeerd"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteitsmodus aan"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistent-aandacht aan"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standaard notitie-app instellen in Instellingen"</string> </resources> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index f298fd36a1d7..04f07f6978e5 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -127,7 +127,7 @@ <string name="accessibility_accessibility_button" msgid="4089042473497107709">"ଆକ୍ସେସିବିଲିଟୀ"</string> <string name="accessibility_rotate_button" msgid="1238584767612362586">"ସ୍କ୍ରୀନ୍କୁ ଘୁରାନ୍ତୁ"</string> <string name="accessibility_recent" msgid="901641734769533575">"ଓଭରଭିଉ"</string> - <string name="accessibility_camera_button" msgid="2938898391716647247">"କ୍ୟାମେରା"</string> + <string name="accessibility_camera_button" msgid="2938898391716647247">"କେମେରା"</string> <string name="accessibility_phone_button" msgid="4256353121703100427">"ଫୋନ"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"ଭଏସ୍ ସହାୟକ"</string> <string name="accessibility_wallet_button" msgid="1458258783460555507">"ୱାଲେଟ୍"</string> @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"ଆପଣ ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଏକ ଭୁଲ ପାଟର୍ନ ପ୍ରବେଶ କଲେ, ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଏବଂ ଏହାର ଡାଟାକୁ ଡିଲିଟ୍ କରିଦିଆଯିବ।"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"ଆପଣ ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଏକ ଭୁଲ PIN ଲେଖିଲେ, ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଏବଂ ଏହାର ଡାଟାକୁ ଡିଲିଟ୍ କରିଦିଆଯିବ।"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"ଆପଣ ପରବର୍ତ୍ତୀ ପ୍ରଚେଷ୍ଟାରେ ଏକ ଭୁଲ ପାସୱାର୍ଡ ଲେଖିଲେ, ଆପଣଙ୍କ ୱାର୍କ ପ୍ରୋଫାଇଲ୍ ଓ ଏହାର ଡାଟାକୁ ଡିଲିଟ୍ କରିଦିଆଯିବ।"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ଟିପଚିହ୍ନ ସେନସର୍କୁ ଛୁଅଁନ୍ତୁ"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ଫେସ୍ ଚିହ୍ନଟ କରିହେବ ନାହିଁ। ଟିପଚିହ୍ନ ବ୍ୟବହାର କରନ୍ତୁ।"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -182,7 +210,7 @@ <string name="accessibility_not_connected" msgid="4061305616351042142">"କନେକ୍ଟ ହୋଇନାହିଁ।"</string> <string name="data_connection_roaming" msgid="375650836665414797">"ରୋମିଙ୍ଗ"</string> <string name="cell_data_off" msgid="4886198950247099526">"ବନ୍ଦ ଅଛି"</string> - <string name="accessibility_airplane_mode" msgid="1899529214045998505">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍।"</string> + <string name="accessibility_airplane_mode" msgid="1899529214045998505">"ଏରୋପ୍ଲେନ ମୋଡ।"</string> <string name="accessibility_vpn_on" msgid="8037549696057288731">"VPN ଅନ୍।"</string> <string name="accessibility_battery_level" msgid="5143715405241138822">"ବ୍ୟାଟେରୀ <xliff:g id="NUMBER">%d</xliff:g> ଶତକଡ଼ା।"</string> <string name="accessibility_battery_level_with_estimate" msgid="6548654589315074529">"ବେଟେରୀ <xliff:g id="PERCENTAGE">%1$d</xliff:g> ଶତକଡ଼ା, <xliff:g id="TIME">%2$s</xliff:g>"</string> @@ -520,7 +548,7 @@ <string name="qr_code_scanner_title" msgid="1938155688725760702">"QR କୋଡ ସ୍କାନର"</string> <string name="qr_code_scanner_updating_secondary_label" msgid="8344598017007876352">"ଅପଡେଟ ହେଉଛି"</string> <string name="status_bar_work" msgid="5238641949837091056">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string> - <string name="status_bar_airplane" msgid="4848702508684541009">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍"</string> + <string name="status_bar_airplane" msgid="4848702508684541009">"ଏରୋପ୍ଲେନ ମୋଡ"</string> <string name="zen_alarm_warning" msgid="7844303238486849503">"<xliff:g id="WHEN">%1$s</xliff:g>ବେଳେ ଆପଣ ନିଜର ପରବର୍ତ୍ତୀ ଆଲାର୍ମ ଶୁଣିପାରିବେ ନାହିଁ"</string> <string name="alarm_template" msgid="2234991538018805736">"<xliff:g id="WHEN">%1$s</xliff:g> ହେଲେ"</string> <string name="alarm_template_far" msgid="3561752195856839456">"<xliff:g id="WHEN">%1$s</xliff:g> ବେଳେ"</string> @@ -818,7 +846,7 @@ <string name="ongoing_privacy_dialog_attribution_text" msgid="4738795925380373994">"(<xliff:g id="APPLICATION_NAME_S_">%s</xliff:g> ମାଧ୍ୟମରେ)"</string> <string name="ongoing_privacy_dialog_attribution_label" msgid="3385241594101496292">"(<xliff:g id="ATTRIBUTION_LABEL">%s</xliff:g>)"</string> <string name="ongoing_privacy_dialog_attribution_proxy_label" msgid="1111829599659403249">"(<xliff:g id="ATTRIBUTION_LABEL">%1$s</xliff:g> • <xliff:g id="PROXY_LABEL">%2$s</xliff:g>)"</string> - <string name="privacy_type_camera" msgid="7974051382167078332">"କ୍ୟାମେରା"</string> + <string name="privacy_type_camera" msgid="7974051382167078332">"Camera"</string> <string name="privacy_type_location" msgid="7991481648444066703">"ଲୋକେସନ"</string> <string name="privacy_type_microphone" msgid="9136763906797732428">"ମାଇକ୍ରୋଫୋନ"</string> <string name="privacy_type_media_projection" msgid="8136723828804251547">"ସ୍କ୍ରିନ ରେକର୍ଡିଂ"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ୱାର୍କ ପ୍ରୋଫାଇଲକୁ ସ୍ୱିଚ କରନ୍ତୁ"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ବନ୍ଦ କରନ୍ତୁ"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"ଲକ ସ୍କ୍ରିନକୁ କଷ୍ଟମାଇଜ କରନ୍ତୁ"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"ଲକ ସ୍କ୍ରିନକୁ କଷ୍ଟମାଇଜ କରିବା ପାଇଁ ଅନଲକ କରନ୍ତୁ"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"ୱାଇ-ଫାଇ ଉପଲବ୍ଧ ନାହିଁ"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"କେମେରାକୁ ବ୍ଲକ କରାଯାଇଛି"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"କେମେରା ଏବଂ ମାଇକ୍ରୋଫୋନକୁ ବ୍ଲକ କରାଯାଇଛି"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ମାଇକ୍ରୋଫୋନକୁ ବ୍ଲକ କରାଯାଇଛି"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ପ୍ରାୟୋରିଟି ମୋଡ ଚାଲୁ ଅଛି"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant ଆଟେନସନ ଚାଲୁ ଅଛି"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ସେଟିଂସରେ ଡିଫଲ୍ଟ ନୋଟ୍ସ ଆପ ସେଟ କରନ୍ତୁ"</string> </resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 50e829f1f4e8..dbeda1877a05 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"ਜੇ ਤੁਸੀਂ ਅਗਲੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਕੋਈ ਗਲਤ ਪੈਟਰਨ ਦਾਖਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਇਸ ਦਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"ਜੇ ਤੁਸੀਂ ਅਗਲੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਕੋਈ ਗਲਤ ਪਿੰਨ ਦਾਖਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਇਸ ਦਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"ਜੇ ਤੁਸੀਂ ਅਗਲੀ ਕੋਸ਼ਿਸ਼ ਵਿੱਚ ਕੋਈ ਗਲਤ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡਾ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਇਸ ਦਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ਚਿਹਰਾ ਨਹੀਂ ਪਛਾਣ ਸਕਦੇ। ਇਸਦੀ ਬਜਾਏ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ।"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ \'ਤੇ ਜਾਓ"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ਬੰਦ ਕਰੋ"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"ਲਾਕ ਸਕ੍ਰੀਨ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"ਲਾਕ ਸਕ੍ਰੀਨ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰਨ ਲਈ ਅਣਲਾਕ ਕਰੋ"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"ਵਾਈ-ਫਾਈ ਉਪਲਬਧ ਨਹੀਂ"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"ਕੈਮਰਾ ਬਲਾਕ ਕੀਤਾ ਗਿਆ"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"ਕੈਮਰਾ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਬਲਾਕ ਕੀਤੇ ਗਏ"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਬਲਾਕ ਕੀਤਾ ਗਿਆ"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ਤਰਜੀਹ ਮੋਡ ਚਾਲੂ ਹੈ"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistant ਧਿਆਨ ਸੁਵਿਧਾ ਨੂੰ ਚਾਲੂ ਹੈ"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਨੋਟ ਐਪ ਨੂੰ ਸੈੱਟ ਕਰੋ"</string> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 499925aed53a..6dda47dd02b6 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Jeśli następnym razem podasz nieprawidłowy wzór, profil służbowy oraz powiązane z nim dane zostaną usunięte."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Jeśli następnym razem podasz nieprawidłowy kod PIN, profil służbowy oraz powiązane z nim dane zostaną usunięte."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Jeśli następnym razem podasz nieprawidłowe hasło, profil służbowy oraz powiązane z nim dane zostaną usunięte."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dotknij czytnika linii papilarnych"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nie rozpoznaję twarzy. Użyj odcisku palca."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Przełącz na profil służbowy"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Zamknij"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Dostosuj ekran blokady"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Odblokuj, aby dostosować ekran blokady"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Sieć Wi-Fi jest niedostępna"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera jest zablokowana"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera i mikrofon są zablokowane"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon jest zablokowany"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Tryb priorytetowy jest włączony"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Asystent jest aktywny"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ustaw domyślną aplikację do obsługi notatek w Ustawieniach"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 2469f2ef7acf..486c6668676f 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -95,7 +95,7 @@ <string name="screenshot_default_files_app_name" msgid="8721579578575161912">"Files"</string> <string name="screenshot_detected_template" msgid="7940376642921719915">"O app <xliff:g id="APPNAME">%1$s</xliff:g> detectou essa captura de tela."</string> <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> e outros apps abertos detectaram essa captura de tela."</string> - <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Adicionar às notas"</string> + <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Incluir anotação"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravador de tela"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processando gravação de tela"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação contínua para uma sessão de gravação de tela"</string> @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Se você informar um padrão incorreto na próxima tentativa, seu perfil de trabalho e os dados dele serão excluídos."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Se você informar um PIN incorreto na próxima tentativa, seu perfil de trabalho e os dados dele serão excluídos."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Se você informar uma senha incorreta na próxima tentativa, seu perfil de trabalho e os dados dele serão excluídos."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toque no sensor de impressão digital"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Não foi possível reconhecer o rosto Use a impressão digital."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 07378b90bd37..ca7756f1f14c 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Se introduzir um padrão incorreto na tentativa seguinte, o seu perfil de trabalho e os respetivos dados serão eliminados."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Se introduzir um PIN incorreto na tentativa seguinte, o seu perfil de trabalho e os respetivos dados serão eliminados."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Se introduzir uma palavra-passe incorreta na tentativa seguinte, o seu perfil de trabalho e os respetivos dados serão eliminados."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toque no sensor de impressões digitais."</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Impos. reconh. rosto. Utilize a impressão digital."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Mudar para perfil de trabalho"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Fechar"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Personalizar o ecrã de bloqueio"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Desbloqueie para personalizar o ecrã de bloqueio"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi indisponível"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Câmara bloqueada"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Câmara e microfone bloqueados"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfone bloqueado"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modo Prioridade ativado"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Atenção do Assistente ativada"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Predefina a app de notas nas Definições"</string> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 2469f2ef7acf..486c6668676f 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -95,7 +95,7 @@ <string name="screenshot_default_files_app_name" msgid="8721579578575161912">"Files"</string> <string name="screenshot_detected_template" msgid="7940376642921719915">"O app <xliff:g id="APPNAME">%1$s</xliff:g> detectou essa captura de tela."</string> <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> e outros apps abertos detectaram essa captura de tela."</string> - <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Adicionar às notas"</string> + <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"Incluir anotação"</string> <string name="screenrecord_name" msgid="2596401223859996572">"Gravador de tela"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processando gravação de tela"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificação contínua para uma sessão de gravação de tela"</string> @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Se você informar um padrão incorreto na próxima tentativa, seu perfil de trabalho e os dados dele serão excluídos."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Se você informar um PIN incorreto na próxima tentativa, seu perfil de trabalho e os dados dele serão excluídos."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Se você informar uma senha incorreta na próxima tentativa, seu perfil de trabalho e os dados dele serão excluídos."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Toque no sensor de impressão digital"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Não foi possível reconhecer o rosto Use a impressão digital."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 6d73152c9ff6..159475aee99e 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Dacă la următoarea încercare introduci un model incorect, profilul de serviciu și datele sale vor fi șterse."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Dacă la următoarea încercare introduci un cod PIN incorect, profilul de serviciu și datele sale vor fi șterse."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Dacă la următoarea încercare introduci o parolă incorectă, profilul de serviciu și datele sale vor fi șterse."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Atinge senzorul de amprente"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Chipul nu a fost recunoscut. Folosește amprenta."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -223,7 +251,7 @@ <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"Ecranul este blocat în orientarea de tip peisaj."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"Ecranul este blocat în orientarea de tip portret."</string> <string name="dessert_case" msgid="9104973640704357717">"Vitrina cu dulciuri"</string> - <string name="start_dreams" msgid="9131802557946276718">"Economizor de ecran"</string> + <string name="start_dreams" msgid="9131802557946276718">"Screensaver"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"Nu deranja"</string> <string name="quick_settings_bluetooth_label" msgid="7018763367142041481">"Bluetooth"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Comută la profilul de serviciu"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Închide"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Personalizează ecranul de blocare"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Deblochează pentru a personaliza ecranul de blocare"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Conexiune Wi-Fi indisponibilă"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera foto a fost blocată"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera foto și microfonul sunt blocate"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfonul a fost blocat"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modul Cu prioritate este activat"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Asistentul este atent"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setează aplicația prestabilită de note din Setări"</string> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 25807f23b60e..1c5b66237b10 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Если вы неправильно введете графический ключ ещё раз, ваш рабочий профиль и его данные будут удалены."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Если вы неправильно введете PIN-код ещё раз, ваш рабочий профиль и его данные будут удалены."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Если вы неправильно введете пароль ещё раз, ваш рабочий профиль и его данные будут удалены."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Прикоснитесь к сканеру отпечатков пальцев."</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Не удалось распознать лицо. Используйте отпечаток."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Перейти в рабочий профиль"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Закрыть"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Настройки заблок. экрана"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Разблокируйте устройство, чтобы настроить заблокированный экран"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Функция Wi-Fi недоступна"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера заблокирована"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера и микрофон заблокированы"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон заблокирован"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Режим \"Только важные\" включен"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Ассистент готов слушать"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайте стандартное приложение для заметок в настройках."</string> </resources> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index a4e340c1c703..bf664346d5ad 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"ඔබ ඊළඟ උත්සාහයේදී වැරදි රටාවක් ඇතුළු කළහොත්, ඔබේ කාර්යාල පැතිකඩ සහ එහි දත්ත මකනු ඇත."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"ඔබ ඊළඟ උත්සාහයේදී වැරදි PIN එකක් ඇතුළු කළහොත්, ඔබේ කාර්යාල පැතිකඩ සහ එහි දත්ත මකනු ඇත."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"ඔබ ඊළඟ උත්සාහයේදී වැරදි මුරපදයක් ඇතුළු කළහොත්, ඔබේ කාර්යාල පැතිකඩ සහ එහි දත්ත මකනු ඇත."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරන්න"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"මුහුණ හැඳිනිය නොහැක. ඒ වෙනුවට ඇඟිලි සලකුණ භාවිත ක."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"කාර්යාල පැතිකඩ වෙත මාරු වන්න"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"වසන්න"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"අගුළු තිරය අභිරුචිකරණය කරන්න"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"අගුළු තිරය අභිරුචිකරණය කිරීමට අගුළු හරින්න"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi ලද නොහැක"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"කැමරාව අවහිරයි"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"කැමරාව සහ මයික්රොෆෝනය අවහිරයි"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"මයික්රොෆෝනය අවහිරයි"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ප්රමුඛතා මාදිලිය සක්රීයයි"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"සහයක අවධානය යොමු කරයි"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"සැකසීම් තුළ පෙරනිමි සටහන් යෙදුම සකසන්න"</string> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index d59c6aead1b5..4c44724afc0c 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Ak pri ďalšom pokuse zadáte nesprávny vzor, váš pracovný profil a jeho dáta budú odstránené."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Ak pri ďalšom pokuse zadáte nesprávny PIN, váš pracovný profil a jeho dáta budú odstránené."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Ak pri ďalšom pokuse zadáte nesprávne heslo, váš pracovný profil a jeho dáta budú odstránené."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dotknite sa senzora odtlačkov prstov"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Tvár sa nedá rozpoznať. Použite odtlačok prsta."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Potiahnutím zobrazíte ďalšie položky"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Načítavajú sa odporúčania"</string> <string name="controls_media_title" msgid="1746947284862928133">"Médiá"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Chcete tento ovládač médií pre aplikáciu <xliff:g id="APP_NAME">%1$s</xliff:g> skryť?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Chcete tento ovládač médií pre <xliff:g id="APP_NAME">%1$s</xliff:g> skryť?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Aktuálna relácia média sa nedá skryť."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Skryť"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Pokračovať"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index b600337ce45e..78016c29f682 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Če pri naslednjem poskusu vnesete napačen vzorec, bodo delovni profil in podatki v njem izbrisani."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Če pri naslednjem poskusu vnesete napačno kodo PIN, bodo delovni profil in podatki v njem izbrisani."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Če pri naslednjem poskusu vnesete napačno geslo, bodo delovni profil in podatki v njem izbrisani."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Dotaknite se tipala prstnih odtisov"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Obraza ni mogoče prepoznati. Uporabite prstni odtis."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index ea380a0451c2..cdeaa89063ab 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Nëse fut një motiv të pasaktë në tentativën tjetër, profili yt i punës dhe të dhënat e tij do të fshihen."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Nëse fut një kod PIN të pasaktë në tentativën tjetër, profili yt i punës dhe të dhënat e tij do të fshihen."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Nëse fut një fjalëkalim të pasaktë në tentativën tjetër, profili yt i punës dhe të dhënat e tij do të fshihen."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Prek sensorin e gjurmës së gishtit"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Nuk mund ta dallojë fytyrën. Përdor më mirë gjurmën e gishtit."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Kalo te profili i punës"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Mbyll"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Personalizo ekranin e kyçjes"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Shkyçe për të personalizuar ekranin e kyçjes"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi nuk ofrohet"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera u bllokua"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera dhe mikrofoni u bllokuan"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofoni u bllokua"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modaliteti i përparësisë aktiv"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Vëmendja e \"Asistentit\" aktive"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Cakto aplikacionin e parazgjedhur të shënimeve te \"Cilësimet\""</string> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 14dddd686926..1791a7fd8695 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Ако унесете нетачан шаблон при следећем покушају, избрисаћемо пословни профил и његове податке."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Ако унесете нетачан PIN при следећем покушају, избрисаћемо пословни профил и његове податке."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Ако унесете нетачну лозинку при следећем покушају, избрисаћемо пословни профил и његове податке."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Додирните сензор за отисак прста"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Лице није препознато. Користите отисак прста."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Превуците да бисте видели још"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Учитавају се препоруке"</string> <string name="controls_media_title" msgid="1746947284862928133">"Медији"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Желите ли да сакријете ову контролу за медије за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Желите да сакријете ову контролу за медије за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Актуелна сесија медија не може да буде сакривена."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Сакриј"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Настави"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Пређи на пословни профил"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Затвори"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Прилагоди закључани екран"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Откључајте да бисте прилагодили закључани екран"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"WiFi није доступан"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камера је блокирана"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камера и микрофон су блокирани"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Микрофон је блокиран"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Приоритетни режим је укључен"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Помоћник је у активном стању"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Подесите подразумевану апликацију за белешке у Подешавањима"</string> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 5149bbf3013e..191d9b620bd8 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Jobbprofilen och dess data raderas om du ritar fel mönster vid nästa försök."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Jobbprofilen och dess data raderas om du anger fel pinkod vid nästa försök."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Din jobbprofil och dess data raderas om du anger fel lösenord vid nästa försök."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Tryck på fingeravtryckssensorn"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ansiktet kändes inte igen. Använd fingeravtryck."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Svep om du vill se mer"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Rekommendationer läses in"</string> <string name="controls_media_title" msgid="1746947284862928133">"Media"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Vill du dölja detta uppspelningsreglage för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Vill du dölja denna mediastyrning för <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Den aktuella mediesessionen kan inte döljas."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Dölj"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Återuppta"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Byt till jobbprofilen"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Stäng"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Anpassa låsskärmen"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Lås upp för att anpassa låsskärmen"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wifi är inte tillgängligt"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kameran är blockerad"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kameran och mikrofonen är blockerade"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofonen är blockerad"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioritetsläge är aktiverat"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistenten är aktiverad"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ställ in en standardapp för anteckningar i inställningarna"</string> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index eb32d9b2af08..15f4e5241466 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Ukiweka mchoro usio sahihi utakapojaribu tena, wasifu wako wa kazini utafutwa pamoja na data yake."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Ukiweka PIN isiyo sahihi utakapojaribu tena, wasifu wako wa kazini utafutwa pamoja na data yake."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Ukiweka nenosiri lisilo sahihi utakapojaribu tena, wasifu wako wa kazini utafutwa pamoja na data yake."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Gusa kitambua alama ya kidole"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Imeshindwa kutambua uso. Tumia alama ya kidole."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Telezesha kidole ili uone zaidi"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Inapakia mapendekezo"</string> <string name="controls_media_title" msgid="1746947284862928133">"Maudhui"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Ungependa kuficha kidhibiti hiki kwa <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Ungependa kuficha kidhibiti hiki kwenye <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Kipindi cha sasa cha maudhui hakiwezi kufichwa."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Ficha"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Endelea"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Tumia wasifu wa kazini"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Funga"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Wekea mapendeleo skrini iliyofungwa"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Fungua ili uweke mapendeleo ya skrini iliyofungwa"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi haipatikani"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera imezuiwa"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera na maikrofoni zimezuiwa"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Maikrofoni imezuiwa"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Hali ya kipaumbele imewashwa"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Programu ya Mratibu imewashwa"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Teua programu chaguomsingi ya madokezo katika Mipangilio"</string> </resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index 583ec25a2cbe..14777e497a83 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"அடுத்த முறை தவறான பேட்டர்னை வரைந்தால் உங்கள் பணிக் கணக்கும் அதன் தரவும் நீக்கப்படும்."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"அடுத்த முறை தவறான பின்னை உள்ளிட்டால் உங்கள் பணிக் கணக்கும் அதன் தரவும் நீக்கப்படும்."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"அடுத்த முறை தவறான கடவுச்சொல்லை உள்ளிட்டால் உங்கள் பணிக் கணக்கும் அதன் தரவும் நீக்கப்படும்."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"கைரேகை சென்சாரைத் தொடவும்"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"முகத்தை அடையாளம் காண முடியவில்லை. கைரேகையைப் பயன்படுத்தவும்."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"பணிக் கணக்கிற்கு மாறு"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"மூடுக"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"பூட்டுத் திரையை பிரத்தியேகமாக்கு"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"பூட்டுத் திரையைப் பிரத்தியேகப்படுத்த அன்லாக் செய்யுங்கள்"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"வைஃபை கிடைக்கவில்லை"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"கேமரா தடுக்கப்பட்டுள்ளது"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"கேமராவும் மைக்ரோஃபோனும் தடுக்கப்பட்டுள்ளன"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"மைக்ரோஃபோன் தடுக்கப்பட்டுள்ளது"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"முன்னுரிமைப் பயன்முறை இயக்கத்தில் உள்ளது"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"அசிஸ்டண்ட்டின் கவனம் இயக்கத்தில் உள்ளது"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"குறிப்பு எடுப்பதற்கான இயல்புநிலை ஆப்ஸை அமைப்புகளில் அமையுங்கள்"</string> </resources> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 8ada2ee55498..0a0e7fd68233 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"మీరు ఒకవేళ తర్వాతి ప్రయత్నంలో తప్పు ఆకృతిని ఎంటర్ చేస్తే, మీ కార్యాలయ ప్రొఫైల్, అలాగే దాని డేటా తొలగించబడతాయి."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"మీరు ఒకవేళ తర్వాతి ప్రయత్నంలో తప్పు పిన్ను ఎంటర్ చేస్తే, మీ కార్యాలయ ప్రొఫైల్, అలాగే దాని డేటా తొలగించబడతాయి."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"మీరు ఒకవేళ తర్వాతి ప్రయత్నంలో తప్పు పాస్వర్డ్ను ఎంటర్ చేస్తే, మీ కార్యాలయ ప్రొఫైల్, అలాగే దాని డేటా తొలగించబడతాయి."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"వేలిముద్ర సెన్సార్ను తాకండి"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ముఖం గుర్తించలేము. బదులుగా వేలిముద్ర ఉపయోగించండి."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -545,7 +573,7 @@ <string name="notification_silence_title" msgid="8608090968400832335">"నిశ్శబ్దం"</string> <string name="notification_alert_title" msgid="3656229781017543655">"ఆటోమేటిక్ సెట్టింగ్"</string> <string name="notification_automatic_title" msgid="3745465364578762652">"ఆటోమేటిక్"</string> - <string name="notification_channel_summary_low" msgid="4860617986908931158">"శబ్దం లేదా వైబ్రేషన్లు ఏవీ లేవు"</string> + <string name="notification_channel_summary_low" msgid="4860617986908931158">"సౌండ్ లేదా వైబ్రేషన్లు ఏవీ ఉండవు"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"శబ్దం లేదా వైబ్రేషన్ లేదు, సంభాషణ విభాగం దిగువన కనిపిస్తుంది"</string> <string name="notification_channel_summary_default" msgid="777294388712200605">"పరికర సెట్టింగ్ల ఆధారంగా రింగ్ లేదా వైబ్రేట్ కావచ్చు"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="3482483084451555344">"పరికర సెట్టింగ్ల ఆధారంగా రింగ్ లేదా వైబ్రేట్ కావచ్చు. <xliff:g id="APP_NAME">%1$s</xliff:g> నుండి సంభాషణలు ఆటోమేటిక్గా బబుల్లో కనిపిస్తాయి."</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index ce35c4065ebb..76d99814d15e 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"หากคุณป้อนรูปแบบไม่ถูกต้องในความพยายามครั้งถัดไป ระบบจะลบโปรไฟล์งานและข้อมูลในโปรไฟล์"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"หากคุณป้อน PIN ไม่ถูกต้องในความพยายามครั้งถัดไป ระบบจะลบโปรไฟล์งานและข้อมูลในโปรไฟล์"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"หากคุณป้อนรหัสผ่านไม่ถูกต้องในความพยายามครั้งถัดไป ระบบจะลบโปรไฟล์งานและข้อมูลในโปรไฟล์"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"แตะเซ็นเซอร์ลายนิ้วมือ"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"ไม่รู้จักใบหน้า ใช้ลายนิ้วมือแทน"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"สลับไปใช้โปรไฟล์งาน"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"ปิด"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"ปรับแต่งหน้าจอล็อก"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"ปลดล็อกเพื่อปรับแต่งหน้าจอล็อก"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi ไม่พร้อมใช้งาน"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"กล้องถูกบล็อกอยู่"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"กล้องและไมโครโฟนถูกบล็อกอยู่"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"ไมโครโฟนถูกบล็อกอยู่"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"โหมดลำดับความสำคัญเปิดอยู่"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"การเรียกใช้งาน Assistant เปิดอยู่"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"กำหนดแอปการจดบันทึกเริ่มต้นในการตั้งค่า"</string> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 527a2f64e8fe..653ed5cfeda6 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Kung maling pattern ang mailalagay mo sa susunod na pagsubok, made-delete ang iyong profile sa trabaho at ang data nito."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Kung maling PIN ang mailalagay mo sa susunod na pagsubok, made-delete ang iyong profile sa trabaho at ang data nito."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Kung maling password ang mailalagay mo sa susunod na pagsubok, made-delete ang iyong profile sa trabaho at ang data nito."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Pindutin ang fingerprint sensor"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Hindi makilala ang mukha. Gumamit ng fingerprint."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Lumipat sa profile sa trabaho"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Isara"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"I-customize ang lock screen"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"I-unlock para i-customize ang lock screen"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Hindi available ang Wi-Fi"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Naka-block ang camera"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Naka-block ang camera at mikropono"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Naka-block ang mikropono"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Naka-on ang Priority mode"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Naka-on ang atensyon ng Assistant"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Magtakda ng default na app sa pagtatala sa Mga Setting"</string> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index cb504621fc6f..82c89d993656 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Bir sonraki denemenizde yanlış desen girerseniz iş profiliniz ve verileri silinir."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Bir sonraki denemenizde yanlış PIN girerseniz iş profiliniz ve verileri silinir."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Bir sonraki denemenizde yanlış şifre girerseniz iş profiliniz ve verileri silinir."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Parmak izi sensörüne dokunun"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Yüz tanınamadı. Bunun yerine parmak izi kullanın."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"İş profiline geç"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Kapat"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Kilit ekranını özelleştir"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Kilit ekranını özelleştirmek için kilidi açın"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Kablosuz bağlantı kullanılamıyor"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera engellendi"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera ve mikrofon engellendi"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon engellendi"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Öncelik modu etkin"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Asistan dinliyor"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ayarlar\'ı kullanarak varsayılan notlar ayarlayın"</string> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index d236f5058cbc..767d31969d59 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Якщо наступного разу ви введете неправильний ключ, ваш робочий профіль і його дані буде видалено."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Якщо наступного разу ви введете неправильний PIN-код, ваш робочий профіль і його дані буде видалено."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Якщо наступного разу ви введете неправильний пароль, ваш робочий профіль і його дані буде видалено."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Торкніться сканера відбитків пальців"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Обличчя не розпізнано. Скористайтеся відбитком пальця."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Перейти в робочий профіль"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Закрити"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Налаштувати заблокований екран"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Розблокуйте, щоб налаштувати заблокований екран"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Мережа Wi-Fi недоступна"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Камеру заблоковано"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Камеру й мікрофон заблоковано"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Мікрофон заблоковано"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Режим пріоритету ввімкнено"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Асистента активовано"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Призначте стандартний додаток для нотаток у налаштуваннях"</string> </resources> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 92a765244aea..b4d1ebc84b35 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"اگر آپ نے اگلی کوشش میں غلط پیٹرن درج کیا تو آپ کی دفتری پروفائل اور اس کا ڈیٹا حذف کر دیا جائے گا۔"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"اگر آپ نے اگلی کوشش میں غلط PIN درج کیا تو آپ کی دفتری پروفائل اور اس کا ڈیٹا حذف کر دیا جائے گا۔"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"اگر آپ نے اگلی کوشش میں غلط پاس ورڈ درج کیا تو آپ کی دفتری پروفائل اور اس کا ڈیٹا حذف کر دیا جائے گا۔"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"فنگر پرنٹ سینسر پر ٹچ کریں"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"چہرے کی شناخت نہیں ہو سکی۔ اس کے بجائے فنگر پرنٹ استعمال کریں۔"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"دفتری پروفائل پر سوئچ کریں"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"بند کریں"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"مقفل اسکرین کو حسب ضرورت بنائیں"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"مقفل اسکرین کو حسب ضرورت بنانے کے لیے غیر مقفل کریں"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi دستیاب نہیں ہے"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"کیمرا مسدود ہے"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"کیمرا اور مائیکروفون مسدود ہے"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"مائیکروفون مسدود ہے"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"ترجیحی موڈ آن ہے"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"اسسٹنٹ کی توجہ آن ہے"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ترتیبات میں ڈیفالٹ نوٹس ایپ سیٹ کریں"</string> </resources> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 3d148e4ea596..0154c53d8b5e 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Agar grafik kalitni xato kiritsangiz, ish profili va undagi maʼlumotlar oʻchirib tashlanadi."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Agar PIN kodni xato kiritsangiz, ish profili va undagi maʼlumotlar oʻchirib tashlanadi."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Agar parolni xato kiritsangiz, ish profili va undagi maʼlumotlar oʻchirib tashlanadi."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Barmoq izi skaneriga tegining"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Bu yuz notanish. Barmoq izi orqali urining."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Ish profiliga almashish"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Yopish"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Ekran qulfini moslash"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Ekran qulfini sozlash uchun qulfni oching"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi mavjud emas"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera bloklangan"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera va mikrofon bloklangan"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon bloklangan"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Imtiyozli rejim yoniq"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Assistent diqqati yoniq"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standart qaydlar ilovasini Sozlamalar orqali tanlang"</string> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index f9a23ed69803..1dca0155117a 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Nếu bạn nhập hình mở khóa không chính xác vào lần thử tiếp theo, thì hồ sơ công việc của bạn và dữ liệu của hồ sơ công việc sẽ bị xóa."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Nếu bạn nhập mã PIN không chính xác vào lần thử tiếp theo, thì hồ sơ công việc của bạn và dữ liệu của hồ sơ công việc sẽ bị xóa."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Nếu bạn nhập mật khẩu không chính xác vào lần thử tiếp theo, thì hồ sơ công việc của bạn và dữ liệu của hồ sơ công việc sẽ bị xóa."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Chạm vào cảm biến vân tay"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Không thể nhận dạng khuôn mặt. Hãy dùng vân tay."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -917,7 +945,7 @@ <string name="controls_structure_tooltip" msgid="4355922222944447867">"Vuốt để xem thêm"</string> <string name="controls_seeding_in_progress" msgid="3033855341410264148">"Đang tải các đề xuất"</string> <string name="controls_media_title" msgid="1746947284862928133">"Nội dung nghe nhìn"</string> - <string name="controls_media_close_session" msgid="4780485355795635052">"Ẩn chế độ điều khiển nội dung nghe nhìn này cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> + <string name="controls_media_close_session" msgid="4780485355795635052">"Ẩn tính năng điều khiển này cho <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="controls_media_active_session" msgid="3146882316024153337">"Không thể ẩn phiên phát nội dung nghe nhìn hiện tại."</string> <string name="controls_media_dismiss_button" msgid="4485675693008031646">"Ẩn"</string> <string name="controls_media_resume" msgid="1933520684481586053">"Tiếp tục"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Chuyển sang hồ sơ công việc"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Đóng"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Tuỳ chỉnh màn hình khoá"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Mở khoá để tuỳ chỉnh màn hình khoá"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Không có Wi-Fi"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Máy ảnh bị chặn"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Máy ảnh và micrô bị chặn"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Micrô bị chặn"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Chế độ ưu tiên đang bật"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Trợ lý đang bật"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Đặt ứng dụng ghi chú mặc định trong phần Cài đặt"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 51100278c03a..e7294c325954 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"如果您下次绘制的解锁图案仍然有误,您的工作资料及其相关数据将会被删除。"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"如果您下次输入的 PIN 码仍然有误,您的工作资料及其相关数据将会被删除。"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"如果您下次输入的密码仍然有误,您的工作资料及其相关数据将会被删除。"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"请触摸指纹传感器"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"无法识别人脸。请改用指纹。"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -982,8 +1010,8 @@ <string name="media_output_broadcast_last_update_error" msgid="5484328807296895491">"无法保存。"</string> <string name="media_output_broadcast_code_hint_no_less_than_min" msgid="4663836092607696185">"必须至少 4 个字符"</string> <string name="media_output_broadcast_code_hint_no_more_than_max" msgid="9181869364856175638">"必须少于 16 个字符"</string> - <string name="build_number_clip_data_label" msgid="3623176728412560914">"版本号"</string> - <string name="build_number_copy_toast" msgid="877720921605503046">"已将版本号复制到剪贴板。"</string> + <string name="build_number_clip_data_label" msgid="3623176728412560914">"Build 号"</string> + <string name="build_number_copy_toast" msgid="877720921605503046">"已将 Build 号复制到剪贴板。"</string> <string name="basic_status" msgid="2315371112182658176">"开放式对话"</string> <string name="select_conversation_title" msgid="6716364118095089519">"对话微件"</string> <string name="select_conversation_text" msgid="3376048251434956013">"点按对话即可将其添加到主屏幕"</string> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"切换到工作资料"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"关闭"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"自定义锁屏状态"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"解锁以自定义锁定屏幕"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"没有 WLAN 连接"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"已禁用摄像头"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已禁用摄像头和麦克风"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已禁用麦克风"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"已开启优先模式"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"已开启 Google 助理感知功能"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在设置中设置默认记事应用"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 82f81f6868bb..5609ac93fe6b 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -36,8 +36,8 @@ <string name="usb_device_permission_prompt_warn" msgid="2309129784984063656">"要允許「<xliff:g id="APPLICATION">%1$s</xliff:g>」存取「<xliff:g id="USB_DEVICE">%2$s</xliff:g>」嗎?\n此應用程式尚未獲授予錄音權限,但可透過此 USB 裝置記錄音訊。"</string> <string name="usb_audio_device_permission_prompt_title" msgid="4221351137250093451">"要允許「<xliff:g id="APPLICATION">%1$s</xliff:g>」存取「<xliff:g id="USB_DEVICE">%2$s</xliff:g>」嗎?"</string> <string name="usb_audio_device_confirm_prompt_title" msgid="8828406516732985696">"要開啟「<xliff:g id="APPLICATION">%1$s</xliff:g>」處理「<xliff:g id="USB_DEVICE">%2$s</xliff:g>」嗎?"</string> - <string name="usb_audio_device_prompt_warn" msgid="2504972133361130335">"此應用程式尚未獲授予錄音權限,但可透過此 USB 裝置記錄音訊。如將「<xliff:g id="APPLICATION">%1$s</xliff:g>」與此裝置配合使用,您可能無法聽見來電、通知及鬧鐘的音效。"</string> - <string name="usb_audio_device_prompt" msgid="7944987408206252949">"如將「<xliff:g id="APPLICATION">%1$s</xliff:g>」與此裝置配合使用,您可能無法聽見來電、通知及鬧鐘的音效。"</string> + <string name="usb_audio_device_prompt_warn" msgid="2504972133361130335">"此應用程式尚未獲授予錄音權限,但可透過此 USB 裝置記錄音訊。如將「<xliff:g id="APPLICATION">%1$s</xliff:g>」與此裝置配合使用,你可能無法聽見來電、通知及鬧鐘的音效。"</string> + <string name="usb_audio_device_prompt" msgid="7944987408206252949">"如將「<xliff:g id="APPLICATION">%1$s</xliff:g>」與此裝置配合使用,你可能無法聽見來電、通知及鬧鐘的音效。"</string> <string name="usb_accessory_permission_prompt" msgid="717963550388312123">"要允許「<xliff:g id="APPLICATION">%1$s</xliff:g>」存取「<xliff:g id="USB_ACCESSORY">%2$s</xliff:g>」嗎?"</string> <string name="usb_device_confirm_prompt" msgid="4091711472439910809">"要開啟「<xliff:g id="APPLICATION">%1$s</xliff:g>」處理「<xliff:g id="USB_DEVICE">%2$s</xliff:g>」嗎?"</string> <string name="usb_device_confirm_prompt_warn" msgid="990208659736311769">"要開啟「<xliff:g id="APPLICATION">%1$s</xliff:g>」應用程式來控制「<xliff:g id="USB_DEVICE">%2$s</xliff:g>」嗎?\n此應用程式尚未獲授予錄音權限,但可透過此 USB 裝置記錄音訊。"</string> @@ -64,7 +64,7 @@ <string name="wifi_debugging_secondary_user_title" msgid="2493201475880517725">"不允許無線偵錯功能"</string> <string name="wifi_debugging_secondary_user_message" msgid="9085779370142222881">"目前登入此裝置的使用者無法啟用無線偵錯功能。如要使用此功能,請切換至管理員使用者。"</string> <string name="usb_contaminant_title" msgid="894052515034594113">"已停用 USB 連接埠"</string> - <string name="usb_contaminant_message" msgid="7730476585174719805">"為了保護您的裝置免受液體或碎片損害,USB 連接埠已停用,因此不會偵測到任何配件。\n\nUSB 連接埠可安全使用時,您會收到通知。"</string> + <string name="usb_contaminant_message" msgid="7730476585174719805">"為了保護你的裝置免受液體或碎片損害,USB 連接埠已停用,因此不會偵測到任何配件。\n\nUSB 連接埠可安全使用時,你會收到通知。"</string> <string name="usb_port_enabled" msgid="531823867664717018">"已啟用 USB 連接埠以偵測充電器和配件"</string> <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"啟用 USB"</string> <string name="learn_more" msgid="4690632085667273811">"瞭解詳情"</string> @@ -78,8 +78,8 @@ <string name="screenshot_failed_to_save_user_locked_text" msgid="6156607948256936920">"必須先解鎖裝置,才能儲存螢幕截圖"</string> <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"請再嘗試拍攝螢幕擷取畫面"</string> <string name="screenshot_failed_to_save_text" msgid="7232739948999195960">"無法儲存螢幕截圖"</string> - <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"應用程式或您的機構不允許擷取螢幕畫面"</string> - <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"您的 IT 管理員已禁止擷取螢幕截圖"</string> + <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"應用程式或你的機構不允許擷取螢幕畫面"</string> + <string name="screenshot_blocked_by_admin" msgid="5486757604822795797">"你的 IT 管理員已禁止擷取螢幕截圖"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"編輯"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"編輯螢幕截圖"</string> <string name="screenshot_share_description" msgid="2861628935812656612">"分享螢幕截圖"</string> @@ -141,7 +141,7 @@ <string name="biometric_dialog_try_again" msgid="8575345628117768844">"請再試一次"</string> <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"輕按即可取消驗證"</string> <string name="biometric_dialog_face_icon_description_idle" msgid="4351777022315116816">"請再試一次"</string> - <string name="biometric_dialog_face_icon_description_authenticating" msgid="3401633342366146535">"正在尋找您的面孔"</string> + <string name="biometric_dialog_face_icon_description_authenticating" msgid="3401633342366146535">"正在尋找你的面孔"</string> <string name="biometric_dialog_face_icon_description_authenticated" msgid="2242167416140740920">"面孔已經驗證"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"已確認"</string> <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"輕按 [確定] 以完成"</string> @@ -157,17 +157,45 @@ <string name="biometric_dialog_wrong_pattern" msgid="8954812279840889029">"圖案錯誤"</string> <string name="biometric_dialog_wrong_password" msgid="69477929306843790">"密碼錯誤"</string> <string name="biometric_dialog_credential_too_many_attempts" msgid="3083141271737748716">"輸入錯誤的次數太多,\n請於 <xliff:g id="NUMBER">%d</xliff:g> 秒後再試。"</string> - <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"請再試一次。您已嘗試 <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> 次,最多可試 <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> 次。"</string> - <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"您的資料將會刪除"</string> - <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"如果您下次畫出錯誤的上鎖圖案,系統將會刪除此裝置上的資料。"</string> - <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"如果您下次輸入錯誤的 PIN,系統將會刪除此裝置上的資料。"</string> - <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"如果您下次輸入錯誤的密碼,系統將會刪除此裝置上的資料。"</string> - <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"如果您下次畫出錯誤的上鎖圖案,系統將會刪除此使用者。"</string> - <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"如果您下次輸入錯誤的 PIN,系統將會刪除此使用者。"</string> - <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"如果您下次輸入錯誤的密碼,系統將會刪除此使用者。"</string> - <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"如果您下次畫出錯誤的上鎖圖案,系統將會刪除工作設定檔和相關資料。"</string> - <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"如果您下次輸入錯誤的 PIN,系統將會刪除工作設定檔和相關資料。"</string> - <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"如果您下次輸入錯誤的密碼,系統將會刪除工作設定檔和相關資料。"</string> + <string name="biometric_dialog_credential_attempts_before_wipe" msgid="6751859711975516999">"請再試一次。你已嘗試 <xliff:g id="ATTEMPTS_0">%1$d</xliff:g> 次,最多可試 <xliff:g id="MAX_ATTEMPTS">%2$d</xliff:g> 次。"</string> + <string name="biometric_dialog_last_attempt_before_wipe_dialog_title" msgid="2874250099278693477">"你的資料將會刪除"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_device" msgid="6562299244825817598">"如果你下次畫出錯誤的上鎖圖案,系統將會刪除此裝置上的資料。"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_device" msgid="9151756675698215723">"如果你下次輸入錯誤的 PIN,系統將會刪除此裝置上的資料。"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_device" msgid="2363778585575998317">"如果你下次輸入錯誤的密碼,系統將會刪除此裝置上的資料。"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_user" msgid="8400180746043407270">"如果你下次畫出錯誤的上鎖圖案,系統將會刪除此使用者。"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_user" msgid="4159878829962411168">"如果你下次輸入錯誤的 PIN,系統將會刪除此使用者。"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_user" msgid="4695682515465063885">"如果你下次輸入錯誤的密碼,系統將會刪除此使用者。"</string> + <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"如果你下次畫出錯誤的上鎖圖案,系統將會刪除工作設定檔和相關資料。"</string> + <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"如果你下次輸入錯誤的 PIN,系統將會刪除工作設定檔和相關資料。"</string> + <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"如果你下次輸入錯誤的密碼,系統將會刪除工作設定檔和相關資料。"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"請輕觸指紋感應器"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"無法辨識面孔,請改用指紋完成驗證。"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -213,7 +241,7 @@ <string name="accessibility_brightness" msgid="5391187016177823721">"顯示光暗度"</string> <string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"已暫停使用流動數據"</string> <string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"已暫停使用數據"</string> - <string name="data_usage_disabled_dialog" msgid="7933201635215099780">"您的數據用量已達到所設定的上限,因此系統已停用流動數據連線。\n\n如果您恢復使用流動數據連線,可能需要支付數據用量費用。"</string> + <string name="data_usage_disabled_dialog" msgid="7933201635215099780">"你的數據用量已達到所設定的上限,因此系統已停用流動數據連線。\n\n如果你恢復使用流動數據連線,可能需要支付數據用量費用。"</string> <string name="data_usage_disabled_dialog_enable" msgid="2796648546086408937">"恢復"</string> <string name="accessibility_location_active" msgid="2845747916764660369">"位置要求啟動中"</string> <string name="accessibility_sensors_off_active" msgid="2619725434618911551">"已啟用「感應器關閉」"</string> @@ -306,9 +334,9 @@ <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"要解除封鎖裝置麥克風嗎?"</string> <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"要解除封鎖裝置相機嗎?"</string> <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"要解除封鎖裝置相機和麥克風嗎?"</string> - <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"解除封鎖後,凡有存取權的應用程式和服務都可使用您的麥克風。"</string> - <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"解除封鎖後,凡有存取權的應用程式和服務都可使用您的相機。"</string> - <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"解除封鎖後,凡有存取權的應用程式和服務都可使用您的相機或麥克風。"</string> + <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"解除封鎖後,凡有存取權的應用程式和服務都可使用你的麥克風。"</string> + <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"解除封鎖後,凡有存取權的應用程式和服務都可使用你的相機。"</string> + <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"解除封鎖後,凡有存取權的應用程式和服務都可使用你的相機或麥克風。"</string> <string name="sensor_privacy_start_use_mic_blocked_dialog_title" msgid="2640140287496469689">"已封鎖麥克風"</string> <string name="sensor_privacy_start_use_camera_blocked_dialog_title" msgid="7398084286822440384">"已封鎖相機"</string> <string name="sensor_privacy_start_use_mic_camera_blocked_dialog_title" msgid="195236134743281973">"已封鎖麥克風和相機"</string> @@ -321,8 +349,8 @@ <string name="sensor_privacy_mic_turned_on_dialog_title" msgid="6348853159838376513">"麥克風已開啟"</string> <string name="sensor_privacy_mic_turned_off_dialog_title" msgid="5760464281790732849">"麥克風已關閉"</string> <string name="sensor_privacy_mic_unblocked_dialog_content" msgid="4889961886199270224">"已為所有應用程式和服務啟用麥克風。"</string> - <string name="sensor_privacy_mic_blocked_no_exception_dialog_content" msgid="5864898470772965394">"已停用所有應用程式和服務的麥克風存取權。您可以在 [設定] > [私隱] > [麥克風] 啟用麥克風存取權。"</string> - <string name="sensor_privacy_mic_blocked_with_exception_dialog_content" msgid="810289713700437896">"已停用所有應用程式和服務的麥克風存取權。您可以在 [設定] > [私隱] > [麥克風] 更改設定。"</string> + <string name="sensor_privacy_mic_blocked_no_exception_dialog_content" msgid="5864898470772965394">"已停用所有應用程式和服務的麥克風存取權。你可以在 [設定] > [私隱] > [麥克風] 啟用麥克風存取權。"</string> + <string name="sensor_privacy_mic_blocked_with_exception_dialog_content" msgid="810289713700437896">"已停用所有應用程式和服務的麥克風存取權。你可以在 [設定] > [私隱] > [麥克風] 更改設定。"</string> <string name="sensor_privacy_camera_turned_on_dialog_title" msgid="8039095295100075952">"相機已開啟"</string> <string name="sensor_privacy_camera_turned_off_dialog_title" msgid="1936603903120742696">"相機已關閉"</string> <string name="sensor_privacy_camera_unblocked_dialog_content" msgid="7847190103011782278">"已為所有應用程式和服務啟用相機。"</string> @@ -331,10 +359,10 @@ <string name="sensor_privacy_dialog_open_settings" msgid="5635865896053011859">"開啟「設定」"</string> <string name="media_seamless_other_device" msgid="4654849800789196737">"其他裝置"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"切換概覽"</string> - <string name="zen_priority_introduction" msgid="3159291973383796646">"您不會受到聲音和震動騷擾 (鬧鐘、提醒、活動和您指定的來電者鈴聲除外)。當您選擇播放音樂、影片和遊戲等,仍可以聽到該內容的聲音。"</string> - <string name="zen_alarms_introduction" msgid="3987266042682300470">"您不會受到聲音和震動騷擾 (鬧鐘除外)。當您選擇播放音樂、影片和遊戲等,仍可以聽到該內容的聲音。"</string> + <string name="zen_priority_introduction" msgid="3159291973383796646">"你不會受到聲音和震動騷擾 (鬧鐘、提醒、活動和你指定的來電者鈴聲除外)。當你選擇播放音樂、影片和遊戲等,仍可以聽到該內容的聲音。"</string> + <string name="zen_alarms_introduction" msgid="3987266042682300470">"你不會受到聲音和震動騷擾 (鬧鐘除外)。當你選擇播放音樂、影片和遊戲等,仍可以聽到該內容的聲音。"</string> <string name="zen_priority_customize_button" msgid="4119213187257195047">"自訂"</string> - <string name="zen_silence_introduction_voice" msgid="853573681302712348">"這會封鎖所有聲音和震動 (包括鬧鐘、音樂、影片及遊戲),但您仍可以撥打電話。"</string> + <string name="zen_silence_introduction_voice" msgid="853573681302712348">"這會封鎖所有聲音和震動 (包括鬧鐘、音樂、影片及遊戲),但你仍可以撥打電話。"</string> <string name="zen_silence_introduction" msgid="6117517737057344014">"這會封鎖所有聲音和震動,包括鬧鐘、音樂、影片和遊戲。"</string> <string name="notification_tap_again" msgid="4477318164947497249">"再次輕按即可開啟"</string> <string name="tap_again" msgid="1315420114387908655">"再次輕按"</string> @@ -349,7 +377,7 @@ <string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"已識別面孔"</string> <string name="keyguard_retry" msgid="886802522584053523">"請向上滑動以再試一次"</string> <string name="require_unlock_for_nfc" msgid="1305686454823018831">"解鎖方可使用 NFC"</string> - <string name="do_disclosure_generic" msgid="4896482821974707167">"此裝置屬於您的機構"</string> + <string name="do_disclosure_generic" msgid="4896482821974707167">"此裝置屬於你的機構"</string> <string name="do_disclosure_with_name" msgid="2091641464065004091">"此裝置屬於「<xliff:g id="ORGANIZATION_NAME">%s</xliff:g>」"</string> <string name="do_financed_disclosure_with_name" msgid="6723004643314467864">"此裝置由 <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> 提供"</string> <string name="phone_hint" msgid="6682125338461375925">"從圖示滑動即可使用手機功能"</string> @@ -370,15 +398,15 @@ <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"切換使用者"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"下拉式選單"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"這個工作階段中的所有應用程式和資料都會被刪除。"</string> - <string name="guest_wipe_session_title" msgid="7147965814683990944">"訪客您好,歡迎回來!"</string> - <string name="guest_wipe_session_message" msgid="3393823610257065457">"您要繼續您的工作階段嗎?"</string> + <string name="guest_wipe_session_title" msgid="7147965814683990944">"訪客你好,歡迎回來!"</string> + <string name="guest_wipe_session_message" msgid="3393823610257065457">"你要繼續你的工作階段嗎?"</string> <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"重新開始"</string> <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"是的,請繼續"</string> <string name="guest_notification_app_name" msgid="2110425506754205509">"訪客模式"</string> - <string name="guest_notification_session_active" msgid="5567273684713471450">"您正在使用訪客模式"</string> + <string name="guest_notification_session_active" msgid="5567273684713471450">"你正在使用訪客模式"</string> <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"新增使用者後,系統就會結束訪客模式,並刪除目前訪客工作階段中的所有應用程式和資料。"</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"已達到使用者上限"</string> - <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{只可建立一位使用者。}other{您可以加入多達 # 位使用者。}}"</string> + <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{只可建立一位使用者。}other{你可以加入多達 # 位使用者。}}"</string> <string name="user_remove_user_title" msgid="9124124694835811874">"移除使用者?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"系統將會刪除這個使用者的所有應用程式和資料。"</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"移除"</string> @@ -389,14 +417,14 @@ <string name="media_projection_permission_dialog_title" msgid="7130975432309482596">"允許 <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 分享或錄製嗎?"</string> <string name="media_projection_permission_dialog_option_entire_screen" msgid="392086473225692983">"整個螢幕畫面"</string> <string name="media_projection_permission_dialog_option_single_app" msgid="1591110238124910521">"一個應用程式"</string> - <string name="media_projection_permission_dialog_warning_entire_screen" msgid="3989078820637452717">"當您分享、錄製或投放應用程式時,<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 可存取在螢幕畫面上顯示或在裝置上播放的所有內容。因此請小心保管密碼、付款資料、訊息或其他敏感資料。"</string> + <string name="media_projection_permission_dialog_warning_entire_screen" msgid="3989078820637452717">"當你分享、錄製或投放應用程式時,<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 可存取在螢幕畫面上顯示或在裝置上播放的所有內容。因此請小心保管密碼、付款資料、訊息或其他敏感資料。"</string> <string name="media_projection_permission_dialog_warning_single_app" msgid="1659532781536753059">"進行分享、錄製或投放時,<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 可存取顯示在螢幕畫面上或在裝置上播放的所有內容。因此請謹慎處理密碼、付款資料、訊息或其他敏感資料。"</string> <string name="media_projection_permission_dialog_continue" msgid="1827799658916736006">"繼續"</string> <string name="media_projection_permission_app_selector_title" msgid="894251621057480704">"分享或錄製應用程式"</string> <string name="media_projection_permission_dialog_system_service_title" msgid="6827129613741303726">"要允許此應用程式分享或錄製內容嗎?"</string> <string name="media_projection_permission_dialog_system_service_warning_entire_screen" msgid="8801616203805837575">"進行分享、錄製或投放時,此應用程式可存取顯示在螢幕畫面上或在裝置上播放的所有內容。因此請謹慎處理密碼、付款資料、訊息或其他敏感資料。"</string> <string name="media_projection_permission_dialog_system_service_warning_single_app" msgid="543310680568419338">"進行分享、錄製或投放時,此應用程式可存取顯示在螢幕畫面上或在該應用程式上播放的所有內容。因此請謹慎處理密碼、付款資料、訊息或其他敏感資料。"</string> - <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"已被您的 IT 管理員封鎖"</string> + <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"已被你的 IT 管理員封鎖"</string> <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"螢幕截圖功能因裝置政策而停用"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"全部清除"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string> @@ -411,23 +439,23 @@ <string name="empty_shade_text" msgid="8935967157319717412">"沒有通知"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"沒有新通知"</string> <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"解鎖即可查看舊通知"</string> - <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"此裝置由您的家長管理"</string> - <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"您的機構擁有此裝置,並可能會監察網絡流量"</string> + <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"此裝置由你的家長管理"</string> + <string name="quick_settings_disclosure_management_monitoring" msgid="8231336875820702180">"你的機構擁有此裝置,並可能會監察網絡流量"</string> <string name="quick_settings_disclosure_named_management_monitoring" msgid="2831423806103479812">"「<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>」擁有此裝置,並可能會監察網絡流量"</string> <string name="quick_settings_financed_disclosure_named_management" msgid="2307703784594859524">"此裝置由 <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> 提供"</string> - <string name="quick_settings_disclosure_management_named_vpn" msgid="4137564460025113168">"此裝置屬於您的機構,並已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網"</string> + <string name="quick_settings_disclosure_management_named_vpn" msgid="4137564460025113168">"此裝置屬於你的機構,並已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網"</string> <string name="quick_settings_disclosure_named_management_named_vpn" msgid="2169227918166358741">"此裝置由「<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>」所有,並透過「<xliff:g id="VPN_APP">%2$s</xliff:g>」連接至互聯網"</string> - <string name="quick_settings_disclosure_management" msgid="5515296598440684962">"此裝置屬於您的機構"</string> + <string name="quick_settings_disclosure_management" msgid="5515296598440684962">"此裝置屬於你的機構"</string> <string name="quick_settings_disclosure_named_management" msgid="3476472755775165827">"此裝置屬於「<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>」"</string> - <string name="quick_settings_disclosure_management_vpns" msgid="929181757984262902">"此裝置屬於您的機構,並已透過 VPN 連接至互聯網"</string> + <string name="quick_settings_disclosure_management_vpns" msgid="929181757984262902">"此裝置屬於你的機構,並已透過 VPN 連接至互聯網"</string> <string name="quick_settings_disclosure_named_management_vpns" msgid="3312645578322079185">"此裝置屬於「<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>」,並已透過 VPN 連接至互聯網"</string> - <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"您的機構可能監控您工作設定檔上的網絡流量"</string> - <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>可能會監控您工作設定檔上的網絡流量"</string> + <string name="quick_settings_disclosure_managed_profile_monitoring" msgid="1423899084754272514">"你的機構可能監控你工作設定檔上的網絡流量"</string> + <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8321469176706219860">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>可能會監控你工作設定檔上的網絡流量"</string> <string name="quick_settings_disclosure_managed_profile_network_activity" msgid="2636594621387832827">"IT 管理員可以查看工作設定檔的網絡活動"</string> <string name="quick_settings_disclosure_monitoring" msgid="8548019955631378680">"網絡可能會受到監控"</string> <string name="quick_settings_disclosure_vpns" msgid="3586175303518266301">"此裝置已透過 VPN 連接至互聯網"</string> - <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="153393105176944100">"您的工作應用程式已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網"</string> - <string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="451254750289172191">"您的個人應用程式已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網"</string> + <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="153393105176944100">"你的工作應用程式已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網"</string> + <string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="451254750289172191">"你的個人應用程式已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網"</string> <string name="quick_settings_disclosure_named_vpn" msgid="6191822916936028208">"此裝置已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網"</string> <string name="monitoring_title_financed_device" msgid="3659962357973919387">"此裝置由 <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> 提供"</string> <string name="monitoring_title_device_owned" msgid="7029691083837606324">"裝置管理"</string> @@ -436,21 +464,21 @@ <string name="monitoring_subtitle_ca_certificate" msgid="8588092029755175800">"CA 憑證"</string> <string name="monitoring_button_view_policies" msgid="3869724835853502410">"查看政策"</string> <string name="monitoring_button_view_controls" msgid="8316440345340701117">"查看控制項"</string> - <string name="monitoring_description_named_management" msgid="505833016545056036">"此裝置屬於 <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>。\n\n您的 IT 管理員可監察及管理與裝置相關聯的設定、公司存取權、應用程式和資料,以及裝置的位置資料。\n\n如要瞭解詳情,請與您的 IT 管理員聯絡。"</string> + <string name="monitoring_description_named_management" msgid="505833016545056036">"此裝置屬於 <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>。\n\n你的 IT 管理員可監察及管理與裝置相關聯的設定、公司存取權、應用程式和資料,以及裝置的位置資料。\n\n如要瞭解詳情,請與你的 IT 管理員聯絡。"</string> <string name="monitoring_financed_description_named_management" msgid="6108439201399938668">"<xliff:g id="ORGANIZATION_NAME_0">%1$s</xliff:g> 或可存取此裝置的相關資料、管理應用程式並變更裝置設定。\n\n如有疑問,請聯絡 <xliff:g id="ORGANIZATION_NAME_1">%2$s</xliff:g>。"</string> - <string name="monitoring_description_management" msgid="4308879039175729014">"此裝置屬於您的機構。\n\n您的 IT 管理員可監察及管理與裝置相關聯的設定、公司存取權、應用程式和資料,以及裝置的位置資料。\n\n如要瞭解詳情,請與您的 IT 管理員聯絡。"</string> - <string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"您的機構已在此裝置中安裝憑證授權單位。您的安全網絡流量可能會受監控或修改。"</string> - <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"您的機構已在您的工作設定檔中安裝憑證授權單位。您的安全網絡流量可能會受監控或修改。"</string> - <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"此裝置已安裝憑證授權單位。您的安全網絡流量可能會受監控或修改。"</string> - <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"您的管理員已開啟網絡記錄功能,以監控您裝置上的流量。"</string> - <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"您的管理員已開啟網絡記錄功能,可監控您工作設定檔 (而非個人設定檔) 的流量。"</string> - <string name="monitoring_description_named_vpn" msgid="7502657784155456414">"此裝置已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網。IT 管理員可以看到您的網絡活動,包括電郵和瀏覽資料。"</string> - <string name="monitoring_description_two_named_vpns" msgid="6726394451199620634">"此裝置已透過「<xliff:g id="VPN_APP_0">%1$s</xliff:g>」和「<xliff:g id="VPN_APP_1">%2$s</xliff:g>」連接至互聯網。IT 管理員可以看到您的網絡活動,包括電郵和瀏覽資料。"</string> - <string name="monitoring_description_managed_profile_named_vpn" msgid="7254359257263069766">"您的工作應用程式已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網。IT 管理員和 VPN 供應商可以看到您在工作應用程式的網絡活動,包括電郵和瀏覽資料。"</string> - <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"您的個人應用程式已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網。您的 VPN 供應商可以看到您的網絡活動,包括電郵和瀏覽資料。"</string> + <string name="monitoring_description_management" msgid="4308879039175729014">"此裝置屬於你的機構。\n\n你的 IT 管理員可監察及管理與裝置相關聯的設定、公司存取權、應用程式和資料,以及裝置的位置資料。\n\n如要瞭解詳情,請與你的 IT 管理員聯絡。"</string> + <string name="monitoring_description_management_ca_certificate" msgid="7785013130658110130">"你的機構已在此裝置中安裝憑證授權單位。你的安全網絡流量可能會受監控或修改。"</string> + <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"你的機構已在你的工作設定檔中安裝憑證授權單位。你的安全網絡流量可能會受監控或修改。"</string> + <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"此裝置已安裝憑證授權單位。你的安全網絡流量可能會受監控或修改。"</string> + <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"你的管理員已開啟網絡記錄功能,以監控你裝置上的流量。"</string> + <string name="monitoring_description_managed_profile_network_logging" msgid="6932303843097006037">"你的管理員已開啟網絡記錄功能,可監控你工作設定檔 (而非個人設定檔) 的流量。"</string> + <string name="monitoring_description_named_vpn" msgid="7502657784155456414">"此裝置已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網。IT 管理員可以看到你的網絡活動,包括電郵和瀏覽資料。"</string> + <string name="monitoring_description_two_named_vpns" msgid="6726394451199620634">"此裝置已透過「<xliff:g id="VPN_APP_0">%1$s</xliff:g>」和「<xliff:g id="VPN_APP_1">%2$s</xliff:g>」連接至互聯網。IT 管理員可以看到你的網絡活動,包括電郵和瀏覽資料。"</string> + <string name="monitoring_description_managed_profile_named_vpn" msgid="7254359257263069766">"你的工作應用程式已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網。IT 管理員和 VPN 供應商可以看到你在工作應用程式的網絡活動,包括電郵和瀏覽資料。"</string> + <string name="monitoring_description_personal_profile_named_vpn" msgid="5083909710727365452">"你的個人應用程式已透過「<xliff:g id="VPN_APP">%1$s</xliff:g>」連接至互聯網。你的 VPN 供應商可以看到你的網絡活動,包括電郵和瀏覽資料。"</string> <string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string> <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"開啟 VPN 設定"</string> - <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"此裝置由您的家長管理。家長可以查看及管理裝置上的資料,例如您使用的應用程式、位置和裝置使用時間。"</string> + <string name="monitoring_description_parental_controls" msgid="8184693528917051626">"此裝置由你的家長管理。家長可以查看及管理裝置上的資料,例如你使用的應用程式、位置和裝置使用時間。"</string> <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string> <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"由信任的代理保持解鎖狀態"</string> <string name="zen_mode_and_condition" msgid="5043165189511223718">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> @@ -465,11 +493,11 @@ <string name="csd_lowered_title" product="default" msgid="1786173629015030856">"已調低至較安全的音量"</string> <string name="csd_system_lowered_text" product="default" msgid="2001603282316829500">"使用高音量已超過建議的時間"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"已固定應用程式"</string> - <string name="screen_pinning_description" msgid="8699395373875667743">"應用程式將會固定在螢幕上顯示,直至您取消固定為止。按住「返回」和「概覽」按鈕即可取消固定。"</string> - <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"應用程式將會固定在螢幕上顯示,直至您取消固定為止。按住「返回」按鈕和主按鈕即可取消固定。"</string> - <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"應用程式將會固定在螢幕上顯示,直至您取消固定為止。向上滑動後按住即可取消固定。"</string> - <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"應用程式將會固定在螢幕上顯示,直至您取消固定為止。按住「概覽」按鈕即可取消固定。"</string> - <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"應用程式將會固定在螢幕上顯示,直至您取消固定為止。按住主按鈕即可取消固定。"</string> + <string name="screen_pinning_description" msgid="8699395373875667743">"應用程式將會固定在螢幕上顯示,直至你取消固定為止。按住「返回」和「概覽」按鈕即可取消固定。"</string> + <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"應用程式將會固定在螢幕上顯示,直至你取消固定為止。按住「返回」按鈕和主按鈕即可取消固定。"</string> + <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"應用程式將會固定在螢幕上顯示,直至你取消固定為止。向上滑動後按住即可取消固定。"</string> + <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"應用程式將會固定在螢幕上顯示,直至你取消固定為止。按住「概覽」按鈕即可取消固定。"</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"應用程式將會固定在螢幕上顯示,直至你取消固定為止。按住主按鈕即可取消固定。"</string> <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"應用程式可能會存取個人資料 (例如通訊錄和電郵內容)。"</string> <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"固定的應用程式可開啟其他應用程式。"</string> <string name="screen_pinning_toast" msgid="8177286912533744328">"如要取消固定此應用程式,請按住「返回」按鈕和「概覽」按鈕"</string> @@ -521,16 +549,16 @@ <string name="qr_code_scanner_updating_secondary_label" msgid="8344598017007876352">"正在更新"</string> <string name="status_bar_work" msgid="5238641949837091056">"工作設定檔"</string> <string name="status_bar_airplane" msgid="4848702508684541009">"飛行模式"</string> - <string name="zen_alarm_warning" msgid="7844303238486849503">"您不會<xliff:g id="WHEN">%1$s</xliff:g>聽到鬧鐘"</string> + <string name="zen_alarm_warning" msgid="7844303238486849503">"你不會<xliff:g id="WHEN">%1$s</xliff:g>聽到鬧鐘"</string> <string name="alarm_template" msgid="2234991538018805736">"在 <xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="alarm_template_far" msgid="3561752195856839456">"在<xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"熱點"</string> <string name="accessibility_managed_profile" msgid="4703836746209377356">"工作設定檔"</string> <string name="tuner_warning_title" msgid="7721976098452135267">"這只是測試版本,並不包含完整功能"</string> - <string name="tuner_warning" msgid="1861736288458481650">"使用者介面調諧器讓您以更多方法修改和自訂 Android 使用者介面。但請小心,這些實驗功能可能會在日後發佈時更改、分拆或消失。"</string> + <string name="tuner_warning" msgid="1861736288458481650">"使用者介面調諧器讓你以更多方法修改和自訂 Android 使用者介面。但請小心,這些實驗功能可能會在日後發佈時更改、分拆或消失。"</string> <string name="tuner_persistent_warning" msgid="230466285569307806">"請小心,這些實驗功能可能會在日後發佈時更改、分拆或消失。"</string> <string name="got_it" msgid="477119182261892069">"知道了"</string> - <string name="tuner_toast" msgid="3812684836514766951">"恭喜您!系統使用者介面調諧器已新增至「設定」中"</string> + <string name="tuner_toast" msgid="3812684836514766951">"恭喜你!系統使用者介面調諧器已新增至「設定」中"</string> <string name="remove_from_settings" msgid="633775561782209994">"從「設定」移除"</string> <string name="remove_from_settings_prompt" msgid="551565437265615426">"要從「設定」移除系統使用者介面調諧器,並停止其所有功能嗎?"</string> <string name="enable_bluetooth_title" msgid="866883307336662596">"要開啟藍牙嗎?"</string> @@ -538,7 +566,7 @@ <string name="enable_bluetooth_confirmation_ok" msgid="2866408183324184876">"開啟"</string> <string name="tuner_full_importance_settings" msgid="1388025816553459059">"通知控制項"</string> <string name="rotation_lock_camera_rotation_on" msgid="789434807790534274">"已開啟 - 根據面孔偵測"</string> - <string name="power_notification_controls_description" msgid="1334963837572708952">"通知控制項讓您設定應用程式通知的重要性 (0 至 5 級)。\n\n"<b>"第 5 級"</b>" \n- 在通知清單頂部顯示 \n- 允許全螢幕騷擾 \n- 一律顯示通知 \n\n"<b>"第 4 級"</b>" \n- 阻止全螢幕騷擾 \n- 一律顯示通知 \n\n"<b>"第 3 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n\n"<b>"第 2 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n- 永不發出聲響和震動 \n\n"<b>"第 1 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n- 永不發出聲響和震動 \n- 從上鎖畫面和狀態列中隱藏 \n- 在通知清單底部顯示 \n\n"<b>"第 0 級"</b>" \n- 封鎖所有應用程式通知"</string> + <string name="power_notification_controls_description" msgid="1334963837572708952">"通知控制項讓你設定應用程式通知的重要性 (0 至 5 級)。\n\n"<b>"第 5 級"</b>" \n- 在通知清單頂部顯示 \n- 允許全螢幕騷擾 \n- 一律顯示通知 \n\n"<b>"第 4 級"</b>" \n- 阻止全螢幕騷擾 \n- 一律顯示通知 \n\n"<b>"第 3 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n\n"<b>"第 2 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n- 永不發出聲響和震動 \n\n"<b>"第 1 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n- 永不發出聲響和震動 \n- 從上鎖畫面和狀態列中隱藏 \n- 在通知清單底部顯示 \n\n"<b>"第 0 級"</b>" \n- 封鎖所有應用程式通知"</string> <string name="inline_done_button" msgid="6043094985588909584">"完成"</string> <string name="inline_ok_button" msgid="603075490581280343">"套用"</string> <string name="inline_turn_off_notifications" msgid="8543989584403106071">"關閉通知"</string> @@ -570,7 +598,7 @@ <string name="feedback_silenced" msgid="9116540317466126457">"系統已自動將此通知的重要性<b>降低為靜音</b>。"</string> <string name="feedback_promoted" msgid="2125562787759780807">"系統已自動<b>提高</b>此通知在通知欄中的次序。"</string> <string name="feedback_demoted" msgid="951884763467110604">"系統已自動<b>調低</b>此通知在通知欄中的次序。"</string> - <string name="feedback_prompt" msgid="3656728972307896379">"與開發人員分享您的意見。是否正確?"</string> + <string name="feedback_prompt" msgid="3656728972307896379">"與開發人員分享你的意見。是否正確?"</string> <string name="notification_channel_controls_opened_accessibility" msgid="6111817750774381094">"開咗「<xliff:g id="APP_NAME">%1$s</xliff:g>」嘅通知控制項"</string> <string name="notification_channel_controls_closed_accessibility" msgid="1561909368876911701">"閂咗「<xliff:g id="APP_NAME">%1$s</xliff:g>」嘅通知控制項"</string> <string name="notification_more_settings" msgid="4936228656989201793">"更多設定"</string> @@ -702,7 +730,7 @@ <string name="drag_to_add_tiles" msgid="8933270127508303672">"按住並拖曳即可新增圖塊"</string> <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"按住並拖曳即可重新排列圖塊"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"拖曳這裡即可移除"</string> - <string name="drag_to_remove_disabled" msgid="933046987838658850">"您需要有至少 <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> 個資訊方塊"</string> + <string name="drag_to_remove_disabled" msgid="933046987838658850">"你需要有至少 <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> 個資訊方塊"</string> <string name="qs_edit" msgid="5583565172803472437">"編輯"</string> <string name="tuner_time" msgid="2450785840990529997">"時間"</string> <string-array name="clock_options"> @@ -740,12 +768,12 @@ <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"第 <xliff:g id="ID_1">%1$d</xliff:g> 頁 (共 <xliff:g id="ID_2">%2$d</xliff:g> 頁)"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"螢幕鎖定"</string> <string name="thermal_shutdown_title" msgid="2702966892682930264">"手機因過熱而關上"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"您的手機現已正常運作。\n輕按即可瞭解詳情"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"您的手機之前因過熱而關上降溫。手機現已正常運作。\n\n以下情況可能會導致手機過熱:\n • 使用耗用大量資源的應用程式 (例如遊戲、影片或導航應用程式)\n • 下載或上載大型檔案\n • 在高溫環境下使用手機"</string> + <string name="thermal_shutdown_message" msgid="6142269839066172984">"你的手機現已正常運作。\n輕按即可瞭解詳情"</string> + <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"你的手機之前因過熱而關上降溫。手機現已正常運作。\n\n以下情況可能會導致手機過熱:\n • 使用耗用大量資源的應用程式 (例如遊戲、影片或導航應用程式)\n • 下載或上載大型檔案\n • 在高溫環境下使用手機"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"查看保養步驟"</string> <string name="high_temp_title" msgid="2218333576838496100">"手機溫度正在上升"</string> <string name="high_temp_notif_message" msgid="1277346543068257549">"手機降溫時,部分功能會受限制。\n輕按即可瞭解詳情"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"手機會自動嘗試降溫。您仍可以使用手機,但手機的運作速度可能較慢。\n\n手機降溫後便會恢復正常。"</string> + <string name="high_temp_dialog_message" msgid="3793606072661253968">"手機會自動嘗試降溫。你仍可以使用手機,但手機的運作速度可能較慢。\n\n手機降溫後便會恢復正常。"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"查看保養步驟"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"拔除裝置"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"充電埠附近的裝置溫度正在上升。如裝置正連接充電器或 USB 配件,請拔除裝置並小心安全,因為電線的溫度可能也偏高。"</string> @@ -790,13 +818,13 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"正在背景中執行的應用程式"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"輕按即可查看電池和數據用量詳情"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"要關閉流動數據嗎?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"您無法透過「<xliff:g id="CARRIER">%s</xliff:g>」使用流動數據或互聯網。如要使用互聯網,您必須連接 Wi-Fi。"</string> - <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"您的流動網絡供應商"</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"你無法透過「<xliff:g id="CARRIER">%s</xliff:g>」使用流動數據或互聯網。如要使用互聯網,你必須連接 Wi-Fi。"</string> + <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"你的流動網絡供應商"</string> <string name="auto_data_switch_disable_title" msgid="5146527155665190652">"要切換回「<xliff:g id="CARRIER">%s</xliff:g>」嗎?"</string> <string name="auto_data_switch_disable_message" msgid="5885533647399535852">"流動數據不會根據可用性自動切換"</string> <string name="auto_data_switch_dialog_negative_button" msgid="2370876875999891444">"不用了,謝謝"</string> <string name="auto_data_switch_dialog_positive_button" msgid="8531782041263087564">"是,請切換"</string> - <string name="touch_filtered_warning" msgid="8119511393338714836">"由於某個應用程式已阻擋權限要求畫面,因此「設定」應用程式無法驗證您的回應。"</string> + <string name="touch_filtered_warning" msgid="8119511393338714836">"由於某個應用程式已阻擋權限要求畫面,因此「設定」應用程式無法驗證你的回應。"</string> <string name="slice_permission_title" msgid="3262615140094151017">"要允許「<xliff:g id="APP_0">%1$s</xliff:g>」顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的快訊嗎?"</string> <string name="slice_permission_text_1" msgid="6675965177075443714">"- 可以讀取「<xliff:g id="APP">%1$s</xliff:g>」中的資料"</string> <string name="slice_permission_text_2" msgid="6758906940360746983">"- 可以在「<xliff:g id="APP">%1$s</xliff:g>」內執行操作"</string> @@ -903,9 +931,9 @@ <string name="controls_dialog_message" msgid="342066938390663844">"由「<xliff:g id="APP">%s</xliff:g>」提供的建議"</string> <string name="controls_tile_locked" msgid="731547768182831938">"裝置已上鎖"</string> <string name="controls_settings_show_controls_dialog_title" msgid="3357852503553809554">"要從上鎖畫面查看及控制裝置嗎?"</string> - <string name="controls_settings_show_controls_dialog_message" msgid="7666211700524587969">"您可以在上鎖畫面新增外部裝置的控制項。\n\n裝置應用程式可能會讓您在不解鎖手機或平板電腦的情況下控制部分裝置。\n\n您可隨時在「設定」中作出變更。"</string> + <string name="controls_settings_show_controls_dialog_message" msgid="7666211700524587969">"你可以在上鎖畫面新增外部裝置的控制項。\n\n裝置應用程式可能會讓你在不解鎖手機或平板電腦的情況下控制部分裝置。\n\n你可隨時在「設定」中作出變更。"</string> <string name="controls_settings_trivial_controls_dialog_title" msgid="7593188157655036677">"要在上鎖畫面控制裝置嗎?"</string> - <string name="controls_settings_trivial_controls_dialog_message" msgid="397178734990952575">"您可以在不解鎖手機或平板電腦的情況下控制部分裝置。裝置應用程式決定哪些裝置可透過此方式控制。"</string> + <string name="controls_settings_trivial_controls_dialog_message" msgid="397178734990952575">"你可以在不解鎖手機或平板電腦的情況下控制部分裝置。裝置應用程式決定哪些裝置可透過此方式控制。"</string> <string name="controls_settings_dialog_neutral_button" msgid="4514446354793124140">"不用了,謝謝"</string> <string name="controls_settings_dialog_positive_button" msgid="436070672551674863">"是"</string> <string name="controls_pin_use_alphanumeric" msgid="8478371861023048414">"PIN 含有字母或符號"</string> @@ -933,7 +961,7 @@ <string name="controls_media_smartspace_rec_description" msgid="4136242327044070732">"開啟 <xliff:g id="APP_LABEL">%1$s</xliff:g>"</string> <string name="controls_media_smartspace_rec_item_description" msgid="2189271793070870883">"在 <xliff:g id="APP_LABEL">%3$s</xliff:g> 播放 <xliff:g id="ARTIST_NAME">%2$s</xliff:g> 的《<xliff:g id="SONG_NAME">%1$s</xliff:g>》"</string> <string name="controls_media_smartspace_rec_item_no_artist_description" msgid="8703614798636591077">"在 <xliff:g id="APP_LABEL">%2$s</xliff:g> 播放《<xliff:g id="SONG_NAME">%1$s</xliff:g>》"</string> - <string name="controls_media_smartspace_rec_header" msgid="5053461390357112834">"為您推薦"</string> + <string name="controls_media_smartspace_rec_header" msgid="5053461390357112834">"為你推薦"</string> <string name="media_transfer_undo" msgid="1895606387620728736">"復原"</string> <string name="media_move_closer_to_start_cast" msgid="2673104707465013176">"如要在「<xliff:g id="DEVICENAME">%1$s</xliff:g>」上播放,請靠近一點"</string> <string name="media_move_closer_to_end_cast" msgid="7302555909119374738">"如要在這部裝置播放,請靠近「<xliff:g id="DEVICENAME">%1$s</xliff:g>」一點"</string> @@ -971,8 +999,8 @@ <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"建議的裝置"</string> <string name="media_output_first_broadcast_title" msgid="6292237789860753022">"廣播運作方式"</string> <string name="media_output_broadcast" msgid="3555580945878071543">"廣播"</string> - <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"附近有兼容藍牙裝置的人可收聽您正在廣播的媒體內容"</string> - <string name="media_output_broadcasting_message" msgid="4150299923404886073">"如附近有兼容藍牙裝置的人,只要掃瞄您的 QR 碼或使用您的廣播名稱和密碼,便可收聽您的廣播內容"</string> + <string name="media_output_first_notify_broadcast_message" msgid="6353857724136398494">"附近有兼容藍牙裝置的人可收聽你正在廣播的媒體內容"</string> + <string name="media_output_broadcasting_message" msgid="4150299923404886073">"如附近有兼容藍牙裝置的人,只要掃瞄你的 QR 碼或使用你的廣播名稱和密碼,便可收聽你的廣播內容"</string> <string name="media_output_broadcast_name" msgid="8786127091542624618">"廣播名稱"</string> <string name="media_output_broadcast_code" msgid="870795639644728542">"密碼"</string> <string name="media_output_broadcast_dialog_save" msgid="7910865591430010198">"儲存"</string> @@ -987,7 +1015,7 @@ <string name="basic_status" msgid="2315371112182658176">"開啟對話"</string> <string name="select_conversation_title" msgid="6716364118095089519">"對話小工具"</string> <string name="select_conversation_text" msgid="3376048251434956013">"輕按對話即可新增至主畫面"</string> - <string name="no_conversations_text" msgid="5354115541282395015">"您最近的對話會在這裡顯示"</string> + <string name="no_conversations_text" msgid="5354115541282395015">"你最近的對話會在這裡顯示"</string> <string name="priority_conversations" msgid="3967482288896653039">"優先對話"</string> <string name="recent_conversations" msgid="8531874684782574622">"最近的對話"</string> <string name="days_timestamp" msgid="5821854736213214331">"<xliff:g id="DURATION">%1$s</xliff:g> 天前"</string> @@ -1046,7 +1074,7 @@ <string name="wifi_wont_autoconnect_for_now" msgid="5782282612749867762">"目前系統不會自動連線至 Wi-Fi"</string> <string name="see_all_networks" msgid="3773666844913168122">"顯示全部"</string> <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"如要切換網絡,請中斷以太網連線"</string> - <string name="wifi_scan_notify_message" msgid="3753839537448621794">"為改善裝置的使用體驗,應用程式和服務仍可隨時掃瞄 Wi-Fi 網絡 (即使 Wi-Fi 已關閉)。您可在 Wi-Fi 掃瞄設定中變更此設定。"<annotation id="link">"變更"</annotation></string> + <string name="wifi_scan_notify_message" msgid="3753839537448621794">"為改善裝置的使用體驗,應用程式和服務仍可隨時掃瞄 Wi-Fi 網絡 (即使 Wi-Fi 已關閉)。你可在 Wi-Fi 掃瞄設定中變更此設定。"<annotation id="link">"變更"</annotation></string> <string name="turn_off_airplane_mode" msgid="8425587763226548579">"關閉飛行模式"</string> <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"「<xliff:g id="APPNAME">%1$s</xliff:g>」想在「快速設定」選單新增以下圖塊"</string> <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"新增圖塊"</string> @@ -1055,7 +1083,7 @@ <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{已啟用 # 個應用程式}other{已啟用 # 個應用程式}}"</string> <string name="fgs_dot_content_description" msgid="2865071539464777240">"新資料"</string> <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"使用中的應用程式"</string> - <string name="fgs_manager_dialog_message" msgid="2670045017200730076">"這些應用程式已啟用並執行 (即使您沒有使用)。這會提升應用程式的功能,但也可影響電池壽命。"</string> + <string name="fgs_manager_dialog_message" msgid="2670045017200730076">"這些應用程式已啟用並執行 (即使你沒有使用)。這會提升應用程式的功能,但也可影響電池壽命。"</string> <string name="fgs_manager_app_item_stop_button_label" msgid="7188317969020801156">"停止"</string> <string name="fgs_manager_app_item_stop_button_stopped_label" msgid="6950382004441263922">"已停止"</string> <string name="clipboard_edit_text_done" msgid="4551887727694022409">"完成"</string> @@ -1120,16 +1148,16 @@ <string name="stylus_battery_low" msgid="7134370101603167096">"觸控筆電量不足"</string> <string name="video_camera" msgid="7654002575156149298">"攝影機"</string> <string name="call_from_work_profile_title" msgid="6991157106804289643">"無法透過此設定檔撥打電話"</string> - <string name="call_from_work_profile_text" msgid="3458704745640229638">"您的公司政策只允許透過工作設定檔撥打電話"</string> + <string name="call_from_work_profile_text" msgid="3458704745640229638">"你的公司政策只允許透過工作設定檔撥打電話"</string> <string name="call_from_work_profile_action" msgid="2937701298133010724">"切換至工作設定檔"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"關閉"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"自訂上鎖畫面"</string> - <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"解鎖後即可自訂螢幕鎖定畫面"</string> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"解鎖後即可自訂上鎖畫面"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"無法連線至 Wi-Fi"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"已封鎖相機"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"已封鎖相機和麥克風"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"已封鎖麥克風"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"優先模式已開啟"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"「Google 助理」感應功能已開啟"</string> - <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在「設定」中指定預設記事應用程式"</string> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在「設定」中指定預設筆記應用程式"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 1652a1c599ed..abb25359ce57 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -95,7 +95,7 @@ <string name="screenshot_default_files_app_name" msgid="8721579578575161912">"檔案"</string> <string name="screenshot_detected_template" msgid="7940376642921719915">"「<xliff:g id="APPNAME">%1$s</xliff:g>」偵測到這張螢幕截圖。"</string> <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"「<xliff:g id="APPNAME">%1$s</xliff:g>」和其他開啟的應用程式偵測到這張螢幕截圖。"</string> - <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"新增至記事"</string> + <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"新增至記事本"</string> <string name="screenrecord_name" msgid="2596401223859996572">"螢幕錄影器"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"處理螢幕錄影內容"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"持續顯示螢幕畫面錄製工作階段通知"</string> @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"如果下次輸入的解鎖圖案仍不正確,系統將刪除你的工作資料夾和相關資料。"</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"如果下次輸入的 PIN 碼仍不正確,系統將刪除你的工作資料夾和相關資料。"</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"如果下次輸入的密碼仍不正確,系統將刪除你的工作資料夾和相關資料。"</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"請輕觸指紋感應器"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"無法辨識臉孔,請改用指紋完成驗證。"</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -663,7 +691,7 @@ <string name="keyboard_shortcut_group_applications_calculator" msgid="6316043911946540137">"計算機"</string> <string name="keyboard_shortcut_group_applications_maps" msgid="7312554713993114342">"地圖"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"零打擾"</string> - <string name="volume_dnd_silent" msgid="4154597281458298093">"音量按鈕快速鍵"</string> + <string name="volume_dnd_silent" msgid="4154597281458298093">"音量鍵快速鍵"</string> <string name="battery" msgid="769686279459897127">"電池"</string> <string name="headset" msgid="4485892374984466437">"耳機"</string> <string name="accessibility_long_click_tile" msgid="210472753156768705">"開啟設定"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index aa6f168e0e63..ea21f9a058f1 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -168,6 +168,34 @@ <string name="biometric_dialog_last_pattern_attempt_before_wipe_profile" msgid="6045224069529284686">"Uma ufaka iphethini engalungile kumzamo olandelayo, iphrofayela yakho yomsebenzi nedatha yayo izosuswa."</string> <string name="biometric_dialog_last_pin_attempt_before_wipe_profile" msgid="545567685899091757">"Uma ufaka iphinikhodi engalungile kumzamo olandelayo, iphrofayela yakho yomsebenzi nedatha yayo izosuswa."</string> <string name="biometric_dialog_last_password_attempt_before_wipe_profile" msgid="8538032972389729253">"Uma ufake iphasiwedi engalungile kumzamo olandelayo, iphrofayela yakho yomsebenzi nedatha yayo izosuswa."</string> + <!-- no translation found for biometric_re_enroll_dialog_confirm (3049858021857801836) --> + <skip /> + <!-- no translation found for biometric_re_enroll_dialog_cancel (93760939407091417) --> + <skip /> + <!-- no translation found for biometric_re_enroll_notification_content (8685925877186288180) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_title (4539432429683916604) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_notification_name (630798657797645704) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_title (3526033128113925780) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content (4866561176695984879) --> + <skip /> + <!-- no translation found for fingerprint_re_enroll_dialog_content_singular (3083663339787381218) --> + <skip /> + <!-- no translation found for fingerprint_reenroll_failure_dialog_content (4733768492747300666) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_title (1850838867718410520) --> + <skip /> + <!-- no translation found for face_re_enroll_notification_name (7384545252206120659) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_title (6392173708176069994) --> + <skip /> + <!-- no translation found for face_re_enroll_dialog_content (7353502359464038511) --> + <skip /> + <!-- no translation found for face_reenroll_failure_dialog_content (7073947334397236935) --> + <skip /> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Thinta inzwa yesigxivizo zeminwe"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ayibazi ubuso. Sebenzisa izigxivizo zeminwe kunalokho."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> @@ -1124,14 +1152,12 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Shintshela kuphrofayela yomsebenzi"</string> <string name="call_from_work_profile_close" msgid="7927067108901068098">"Vala"</string> <string name="lock_screen_settings" msgid="6152703934761402399">"Yenza ngokwezifiso ukukhiya isikrini"</string> - <!-- no translation found for keyguard_unlock_to_customize_ls (2068542308086253819) --> - <skip /> + <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Vula ukuze wenze ukuvala isikrini ngendlela oyifisayo"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"I-Wi-Fi ayitholakali"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Ikhamera ivinjiwe"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Ikhamera nemakrofoni zivinjiwe"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Imakrofoni ivinjiwe"</string> <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Imodi ebalulekile ivuliwe"</string> <string name="assistant_attention_content_description" msgid="6830215897604642875">"Ukunaka kwe-Assistant kuvuliwe"</string> - <!-- no translation found for set_default_notes_app_toast_content (2812374329662610753) --> - <skip /> + <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setha i-app yamanothi azenzakalelayo Kumsethingi"</string> </resources> diff --git a/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt b/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt index 64d766dcd488..f59bf8e766fe 100644 --- a/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt +++ b/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt @@ -26,8 +26,8 @@ import android.content.res.TypedArray import android.graphics.Color import android.util.AttributeSet import android.view.View -import com.android.app.animation.Interpolators import com.android.settingslib.Utils +import com.android.systemui.animation.Interpolators /** Displays security messages for the keyguard bouncer. */ open class BouncerKeyguardMessageArea(context: Context?, attrs: AttributeSet?) : diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index a30cae950dfe..a6c782d88e18 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -15,9 +15,9 @@ import android.widget.RelativeLayout; import androidx.annotation.IntDef; import androidx.annotation.VisibleForTesting; -import com.android.app.animation.Interpolators; import com.android.keyguard.dagger.KeyguardStatusViewScope; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.plugins.ClockController; import com.android.systemui.plugins.log.LogBuffer; import com.android.systemui.plugins.log.LogLevel; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java index 09820305f34e..03947542d21e 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPINView.java @@ -32,9 +32,9 @@ import android.view.animation.Interpolator; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintSet; -import com.android.app.animation.Interpolators; import com.android.settingslib.animation.DisappearAnimationUtils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.policy.DevicePostureController.DevicePostureInt; /** diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java index 1d7c35d0c90d..33bea027cd20 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java @@ -45,11 +45,11 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.android.app.animation.Interpolators; import com.android.internal.widget.LockscreenCredential; import com.android.internal.widget.TextViewInputDisabler; import com.android.systemui.DejankUtils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; /** * Displays an alphanumeric (latin-1) key entry for the user to enter * an unlock password diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java index b4ddc9a975c2..0a91150e6c39 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java @@ -34,9 +34,9 @@ import android.util.AttributeSet; import android.view.KeyEvent; import android.view.View; -import com.android.app.animation.Interpolators; import com.android.internal.widget.LockscreenCredential; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import java.util.ArrayList; import java.util.List; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 78021ad21a77..ba5a8c94dc23 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -32,7 +32,7 @@ import static androidx.constraintlayout.widget.ConstraintSet.START; import static androidx.constraintlayout.widget.ConstraintSet.TOP; import static androidx.constraintlayout.widget.ConstraintSet.WRAP_CONTENT; -import static com.android.app.animation.InterpolatorsAndroidX.DECELERATE_QUINT; +import static com.android.systemui.animation.InterpolatorsAndroidX.DECELERATE_QUINT; import static com.android.systemui.plugins.FalsingManager.LOW_PENALTY; import static java.lang.Integer.max; @@ -86,7 +86,6 @@ import androidx.constraintlayout.widget.ConstraintSet; import androidx.dynamicanimation.animation.DynamicAnimation; import androidx.dynamicanimation.animation.SpringAnimation; -import com.android.app.animation.Interpolators; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; @@ -97,6 +96,7 @@ import com.android.settingslib.Utils; import com.android.settingslib.drawable.CircleFramedDrawable; import com.android.systemui.Gefingerpoken; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.classifier.FalsingA11yDelegate; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.shared.system.SysUiStatsLog; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewTransition.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewTransition.kt index 96ac8ad56651..c9128e5881cc 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewTransition.kt +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewTransition.kt @@ -26,9 +26,9 @@ import android.util.MathUtils import android.view.View import android.view.ViewGroup import android.view.animation.AnimationUtils -import com.android.app.animation.Interpolators import com.android.internal.R.interpolator.fast_out_extra_slow_in import com.android.systemui.R +import com.android.systemui.animation.Interpolators /** Animates constraint layout changes for the security view. */ class KeyguardSecurityViewTransition : Transition() { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java index b4f124aa598a..65a71664e245 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java @@ -44,11 +44,11 @@ import androidx.slice.core.SliceQuery; import androidx.slice.widget.RowContent; import androidx.slice.widget.SliceContent; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.graphics.ColorUtils; import com.android.settingslib.Utils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.util.wakelock.KeepAwakeAnimationListener; import java.io.PrintWriter; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java index 89e7e17a7ce1..edfcb8d0d1a6 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java @@ -40,11 +40,11 @@ import androidx.annotation.VisibleForTesting; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintSet; -import com.android.app.animation.Interpolators; import com.android.internal.jank.InteractionJankMonitor; import com.android.keyguard.KeyguardClockSwitch.ClockSize; import com.android.keyguard.logging.KeyguardLogger; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.plugins.ClockController; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java index aa652fabb294..651c9796140e 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardVisibilityHelper.java @@ -21,7 +21,7 @@ import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import android.util.Property; import android.view.View; -import com.android.app.animation.Interpolators; +import com.android.systemui.animation.Interpolators; import com.android.systemui.plugins.log.LogBuffer; import com.android.systemui.plugins.log.LogLevel; import com.android.systemui.statusbar.StatusBarState; diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java index e76112366e9e..ad669099284f 100644 --- a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java +++ b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java @@ -30,7 +30,7 @@ import android.widget.TextView; import androidx.annotation.StyleRes; -import com.android.app.animation.Interpolators; +import com.android.systemui.animation.Interpolators; /** * Provides background color and radius animations for key pad buttons. diff --git a/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java b/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java index c4ecb393751c..14810d9baf02 100644 --- a/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java +++ b/packages/SystemUI/src/com/android/keyguard/PinShapeNonHintingView.java @@ -35,9 +35,9 @@ import android.widget.LinearLayout; import androidx.core.graphics.drawable.DrawableCompat; -import com.android.app.animation.Interpolators; import com.android.settingslib.Utils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; /** * This class contains implementation for methods that will be used when user has set a diff --git a/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java b/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java index 401f6c9c747d..bf84f8af02fe 100644 --- a/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/ActivityStarterDelegate.java @@ -35,6 +35,8 @@ import javax.inject.Inject; /** * Single common instance of ActivityStarter that can be gotten and referenced from anywhere, but * delegates to an actual implementation (CentralSurfaces). + * + * @deprecated Migrating to ActivityStarterImpl */ @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @SysUISingleton @@ -92,6 +94,14 @@ public class ActivityStarterDelegate implements ActivityStarter { } @Override + public void startActivity(Intent intent, + boolean dismissShade, + @Nullable ActivityLaunchAnimator.Controller animationController) { + mActualStarterOptionalLazy.get().ifPresent( + starter -> starter.startActivity(intent, dismissShade, animationController)); + } + + @Override public void startActivity(Intent intent, boolean dismissShade, @Nullable ActivityLaunchAnimator.Controller animationController, boolean showOverLockscreenWhenLocked) { @@ -177,4 +187,35 @@ public class ActivityStarterDelegate implements ActivityStarter { starter -> starter.dismissKeyguardThenExecute(action, cancel, afterKeyguardGone, customMessage)); } + + @Override + public void startActivityDismissingKeyguard(Intent intent, boolean onlyProvisioned, + boolean dismissShade, boolean disallowEnterPictureInPictureWhileLaunching, + Callback callback, int flags, + @Nullable ActivityLaunchAnimator.Controller animationController, + UserHandle userHandle) { + mActualStarterOptionalLazy.get().ifPresent( + starter -> starter.startActivityDismissingKeyguard(intent, onlyProvisioned, + dismissShade, disallowEnterPictureInPictureWhileLaunching, callback, + flags, animationController, userHandle)); + } + + @Override + public void executeRunnableDismissingKeyguard(Runnable runnable, + Runnable cancelAction, boolean dismissShade, + boolean afterKeyguardGone, boolean deferred) { + mActualStarterOptionalLazy.get().ifPresent( + starter -> starter.executeRunnableDismissingKeyguard(runnable, cancelAction, + dismissShade, afterKeyguardGone, deferred)); + } + + @Override + public void executeRunnableDismissingKeyguard(Runnable runnable, Runnable cancelAction, + boolean dismissShade, boolean afterKeyguardGone, boolean deferred, + boolean willAnimateOnKeyguard, @Nullable String customMessage) { + mActualStarterOptionalLazy.get().ifPresent( + starter -> starter.executeRunnableDismissingKeyguard(runnable, cancelAction, + dismissShade, afterKeyguardGone, deferred, willAnimateOnKeyguard, + customMessage)); + } } diff --git a/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt b/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt index c1871e09a791..de82ca014722 100644 --- a/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt +++ b/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt @@ -36,7 +36,7 @@ import android.view.Surface import android.view.View import androidx.annotation.VisibleForTesting import com.android.systemui.RegionInterceptingFrameLayout.RegionInterceptableView -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.util.asIndenting import java.io.PrintWriter diff --git a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt index e72ad820c410..a3e7d71a92f6 100644 --- a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt +++ b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt @@ -34,7 +34,7 @@ import androidx.core.graphics.ColorUtils import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.settingslib.Utils -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.biometrics.AuthController import com.android.systemui.log.ScreenDecorationsLogger import com.android.systemui.plugins.statusbar.StatusBarStateController diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java index 99d46629ad7a..aa94ad98f3e6 100644 --- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java @@ -43,8 +43,8 @@ import android.view.accessibility.AccessibilityEvent; import androidx.annotation.VisibleForTesting; -import com.android.app.animation.Interpolators; import com.android.internal.dynamicanimation.animation.SpringForce; +import com.android.systemui.animation.Interpolators; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.plugins.FalsingManager; diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java b/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java index d49197557dc4..d6f0b59accb1 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java @@ -32,8 +32,8 @@ import android.view.View; import android.view.WindowManager; import android.view.accessibility.AccessibilityEvent; -import com.android.app.animation.Interpolators; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; /** * Visually discloses that contextual data was provided to an assistant. diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java index 2aac056b0bde..0002ae95f476 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java @@ -45,9 +45,9 @@ import android.widget.TextView; import androidx.annotation.StyleRes; import androidx.annotation.VisibleForTesting; -import com.android.app.animation.Interpolators; import com.android.systemui.DualToneHandler; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.statusbar.policy.BatteryController; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java index be585ed133d7..aeebb010eb1e 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java @@ -59,11 +59,11 @@ import android.widget.ScrollView; import android.window.OnBackInvokedCallback; import android.window.OnBackInvokedDispatcher; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.widget.LockPatternUtils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.biometrics.AuthController.ScaleFactorProvider; import com.android.systemui.biometrics.domain.interactor.BiometricPromptCredentialInteractor; import com.android.systemui.biometrics.ui.CredentialView; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt index 782a10bd7e4c..d0ac2968ae8e 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt @@ -32,7 +32,7 @@ import com.android.settingslib.Utils import com.android.settingslib.udfps.UdfpsOverlayParams import com.android.systemui.CoreStartable import com.android.systemui.R -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt index 5ede16d221b7..b0071340cf1a 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt @@ -28,7 +28,7 @@ import android.util.AttributeSet import android.view.View import android.view.animation.PathInterpolator import com.android.internal.graphics.ColorUtils -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.surfaceeffects.ripple.RippleShader private const val RIPPLE_SPARKLE_STRENGTH: Float = 0.3f diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.kt index 1dbafc6519f0..ef7dcb7aac93 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.kt @@ -19,7 +19,7 @@ import android.animation.ValueAnimator import android.graphics.PointF import android.graphics.RectF import com.android.systemui.Dumpable -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.shade.ShadeExpansionListener diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java index 52db4ab8b593..ba8e60a08a1d 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java @@ -40,9 +40,9 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.asynclayoutinflater.view.AsyncLayoutInflater; -import com.android.app.animation.Interpolators; import com.android.settingslib.Utils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.airbnb.lottie.LottieAnimationView; import com.airbnb.lottie.LottieProperty; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.kt index eaab75af4a51..3b50bbcd9251 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.kt @@ -23,11 +23,11 @@ import android.view.MotionEvent import androidx.annotation.VisibleForTesting import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle -import com.android.app.animation.Interpolators import com.android.keyguard.BouncerPanelExpansionCalculator.aboutToShowBouncerProgress import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.R import com.android.systemui.animation.ActivityLaunchAnimator +import com.android.systemui.animation.Interpolators import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt index 9292bd7ecd60..e2d36dc6abe1 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt @@ -6,8 +6,8 @@ import android.widget.ImageView import android.widget.TextView import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle -import com.android.app.animation.Interpolators import com.android.systemui.R +import com.android.systemui.animation.Interpolators import com.android.systemui.biometrics.AuthDialog import com.android.systemui.biometrics.AuthPanelController import com.android.systemui.biometrics.ui.CredentialPasswordView diff --git a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingLayout.java b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingLayout.java index 7bf8f4dac1fb..11ef749573b7 100644 --- a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingLayout.java +++ b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingLayout.java @@ -30,9 +30,9 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; -import com.android.app.animation.Interpolators; import com.android.settingslib.Utils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.shared.recents.utilities.Utilities; import com.android.systemui.surfaceeffects.ripple.RippleShader; import com.android.systemui.surfaceeffects.ripple.RippleShader.RippleShape; diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt index b447d66c08dd..8d0edf829416 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsAnimations.kt @@ -32,7 +32,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.OnLifecycleEvent import com.android.systemui.R -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.controls.ui.ControlsUiController object ControlsAnimations { diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt index e6361f46c8ad..6a9aaf865251 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt @@ -50,7 +50,7 @@ import androidx.annotation.ColorInt import androidx.annotation.VisibleForTesting import com.android.internal.graphics.ColorUtils import com.android.systemui.R -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.controls.ControlsMetricsLogger import com.android.systemui.controls.controller.ControlsController import com.android.systemui.util.concurrency.DelayableExecutor diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt index 1461135d3d3b..fa36eee7c644 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt @@ -38,7 +38,7 @@ import android.view.ViewGroup import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityNodeInfo import com.android.systemui.R -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.controls.ui.ControlViewHolder.Companion.MAX_LEVEL import com.android.systemui.controls.ui.ControlViewHolder.Companion.MIN_LEVEL import java.util.IllegalFormatException diff --git a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java index f6435a788f87..0dcba50df4ca 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java @@ -278,6 +278,7 @@ public class FrameworkServicesModule { @Provides @Singleton + @Nullable static IVrManager provideIVrManager() { return IVrManager.Stub.asInterface(ServiceManager.getService(Context.VR_SERVICE)); } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/PluginModule.java b/packages/SystemUI/src/com/android/systemui/dagger/PluginModule.java index 67ad3db74f8a..8764297c1b5d 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/PluginModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/PluginModule.java @@ -18,6 +18,8 @@ package com.android.systemui.dagger; import com.android.systemui.ActivityStarterDelegate; import com.android.systemui.classifier.FalsingManagerProxy; +import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.flags.Flags; import com.android.systemui.globalactions.GlobalActionsComponent; import com.android.systemui.globalactions.GlobalActionsImpl; import com.android.systemui.plugins.ActivityStarter; @@ -28,6 +30,7 @@ import com.android.systemui.plugins.PluginDependencyProvider; import com.android.systemui.plugins.VolumeDialogController; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.StatusBarStateControllerImpl; +import com.android.systemui.statusbar.phone.ActivityStarterImpl; import com.android.systemui.statusbar.phone.DarkIconDispatcherImpl; import com.android.systemui.volume.VolumeDialogControllerImpl; @@ -46,7 +49,11 @@ public abstract class PluginModule { /** */ @Provides static ActivityStarter provideActivityStarter(ActivityStarterDelegate delegate, - PluginDependencyProvider dependencyProvider) { + PluginDependencyProvider dependencyProvider, ActivityStarterImpl activityStarterImpl, + FeatureFlags featureFlags) { + if (featureFlags.isEnabled(Flags.USE_NEW_ACTIVITY_STARTER)) { + return activityStarterImpl; + } dependencyProvider.allowPluginDependency(ActivityStarter.class, delegate); return delegate; } diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayAnimationsController.kt b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayAnimationsController.kt index 83f39b522f09..5b56c04ae8aa 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayAnimationsController.kt +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayAnimationsController.kt @@ -24,8 +24,8 @@ import android.view.animation.Interpolator import androidx.core.animation.doOnEnd import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle -import com.android.app.animation.Interpolators import com.android.systemui.R +import com.android.systemui.animation.Interpolators import com.android.systemui.complication.ComplicationHostViewController import com.android.systemui.complication.ComplicationLayoutParams import com.android.systemui.complication.ComplicationLayoutParams.POSITION_BOTTOM diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java index c22019e96d74..15a32d21213f 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java @@ -33,9 +33,9 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; -import com.android.app.animation.Interpolators; import com.android.dream.lowlight.LowLightTransitionCoordinator; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.complication.ComplicationHostViewController; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dreams.dagger.DreamOverlayComponent; diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index 2ecb0a0043a2..17e66a74927b 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -675,4 +675,8 @@ object Flags { @JvmField val ADVANCED_VPN_ENABLED = unreleasedFlag(2800, name = "AdvancedVpn__enable_feature", namespace = "vpn", teamfood = true) + + // TODO(b/278761837): Tracking Bug + @JvmField + val USE_NEW_ACTIVITY_STARTER = unreleasedFlag(2801, name = "use_new_activity_starter") } diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java index 5189944e908b..d3b6fc237084 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java @@ -97,7 +97,6 @@ import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleRegistry; -import com.android.app.animation.Interpolators; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor; @@ -117,6 +116,7 @@ import com.android.systemui.MultiListLayout.MultiListAdapter; import com.android.systemui.animation.DialogCuj; import com.android.systemui.animation.DialogLaunchAnimator; import com.android.systemui.animation.Expandable; +import com.android.systemui.animation.Interpolators; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dagger.qualifiers.Background; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt index 9844ca02482b..2925d8dbd03a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt @@ -36,7 +36,7 @@ import androidx.core.math.MathUtils import com.android.internal.R import com.android.keyguard.KeyguardClockSwitchController import com.android.keyguard.KeyguardViewController -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 99a9bed5a2bb..93ddfba5b6fc 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -98,7 +98,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; -import com.android.app.animation.Interpolators; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.jank.InteractionJankMonitor.Configuration; import com.android.internal.policy.IKeyguardDismissCallback; @@ -122,6 +121,7 @@ import com.android.systemui.Dumpable; import com.android.systemui.EventLogTags; import com.android.systemui.R; import com.android.systemui.animation.ActivityLaunchAnimator; +import com.android.systemui.animation.Interpolators; import com.android.systemui.animation.LaunchAnimator; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.classifier.FalsingCollector; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt index cde67f979132..e6568f20bc20 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt @@ -17,7 +17,7 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt index 7e9cbc1a9772..c2d139c21074 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt @@ -17,7 +17,7 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt index aca40195dbcf..86f65dde4031 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt @@ -17,7 +17,7 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt index fc7bfb4e45f4..3beac0b1322e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt @@ -17,7 +17,7 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt index 39c630b1fa6f..b5bcd45f03dd 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt @@ -17,7 +17,7 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt index 0505d37262b0..87f3164b33d2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt @@ -17,7 +17,7 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt index 944adbab3906..1fbfff95ab7e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt @@ -17,7 +17,7 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt index d4af38185f0f..94961cbf4240 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt @@ -17,10 +17,10 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator -import com.android.app.animation.Interpolators import com.android.keyguard.KeyguardSecurityModel import com.android.keyguard.KeyguardSecurityModel.SecurityMode.Password import com.android.keyguard.KeyguardUpdateMonitor +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt index 9d7477c13be6..38b9d508f81c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt @@ -16,7 +16,7 @@ package com.android.systemui.keyguard.ui import android.view.animation.Interpolator -import com.android.app.animation.Interpolators.LINEAR +import com.android.systemui.animation.Interpolators.LINEAR import com.android.systemui.keyguard.shared.model.TransitionState.CANCELED import com.android.systemui.keyguard.shared.model.TransitionState.FINISHED import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt index c8d37a165a0e..d96609c24dbd 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt @@ -32,11 +32,11 @@ import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle -import com.android.app.animation.Interpolators import com.android.settingslib.Utils import com.android.systemui.R import com.android.systemui.animation.ActivityLaunchAnimator import com.android.systemui.animation.Expandable +import com.android.systemui.animation.Interpolators import com.android.systemui.animation.view.LaunchableLinearLayout import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.ui.binder.IconViewBinder diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt index 2c9a9b3271e6..8d6545a49a8a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt @@ -16,8 +16,8 @@ package com.android.systemui.keyguard.ui.viewmodel -import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE -import com.android.app.animation.Interpolators.EMPHASIZED_DECELERATE +import com.android.systemui.animation.Interpolators.EMPHASIZED_ACCELERATE +import com.android.systemui.animation.Interpolators.EMPHASIZED_DECELERATE import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.FromDreamingTransitionInteractor.Companion.TO_LOCKSCREEN_DURATION import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModel.kt index c1357863f3a5..f16827d4a54a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToDreamingTransitionViewModel.kt @@ -16,7 +16,7 @@ package com.android.systemui.keyguard.ui.viewmodel -import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE +import com.android.systemui.animation.Interpolators.EMPHASIZED_ACCELERATE import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.FromGoneTransitionInteractor.Companion.TO_DREAMING_DURATION import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt index c6187dde035b..bc9dc4f69102 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt @@ -16,7 +16,7 @@ package com.android.systemui.keyguard.ui.viewmodel -import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE +import com.android.systemui.animation.Interpolators.EMPHASIZED_ACCELERATE import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.FromLockscreenTransitionInteractor.Companion.TO_DREAMING_DURATION import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt index d3ea89ce1935..a60665a81f0e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt @@ -16,7 +16,7 @@ package com.android.systemui.keyguard.ui.viewmodel -import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE +import com.android.systemui.animation.Interpolators.EMPHASIZED_ACCELERATE import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.FromLockscreenTransitionInteractor.Companion.TO_OCCLUDED_DURATION import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt index 6845c55b8385..ddce516a0fb2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt @@ -16,7 +16,7 @@ package com.android.systemui.keyguard.ui.viewmodel -import com.android.app.animation.Interpolators.EMPHASIZED_DECELERATE +import com.android.systemui.animation.Interpolators.EMPHASIZED_DECELERATE import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.FromOccludedTransitionInteractor.Companion.TO_LOCKSCREEN_DURATION import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt index 68810f909016..df93d235245c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToGoneTransitionViewModel.kt @@ -16,7 +16,7 @@ package com.android.systemui.keyguard.ui.viewmodel -import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE +import com.android.systemui.animation.Interpolators.EMPHASIZED_ACCELERATE import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.FromPrimaryBouncerTransitionInteractor.Companion.TO_GONE_DURATION import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/models/player/SeekBarObserver.kt b/packages/SystemUI/src/com/android/systemui/media/controls/models/player/SeekBarObserver.kt index e38abc2228c4..37d956bd09eb 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/models/player/SeekBarObserver.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/models/player/SeekBarObserver.kt @@ -21,9 +21,9 @@ import android.animation.ObjectAnimator import android.text.format.DateUtils import androidx.annotation.UiThread import androidx.lifecycle.Observer -import com.android.app.animation.Interpolators import com.android.internal.annotations.VisibleForTesting import com.android.systemui.R +import com.android.systemui.animation.Interpolators import com.android.systemui.media.controls.ui.SquigglyProgress /** diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/IlluminationDrawable.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/IlluminationDrawable.kt index b46ebb22ff05..3669493f4e41 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/IlluminationDrawable.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/IlluminationDrawable.kt @@ -34,10 +34,10 @@ import android.util.AttributeSet import android.util.MathUtils import android.view.View import androidx.annotation.Keep -import com.android.app.animation.Interpolators import com.android.internal.graphics.ColorUtils import com.android.internal.graphics.ColorUtils.blendARGB import com.android.systemui.R +import com.android.systemui.animation.Interpolators import org.xmlpull.v1.XmlPullParser private const val BACKGROUND_ANIM_DURATION = 370L diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/LightSourceDrawable.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/LightSourceDrawable.kt index 937a618df68f..dd5c2bf497cb 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/LightSourceDrawable.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/LightSourceDrawable.kt @@ -35,9 +35,9 @@ import android.graphics.drawable.Drawable import android.util.AttributeSet import android.util.MathUtils.lerp import androidx.annotation.Keep -import com.android.app.animation.Interpolators import com.android.internal.graphics.ColorUtils import com.android.systemui.R +import com.android.systemui.animation.Interpolators import org.xmlpull.v1.XmlPullParser private const val RIPPLE_ANIM_DURATION = 800L diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java index f9d3094d6f00..40027a1d8f2c 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java @@ -72,7 +72,6 @@ import androidx.annotation.Nullable; import androidx.annotation.UiThread; import androidx.constraintlayout.widget.ConstraintSet; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.graphics.ColorUtils; import com.android.internal.jank.InteractionJankMonitor; @@ -83,6 +82,7 @@ import com.android.systemui.ActivityIntentHelper; import com.android.systemui.R; import com.android.systemui.animation.ActivityLaunchAnimator; import com.android.systemui.animation.GhostedViewLaunchAnimatorController; +import com.android.systemui.animation.Interpolators; import com.android.systemui.bluetooth.BroadcastDialogController; import com.android.systemui.broadcast.BroadcastSender; import com.android.systemui.dagger.qualifiers.Background; diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt index fe8ebafdf9b4..49e1665a0de9 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt @@ -33,9 +33,9 @@ import android.view.View import android.view.ViewGroup import android.view.ViewGroupOverlay import androidx.annotation.VisibleForTesting -import com.android.app.animation.Interpolators import com.android.keyguard.KeyguardViewController import com.android.systemui.R +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dreams.DreamOverlayStateController diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/SquigglyProgress.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/SquigglyProgress.kt index 583c626d2156..e9b2cf2b18d1 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/SquigglyProgress.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/SquigglyProgress.kt @@ -31,8 +31,8 @@ import android.util.MathUtils.lerp import android.util.MathUtils.lerpInv import android.util.MathUtils.lerpInvSat import androidx.annotation.VisibleForTesting -import com.android.app.animation.Interpolators import com.android.internal.graphics.ColorUtils +import com.android.systemui.animation.Interpolators import kotlin.math.abs import kotlin.math.cos diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt index 77ff0362851a..78082c3eb3c6 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt @@ -36,7 +36,7 @@ import android.view.View.ACCESSIBILITY_LIVE_REGION_ASSERTIVE import android.view.View.ACCESSIBILITY_LIVE_REGION_NONE import com.android.internal.widget.CachingIconView import com.android.systemui.R -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.common.shared.model.ContentDescription import com.android.systemui.common.ui.binder.TintedIconViewBinder import com.android.systemui.dagger.SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index 146b5f57630e..94f01b87f936 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -58,11 +58,11 @@ import android.widget.FrameLayout; import androidx.annotation.Nullable; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.Utils; import com.android.systemui.Gefingerpoken; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.model.SysUiState; import com.android.systemui.navigationbar.buttons.ButtonDispatcher; import com.android.systemui.navigationbar.buttons.ContextualButton; diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java index 10084bd4ccad..02180160fc11 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java @@ -16,7 +16,7 @@ package com.android.systemui.navigationbar.buttons; -import static com.android.app.animation.Interpolators.LINEAR; +import static com.android.systemui.animation.Interpolators.LINEAR; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -24,6 +24,9 @@ import android.animation.ValueAnimator; import android.view.View; import android.view.View.AccessibilityDelegate; +import com.android.systemui.Dependency; +import com.android.systemui.assist.AssistManager; + import java.util.ArrayList; /** diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java index ff22398cc3be..590efbb66454 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationBarEdgePanel.java @@ -48,10 +48,10 @@ import androidx.dynamicanimation.animation.FloatPropertyCompat; import androidx.dynamicanimation.animation.SpringAnimation; import androidx.dynamicanimation.animation.SpringForce; -import com.android.app.animation.Interpolators; import com.android.internal.util.LatencyTracker; import com.android.settingslib.Utils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.plugins.NavigationEdgeBackPlugin; import com.android.systemui.settings.DisplayTracker; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index 463c79c6696a..a7aac5a4824d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -26,7 +26,7 @@ import android.view.View.OnLayoutChangeListener; import androidx.annotation.Nullable; -import com.android.app.animation.Interpolators; +import com.android.systemui.animation.Interpolators; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.qs.QSTile; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index cce708eb0f5f..d806afa91dd1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -18,10 +18,9 @@ import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS; import static com.android.systemui.media.dagger.MediaModule.QS_PANEL; import static com.android.systemui.media.dagger.MediaModule.QUICK_QS_PANEL; +import static com.android.systemui.statusbar.disableflags.DisableFlagsLogger.DisableState; import static com.android.systemui.statusbar.StatusBarState.KEYGUARD; import static com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED; -import static com.android.systemui.statusbar.disableflags.DisableFlagsLogger.DisableState; - import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.content.res.Configuration; @@ -44,10 +43,10 @@ import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleRegistry; -import com.android.app.animation.Interpolators; import com.android.keyguard.BouncerPanelExpansionCalculator; import com.android.systemui.Dumpable; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.animation.ShadeInterpolation; import com.android.systemui.compose.ComposeFacade; import com.android.systemui.dump.DumpManager; diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java index 5ea1c0b4ce85..4b22edcc29ad 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java @@ -23,15 +23,16 @@ import android.os.RemoteException; import android.util.Log; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.statusbar.phone.CentralSurfaces; +import dagger.Lazy; + import java.util.Optional; import javax.inject.Inject; -import dagger.Lazy; - /** * An implementation of the Recents interface which proxies to the OverviewProxyService. */ @@ -44,13 +45,15 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { private Handler mHandler; private final OverviewProxyService mOverviewProxyService; + private final ActivityStarter mActivityStarter; @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @Inject public OverviewProxyRecentsImpl(Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy, - OverviewProxyService overviewProxyService) { + OverviewProxyService overviewProxyService, ActivityStarter activityStarter) { mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; mOverviewProxyService = overviewProxyService; + mActivityStarter = activityStarter; } @Override @@ -101,7 +104,7 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { final Optional<CentralSurfaces> centralSurfacesOptional = mCentralSurfacesOptionalLazy.get(); if (centralSurfacesOptional.map(CentralSurfaces::isKeyguardShowing).orElse(false)) { - centralSurfacesOptional.get().executeRunnableDismissingKeyguard( + mActivityStarter.executeRunnableDismissingKeyguard( () -> mHandler.post(toggleRecents), null, true /* dismissShade */, false /* afterKeyguardGone */, true /* deferred */); diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java b/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java index 4f5cb72438bc..3aefcb3d2976 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java @@ -33,11 +33,9 @@ import android.util.Log; import android.view.RemoteAnimationAdapter; import android.view.WindowManagerGlobal; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.settings.DisplayTracker; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.statusbar.phone.CentralSurfaces; - -import java.util.Optional; import javax.inject.Inject; @@ -48,20 +46,20 @@ import javax.inject.Inject; public class ActionProxyReceiver extends BroadcastReceiver { private static final String TAG = "ActionProxyReceiver"; - private final CentralSurfaces mCentralSurfaces; private final ActivityManagerWrapper mActivityManagerWrapper; private final ScreenshotSmartActions mScreenshotSmartActions; private final DisplayTracker mDisplayTracker; + private final ActivityStarter mActivityStarter; @Inject - public ActionProxyReceiver(Optional<CentralSurfaces> centralSurfacesOptional, - ActivityManagerWrapper activityManagerWrapper, + public ActionProxyReceiver(ActivityManagerWrapper activityManagerWrapper, ScreenshotSmartActions screenshotSmartActions, - DisplayTracker displayTracker) { - mCentralSurfaces = centralSurfacesOptional.orElse(null); + DisplayTracker displayTracker, + ActivityStarter activityStarter) { mActivityManagerWrapper = activityManagerWrapper; mScreenshotSmartActions = screenshotSmartActions; mDisplayTracker = displayTracker; + mActivityStarter = activityStarter; } @Override @@ -92,13 +90,9 @@ public class ActionProxyReceiver extends BroadcastReceiver { }; - if (mCentralSurfaces != null) { - mCentralSurfaces.executeRunnableDismissingKeyguard(startActivityRunnable, null, - true /* dismissShade */, true /* afterKeyguardGone */, - true /* deferred */); - } else { - startActivityRunnable.run(); - } + mActivityStarter.executeRunnableDismissingKeyguard(startActivityRunnable, null, + true /* dismissShade */, true /* afterKeyguardGone */, + true /* deferred */); if (intent.getBooleanExtra(EXTRA_SMART_ACTIONS_ENABLED, false)) { String actionType = Intent.ACTION_EDIT.equals(intent.getAction()) diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt index 4cb91e134003..14e875d28f8f 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotProxyService.kt @@ -21,53 +21,44 @@ import android.util.Log import androidx.lifecycle.LifecycleService import androidx.lifecycle.lifecycleScope import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.plugins.ActivityStarter import com.android.systemui.shade.ShadeExpansionStateManager -import com.android.systemui.statusbar.phone.CentralSurfaces +import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import java.util.Optional -import javax.inject.Inject -/** - * Provides state from the main SystemUI process on behalf of the Screenshot process. - */ -internal class ScreenshotProxyService @Inject constructor( +/** Provides state from the main SystemUI process on behalf of the Screenshot process. */ +internal class ScreenshotProxyService +@Inject +constructor( private val mExpansionMgr: ShadeExpansionStateManager, - private val mCentralSurfacesOptional: Optional<CentralSurfaces>, @Main private val mMainDispatcher: CoroutineDispatcher, + private val activityStarter: ActivityStarter, ) : LifecycleService() { - private val mBinder: IBinder = object : IScreenshotProxy.Stub() { - /** - * @return true when the notification shade is partially or fully expanded. - */ - override fun isNotificationShadeExpanded(): Boolean { - val expanded = !mExpansionMgr.isClosed() - Log.d(TAG, "isNotificationShadeExpanded(): $expanded") - return expanded - } + private val mBinder: IBinder = + object : IScreenshotProxy.Stub() { + /** @return true when the notification shade is partially or fully expanded. */ + override fun isNotificationShadeExpanded(): Boolean { + val expanded = !mExpansionMgr.isClosed() + Log.d(TAG, "isNotificationShadeExpanded(): $expanded") + return expanded + } - override fun dismissKeyguard(callback: IOnDoneCallback) { - lifecycleScope.launch { - executeAfterDismissing(callback) + override fun dismissKeyguard(callback: IOnDoneCallback) { + lifecycleScope.launch { executeAfterDismissing(callback) } } } - } private suspend fun executeAfterDismissing(callback: IOnDoneCallback) = withContext(mMainDispatcher) { - mCentralSurfacesOptional.ifPresentOrElse( - { - it.executeRunnableDismissingKeyguard( - Runnable { - callback.onDone(true) - }, null, - true /* dismissShade */, true /* afterKeyguardGone */, - true /* deferred */ - ) - }, - { callback.onDone(false) } + activityStarter.executeRunnableDismissingKeyguard( + Runnable { callback.onDone(true) }, + null, + true /* dismissShade */, + true /* afterKeyguardGone */, + true /* deferred */ ) } diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index be92bd48a619..51179153fc73 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -22,10 +22,10 @@ import static android.view.MotionEvent.CLASSIFICATION_TWO_FINGER_SWIPE; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; -import static com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE; -import static com.android.app.animation.Interpolators.EMPHASIZED_DECELERATE; import static com.android.keyguard.KeyguardClockSwitch.LARGE; import static com.android.keyguard.KeyguardClockSwitch.SMALL; +import static com.android.systemui.animation.Interpolators.EMPHASIZED_ACCELERATE; +import static com.android.systemui.animation.Interpolators.EMPHASIZED_DECELERATE; import static com.android.systemui.classifier.Classifier.BOUNCER_UNLOCK; import static com.android.systemui.classifier.Classifier.GENERIC; import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS; @@ -88,7 +88,6 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.Interpolator; import android.widget.FrameLayout; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.MetricsLogger; @@ -112,6 +111,7 @@ import com.android.systemui.Dumpable; import com.android.systemui.Gefingerpoken; import com.android.systemui.R; import com.android.systemui.animation.ActivityLaunchAnimator; +import com.android.systemui.animation.Interpolators; import com.android.systemui.animation.LaunchAnimator; import com.android.systemui.biometrics.AuthController; import com.android.systemui.classifier.Classifier; @@ -4086,7 +4086,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump if (!mFalsingManager.isUnlockingDisabled() && qsFullyExpanded && mFalsingCollector.shouldEnforceBouncer()) { - mCentralSurfaces.executeRunnableDismissingKeyguard(null, null, + mActivityStarter.executeRunnableDismissingKeyguard(null, null, false, true, false); } if (DEBUG_DRAWABLE) { diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java index 7a79e8514510..ef14d1cb7f63 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java @@ -50,7 +50,6 @@ import android.view.WindowMetrics; import android.view.accessibility.AccessibilityManager; import android.widget.FrameLayout; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.MetricsLogger; @@ -60,6 +59,7 @@ import com.android.internal.policy.SystemBarUtils; import com.android.keyguard.FaceAuthApiRequestReason; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.classifier.Classifier; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt index 4131e7dbc98c..f0815e93dccd 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt @@ -34,10 +34,10 @@ import android.view.WindowInsets import android.widget.TextView import androidx.annotation.VisibleForTesting import androidx.constraintlayout.motion.widget.MotionLayout -import com.android.app.animation.Interpolators import com.android.settingslib.Utils import com.android.systemui.Dumpable import com.android.systemui.R +import com.android.systemui.animation.Interpolators import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java index c1ebf1236def..63179dac7b8c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CrossFadeHelper.java @@ -18,8 +18,8 @@ package com.android.systemui.statusbar; import android.view.View; -import com.android.app.animation.Interpolators; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java index 1a32d70a9745..54b341f529b0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java @@ -38,8 +38,8 @@ import android.view.ViewAnimationUtils; import android.view.animation.Interpolator; import android.widget.ImageView; -import com.android.app.animation.Interpolators; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.wm.shell.animation.FlingAnimationUtils; /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt index 823bb355a307..9421524c73a7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt @@ -16,7 +16,7 @@ import android.util.AttributeSet import android.util.MathUtils.lerp import android.view.View import android.view.animation.PathInterpolator -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.statusbar.LightRevealEffect.Companion.getPercentPastThreshold import com.android.systemui.util.getColorWithAlpha import com.android.systemui.util.leak.RotationUtils diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt index 22589686520b..c5f64b0a2306 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt @@ -18,7 +18,7 @@ import com.android.systemui.Dumpable import com.android.systemui.ExpandHelper import com.android.systemui.Gefingerpoken import com.android.systemui.R -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.biometrics.UdfpsKeyguardViewController import com.android.systemui.classifier.Classifier import com.android.systemui.classifier.FalsingCollector @@ -26,6 +26,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.media.controls.ui.MediaHierarchyManager +import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.ActivityStarter.OnDismissAction import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.qs.QS @@ -62,11 +63,12 @@ class LockscreenShadeTransitionController @Inject constructor( private val mediaHierarchyManager: MediaHierarchyManager, private val scrimTransitionController: LockscreenShadeScrimTransitionController, private val keyguardTransitionControllerFactory: - LockscreenShadeKeyguardTransitionController.Factory, + LockscreenShadeKeyguardTransitionController.Factory, private val depthController: NotificationShadeDepthController, private val context: Context, private val splitShadeOverScrollerFactory: SplitShadeLockScreenOverScroller.Factory, private val singleShadeOverScrollerFactory: SingleShadeLockScreenOverScroller.Factory, + private val activityStarter: ActivityStarter, wakefulnessLifecycle: WakefulnessLifecycle, configurationController: ConfigurationController, falsingManager: FalsingManager, @@ -305,7 +307,7 @@ class LockscreenShadeTransitionController @Inject constructor( if (nsslController.isInLockedDownShade()) { logger.logDraggedDownLockDownShade(startingChild) statusBarStateController.setLeaveOpenOnKeyguardHide(true) - centralSurfaces.dismissKeyguardThenExecute(OnDismissAction { + activityStarter.dismissKeyguardThenExecute(OnDismissAction { nextHideKeyguardNeedsNoAnimation = true false }, cancelRunnable, false /* afterKeyguardGone */) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index fb88a96c38c2..72ae16e607c8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -44,9 +44,9 @@ import android.util.Log; import android.view.View; import android.widget.ImageView; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dumpable; +import com.android.systemui.animation.Interpolators; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt index d37cbcc00360..8dc78426da7d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt @@ -33,7 +33,7 @@ import androidx.dynamicanimation.animation.FloatPropertyCompat import androidx.dynamicanimation.animation.SpringAnimation import androidx.dynamicanimation.animation.SpringForce import com.android.systemui.Dumpable -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 5c3bacc1fe1b..7eb63da38028 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -35,10 +35,10 @@ import android.view.animation.PathInterpolator; import androidx.annotation.NonNull; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.policy.SystemBarUtils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.animation.ShadeInterpolation; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt index f9d4f1a89ee2..976924a2159d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt @@ -31,7 +31,7 @@ import androidx.annotation.VisibleForTesting import com.android.systemui.Dumpable import com.android.systemui.Gefingerpoken import com.android.systemui.R -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN import com.android.systemui.classifier.FalsingCollector import com.android.systemui.dagger.SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SingleShadeLockScreenOverScroller.kt b/packages/SystemUI/src/com/android/systemui/statusbar/SingleShadeLockScreenOverScroller.kt index f1e51e21a9e5..575f354c6620 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SingleShadeLockScreenOverScroller.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SingleShadeLockScreenOverScroller.kt @@ -4,7 +4,7 @@ import android.content.Context import android.content.res.Configuration import android.util.MathUtils import com.android.systemui.R -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.policy.ConfigurationController import dagger.assisted.Assisted diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScroller.kt b/packages/SystemUI/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScroller.kt index 3d574caf3192..572c0e0da262 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScroller.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SplitShadeLockScreenOverScroller.kt @@ -8,7 +8,7 @@ import android.util.MathUtils import android.view.animation.PathInterpolator import com.android.internal.annotations.VisibleForTesting import com.android.systemui.R -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.qs.QS import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java index 91c08a062b54..77550038c94a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java @@ -52,10 +52,10 @@ import android.view.animation.Interpolator; import androidx.core.graphics.ColorUtils; -import com.android.app.animation.Interpolators; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.util.ContrastColorUtil; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.notification.NotificationIconDozeHelper; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.util.drawable.DrawableSize; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java index d6a14604ffb0..79d01b4a73fd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java @@ -42,7 +42,6 @@ import android.view.animation.Interpolator; import androidx.annotation.NonNull; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; @@ -50,6 +49,7 @@ import com.android.internal.jank.InteractionJankMonitor.Configuration; import com.android.internal.logging.UiEventLogger; import com.android.systemui.DejankUtils; import com.android.systemui.Dumpable; +import com.android.systemui.animation.Interpolators; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java index 67ab0601cbf8..2fa27ee454e8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ViewTransformationHelper.java @@ -25,8 +25,8 @@ import android.view.View; import android.view.ViewGroup; import android.view.animation.Interpolator; -import com.android.app.animation.Interpolators; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.notification.TransformState; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt index eddb6835318d..bfc4e9c47db5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt @@ -26,7 +26,7 @@ import android.view.View import android.widget.FrameLayout import com.android.internal.annotations.GuardedBy import com.android.systemui.R -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.statusbar.StatusBarStateController diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ImageTransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ImageTransformState.java index b09b9f42e6af..0446165be5fc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ImageTransformState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ImageTransformState.java @@ -21,8 +21,8 @@ import android.util.Pools; import android.view.View; import android.widget.ImageView; -import com.android.app.animation.Interpolators; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.TransformableView; import com.android.systemui.statusbar.notification.row.HybridNotificationView; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/LaunchAnimationParameters.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/LaunchAnimationParameters.kt index 785e65dd4026..c22dbf615190 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/LaunchAnimationParameters.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/LaunchAnimationParameters.kt @@ -3,7 +3,7 @@ package com.android.systemui.statusbar.notification import android.util.MathUtils import com.android.internal.annotations.VisibleForTesting import com.android.systemui.animation.ActivityLaunchAnimator -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.animation.LaunchAnimator import kotlin.math.min diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingLayoutTransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingLayoutTransformState.java index 5a14200677b2..c22cd1ba4bc8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingLayoutTransformState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/MessagingLayoutTransformState.java @@ -23,13 +23,13 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import com.android.app.animation.Interpolators; import com.android.internal.widget.IMessagingLayout; import com.android.internal.widget.MessagingGroup; import com.android.internal.widget.MessagingImageMessage; import com.android.internal.widget.MessagingLinearLayout; import com.android.internal.widget.MessagingMessage; import com.android.internal.widget.MessagingPropertyAnimator; +import com.android.systemui.animation.Interpolators; import java.util.ArrayList; import java.util.HashMap; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java index a0456985e8d9..3fc7b132f38f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationDozeHelper.java @@ -24,8 +24,8 @@ import android.graphics.ColorMatrixColorFilter; import android.view.View; import android.widget.ImageView; -import com.android.app.animation.Interpolators; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import java.util.function.Consumer; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 9ba219903272..fe0b28d16239 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -21,8 +21,8 @@ import android.view.animation.Interpolator import androidx.annotation.VisibleForTesting import androidx.core.animation.ObjectAnimator import com.android.systemui.Dumpable -import com.android.app.animation.Interpolators -import com.android.app.animation.InterpolatorsAndroidX +import com.android.systemui.animation.Interpolators +import com.android.systemui.animation.InterpolatorsAndroidX import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.statusbar.StatusBarStateController diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/PropertyAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/PropertyAnimator.java index 57d20246ea14..5d07cac78682 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/PropertyAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/PropertyAnimator.java @@ -24,7 +24,7 @@ import android.util.Property; import android.view.View; import android.view.animation.Interpolator; -import com.android.app.animation.Interpolators; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.notification.stack.AnimationFilter; import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.notification.stack.ViewState; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java index 90eb630949fa..9f9fba437869 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java @@ -23,11 +23,11 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; -import com.android.app.animation.Interpolators; import com.android.internal.widget.MessagingImageMessage; import com.android.internal.widget.MessagingPropertyAnimator; import com.android.internal.widget.ViewClippingUtil; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.TransformableView; import com.android.systemui.statusbar.ViewTransformationHelper; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt index 16f1a45ba83f..dc1627438490 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt @@ -22,7 +22,7 @@ import android.animation.ValueAnimator import android.view.View import android.view.ViewGroup import com.android.systemui.R -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators /** * Class to help with fading of view groups without fading one subview diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifLiveDataStoreImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifLiveDataStoreImpl.kt index 8aa6b81eede0..d95d593778a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifLiveDataStoreImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifLiveDataStoreImpl.kt @@ -32,7 +32,7 @@ import javax.inject.Inject @SysUISingleton class NotifLiveDataStoreImpl @Inject constructor( @Main private val mainExecutor: Executor -) : NotifLiveDataStore { +) : NotifLiveDataStore, PipelineDumpable { private val hasActiveNotifsPrivate = NotifLiveDataImpl( name = "hasActiveNotifs", initialValue = false, @@ -66,6 +66,12 @@ class NotifLiveDataStoreImpl @Inject constructor( ).forEach { dispatcher -> dispatcher.invoke() } } } + + override fun dumpPipeline(d: PipelineDumper) { + d.dump("activeNotifListPrivate", activeNotifListPrivate) + d.dump("activeNotifCountPrivate", activeNotifCountPrivate) + d.dump("hasActiveNotifsPrivate", hasActiveNotifsPrivate) + } } /** Read-write implementation of [NotifLiveData] */ @@ -73,7 +79,7 @@ class NotifLiveDataImpl<T>( private val name: String, initialValue: T, @Main private val mainExecutor: Executor -) : NotifLiveData<T> { +) : NotifLiveData<T>, PipelineDumpable { private val syncObservers = ListenerSet<Observer<T>>() private val asyncObservers = ListenerSet<Observer<T>>() private val atomicValue = AtomicReference(initialValue) @@ -134,4 +140,9 @@ class NotifLiveDataImpl<T>( syncObservers.remove(observer) asyncObservers.remove(observer) } + + override fun dumpPipeline(d: PipelineDumper) { + d.dump("syncObservers", syncObservers) + d.dump("asyncObservers", asyncObservers) + } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/CoreCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/CoreCoordinator.kt new file mode 100644 index 000000000000..75e461c262cd --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/CoreCoordinator.kt @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2023 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.notification.collection.coordinator + +import com.android.systemui.statusbar.notification.collection.PipelineDumpable + +/** + * A special type of [Coordinator] that is also a core part of the pipeline, and so is also a + * [PipelineDumpable]. + */ +interface CoreCoordinator : Coordinator, PipelineDumpable diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/DataStoreCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/DataStoreCoordinator.kt index 8e307ecd896d..dc8ff63865a2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/DataStoreCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/DataStoreCoordinator.kt @@ -21,6 +21,7 @@ import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.NotifLiveDataStoreImpl import com.android.systemui.statusbar.notification.collection.NotifPipeline import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.notification.collection.PipelineDumper import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope import com.android.systemui.statusbar.notification.collection.render.requireSummary import javax.inject.Inject @@ -32,13 +33,17 @@ import javax.inject.Inject @CoordinatorScope class DataStoreCoordinator @Inject internal constructor( private val notifLiveDataStoreImpl: NotifLiveDataStoreImpl -) : Coordinator { +) : CoreCoordinator { override fun attach(pipeline: NotifPipeline) { pipeline.addOnAfterRenderListListener { entries, _ -> onAfterRenderList(entries) } } - fun onAfterRenderList(entries: List<ListEntry>) { + override fun dumpPipeline(d: PipelineDumper) { + d.dump("notifLiveDataStoreImpl", notifLiveDataStoreImpl) + } + + private fun onAfterRenderList(entries: List<ListEntry>) { val flatEntryList = flattenedEntryList(entries) notifLiveDataStoreImpl.setActiveNotifList(flatEntryList) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt index 02ce0d46ead8..e5953cfc07cd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.kt @@ -15,7 +15,6 @@ */ package com.android.systemui.statusbar.notification.collection.coordinator -import com.android.systemui.statusbar.notification.NotifPipelineFlags import com.android.systemui.statusbar.notification.collection.NotifPipeline import com.android.systemui.statusbar.notification.collection.PipelineDumpable import com.android.systemui.statusbar.notification.collection.PipelineDumper @@ -32,7 +31,6 @@ interface NotifCoordinators : Coordinator, PipelineDumpable @CoordinatorScope class NotifCoordinatorsImpl @Inject constructor( - notifPipelineFlags: NotifPipelineFlags, sectionStyleProvider: SectionStyleProvider, dataStoreCoordinator: DataStoreCoordinator, hideLocallyDismissedNotifsCoordinator: HideLocallyDismissedNotifsCoordinator, @@ -61,6 +59,7 @@ class NotifCoordinatorsImpl @Inject constructor( dismissibilityCoordinator: DismissibilityCoordinator, ) : NotifCoordinators { + private val mCoreCoordinators: MutableList<CoreCoordinator> = ArrayList() private val mCoordinators: MutableList<Coordinator> = ArrayList() private val mOrderedSections: MutableList<NotifSectioner> = ArrayList() @@ -68,11 +67,8 @@ class NotifCoordinatorsImpl @Inject constructor( * Creates all the coordinators. */ init { - // TODO(b/208866714): formalize the system by which some coordinators may be required by the - // pipeline, such as this DataStoreCoordinator which cannot be removed, as it's a critical - // glue between the pipeline and parts of SystemUI which depend on pipeline output via the - // NotifLiveDataStore. - mCoordinators.add(dataStoreCoordinator) + // Attach core coordinators. + mCoreCoordinators.add(dataStoreCoordinator) // Attach normal coordinators. mCoordinators.add(hideLocallyDismissedNotifsCoordinator) @@ -122,6 +118,9 @@ class NotifCoordinatorsImpl @Inject constructor( * [Pluggable]s, [NotifCollectionListener]s and [NotifLifetimeExtender]s. */ override fun attach(pipeline: NotifPipeline) { + for (c in mCoreCoordinators) { + c.attach(pipeline) + } for (c in mCoordinators) { c.attach(pipeline) } @@ -133,7 +132,8 @@ class NotifCoordinatorsImpl @Inject constructor( * as they are dumped in the RenderStageManager instead. */ override fun dumpPipeline(d: PipelineDumper) = with(d) { - dump("coordinators", mCoordinators) + dump("core coordinators", mCoreCoordinators) + dump("normal coordinators", mCoordinators) } companion object { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinator.kt index 1c96e8ceb27f..62a0d138fd05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinator.kt @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.notification.collection.coordinator import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.NotifPipeline import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope +import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManagerImpl import com.android.systemui.statusbar.notification.collection.render.NotifStackController import com.android.systemui.statusbar.notification.collection.render.NotifStats import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT @@ -32,11 +33,13 @@ import javax.inject.Inject */ @CoordinatorScope class StackCoordinator @Inject internal constructor( + private val groupExpansionManagerImpl: GroupExpansionManagerImpl, private val notificationIconAreaController: NotificationIconAreaController ) : Coordinator { override fun attach(pipeline: NotifPipeline) { pipeline.addOnAfterRenderListListener(::onAfterRenderList) + groupExpansionManagerImpl.attach(pipeline) } fun onAfterRenderList(entries: List<ListEntry>, controller: NotifStackController) = diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/GroupExpansionManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/GroupExpansionManager.java index d2df07ed7864..30386ab46382 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/GroupExpansionManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/GroupExpansionManager.java @@ -16,7 +16,6 @@ package com.android.systemui.statusbar.notification.collection.render; -import com.android.systemui.Dumpable; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -25,7 +24,7 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow * expanded/collapsed state of a single notification which is tracked within each * ExpandableNotificationRow. */ -public interface GroupExpansionManager extends Dumpable { +public interface GroupExpansionManager { /** * Register a listener for group expansion changes diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/GroupExpansionManagerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/GroupExpansionManagerImpl.java index 1b3f83d1892f..4568c0ca1458 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/GroupExpansionManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/GroupExpansionManagerImpl.java @@ -16,12 +16,15 @@ package com.android.systemui.statusbar.notification.collection.render; +import androidx.annotation.NonNull; + +import com.android.systemui.Dumpable; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dump.DumpManager; import com.android.systemui.statusbar.notification.collection.GroupEntry; import com.android.systemui.statusbar.notification.collection.ListEntry; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; -import com.android.systemui.statusbar.notification.collection.coordinator.Coordinator; import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener; import java.io.PrintWriter; @@ -36,7 +39,8 @@ import javax.inject.Inject; * expanded state. */ @SysUISingleton -public class GroupExpansionManagerImpl implements GroupExpansionManager, Coordinator { +public class GroupExpansionManagerImpl implements GroupExpansionManager, Dumpable { + private final DumpManager mDumpManager; private final GroupMembershipManager mGroupMembershipManager; private final Set<OnGroupExpansionChangeListener> mOnGroupChangeListeners = new HashSet<>(); @@ -44,7 +48,9 @@ public class GroupExpansionManagerImpl implements GroupExpansionManager, Coordin private final Set<NotificationEntry> mExpandedGroups = new HashSet<>(); @Inject - public GroupExpansionManagerImpl(GroupMembershipManager groupMembershipManager) { + public GroupExpansionManagerImpl(DumpManager dumpManager, + GroupMembershipManager groupMembershipManager) { + mDumpManager = dumpManager; mGroupMembershipManager = groupMembershipManager; } @@ -61,8 +67,8 @@ public class GroupExpansionManagerImpl implements GroupExpansionManager, Coordin mExpandedGroups.removeIf(expandedGroup -> !renderingSummaries.contains(expandedGroup)); }; - @Override public void attach(NotifPipeline pipeline) { + mDumpManager.registerDumpable(this); pipeline.addOnBeforeRenderListListener(mNotifTracker); } @@ -102,11 +108,11 @@ public class GroupExpansionManagerImpl implements GroupExpansionManager, Coordin } @Override - public void dump(PrintWriter pw, String[] args) { + public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { pw.println("NotificationEntryExpansion state:"); - pw.println(" # expanded groups: " + mExpandedGroups.size()); + pw.println(" mExpandedGroups: " + mExpandedGroups.size()); for (NotificationEntry entry : mExpandedGroups) { - pw.println(" summary key of expanded group: " + entry.getKey()); + pw.println(" * " + entry.getKey()); } } 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 f70d5e69afe6..766ad88f8a55 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 @@ -31,12 +31,12 @@ import android.view.View; import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; -import com.android.app.animation.Interpolators; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.jank.InteractionJankMonitor.Configuration; import com.android.settingslib.Utils; import com.android.systemui.Gefingerpoken; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.notification.FakeShadowView; import com.android.systemui.statusbar.notification.NotificationUtils; 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 2695410c8ac4..e468a59d4eb1 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 @@ -64,7 +64,6 @@ import android.widget.ImageView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; @@ -73,6 +72,7 @@ import com.android.internal.util.ContrastColorUtil; import com.android.internal.widget.CachingIconView; import com.android.internal.widget.CallLayout; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowDragController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowDragController.java index 7a2bee91e972..b56bae12be6c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowDragController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowDragController.java @@ -45,10 +45,10 @@ import android.widget.Toast; import androidx.annotation.VisibleForTesting; -import com.android.app.animation.Interpolators; import com.android.internal.logging.InstanceId; import com.android.internal.logging.InstanceIdSequence; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.shade.ShadeController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.notification.logging.NotificationPanelLogger; 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 9dbbc5874f28..5edff5f4e5d2 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 @@ -32,9 +32,9 @@ import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.android.app.animation.Interpolators; import com.android.systemui.Dumpable; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.notification.Roundable; import com.android.systemui.statusbar.notification.RoundableState; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java index 9bc03336c3b0..f21db0bde59a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationConversationInfo.java @@ -25,7 +25,7 @@ import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; import static android.app.NotificationManager.Policy.CONVERSATION_SENDERS_ANYONE; import static android.app.NotificationManager.Policy.CONVERSATION_SENDERS_IMPORTANT; -import static com.android.app.animation.Interpolators.FAST_OUT_SLOW_IN; +import static com.android.systemui.animation.Interpolators.FAST_OUT_SLOW_IN; import static java.lang.annotation.RetentionPolicy.SOURCE; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java index 047db2046529..596bdc09efe4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java @@ -33,9 +33,9 @@ import android.widget.FrameLayout; import androidx.annotation.Nullable; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index e6e6b9950d40..0c4b0927a906 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -49,6 +49,7 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.people.widget.PeopleSpaceWidgetManager; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.settings.UserContextProvider; @@ -73,8 +74,6 @@ import java.util.Optional; import javax.inject.Inject; -import dagger.Lazy; - /** * Handles various NotificationGuts related tasks, such as binding guts to a row, opening and * closing guts, and keeping track of the currently exposed notification guts. @@ -107,7 +106,6 @@ public class NotificationGutsManager implements NotifGutsViewManager { private NotificationListContainer mListContainer; private OnSettingsClickListener mOnSettingsClickListener; - private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy; private final Handler mMainHandler; private final Handler mBgHandler; private final Optional<BubblesManager> mBubblesManagerOptional; @@ -121,10 +119,10 @@ public class NotificationGutsManager implements NotifGutsViewManager { private final ShadeController mShadeController; private NotifGutsViewListener mGutsListener; private final HeadsUpManagerPhone mHeadsUpManagerPhone; + private final ActivityStarter mActivityStarter; @Inject public NotificationGutsManager(Context context, - Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy, @Main Handler mainHandler, @Background Handler bgHandler, AccessibilityManager accessibilityManager, @@ -144,9 +142,9 @@ public class NotificationGutsManager implements NotifGutsViewManager { StatusBarStateController statusBarStateController, DeviceProvisionedController deviceProvisionedController, MetricsLogger metricsLogger, - HeadsUpManagerPhone headsUpManagerPhone) { + HeadsUpManagerPhone headsUpManagerPhone, + ActivityStarter activityStarter) { mContext = context; - mCentralSurfacesOptionalLazy = centralSurfacesOptionalLazy; mMainHandler = mainHandler; mBgHandler = bgHandler; mAccessibilityManager = accessibilityManager; @@ -167,6 +165,7 @@ public class NotificationGutsManager implements NotifGutsViewManager { mDeviceProvisionedController = deviceProvisionedController; mMetricsLogger = metricsLogger; mHeadsUpManagerPhone = headsUpManagerPhone; + mActivityStarter = activityStarter; } public void setUpWithPresenter(NotificationPresenter presenter, @@ -551,19 +550,15 @@ public class NotificationGutsManager implements NotifGutsViewManager { .setLeaveOpenOnKeyguardHide(true); } - Optional<CentralSurfaces> centralSurfacesOptional = - mCentralSurfacesOptionalLazy.get(); - if (centralSurfacesOptional.isPresent()) { - Runnable r = () -> mMainHandler.post( - () -> openGutsInternal(view, x, y, menuItem)); - centralSurfacesOptional.get().executeRunnableDismissingKeyguard( - r, - null /* cancelAction */, - false /* dismissShade */, - true /* afterKeyguardGone */, - true /* deferred */); - return true; - } + Runnable r = () -> mMainHandler.post( + () -> openGutsInternal(view, x, y, menuItem)); + mActivityStarter.executeRunnableDismissingKeyguard( + r, + null /* cancelAction */, + false /* dismissShade */, + true /* afterKeyguardGone */, + true /* deferred */); + return true; /** * When {@link CentralSurfaces} doesn't exist, falling through to call * {@link #openGutsInternal(View,int,int,NotificationMenuRowPlugin.MenuItem)}. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java index 99a77550cc76..8a50f2f527fa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java @@ -20,7 +20,7 @@ import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.IMPORTANCE_LOW; import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; -import static com.android.app.animation.Interpolators.FAST_OUT_SLOW_IN; +import static com.android.systemui.animation.Interpolators.FAST_OUT_SLOW_IN; import static java.lang.annotation.RetentionPolicy.SOURCE; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java index 5a129fccff06..bafc474d7123 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java @@ -39,9 +39,9 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.statusbar.AlphaOptimizedImageView; import com.android.systemui.statusbar.notification.collection.NotificationEntry; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java index d5d7f75fbaa1..5f4c9267ee4a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSnooze.java @@ -45,11 +45,11 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption; 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 b24cec150941..5aaf63f8d32d 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 @@ -23,8 +23,8 @@ import android.util.AttributeSet; import android.view.View; import android.view.animation.Interpolator; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.animation.Interpolators; import java.util.function.Consumer; 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 84fe9ef6f1ac..9a777ea6230b 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 @@ -34,10 +34,10 @@ import android.widget.TextView; import androidx.annotation.Nullable; -import com.android.app.animation.Interpolators; import com.android.internal.widget.CachingIconView; import com.android.internal.widget.NotificationExpandButton; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.TransformableView; import com.android.systemui.statusbar.ViewTransformationHelper; import com.android.systemui.statusbar.notification.CustomInterpolatorTransformation; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java index d73bbebe40b4..7f3381ccd38a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ExpandableViewState.java @@ -22,8 +22,8 @@ import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.view.View; -import com.android.app.animation.Interpolators; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.ExpandableView; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java index 9a33a9440602..0b435fe9dcc6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSection.java @@ -26,7 +26,7 @@ import android.graphics.Rect; import android.view.View; import android.view.animation.Interpolator; -import com.android.app.animation.Interpolators; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.notification.ShadeViewRefactor; import com.android.systemui.statusbar.notification.row.ExpandableView; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 82608b1b1c7d..3bc2066d4410 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -75,7 +75,6 @@ import android.view.animation.Interpolator; import android.widget.OverScroller; import android.widget.ScrollView; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.graphics.ColorUtils; import com.android.internal.jank.InteractionJankMonitor; @@ -87,8 +86,10 @@ import com.android.systemui.Dependency; import com.android.systemui.Dumpable; import com.android.systemui.ExpandHelper; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper; import com.android.systemui.shade.ShadeController; import com.android.systemui.statusbar.CommandQueue; @@ -319,6 +320,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable }; private NotificationStackScrollLogger mLogger; private CentralSurfaces mCentralSurfaces; + private ActivityStarter mActivityStarter; private final int[] mTempInt2 = new int[2]; private boolean mGenerateChildOrderChangedEvent; private final HashSet<Runnable> mAnimationFinishedRunnables = new HashSet<>(); @@ -4814,6 +4816,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable this.mCentralSurfaces = centralSurfaces; } + public void setActivityStarter(ActivityStarter activityStarter) { + mActivityStarter = activityStarter; + } + @ShadeViewRefactor(RefactorComponent.STATE_RESOLVER) void requestAnimateEverything() { if (mIsExpanded && mAnimationsEnabled) { @@ -5579,7 +5585,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable Intent intent = showHistory ? new Intent(Settings.ACTION_NOTIFICATION_HISTORY) : new Intent(Settings.ACTION_NOTIFICATION_SETTINGS); - mCentralSurfaces.startActivity(intent, true, true, Intent.FLAG_ACTIVITY_SINGLE_TOP); + mActivityStarter.startActivity(intent, true, true, Intent.FLAG_ACTIVITY_SINGLE_TOP); }); setEmptyShadeView(view); updateEmptyShadeView( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java index b69ce3861342..4751fb68697b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java @@ -63,6 +63,7 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.media.controls.ui.KeyguardMediaController; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEventListener; @@ -198,6 +199,7 @@ public class NotificationStackScrollLayoutController { private final NotificationTargetsHelper mNotificationTargetsHelper; private final SecureSettings mSecureSettings; private final NotificationDismissibilityProvider mDismissibilityProvider; + private final ActivityStarter mActivityStarter; private View mLongPressedView; @@ -487,7 +489,7 @@ public class NotificationStackScrollLayoutController { mView.addSwipedOutView(view); mFalsingCollector.onNotificationDismissed(); if (mFalsingCollector.shouldEnforceBouncer()) { - mCentralSurfaces.executeRunnableDismissingKeyguard( + mActivityStarter.executeRunnableDismissingKeyguard( null, null /* cancelAction */, false /* dismissShade */, @@ -678,7 +680,8 @@ public class NotificationStackScrollLayoutController { FeatureFlags featureFlags, NotificationTargetsHelper notificationTargetsHelper, SecureSettings secureSettings, - NotificationDismissibilityProvider dismissibilityProvider) { + NotificationDismissibilityProvider dismissibilityProvider, + ActivityStarter activityStarter) { mView = view; mStackStateLogger = stackLogger; mLogger = logger; @@ -724,6 +727,7 @@ public class NotificationStackScrollLayoutController { mNotificationTargetsHelper = notificationTargetsHelper; mSecureSettings = secureSettings; mDismissibilityProvider = dismissibilityProvider; + mActivityStarter = activityStarter; updateResources(); setUpView(); } @@ -734,6 +738,7 @@ public class NotificationStackScrollLayoutController { mView.setLogger(mLogger); mView.setTouchHandler(new TouchHandler()); mView.setCentralSurfaces(mCentralSurfaces); + mView.setActivityStarter(mActivityStarter); mView.setClearAllAnimationListener(this::onAnimationEnd); mView.setClearAllListener((selection) -> mUiEventLogger.log( NotificationPanelEvent.fromSelection(selection))); 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 f07dd00827b0..ee72943bef57 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 @@ -22,9 +22,9 @@ import android.animation.ValueAnimator; import android.util.Property; import android.view.View; -import com.android.app.animation.Interpolators; import com.android.keyguard.KeyguardSliceView; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.shared.clocks.AnimatableClockView; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.StatusBarIconView; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ViewState.java index f4605be2b9c5..d07da381a186 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ViewState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ViewState.java @@ -26,9 +26,9 @@ import android.util.Property; import android.view.View; import android.view.animation.Interpolator; -import com.android.app.animation.Interpolators; import com.android.systemui.Dumpable; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.NotificationFadeAware.FadeOptimizedNotification; import com.android.systemui.statusbar.notification.PropertyAnimator; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarterImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarterImpl.kt new file mode 100644 index 000000000000..d9dc8878fa61 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarterImpl.kt @@ -0,0 +1,867 @@ +/* + * Copyright (C) 2023 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.phone + +import android.app.ActivityManager +import android.app.ActivityOptions +import android.app.ActivityTaskManager +import android.app.PendingIntent +import android.app.TaskStackBuilder +import android.content.Context +import android.content.Intent +import android.os.RemoteException +import android.os.UserHandle +import android.provider.Settings +import android.util.Log +import android.view.RemoteAnimationAdapter +import android.view.View +import android.view.WindowManager +import com.android.keyguard.KeyguardUpdateMonitor +import com.android.systemui.ActivityIntentHelper +import com.android.systemui.R +import com.android.systemui.animation.ActivityLaunchAnimator +import com.android.systemui.animation.ActivityLaunchAnimator.PendingIntentStarter +import com.android.systemui.animation.DelegateLaunchAnimatorController +import com.android.systemui.assist.AssistManager +import com.android.systemui.camera.CameraIntents.Companion.isInsecureCameraIntent +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.keyguard.KeyguardViewMediator +import com.android.systemui.keyguard.WakefulnessLifecycle +import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.plugins.ActivityStarter.OnDismissAction +import com.android.systemui.settings.UserTracker +import com.android.systemui.shade.ShadeController +import com.android.systemui.statusbar.NotificationLockscreenUserManager +import com.android.systemui.statusbar.SysuiStatusBarStateController +import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow +import com.android.systemui.statusbar.policy.DeviceProvisionedController +import com.android.systemui.statusbar.policy.KeyguardStateController +import com.android.systemui.statusbar.window.StatusBarWindowController +import com.android.systemui.util.concurrency.DelayableExecutor +import com.android.systemui.util.kotlin.getOrNull +import dagger.Lazy +import java.util.Optional +import javax.inject.Inject + +/** Handles start activity logic in SystemUI. */ +@SysUISingleton +class ActivityStarterImpl +@Inject +constructor( + private val centralSurfacesOptLazy: Lazy<Optional<CentralSurfaces>>, + private val assistManagerLazy: Lazy<AssistManager>, + private val dozeServiceHostLazy: Lazy<DozeServiceHost>, + private val biometricUnlockControllerLazy: Lazy<BiometricUnlockController>, + private val keyguardViewMediatorLazy: Lazy<KeyguardViewMediator>, + private val shadeControllerLazy: Lazy<ShadeController>, + private val statusBarKeyguardViewManagerLazy: Lazy<StatusBarKeyguardViewManager>, + private val activityLaunchAnimator: ActivityLaunchAnimator, + private val context: Context, + private val lockScreenUserManager: NotificationLockscreenUserManager, + private val statusBarWindowController: StatusBarWindowController, + private val wakefulnessLifecycle: WakefulnessLifecycle, + private val keyguardStateController: KeyguardStateController, + private val statusBarStateController: SysuiStatusBarStateController, + private val keyguardUpdateMonitor: KeyguardUpdateMonitor, + private val deviceProvisionedController: DeviceProvisionedController, + private val userTracker: UserTracker, + private val activityIntentHelper: ActivityIntentHelper, + @Main private val mainExecutor: DelayableExecutor, +) : ActivityStarter { + companion object { + const val TAG = "ActivityStarterImpl" + } + + private val centralSurfaces: CentralSurfaces? + get() = centralSurfacesOptLazy.get().getOrNull() + + private val activityStarterInternal = ActivityStarterInternal() + + override fun startPendingIntentDismissingKeyguard(intent: PendingIntent) { + activityStarterInternal.startPendingIntentDismissingKeyguard(intent = intent) + } + + override fun startPendingIntentDismissingKeyguard( + intent: PendingIntent, + intentSentUiThreadCallback: Runnable?, + ) { + activityStarterInternal.startPendingIntentDismissingKeyguard( + intent = intent, + intentSentUiThreadCallback = intentSentUiThreadCallback, + ) + } + + override fun startPendingIntentDismissingKeyguard( + intent: PendingIntent, + intentSentUiThreadCallback: Runnable?, + associatedView: View?, + ) { + activityStarterInternal.startPendingIntentDismissingKeyguard( + intent = intent, + intentSentUiThreadCallback = intentSentUiThreadCallback, + associatedView = associatedView, + ) + } + + override fun startPendingIntentDismissingKeyguard( + intent: PendingIntent, + intentSentUiThreadCallback: Runnable?, + animationController: ActivityLaunchAnimator.Controller?, + ) { + activityStarterInternal.startPendingIntentDismissingKeyguard( + intent = intent, + intentSentUiThreadCallback = intentSentUiThreadCallback, + animationController = animationController, + ) + } + + /** + * TODO(b/279084380): Change callers to just call startActivityDismissingKeyguard and deprecate + * this. + */ + override fun startActivity(intent: Intent, dismissShade: Boolean) { + activityStarterInternal.startActivityDismissingKeyguard( + intent = intent, + dismissShade = dismissShade, + ) + } + + /** + * TODO(b/279084380): Change callers to just call startActivityDismissingKeyguard and deprecate + * this. + */ + override fun startActivity(intent: Intent, onlyProvisioned: Boolean, dismissShade: Boolean) { + activityStarterInternal.startActivityDismissingKeyguard( + intent = intent, + onlyProvisioned = onlyProvisioned, + dismissShade = dismissShade, + ) + } + + /** + * TODO(b/279084380): Change callers to just call startActivityDismissingKeyguard and deprecate + * this. + */ + override fun startActivity( + intent: Intent, + dismissShade: Boolean, + callback: ActivityStarter.Callback?, + ) { + activityStarterInternal.startActivityDismissingKeyguard( + intent = intent, + dismissShade = dismissShade, + callback = callback, + ) + } + + /** + * TODO(b/279084380): Change callers to just call startActivityDismissingKeyguard and deprecate + * this. + */ + override fun startActivity( + intent: Intent, + onlyProvisioned: Boolean, + dismissShade: Boolean, + flags: Int, + ) { + activityStarterInternal.startActivityDismissingKeyguard( + intent = intent, + onlyProvisioned = onlyProvisioned, + dismissShade = dismissShade, + flags = flags, + ) + } + + override fun startActivity( + intent: Intent, + dismissShade: Boolean, + animationController: ActivityLaunchAnimator.Controller?, + showOverLockscreenWhenLocked: Boolean, + ) { + activityStarterInternal.startActivity( + intent = intent, + dismissShade = dismissShade, + animationController = animationController, + showOverLockscreenWhenLocked = showOverLockscreenWhenLocked, + ) + } + override fun startActivity( + intent: Intent, + dismissShade: Boolean, + animationController: ActivityLaunchAnimator.Controller?, + showOverLockscreenWhenLocked: Boolean, + userHandle: UserHandle?, + ) { + activityStarterInternal.startActivity( + intent = intent, + dismissShade = dismissShade, + animationController = animationController, + showOverLockscreenWhenLocked = showOverLockscreenWhenLocked, + userHandle = userHandle, + ) + } + + override fun postStartActivityDismissingKeyguard(intent: PendingIntent) { + postOnUiThread { + activityStarterInternal.startPendingIntentDismissingKeyguard( + intent = intent, + ) + } + } + + override fun postStartActivityDismissingKeyguard( + intent: PendingIntent, + animationController: ActivityLaunchAnimator.Controller? + ) { + postOnUiThread { + activityStarterInternal.startPendingIntentDismissingKeyguard( + intent = intent, + animationController = animationController, + ) + } + } + + override fun postStartActivityDismissingKeyguard(intent: Intent, delay: Int) { + postOnUiThread(delay) { + activityStarterInternal.startActivityDismissingKeyguard(intent = intent) + } + } + + override fun postStartActivityDismissingKeyguard( + intent: Intent, + delay: Int, + animationController: ActivityLaunchAnimator.Controller?, + ) { + postOnUiThread(delay) { + activityStarterInternal.startActivityDismissingKeyguard( + intent = intent, + animationController = animationController, + ) + } + } + + override fun postStartActivityDismissingKeyguard( + intent: Intent, + delay: Int, + animationController: ActivityLaunchAnimator.Controller?, + customMessage: String?, + ) { + postOnUiThread(delay) { + activityStarterInternal.startActivityDismissingKeyguard( + intent = intent, + animationController = animationController, + customMessage = customMessage, + ) + } + } + + override fun dismissKeyguardThenExecute( + action: OnDismissAction, + cancel: Runnable?, + afterKeyguardGone: Boolean, + ) { + activityStarterInternal.dismissKeyguardThenExecute( + action = action, + cancel = cancel, + afterKeyguardGone = afterKeyguardGone, + ) + } + + override fun dismissKeyguardThenExecute( + action: OnDismissAction, + cancel: Runnable?, + afterKeyguardGone: Boolean, + customMessage: String?, + ) { + activityStarterInternal.dismissKeyguardThenExecute( + action = action, + cancel = cancel, + afterKeyguardGone = afterKeyguardGone, + customMessage = customMessage, + ) + } + + override fun startActivityDismissingKeyguard( + intent: Intent, + onlyProvisioned: Boolean, + dismissShade: Boolean, + disallowEnterPictureInPictureWhileLaunching: Boolean, + callback: ActivityStarter.Callback?, + flags: Int, + animationController: ActivityLaunchAnimator.Controller?, + userHandle: UserHandle?, + ) { + activityStarterInternal.startActivityDismissingKeyguard( + intent = intent, + onlyProvisioned = onlyProvisioned, + dismissShade = dismissShade, + disallowEnterPictureInPictureWhileLaunching = + disallowEnterPictureInPictureWhileLaunching, + callback = callback, + flags = flags, + animationController = animationController, + userHandle = userHandle, + ) + } + + override fun executeRunnableDismissingKeyguard( + runnable: Runnable?, + cancelAction: Runnable?, + dismissShade: Boolean, + afterKeyguardGone: Boolean, + deferred: Boolean, + ) { + activityStarterInternal.executeRunnableDismissingKeyguard( + runnable = runnable, + cancelAction = cancelAction, + dismissShade = dismissShade, + afterKeyguardGone = afterKeyguardGone, + deferred = deferred, + ) + } + + override fun executeRunnableDismissingKeyguard( + runnable: Runnable?, + cancelAction: Runnable?, + dismissShade: Boolean, + afterKeyguardGone: Boolean, + deferred: Boolean, + willAnimateOnKeyguard: Boolean, + customMessage: String?, + ) { + activityStarterInternal.executeRunnableDismissingKeyguard( + runnable = runnable, + cancelAction = cancelAction, + dismissShade = dismissShade, + afterKeyguardGone = afterKeyguardGone, + deferred = deferred, + willAnimateOnKeyguard = willAnimateOnKeyguard, + customMessage = customMessage, + ) + } + + override fun postQSRunnableDismissingKeyguard(runnable: Runnable?) { + postOnUiThread { + statusBarStateController.setLeaveOpenOnKeyguardHide(true) + activityStarterInternal.executeRunnableDismissingKeyguard( + runnable = { runnable?.let { postOnUiThread(runnable = it) } }, + ) + } + } + + private fun postOnUiThread(delay: Int = 0, runnable: Runnable) { + mainExecutor.executeDelayed(runnable, delay.toLong()) + } + + /** + * Encapsulates the activity logic for activity starter. + * + * Logic is duplicated in {@link CentralSurfacesImpl} + */ + private inner class ActivityStarterInternal { + /** Starts an activity after dismissing keyguard. */ + fun startActivityDismissingKeyguard( + intent: Intent, + onlyProvisioned: Boolean = false, + dismissShade: Boolean = false, + disallowEnterPictureInPictureWhileLaunching: Boolean = false, + callback: ActivityStarter.Callback? = null, + flags: Int = 0, + animationController: ActivityLaunchAnimator.Controller? = null, + userHandle: UserHandle? = null, + customMessage: String? = null, + ) { + val userHandle: UserHandle = userHandle ?: getActivityUserHandle(intent) + + if (onlyProvisioned && !deviceProvisionedController.isDeviceProvisioned) return + + val willLaunchResolverActivity: Boolean = + activityIntentHelper.wouldLaunchResolverActivity( + intent, + lockScreenUserManager.currentUserId + ) + + val animate = + animationController != null && + !willLaunchResolverActivity && + centralSurfaces?.shouldAnimateLaunch(true /* isActivityIntent */) == true + val animController = + wrapAnimationController( + animationController = animationController, + dismissShade = dismissShade, + isLaunchForActivity = true, + ) + + // If we animate, we will dismiss the shade only once the animation is done. This is + // taken care of by the StatusBarLaunchAnimationController. + val dismissShadeDirectly = dismissShade && animController == null + + val runnable = Runnable { + assistManagerLazy.get().hideAssist() + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + intent.addFlags(flags) + val result = intArrayOf(ActivityManager.START_CANCELED) + activityLaunchAnimator.startIntentWithAnimation( + animController, + animate, + intent.getPackage() + ) { adapter: RemoteAnimationAdapter? -> + val options = + ActivityOptions( + CentralSurfaces.getActivityOptions(centralSurfaces!!.displayId, adapter) + ) + + // We know that the intent of the caller is to dismiss the keyguard and + // this runnable is called right after the keyguard is solved, so we tell + // WM that we should dismiss it to avoid flickers when opening an activity + // that can also be shown over the keyguard. + options.setDismissKeyguard() + options.setDisallowEnterPictureInPictureWhileLaunching( + disallowEnterPictureInPictureWhileLaunching + ) + if (isInsecureCameraIntent(intent)) { + // Normally an activity will set it's requested rotation + // animation on its window. However when launching an activity + // causes the orientation to change this is too late. In these cases + // the default animation is used. This doesn't look good for + // the camera (as it rotates the camera contents out of sync + // with physical reality). So, we ask the WindowManager to + // force the cross fade animation if an orientation change + // happens to occur during the launch. + options.rotationAnimationHint = + WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS + } + if (Settings.Panel.ACTION_VOLUME == intent.action) { + // Settings Panel is implemented as activity(not a dialog), so + // underlying app is paused and may enter picture-in-picture mode + // as a result. + // So we need to disable picture-in-picture mode here + // if it is volume panel. + options.setDisallowEnterPictureInPictureWhileLaunching(true) + } + try { + result[0] = + ActivityTaskManager.getService() + .startActivityAsUser( + null, + context.basePackageName, + context.attributionTag, + intent, + intent.resolveTypeIfNeeded(context.contentResolver), + null, + null, + 0, + Intent.FLAG_ACTIVITY_NEW_TASK, + null, + options.toBundle(), + userHandle.identifier, + ) + } catch (e: RemoteException) { + Log.w(TAG, "Unable to start activity", e) + } + result[0] + } + callback?.onActivityStarted(result[0]) + } + val cancelRunnable = Runnable { + callback?.onActivityStarted(ActivityManager.START_CANCELED) + } + // Do not deferKeyguard when occluded because, when keyguard is occluded, + // we do not launch the activity until keyguard is done. + val occluded = (keyguardStateController.isShowing && keyguardStateController.isOccluded) + val deferred = !occluded + executeRunnableDismissingKeyguard( + runnable, + cancelRunnable, + dismissShadeDirectly, + willLaunchResolverActivity, + deferred, + animate, + customMessage, + ) + } + + /** Starts a pending intent after dismissing keyguard. */ + fun startPendingIntentDismissingKeyguard( + intent: PendingIntent, + intentSentUiThreadCallback: Runnable? = null, + associatedView: View? = null, + animationController: ActivityLaunchAnimator.Controller? = null, + ) { + val animationController = + if (associatedView is ExpandableNotificationRow) { + centralSurfaces?.getAnimatorControllerFromNotification(associatedView) + } else animationController + + val willLaunchResolverActivity = + (intent.isActivity && + activityIntentHelper.wouldPendingLaunchResolverActivity( + intent, + lockScreenUserManager.currentUserId, + )) + + val animate = + !willLaunchResolverActivity && + animationController != null && + centralSurfaces?.shouldAnimateLaunch(intent.isActivity) == true + + // If we animate, don't collapse the shade and defer the keyguard dismiss (in case we + // run the animation on the keyguard). The animation will take care of (instantly) + // collapsing the shade and hiding the keyguard once it is done. + val collapse = !animate + executeRunnableDismissingKeyguard( + runnable = { + try { + // We wrap animationCallback with a StatusBarLaunchAnimatorController so + // that the shade is collapsed after the animation (or when it is cancelled, + // aborted, etc). + val controller: ActivityLaunchAnimator.Controller? = + wrapAnimationController( + animationController = animationController, + dismissShade = true, + isLaunchForActivity = intent.isActivity, + ) + activityLaunchAnimator.startPendingIntentWithAnimation( + controller, + animate, + intent.creatorPackage, + object : PendingIntentStarter { + override fun startPendingIntent( + animationAdapter: RemoteAnimationAdapter? + ): Int { + val options = + ActivityOptions( + CentralSurfaces.getActivityOptions( + centralSurfaces!!.displayId, + animationAdapter + ) + ) + // TODO b/221255671: restrict this to only be set for + // notifications + options.isEligibleForLegacyPermissionPrompt = true + return intent.sendAndReturnResult( + null, + 0, + null, + null, + null, + null, + options.toBundle() + ) + } + }, + ) + } catch (e: PendingIntent.CanceledException) { + // the stack trace isn't very helpful here. + // Just log the exception message. + Log.w(TAG, "Sending intent failed: $e") + if (!collapse) { + // executeRunnableDismissingKeyguard did not collapse for us already. + centralSurfaces?.collapsePanelOnMainThread() + } + // TODO: Dismiss Keyguard. + } + if (intent.isActivity) { + assistManagerLazy.get().hideAssist() + } + intentSentUiThreadCallback?.let { postOnUiThread(runnable = it) } + }, + afterKeyguardGone = willLaunchResolverActivity, + dismissShade = collapse, + willAnimateOnKeyguard = animate, + ) + } + + /** Starts an Activity. */ + fun startActivity( + intent: Intent, + dismissShade: Boolean = false, + animationController: ActivityLaunchAnimator.Controller? = null, + showOverLockscreenWhenLocked: Boolean = false, + userHandle: UserHandle? = null, + ) { + val userHandle = userHandle ?: getActivityUserHandle(intent) + // Make sure that we dismiss the keyguard if it is directly dismissible or when we don't + // want to show the activity above it. + if (keyguardStateController.isUnlocked || !showOverLockscreenWhenLocked) { + startActivityDismissingKeyguard( + intent = intent, + onlyProvisioned = false, + dismissShade = dismissShade, + disallowEnterPictureInPictureWhileLaunching = false, + callback = null, + flags = 0, + animationController = animationController, + userHandle = userHandle, + ) + return + } + + val animate = + animationController != null && + centralSurfaces?.shouldAnimateLaunch( + /* isActivityIntent= */ true, + showOverLockscreenWhenLocked + ) == true + + var controller: ActivityLaunchAnimator.Controller? = null + if (animate) { + // Wrap the animation controller to dismiss the shade and set + // mIsLaunchingActivityOverLockscreen during the animation. + val delegate = + wrapAnimationController( + animationController = animationController, + dismissShade = dismissShade, + isLaunchForActivity = true, + ) + delegate?.let { + controller = + object : DelegateLaunchAnimatorController(delegate) { + override fun onIntentStarted(willAnimate: Boolean) { + delegate?.onIntentStarted(willAnimate) + if (willAnimate) { + centralSurfaces?.setIsLaunchingActivityOverLockscreen(true) + } + } + + override fun onLaunchAnimationStart(isExpandingFullyAbove: Boolean) { + super.onLaunchAnimationStart(isExpandingFullyAbove) + + // Double check that the keyguard is still showing and not going + // away, but if so set the keyguard occluded. Typically, WM will let + // KeyguardViewMediator know directly, but we're overriding that to + // play the custom launch animation, so we need to take care of that + // here. The unocclude animation is not overridden, so WM will call + // KeyguardViewMediator's unocclude animation runner when the + // activity is exited. + if ( + keyguardStateController.isShowing && + !keyguardStateController.isKeyguardGoingAway + ) { + Log.d(TAG, "Setting occluded = true in #startActivity.") + keyguardViewMediatorLazy + .get() + .setOccluded(true /* isOccluded */, true /* animate */) + } + } + + override fun onLaunchAnimationEnd(isExpandingFullyAbove: Boolean) { + // Set mIsLaunchingActivityOverLockscreen to false before actually + // finishing the animation so that we can assume that + // mIsLaunchingActivityOverLockscreen being true means that we will + // collapse the shade (or at least run the post collapse runnables) + // later on. + centralSurfaces?.setIsLaunchingActivityOverLockscreen(false) + delegate?.onLaunchAnimationEnd(isExpandingFullyAbove) + } + + override fun onLaunchAnimationCancelled( + newKeyguardOccludedState: Boolean? + ) { + if (newKeyguardOccludedState != null) { + keyguardViewMediatorLazy + .get() + .setOccluded(newKeyguardOccludedState, false /* animate */) + } + + // Set mIsLaunchingActivityOverLockscreen to false before actually + // finishing the animation so that we can assume that + // mIsLaunchingActivityOverLockscreen being true means that we will + // collapse the shade (or at least run the // post collapse + // runnables) later on. + centralSurfaces?.setIsLaunchingActivityOverLockscreen(false) + delegate.onLaunchAnimationCancelled(newKeyguardOccludedState) + } + } + } + } else if (dismissShade) { + // The animation will take care of dismissing the shade at the end of the animation. + // If we don't animate, collapse it directly. + centralSurfaces?.collapseShade() + } + + // We should exit the dream to prevent the activity from starting below the + // dream. + if (keyguardUpdateMonitor.isDreaming) { + centralSurfaces?.awakenDreams() + } + + activityLaunchAnimator.startIntentWithAnimation( + controller, + animate, + intent.getPackage(), + showOverLockscreenWhenLocked + ) { adapter: RemoteAnimationAdapter? -> + TaskStackBuilder.create(context) + .addNextIntent(intent) + .startActivities( + CentralSurfaces.getActivityOptions(centralSurfaces!!.displayId, adapter), + userHandle + ) + } + } + + /** Executes an action after dismissing keyguard. */ + fun dismissKeyguardThenExecute( + action: OnDismissAction, + cancel: Runnable? = null, + afterKeyguardGone: Boolean = false, + customMessage: String? = null, + ) { + if ( + !action.willRunAnimationOnKeyguard() && + wakefulnessLifecycle.wakefulness == WakefulnessLifecycle.WAKEFULNESS_ASLEEP && + keyguardStateController.canDismissLockScreen() && + !statusBarStateController.leaveOpenOnKeyguardHide() && + dozeServiceHostLazy.get().isPulsing + ) { + // Reuse the biometric wake-and-unlock transition if we dismiss keyguard from a + // pulse. + // TODO: Factor this transition out of BiometricUnlockController. + biometricUnlockControllerLazy + .get() + .startWakeAndUnlock(BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING) + } + if (keyguardStateController.isShowing) { + statusBarKeyguardViewManagerLazy + .get() + .dismissWithAction(action, cancel, afterKeyguardGone, customMessage) + } else { + // If the keyguard isn't showing but the device is dreaming, we should exit the + // dream. + if (keyguardUpdateMonitor.isDreaming) { + centralSurfaces?.awakenDreams() + } + action.onDismiss() + } + } + + /** Executes an action after dismissing keyguard. */ + fun executeRunnableDismissingKeyguard( + runnable: Runnable? = null, + cancelAction: Runnable? = null, + dismissShade: Boolean = false, + afterKeyguardGone: Boolean = false, + deferred: Boolean = false, + willAnimateOnKeyguard: Boolean = false, + customMessage: String? = null, + ) { + val onDismissAction: OnDismissAction = + object : OnDismissAction { + override fun onDismiss(): Boolean { + if (runnable != null) { + if ( + keyguardStateController.isShowing && + keyguardStateController.isOccluded + ) { + statusBarKeyguardViewManagerLazy + .get() + .addAfterKeyguardGoneRunnable(runnable) + } else { + mainExecutor.execute(runnable) + } + } + if (dismissShade) { + if ( + shadeControllerLazy.get().isExpandedVisible && + !statusBarKeyguardViewManagerLazy.get().isBouncerShowing + ) { + shadeControllerLazy.get().animateCollapseShadeDelayed() + } else { + // Do it after DismissAction has been processed to conserve the + // needed ordering. + postOnUiThread { + shadeControllerLazy.get().runPostCollapseRunnables() + } + } + } + return deferred + } + + override fun willRunAnimationOnKeyguard(): Boolean { + return willAnimateOnKeyguard + } + } + dismissKeyguardThenExecute( + onDismissAction, + cancelAction, + afterKeyguardGone, + customMessage, + ) + } + + /** + * Return a [ActivityLaunchAnimator.Controller] wrapping `animationController` so that: + * - if it launches in the notification shade window and `dismissShade` is true, then the + * shade will be instantly dismissed at the end of the animation. + * - if it launches in status bar window, it will make the status bar window match the + * device size during the animation (that way, the animation won't be clipped by the + * status bar size). + * + * @param animationController the controller that is wrapped and will drive the main + * animation. + * @param dismissShade whether the notification shade will be dismissed at the end of the + * animation. This is ignored if `animationController` is not animating in the shade + * window. + * @param isLaunchForActivity whether the launch is for an activity. + */ + private fun wrapAnimationController( + animationController: ActivityLaunchAnimator.Controller?, + dismissShade: Boolean, + isLaunchForActivity: Boolean, + ): ActivityLaunchAnimator.Controller? { + if (animationController == null) { + return null + } + val rootView = animationController.launchContainer.rootView + val controllerFromStatusBar: Optional<ActivityLaunchAnimator.Controller> = + statusBarWindowController.wrapAnimationControllerIfInStatusBar( + rootView, + animationController + ) + if (controllerFromStatusBar.isPresent) { + return controllerFromStatusBar.get() + } + + centralSurfaces?.let { + // If the view is not in the status bar, then we are animating a view in the shade. + // We have to make sure that we collapse it when the animation ends or is cancelled. + if (dismissShade) { + return StatusBarLaunchAnimatorController( + animationController, + it, + isLaunchForActivity + ) + } + } + + return animationController + } + + /** Retrieves the current user handle to start the Activity. */ + private fun getActivityUserHandle(intent: Intent): UserHandle { + val packages: Array<String> = + context.resources.getStringArray(R.array.system_ui_packages) + for (pkg in packages) { + if (intent.component == null) break + if (pkg == intent.component.packageName) { + return UserHandle(UserHandle.myUserId()) + } + } + return userTracker.userHandle + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java index 459071280a1e..9dce332985f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java @@ -33,9 +33,9 @@ import android.os.SystemClock; import android.util.Log; import android.view.View; -import com.android.app.animation.Interpolators; import com.android.settingslib.Utils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java index f579d304b268..4e690696b5d3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java @@ -45,7 +45,8 @@ import com.android.systemui.Dumpable; import com.android.systemui.animation.ActivityLaunchAnimator; import com.android.systemui.animation.RemoteTransitionAdapter; import com.android.systemui.navigationbar.NavigationBarView; -import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.plugins.ActivityStarter.Callback; +import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper; import com.android.systemui.qs.QSPanelController; import com.android.systemui.shade.NotificationShadeWindowView; @@ -53,11 +54,13 @@ import com.android.systemui.shade.NotificationShadeWindowViewController; import com.android.systemui.shade.ShadeViewController; import com.android.systemui.statusbar.LightRevealScrim; import com.android.systemui.statusbar.NotificationPresenter; +import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.util.Compile; import java.io.PrintWriter; -public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwner { +/** */ +public interface CentralSurfaces extends Dumpable, LifecycleOwner { boolean MULTIUSER_DEBUG = false; // Should match the values in PhoneWindowManager String SYSTEM_DIALOG_REASON_KEY = "reason"; @@ -230,29 +233,33 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn boolean isShadeDisabled(); - @Override + /** Starts an activity. Please use ActivityStarter instead of using these methods directly. */ void startActivity(Intent intent, boolean onlyProvisioned, boolean dismissShade, int flags); - @Override + /** Starts an activity. Please use ActivityStarter instead of using these methods directly. */ void startActivity(Intent intent, boolean dismissShade); - @Override + /** Starts an activity. Please use ActivityStarter instead of using these methods directly. */ + void startActivity(Intent intent, boolean dismissShade, + @Nullable ActivityLaunchAnimator.Controller animationController); + + /** Starts an activity. Please use ActivityStarter instead of using these methods directly. */ void startActivity(Intent intent, boolean dismissShade, @Nullable ActivityLaunchAnimator.Controller animationController, boolean showOverLockscreenWhenLocked); - @Override + /** Starts an activity. Please use ActivityStarter instead of using these methods directly. */ void startActivity(Intent intent, boolean dismissShade, @Nullable ActivityLaunchAnimator.Controller animationController, boolean showOverLockscreenWhenLocked, UserHandle userHandle); boolean isLaunchingActivityOverLockscreen(); - @Override + /** Starts an activity. Please use ActivityStarter instead of using these methods directly. */ void startActivity(Intent intent, boolean onlyProvisioned, boolean dismissShade); - @Override + /** Starts an activity. Please use ActivityStarter instead of using these methods directly. */ void startActivity(Intent intent, boolean dismissShade, Callback callback); boolean isWakeUpComingFromTouch(); @@ -315,19 +322,34 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn float getDisplayHeight(); + /** Starts an activity intent that dismisses keyguard. + * + * Please use ActivityStarter instead of using these methods directly. + */ void startActivityDismissingKeyguard(Intent intent, boolean onlyProvisioned, boolean dismissShade, int flags); + /** Starts an activity intent that dismisses keyguard. + * + * Please use ActivityStarter instead of using these methods directly. + */ void startActivityDismissingKeyguard(Intent intent, boolean onlyProvisioned, boolean dismissShade); + /** Starts an activity intent that dismisses keyguard. + * + * Please use ActivityStarter instead of using these methods directly. + */ void startActivityDismissingKeyguard(Intent intent, boolean onlyProvisioned, boolean dismissShade, boolean disallowEnterPictureInPictureWhileLaunching, Callback callback, int flags, @Nullable ActivityLaunchAnimator.Controller animationController, UserHandle userHandle); - /** Starts an activity intent that dismisses keyguard. */ + /** Starts an activity intent that dismisses keyguard. + * + * Please use ActivityStarter instead of using these methods directly. + */ void startActivityDismissingKeyguard(Intent intent, boolean onlyProvisioned, boolean dismissShade, boolean disallowEnterPictureInPictureWhileLaunching, Callback callback, int flags, @@ -352,29 +374,70 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn void resetUserExpandedStates(); - @Override + /** + * Dismisses Keyguard and executes an action afterwards. + * + * Please use ActivityStarter instead of using these methods directly. + */ void dismissKeyguardThenExecute(OnDismissAction action, Runnable cancelAction, boolean afterKeyguardGone); + /** + * Dismisses Keyguard and executes an action afterwards. + * + * Please use ActivityStarter instead of using these methods directly. + */ + void dismissKeyguardThenExecute(OnDismissAction action, Runnable cancelAction, + boolean afterKeyguardGone, @Nullable String customMessage); + void setLockscreenUser(int newUserId); - @Override + /** + * Starts a QS runnable on the main thread and dismisses keyguard. + * + * Please use ActivityStarter instead of using these methods directly. + */ void postQSRunnableDismissingKeyguard(Runnable runnable); - @Override + /** + * Starts an activity on the main thread with a delay. + * + * Please use ActivityStarter instead of using these methods directly. + */ void postStartActivityDismissingKeyguard(PendingIntent intent); - @Override + /** + * Starts an activity on the main thread with a delay. + * + * Please use ActivityStarter instead of using these methods directly. + */ void postStartActivityDismissingKeyguard(PendingIntent intent, @Nullable ActivityLaunchAnimator.Controller animationController); - @Override + /** + * Starts an activity on the main thread with a delay. + * + * Please use ActivityStarter instead of using these methods directly. + */ void postStartActivityDismissingKeyguard(Intent intent, int delay); - @Override + /** + * Starts an activity on the main thread with a delay. + * + * Please use ActivityStarter instead of using these methods directly. + */ void postStartActivityDismissingKeyguard(Intent intent, int delay, @Nullable ActivityLaunchAnimator.Controller animationController); + /** + * Starts an activity on the main thread with a delay. + * + * Please use ActivityStarter instead of using these methods directly. + */ + void postStartActivityDismissingKeyguard(Intent intent, int delay, + @Nullable ActivityLaunchAnimator.Controller animationController, + @Nullable String customMessage); + void showKeyguard(); boolean hideKeyguard(); @@ -468,18 +531,14 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn void awakenDreams(); - @Override void startPendingIntentDismissingKeyguard(PendingIntent intent); - @Override void startPendingIntentDismissingKeyguard( PendingIntent intent, @Nullable Runnable intentSentUiThreadCallback); - @Override void startPendingIntentDismissingKeyguard(PendingIntent intent, Runnable intentSentUiThreadCallback, View associatedView); - @Override void startPendingIntentDismissingKeyguard( PendingIntent intent, @Nullable Runnable intentSentUiThreadCallback, @Nullable ActivityLaunchAnimator.Controller animationController); @@ -554,4 +613,15 @@ public interface CentralSurfaces extends Dumpable, ActivityStarter, LifecycleOwn mDeviceId = deviceId; } } + + /** + * Sets launching activity over LS state in central surfaces. + */ + void setIsLaunchingActivityOverLockscreen(boolean isLaunchingActivityOverLockscreen); + + /** + * Gets an animation controller from a notification row. + */ + ActivityLaunchAnimator.Controller getAnimatorControllerFromNotification( + ExpandableNotificationRow associatedView); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java index c0a7a34a3a1e..37e77766c889 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java @@ -50,6 +50,7 @@ import com.android.systemui.camera.CameraIntents; import com.android.systemui.dagger.qualifiers.DisplayId; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.keyguard.WakefulnessLifecycle; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QSPanelController; import com.android.systemui.settings.UserTracker; @@ -102,6 +103,7 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba private final boolean mVibrateOnOpening; private final VibrationEffect mCameraLaunchGestureVibrationEffect; private final SystemBarAttributesListener mSystemBarAttributesListener; + private final ActivityStarter mActivityStarter; private final Lazy<CameraLauncher> mCameraLauncherLazy; private final QuickSettingsController mQsController; private final QSHost mQSHost; @@ -138,7 +140,8 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba SystemBarAttributesListener systemBarAttributesListener, Lazy<CameraLauncher> cameraLauncherLazy, UserTracker userTracker, - QSHost qsHost) { + QSHost qsHost, + ActivityStarter activityStarter) { mCentralSurfaces = centralSurfaces; mQsController = quickSettingsController; mContext = context; @@ -170,6 +173,7 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba mCameraLaunchGestureVibrationEffect = getCameraGestureVibrationEffect( mVibratorOptional, resources); mSystemBarAttributesListener = systemBarAttributesListener; + mActivityStarter = activityStarter; } @Override @@ -375,7 +379,7 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba if (!mKeyguardStateController.isShowing()) { final Intent cameraIntent = CameraIntents.getInsecureCameraIntent(mContext); cameraIntent.putExtra(CameraIntents.EXTRA_LAUNCH_SOURCE, source); - mCentralSurfaces.startActivityDismissingKeyguard(cameraIntent, + mActivityStarter.startActivityDismissingKeyguard(cameraIntent, false /* onlyProvisioned */, true /* dismissShade */, true /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */, 0, null /* animationController */, mUserTracker.getUserHandle()); @@ -432,7 +436,7 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba // app-side haptic experimentation. if (!mKeyguardStateController.isShowing()) { - mCentralSurfaces.startActivityDismissingKeyguard(emergencyIntent, + mActivityStarter.startActivityDismissingKeyguard(emergencyIntent, false /* onlyProvisioned */, true /* dismissShade */, true /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */, 0, null /* animationController */, mUserTracker.getUserHandle()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index e1c806401ea4..aa5aed7451f8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -168,6 +168,8 @@ import com.android.systemui.keyguard.ui.viewmodel.LightRevealScrimViewModel; import com.android.systemui.navigationbar.NavigationBarController; import com.android.systemui.navigationbar.NavigationBarView; import com.android.systemui.notetask.NoteTaskController; +import com.android.systemui.plugins.ActivityStarter.Callback; +import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.OverlayPlugin; @@ -281,6 +283,9 @@ import javax.inject.Provider; * <b>If at all possible, please avoid adding additional code to this monstrous class! Our goal is * to break up this class into many small classes, and any code added here will slow down that goal. * </b> + * + * Note that ActivityStarter logic here is deprecated and should be added here as well as + * {@link ActivityStarterImpl} */ @SysUISingleton public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { @@ -1790,17 +1795,27 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { return (mDisabled1 & StatusBarManager.DISABLE_NOTIFICATION_ALERTS) != 0; } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void startActivity(Intent intent, boolean onlyProvisioned, boolean dismissShade, int flags) { startActivityDismissingKeyguard(intent, onlyProvisioned, dismissShade, flags); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void startActivity(Intent intent, boolean dismissShade) { startActivityDismissingKeyguard(intent, false /* onlyProvisioned */, dismissShade); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ + @Override + public void startActivity(Intent intent, boolean dismissShade, + @androidx.annotation.Nullable ActivityLaunchAnimator.Controller animationController) { + startActivity(intent, dismissShade, animationController, false); + } + + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void startActivity(Intent intent, boolean dismissShade, @Nullable ActivityLaunchAnimator.Controller animationController, @@ -1809,6 +1824,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { getActivityUserHandle(intent)); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void startActivity(Intent intent, boolean dismissShade, @Nullable ActivityLaunchAnimator.Controller animationController, @@ -2406,6 +2422,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { return mDisplayId; } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned, boolean dismissShade, int flags) { @@ -2414,12 +2431,14 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { flags, null /* animationController */, getActivityUserHandle(intent)); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned, boolean dismissShade) { startActivityDismissingKeyguard(intent, onlyProvisioned, dismissShade, 0); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void startActivityDismissingKeyguard(Intent intent, boolean onlyProvisioned, boolean dismissShade, boolean disallowEnterPictureInPictureWhileLaunching, @@ -2431,6 +2450,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { userHandle, null /* customMessage */); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned, final boolean dismissShade, final boolean disallowEnterPictureInPictureWhileLaunching, @@ -2541,6 +2561,8 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { * animation. This is ignored if {@code animationController} is not * animating in the shade window. * @param isLaunchForActivity whether the launch is for an activity. + * + * Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Nullable private ActivityLaunchAnimator.Controller wrapAnimationController( @@ -2570,6 +2592,8 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mStatusBarKeyguardViewManager.readyForKeyguardDone(); } + + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void executeRunnableDismissingKeyguard(final Runnable runnable, final Runnable cancelAction, @@ -2580,6 +2604,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { deferred, false /* willAnimateOnKeyguard */, null /* customMessage */); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void executeRunnableDismissingKeyguard(final Runnable runnable, final Runnable cancelAction, @@ -2690,16 +2715,19 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { afterKeyguardGone /* afterKeyguardGone */); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ protected void dismissKeyguardThenExecute(OnDismissAction action, boolean afterKeyguardGone) { dismissKeyguardThenExecute(action, null /* cancelRunnable */, afterKeyguardGone); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void dismissKeyguardThenExecute(OnDismissAction action, Runnable cancelAction, boolean afterKeyguardGone) { dismissKeyguardThenExecute(action, cancelAction, afterKeyguardGone, null); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void dismissKeyguardThenExecute(OnDismissAction action, Runnable cancelAction, boolean afterKeyguardGone, String customMessage) { @@ -2901,6 +2929,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { | ((currentlyInsecure ? 1 : 0) << 12); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void postQSRunnableDismissingKeyguard(final Runnable runnable) { mMainExecutor.execute(() -> { @@ -2910,11 +2939,13 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { }); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void postStartActivityDismissingKeyguard(PendingIntent intent) { postStartActivityDismissingKeyguard(intent, null /* animationController */); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void postStartActivityDismissingKeyguard(final PendingIntent intent, @Nullable ActivityLaunchAnimator.Controller animationController) { @@ -2922,11 +2953,13 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { null /* intentSentUiThreadCallback */, animationController)); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void postStartActivityDismissingKeyguard(final Intent intent, int delay) { postStartActivityDismissingKeyguard(intent, delay, null /* animationController */); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void postStartActivityDismissingKeyguard(Intent intent, int delay, @Nullable ActivityLaunchAnimator.Controller animationController) { @@ -2934,6 +2967,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { null /* customMessage */); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void postStartActivityDismissingKeyguard(Intent intent, int delay, @Nullable ActivityLaunchAnimator.Controller animationController, @@ -4081,11 +4115,13 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { dismissKeyguardThenExecute(onDismissAction, afterKeyguardGone); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void startPendingIntentDismissingKeyguard(final PendingIntent intent) { startPendingIntentDismissingKeyguard(intent, null); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void startPendingIntentDismissingKeyguard( final PendingIntent intent, @Nullable final Runnable intentSentUiThreadCallback) { @@ -4093,6 +4129,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { (ActivityLaunchAnimator.Controller) null); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void startPendingIntentDismissingKeyguard(PendingIntent intent, Runnable intentSentUiThreadCallback, View associatedView) { @@ -4106,6 +4143,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { animationController); } + /** Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ @Override public void startPendingIntentDismissingKeyguard( final PendingIntent intent, @Nullable final Runnable intentSentUiThreadCallback, @@ -4529,6 +4567,8 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { * launched as user of the current process. * @param intent * @return UserHandle + * + * Logic is duplicated in {@link ActivityStarterImpl}. Please add it there too. */ private UserHandle getActivityUserHandle(Intent intent) { String[] packages = mContext.getResources().getStringArray(R.array.system_ui_packages); @@ -4551,4 +4591,15 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { && mBiometricUnlockController.getMode() != BiometricUnlockController.MODE_WAKE_AND_UNLOCK; } + + @Override + public void setIsLaunchingActivityOverLockscreen(boolean isLaunchingActivityOverLockscreen) { + mIsLaunchingActivityOverLockscreen = isLaunchingActivityOverLockscreen; + } + + @Override + public ActivityLaunchAnimator.Controller getAnimatorControllerFromNotification( + ExpandableNotificationRow associatedView) { + return mNotificationAnimationProvider.getAnimatorController(associatedView); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index c1859b2ee3a2..90a6d0fac7ca 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -23,10 +23,10 @@ import static com.android.systemui.statusbar.notification.NotificationUtils.inte import android.content.res.Resources; import android.util.MathUtils; -import com.android.app.animation.Interpolators; import com.android.keyguard.BouncerPanelExpansionCalculator; import com.android.keyguard.KeyguardStatusView; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.shade.ShadeViewController; import com.android.systemui.statusbar.policy.KeyguardUserSwitcherListView; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java index 61c1cc82482a..9d30cb4c4852 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardIndicationTextView.java @@ -30,9 +30,9 @@ import android.widget.TextView; import androidx.annotation.StyleRes; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.keyguard.KeyguardIndication; /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index 720eeba0fd4e..13566ef8c630 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -43,9 +43,9 @@ import android.widget.TextView; import androidx.annotation.VisibleForTesting; -import com.android.app.animation.Interpolators; import com.android.settingslib.Utils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.battery.BatteryMeterView; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherContainer; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java index 5232fb633e63..e835c5cebbc3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java @@ -37,12 +37,12 @@ import androidx.core.animation.Animator; import androidx.core.animation.AnimatorListenerAdapter; import androidx.core.animation.ValueAnimator; -import com.android.app.animation.InterpolatorsAndroidX; import com.android.keyguard.CarrierTextController; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.logging.KeyguardLogger; import com.android.systemui.R; +import com.android.systemui.animation.InterpolatorsAndroidX; import com.android.systemui.battery.BatteryMeterViewController; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.log.LogLevel; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java index 7bc4fc3c5e47..6bf54430ab38 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarTransitionsController.java @@ -24,21 +24,21 @@ import android.os.SystemClock; import android.util.MathUtils; import android.util.TimeUtils; -import com.android.app.animation.Interpolators; import com.android.systemui.Dumpable; +import com.android.systemui.animation.Interpolators; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.policy.KeyguardStateController; +import java.io.PrintWriter; +import java.lang.ref.WeakReference; + import dagger.assisted.Assisted; import dagger.assisted.AssistedFactory; import dagger.assisted.AssistedInject; -import java.io.PrintWriter; -import java.lang.ref.WeakReference; - /** * Class to control all aspects about light bar changes. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java index 46a2457670b0..cc4f901668ab 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java @@ -31,9 +31,9 @@ import android.util.AttributeSet; import android.util.SparseArray; import android.view.ViewTreeObserver.OnPreDrawListener; -import com.android.app.animation.Interpolators; import com.android.internal.graphics.ColorUtils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.KeyguardAffordanceView; import java.lang.annotation.Retention; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index 560ea8aae594..55dc18859c25 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -15,11 +15,11 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.collection.ArrayMap; -import com.android.app.animation.Interpolators; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.util.ContrastColorUtil; import com.android.settingslib.Utils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.demomode.DemoMode; import com.android.systemui.demomode.DemoModeController; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index bef422ce3004..006a029de8e0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -36,10 +36,10 @@ import android.view.animation.Interpolator; import androidx.annotation.VisibleForTesting; import androidx.collection.ArrayMap; -import com.android.app.animation.Interpolators; import com.android.internal.statusbar.StatusBarIcon; import com.android.settingslib.Utils; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.notification.stack.AnimationFilter; import com.android.systemui.statusbar.notification.stack.AnimationProperties; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsButton.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsButton.java index 07a6d0a5a470..5e5317d764fe 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsButton.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsButton.java @@ -29,7 +29,7 @@ import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.Button; -import com.android.app.animation.Interpolators; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.AlphaOptimizedImageView; public class SettingsButton extends AlphaOptimizedImageView { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index f7646d718dc6..89dddbf1f573 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -68,6 +68,7 @@ import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor; import com.android.systemui.navigationbar.NavigationBarView; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.navigationbar.TaskbarDelegate; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shade.ShadeController; import com.android.systemui.shade.ShadeExpansionChangeEvent; @@ -284,6 +285,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private boolean mIsBackAnimationEnabled; private final boolean mUdfpsNewTouchDetectionEnabled; private final UdfpsOverlayInteractor mUdfpsOverlayInteractor; + private final ActivityStarter mActivityStarter; private OnDismissAction mAfterKeyguardGoneAction; private Runnable mKeyguardGoneCancelAction; @@ -339,7 +341,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb PrimaryBouncerInteractor primaryBouncerInteractor, BouncerView primaryBouncerView, AlternateBouncerInteractor alternateBouncerInteractor, - UdfpsOverlayInteractor udfpsOverlayInteractor + UdfpsOverlayInteractor udfpsOverlayInteractor, + ActivityStarter activityStarter ) { mContext = context; mViewMediatorCallback = callback; @@ -367,6 +370,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb featureFlags.isEnabled(Flags.WM_ENABLE_PREDICTIVE_BACK_BOUNCER_ANIM); mUdfpsNewTouchDetectionEnabled = featureFlags.isEnabled(Flags.UDFPS_NEW_TOUCH_DETECTION); mUdfpsOverlayInteractor = udfpsOverlayInteractor; + mActivityStarter = activityStarter; } @Override @@ -1006,7 +1010,13 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Override public void dismissAndCollapse() { - mCentralSurfaces.executeRunnableDismissingKeyguard(null, null, true, false, true); + mActivityStarter.executeRunnableDismissingKeyguard( + /* runnable= */ null, + /* cancelAction= */ null, + /* dismissShade= */ true, + /* afterKeyguardGone= */ false, + /* deferred= */ true + ); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt index cdf66526ab63..8fa803ea3a8f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt @@ -15,7 +15,7 @@ import com.android.internal.jank.InteractionJankMonitor import com.android.internal.jank.InteractionJankMonitor.CUJ_SCREEN_OFF import com.android.internal.jank.InteractionJankMonitor.CUJ_SCREEN_OFF_SHOW_AOD import com.android.systemui.DejankUtils -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.KeyguardViewMediator import com.android.systemui.keyguard.WakefulnessLifecycle diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java index 831d40259cb5..453dd1bb6f81 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java @@ -44,10 +44,10 @@ import android.widget.LinearLayout; import androidx.annotation.VisibleForTesting; import androidx.core.animation.Animator; -import com.android.app.animation.Interpolators; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.Dumpable; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserDetailItemView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserDetailItemView.java index e1ec94fada81..4dd63be47735 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserDetailItemView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserDetailItemView.java @@ -24,9 +24,9 @@ import android.view.View; import androidx.core.graphics.ColorUtils; -import com.android.app.animation.Interpolators; import com.android.keyguard.KeyguardConstants; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.qs.tiles.UserDetailItemView; /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java index 66b52563c0a9..928e0115287d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java @@ -31,7 +31,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import com.android.app.animation.Interpolators; import com.android.keyguard.KeyguardConstants; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; @@ -39,6 +38,7 @@ import com.android.keyguard.KeyguardVisibilityHelper; import com.android.keyguard.dagger.KeyguardUserSwitcherScope; import com.android.settingslib.drawable.CircleFramedDrawable; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.plugins.statusbar.StatusBarStateController; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java index 363b06ab780b..850a4b499562 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java @@ -21,11 +21,11 @@ import android.util.AttributeSet; import android.util.Log; import android.view.View; -import com.android.app.animation.Interpolators; import com.android.keyguard.AlphaOptimizedLinearLayout; import com.android.keyguard.KeyguardConstants; import com.android.settingslib.animation.AppearAnimationUtils; import com.android.settingslib.animation.DisappearAnimationUtils; +import com.android.systemui.animation.Interpolators; /** * The container for the user switcher on Keyguard. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java index e311bad9e865..403a7e8116c8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java @@ -73,7 +73,6 @@ import androidx.core.animation.AnimatorSet; import androidx.core.animation.ObjectAnimator; import androidx.core.animation.ValueAnimator; -import com.android.app.animation.InterpolatorsAndroidX; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.graphics.ColorUtils; import com.android.internal.logging.UiEvent; @@ -81,6 +80,7 @@ import com.android.internal.logging.UiEventLogger; import com.android.internal.util.ContrastColorUtil; import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.animation.InterpolatorsAndroidX; import com.android.systemui.statusbar.RemoteInputController; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper; diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarAnimator.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarAnimator.kt index 46954b5b81ef..16123882046c 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarAnimator.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarAnimator.kt @@ -18,7 +18,7 @@ package com.android.systemui.temporarydisplay.chipbar import android.view.View import android.view.ViewGroup -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators import com.android.systemui.animation.ViewHierarchyAnimator import com.android.systemui.dagger.SysUISingleton import com.android.systemui.util.children diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt index 4fbbc8915c19..e819f946a6d6 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt @@ -34,10 +34,10 @@ import android.widget.TextView import androidx.annotation.DimenRes import androidx.annotation.IdRes import androidx.annotation.VisibleForTesting -import com.android.app.animation.Interpolators import com.android.internal.widget.CachingIconView import com.android.systemui.Gefingerpoken import com.android.systemui.R +import com.android.systemui.animation.Interpolators import com.android.systemui.classifier.FalsingCollector import com.android.systemui.common.shared.model.ContentDescription.Companion.loadContentDescription import com.android.systemui.common.shared.model.Text.Companion.loadText diff --git a/packages/SystemUI/src/com/android/systemui/util/ListenerSet.kt b/packages/SystemUI/src/com/android/systemui/util/ListenerSet.kt index 4f20067dc0ed..a47e61441c4c 100644 --- a/packages/SystemUI/src/com/android/systemui/util/ListenerSet.kt +++ b/packages/SystemUI/src/com/android/systemui/util/ListenerSet.kt @@ -22,34 +22,27 @@ import java.util.concurrent.CopyOnWriteArrayList * A collection of listeners, observers, callbacks, etc. * * This container is optimized for infrequent mutation and frequent iteration, with thread safety - * and reentrant-safety guarantees as well. + * and reentrant-safety guarantees as well. Specifically, to ensure that + * [ConcurrentModificationException] is never thrown, this iterator will not reflect changes made to + * the set after the iterator is constructed. */ -class ListenerSet<E> : Iterable<E> { - private val listeners: CopyOnWriteArrayList<E> = CopyOnWriteArrayList() +class ListenerSet<E : Any> +/** Private constructor takes the internal list so that we can use auto-delegation */ +private constructor(private val listeners: CopyOnWriteArrayList<E>) : + Collection<E> by listeners, Set<E> { + + /** Create a new instance */ + constructor() : this(CopyOnWriteArrayList()) /** - * A thread-safe, reentrant-safe method to add a listener. - * Does nothing if the listener is already in the set. + * A thread-safe, reentrant-safe method to add a listener. Does nothing if the listener is + * already in the set. */ fun addIfAbsent(element: E): Boolean = listeners.addIfAbsent(element) - /** - * A thread-safe, reentrant-safe method to remove a listener. - */ + /** A thread-safe, reentrant-safe method to remove a listener. */ fun remove(element: E): Boolean = listeners.remove(element) - - /** - * Determine if the listener set is empty - */ - fun isEmpty(): Boolean = listeners.isEmpty() - - /** - * Returns an iterator over the listeners currently in the set. Note that to ensure - * [ConcurrentModificationException] is never thrown, this iterator will not reflect changes - * made to the set after the iterator is constructed. - */ - override fun iterator(): Iterator<E> = listeners.iterator() } /** Extension to match Collection which is implemented to only be (easily) accessible in kotlin */ -fun <T> ListenerSet<T>.isNotEmpty(): Boolean = !isEmpty() +fun <T : Any> ListenerSet<T>.isNotEmpty(): Boolean = !isEmpty() diff --git a/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayoutController.kt b/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayoutController.kt index db4ab7edbcf1..5d8029293107 100644 --- a/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayoutController.kt +++ b/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayoutController.kt @@ -19,7 +19,7 @@ package com.android.systemui.util.animation import android.animation.ValueAnimator import android.graphics.PointF import android.util.MathUtils -import com.android.app.animation.Interpolators +import com.android.systemui.animation.Interpolators /** * The fraction after which we start fading in when going from a gone widget to a visible one diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 91078dc65477..77210b78832b 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -109,7 +109,6 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.android.app.animation.Interpolators; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; @@ -120,6 +119,7 @@ import com.android.settingslib.Utils; import com.android.systemui.Dumpable; import com.android.systemui.Prefs; import com.android.systemui.R; +import com.android.systemui.animation.Interpolators; import com.android.systemui.dump.DumpManager; import com.android.systemui.media.dialog.MediaOutputDialogFactory; import com.android.systemui.plugins.ActivityStarter; diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/InterpolatorsAndroidXTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/InterpolatorsAndroidXTest.kt new file mode 100644 index 000000000000..2c680be97e95 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/animation/InterpolatorsAndroidXTest.kt @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2022 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 + +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import java.lang.reflect.Modifier +import junit.framework.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 + +@SmallTest +@RunWith(JUnit4::class) +class InterpolatorsAndroidXTest : SysuiTestCase() { + + @Test + fun testInterpolatorsAndInterpolatorsAndroidXPublicMethodsAreEqual() { + assertEquals( + Interpolators::class.java.getPublicMethods(), + InterpolatorsAndroidX::class.java.getPublicMethods() + ) + } + + @Test + fun testInterpolatorsAndInterpolatorsAndroidXPublicFieldsAreEqual() { + assertEquals( + Interpolators::class.java.getPublicFields(), + InterpolatorsAndroidX::class.java.getPublicFields() + ) + } + + private fun <T> Class<T>.getPublicMethods() = + declaredMethods + .filter { Modifier.isPublic(it.modifiers) } + .map { it.toString().replace(name, "") } + .toSet() + + private fun <T> Class<T>.getPublicFields() = + fields.filter { Modifier.isPublic(it.modifiers) }.map { it.name }.toSet() +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/ViewHierarchyAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/ViewHierarchyAnimatorTest.kt index da9ceb47446a..6ab54a374d30 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/animation/ViewHierarchyAnimatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/animation/ViewHierarchyAnimatorTest.kt @@ -19,7 +19,6 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import com.android.app.animation.Interpolators @SmallTest @RunWith(AndroidTestingRunner::class) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt index a17b596d1403..f4d28431a2e9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt @@ -23,9 +23,9 @@ import android.util.Log.TerribleFailureHandler import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.FlakyTest import androidx.test.filters.SmallTest -import com.android.app.animation.Interpolators import com.android.systemui.RoboPilotTest import com.android.systemui.SysuiTestCase +import com.android.systemui.animation.Interpolators import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState.AOD import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt index 3efe38295f3d..a5b78b74fcdf 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlowTest.kt @@ -17,8 +17,8 @@ package com.android.systemui.keyguard.ui import androidx.test.filters.SmallTest -import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE import com.android.systemui.SysuiTestCase +import com.android.systemui.animation.Interpolators.EMPHASIZED_ACCELERATE import com.android.systemui.coroutines.collectLastValue import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java index 7d583258e4e5..9ea30d676dc5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java @@ -39,9 +39,9 @@ import android.testing.AndroidTestingRunner; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.statusbar.phone.CentralSurfaces; import org.junit.Before; import org.junit.Test; @@ -50,22 +50,20 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.stubbing.Answer; -import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @RunWith(AndroidTestingRunner.class) @SmallTest public class ActionProxyReceiverTest extends SysuiTestCase { - - @Mock - private CentralSurfaces mMockCentralSurfaces; @Mock private ActivityManagerWrapper mMockActivityManagerWrapper; @Mock private ScreenshotSmartActions mMockScreenshotSmartActions; @Mock private PendingIntent mMockPendingIntent; + @Mock + private ActivityStarter mActivityStarter; private Intent mIntent; private FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); @@ -78,32 +76,19 @@ public class ActionProxyReceiverTest extends SysuiTestCase { } @Test - public void testPendingIntentSentWithoutStatusBar() throws PendingIntent.CanceledException { - ActionProxyReceiver actionProxyReceiver = constructActionProxyReceiver(false); - - actionProxyReceiver.onReceive(mContext, mIntent); - - verify(mMockActivityManagerWrapper).closeSystemWindows(SYSTEM_DIALOG_REASON_SCREENSHOT); - verify(mMockCentralSurfaces, never()).executeRunnableDismissingKeyguard( - any(Runnable.class), any(Runnable.class), anyBoolean(), anyBoolean(), anyBoolean()); - verify(mMockPendingIntent).send( - eq(mContext), anyInt(), isNull(), isNull(), isNull(), isNull(), any(Bundle.class)); - } - - @Test public void testPendingIntentSentWithStatusBar() throws PendingIntent.CanceledException { - ActionProxyReceiver actionProxyReceiver = constructActionProxyReceiver(true); + ActionProxyReceiver actionProxyReceiver = constructActionProxyReceiver(); // ensure that the pending intent call is passed through doAnswer((Answer<Object>) invocation -> { ((Runnable) invocation.getArgument(0)).run(); return null; - }).when(mMockCentralSurfaces).executeRunnableDismissingKeyguard( + }).when(mActivityStarter).executeRunnableDismissingKeyguard( any(Runnable.class), isNull(), anyBoolean(), anyBoolean(), anyBoolean()); actionProxyReceiver.onReceive(mContext, mIntent); verify(mMockActivityManagerWrapper).closeSystemWindows(SYSTEM_DIALOG_REASON_SCREENSHOT); - verify(mMockCentralSurfaces).executeRunnableDismissingKeyguard( + verify(mActivityStarter).executeRunnableDismissingKeyguard( any(Runnable.class), isNull(), eq(true), eq(true), eq(true)); verify(mMockPendingIntent).send( eq(mContext), anyInt(), isNull(), isNull(), isNull(), isNull(), any(Bundle.class)); @@ -111,7 +96,7 @@ public class ActionProxyReceiverTest extends SysuiTestCase { @Test public void testSmartActionsNotNotifiedByDefault() { - ActionProxyReceiver actionProxyReceiver = constructActionProxyReceiver(true); + ActionProxyReceiver actionProxyReceiver = constructActionProxyReceiver(); actionProxyReceiver.onReceive(mContext, mIntent); @@ -122,7 +107,7 @@ public class ActionProxyReceiverTest extends SysuiTestCase { @Test public void testSmartActionsNotifiedIfEnabled() { - ActionProxyReceiver actionProxyReceiver = constructActionProxyReceiver(true); + ActionProxyReceiver actionProxyReceiver = constructActionProxyReceiver(); mIntent.putExtra(EXTRA_SMART_ACTIONS_ENABLED, true); String testId = "testID"; mIntent.putExtra(EXTRA_ID, testId); @@ -133,15 +118,12 @@ public class ActionProxyReceiverTest extends SysuiTestCase { testId, ACTION_TYPE_SHARE, false, null); } - private ActionProxyReceiver constructActionProxyReceiver(boolean withStatusBar) { - if (withStatusBar) { - return new ActionProxyReceiver( - Optional.of(mMockCentralSurfaces), mMockActivityManagerWrapper, - mMockScreenshotSmartActions, mDisplayTracker); - } else { - return new ActionProxyReceiver( - Optional.empty(), mMockActivityManagerWrapper, mMockScreenshotSmartActions, - mDisplayTracker); - } + private ActionProxyReceiver constructActionProxyReceiver() { + return new ActionProxyReceiver( + mMockActivityManagerWrapper, + mMockScreenshotSmartActions, + mDisplayTracker, + mActivityStarter + ); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt index 20da8a619100..9fe75abddf9c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt @@ -33,9 +33,9 @@ import android.widget.TextView import androidx.constraintlayout.motion.widget.MotionLayout import androidx.constraintlayout.widget.ConstraintSet import androidx.test.filters.SmallTest -import com.android.app.animation.Interpolators import com.android.systemui.R import com.android.systemui.SysuiTestCase +import com.android.systemui.animation.Interpolators import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.battery.BatteryMeterView import com.android.systemui.battery.BatteryMeterViewController diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt index d017ffd08a4b..2106da887b44 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt @@ -11,6 +11,7 @@ import com.android.systemui.classifier.FalsingCollector import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.media.controls.ui.MediaHierarchyManager +import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.qs.QS import com.android.systemui.shade.ShadeViewController @@ -79,6 +80,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { @Mock lateinit var singleShadeOverScroller: SingleShadeLockScreenOverScroller @Mock lateinit var splitShadeOverScroller: SplitShadeLockScreenOverScroller @Mock lateinit var qsTransitionController: LockscreenShadeQsTransitionController + @Mock lateinit var activityStarter: ActivityStarter @Mock lateinit var transitionControllerCallback: LockscreenShadeTransitionController.Callback @JvmField @Rule val mockito = MockitoJUnit.rule() @@ -124,6 +126,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { dumpManager) }, qsTransitionControllerFactory = { qsTransitionController }, + activityStarter = activityStarter, ) transitionController.addCallback(transitionControllerCallback) whenever(nsslController.view).thenReturn(stackscroller) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/PropertyAnimatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/PropertyAnimatorTest.java index f0abf2f4a24f..a1168f809971 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/PropertyAnimatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/PropertyAnimatorTest.java @@ -32,9 +32,9 @@ import android.util.Property; import android.view.View; import android.view.animation.Interpolator; -import com.android.app.animation.Interpolators; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.animation.Interpolators; import com.android.systemui.statusbar.notification.stack.AnimationFilter; import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.notification.stack.ViewState; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt index 70266e401f8a..655bd7243836 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt @@ -24,6 +24,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection import com.android.systemui.statusbar.notification.collection.listbuilder.OnAfterRenderListListener +import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManagerImpl import com.android.systemui.statusbar.notification.collection.render.NotifStackController import com.android.systemui.statusbar.notification.collection.render.NotifStats import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING @@ -49,6 +50,7 @@ class StackCoordinatorTest : SysuiTestCase() { private lateinit var entry: NotificationEntry @Mock private lateinit var pipeline: NotifPipeline + @Mock private lateinit var groupExpansionManagerImpl: GroupExpansionManagerImpl @Mock private lateinit var notificationIconAreaController: NotificationIconAreaController @Mock private lateinit var stackController: NotifStackController @Mock private lateinit var section: NotifSection @@ -56,7 +58,7 @@ class StackCoordinatorTest : SysuiTestCase() { @Before fun setUp() { initMocks(this) - coordinator = StackCoordinator(notificationIconAreaController) + coordinator = StackCoordinator(groupExpansionManagerImpl, notificationIconAreaController) coordinator.attach(pipeline) afterRenderListListener = withArgCaptor { verify(pipeline).addOnAfterRenderListListener(capture()) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java index 4bb2c8740d44..3cefc9973d09 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java @@ -67,6 +67,7 @@ import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.testing.UiEventLoggerFake; import com.android.systemui.SysuiTestCase; import com.android.systemui.people.widget.PeopleSpaceWidgetManager; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.settings.UserContextProvider; @@ -80,7 +81,6 @@ import com.android.systemui.statusbar.notification.collection.provider.HighPrior import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier; import com.android.systemui.statusbar.notification.row.NotificationGutsManager.OnSettingsClickListener; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; -import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.wmshell.BubblesManager; @@ -120,7 +120,6 @@ public class NotificationGutsManagerTest extends SysuiTestCase { @Mock private NotificationListContainer mNotificationListContainer; @Mock private OnSettingsClickListener mOnSettingsClickListener; @Mock private DeviceProvisionedController mDeviceProvisionedController; - @Mock private CentralSurfaces mCentralSurfaces; @Mock private AccessibilityManager mAccessibilityManager; @Mock private HighPriorityProvider mHighPriorityProvider; @Mock private INotificationManager mINotificationManager; @@ -136,6 +135,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase { @Mock private NotificationLockscreenUserManager mNotificationLockscreenUserManager; @Mock private StatusBarStateController mStatusBarStateController; @Mock private HeadsUpManagerPhone mHeadsUpManagerPhone; + @Mock private ActivityStarter mActivityStarter; @Before public void setUp() { @@ -145,8 +145,8 @@ public class NotificationGutsManagerTest extends SysuiTestCase { mHelper = new NotificationTestHelper(mContext, mDependency, TestableLooper.get(this)); when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(false); - mGutsManager = new NotificationGutsManager(mContext, - () -> Optional.of(mCentralSurfaces), mHandler, mHandler, mAccessibilityManager, + mGutsManager = new NotificationGutsManager(mContext, mHandler, mHandler, + mAccessibilityManager, mHighPriorityProvider, mINotificationManager, mPeopleSpaceWidgetManager, mLauncherApps, mShortcutManager, mChannelEditorDialogController, mContextTracker, mAssistantFeedbackController, @@ -156,7 +156,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase { mStatusBarStateController, mDeviceProvisionedController, mMetricsLogger, - mHeadsUpManagerPhone); + mHeadsUpManagerPhone, mActivityStarter); mGutsManager.setUpWithPresenter(mPresenter, mNotificationListContainer, mOnSettingsClickListener); mGutsManager.setNotificationActivityStarter(mNotificationActivityStarter); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java index 420c7ae3d2ec..6a0e3c6d51eb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java @@ -48,6 +48,7 @@ import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.media.controls.ui.KeyguardMediaController; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEventListener; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -143,6 +144,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @Mock private NotificationTargetsHelper mNotificationTargetsHelper; @Mock private SecureSettings mSecureSettings; @Mock private NotificationIconAreaController mIconAreaController; + @Mock private ActivityStarter mActivityStarter; @Captor private ArgumentCaptor<StatusBarStateController.StateListener> mStateListenerArgumentCaptor; @@ -491,7 +493,8 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { mFeatureFlags, mNotificationTargetsHelper, mSecureSettings, - mock(NotificationDismissibilityProvider.class) + mock(NotificationDismissibilityProvider.class), + mActivityStarter ); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ActivityStarterImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ActivityStarterImplTest.kt new file mode 100644 index 000000000000..b6b28c9e4527 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ActivityStarterImplTest.kt @@ -0,0 +1,255 @@ +/* + * Copyright (C) 2023 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.phone + +import android.app.PendingIntent +import android.content.Intent +import android.os.RemoteException +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.keyguard.KeyguardUpdateMonitor +import com.android.systemui.ActivityIntentHelper +import com.android.systemui.SysuiTestCase +import com.android.systemui.animation.ActivityLaunchAnimator +import com.android.systemui.assist.AssistManager +import com.android.systemui.keyguard.KeyguardViewMediator +import com.android.systemui.keyguard.WakefulnessLifecycle +import com.android.systemui.plugins.ActivityStarter.OnDismissAction +import com.android.systemui.settings.UserTracker +import com.android.systemui.shade.ShadeController +import com.android.systemui.statusbar.NotificationLockscreenUserManager +import com.android.systemui.statusbar.SysuiStatusBarStateController +import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow +import com.android.systemui.statusbar.policy.DeviceProvisionedController +import com.android.systemui.statusbar.policy.KeyguardStateController +import com.android.systemui.statusbar.window.StatusBarWindowController +import com.android.systemui.util.concurrency.FakeExecutor +import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.eq +import com.android.systemui.util.mockito.whenever +import com.android.systemui.util.time.FakeSystemClock +import com.google.common.truth.Truth.assertThat +import dagger.Lazy +import java.util.Optional +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.anyBoolean +import org.mockito.Mockito.mock +import org.mockito.Mockito.never +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class ActivityStarterImplTest : SysuiTestCase() { + @Mock private lateinit var centralSurfaces: CentralSurfaces + @Mock private lateinit var assistManager: AssistManager + @Mock private lateinit var dozeServiceHost: DozeServiceHost + @Mock private lateinit var biometricUnlockController: BiometricUnlockController + @Mock private lateinit var keyguardViewMediator: KeyguardViewMediator + @Mock private lateinit var shadeController: ShadeController + @Mock private lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager + @Mock private lateinit var activityLaunchAnimator: ActivityLaunchAnimator + @Mock private lateinit var lockScreenUserManager: NotificationLockscreenUserManager + @Mock private lateinit var statusBarWindowController: StatusBarWindowController + @Mock private lateinit var wakefulnessLifecycle: WakefulnessLifecycle + @Mock private lateinit var keyguardStateController: KeyguardStateController + @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController + @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor + @Mock private lateinit var deviceProvisionedController: DeviceProvisionedController + @Mock private lateinit var userTracker: UserTracker + @Mock private lateinit var activityIntentHelper: ActivityIntentHelper + private lateinit var underTest: ActivityStarterImpl + private val mainExecutor = FakeExecutor(FakeSystemClock()) + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + underTest = + ActivityStarterImpl( + Lazy { Optional.of(centralSurfaces) }, + Lazy { assistManager }, + Lazy { dozeServiceHost }, + Lazy { biometricUnlockController }, + Lazy { keyguardViewMediator }, + Lazy { shadeController }, + Lazy { statusBarKeyguardViewManager }, + activityLaunchAnimator, + context, + lockScreenUserManager, + statusBarWindowController, + wakefulnessLifecycle, + keyguardStateController, + statusBarStateController, + keyguardUpdateMonitor, + deviceProvisionedController, + userTracker, + activityIntentHelper, + mainExecutor, + ) + } + + @Test + fun startPendingIntentDismissingKeyguard_keyguardShowing_dismissWithAction() { + val pendingIntent = mock(PendingIntent::class.java) + whenever(keyguardStateController.isShowing).thenReturn(true) + whenever(deviceProvisionedController.isDeviceProvisioned).thenReturn(true) + + underTest.startPendingIntentDismissingKeyguard(pendingIntent) + + verify(statusBarKeyguardViewManager) + .dismissWithAction(any(OnDismissAction::class.java), eq(null), anyBoolean(), eq(null)) + } + + @Test + fun startPendingIntentDismissingKeyguard_associatedView_getAnimatorController() { + val pendingIntent = mock(PendingIntent::class.java) + val associatedView = mock(ExpandableNotificationRow::class.java) + + underTest.startPendingIntentDismissingKeyguard( + intent = pendingIntent, + intentSentUiThreadCallback = null, + associatedView = associatedView, + ) + + verify(centralSurfaces).getAnimatorControllerFromNotification(associatedView) + } + + @Test + fun startActivity_noUserHandleProvided_getUserHandle() { + val intent = mock(Intent::class.java) + + underTest.startActivity(intent, false) + + verify(userTracker).userHandle + } + + @Test + fun postStartActivityDismissingKeyguard_pendingIntent_postsOnMain() { + val intent = mock(PendingIntent::class.java) + + underTest.postStartActivityDismissingKeyguard(intent) + + assertThat(mainExecutor.numPending()).isEqualTo(1) + } + + @Test + fun postStartActivityDismissingKeyguard_intent_postsOnMain() { + val intent = mock(Intent::class.java) + + underTest.postStartActivityDismissingKeyguard(intent, 0) + + assertThat(mainExecutor.numPending()).isEqualTo(1) + } + + @Test + fun dismissKeyguardThenExecute_startWakeAndUnlock() { + whenever(wakefulnessLifecycle.wakefulness) + .thenReturn(WakefulnessLifecycle.WAKEFULNESS_ASLEEP) + whenever(keyguardStateController.canDismissLockScreen()).thenReturn(true) + whenever(statusBarStateController.leaveOpenOnKeyguardHide()).thenReturn(false) + whenever(dozeServiceHost.isPulsing).thenReturn(true) + + underTest.dismissKeyguardThenExecute({ true }, {}, false) + + verify(biometricUnlockController) + .startWakeAndUnlock(BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING) + } + + @Test + fun dismissKeyguardThenExecute_keyguardIsShowing_dismissWithAction() { + val customMessage = "Enter your pin." + whenever(keyguardStateController.isShowing).thenReturn(true) + + underTest.dismissKeyguardThenExecute({ true }, {}, false, customMessage) + + verify(statusBarKeyguardViewManager) + .dismissWithAction( + any(OnDismissAction::class.java), + any(Runnable::class.java), + eq(false), + eq(customMessage) + ) + } + + @Test + fun dismissKeyguardThenExecute_awakeDreams() { + val customMessage = "Enter your pin." + var dismissActionExecuted = false + whenever(keyguardStateController.isShowing).thenReturn(false) + whenever(keyguardUpdateMonitor.isDreaming).thenReturn(true) + + underTest.dismissKeyguardThenExecute( + { + dismissActionExecuted = true + true + }, + {}, + false, + customMessage + ) + + verify(centralSurfaces).awakenDreams() + assertThat(dismissActionExecuted).isTrue() + } + + @Test + @Throws(RemoteException::class) + fun executeRunnableDismissingKeyguard_dreaming_notShowing_awakenDreams() { + whenever(keyguardStateController.isShowing).thenReturn(false) + whenever(keyguardStateController.isOccluded).thenReturn(false) + whenever(keyguardUpdateMonitor.isDreaming).thenReturn(true) + + underTest.executeRunnableDismissingKeyguard( + runnable = {}, + cancelAction = null, + dismissShade = false, + afterKeyguardGone = false, + deferred = false + ) + + verify(centralSurfaces, times(1)).awakenDreams() + } + + @Test + @Throws(RemoteException::class) + fun executeRunnableDismissingKeyguard_notDreaming_notShowing_doNotAwakenDreams() { + whenever(keyguardStateController.isShowing).thenReturn(false) + whenever(keyguardStateController.isOccluded).thenReturn(false) + whenever(keyguardUpdateMonitor.isDreaming).thenReturn(false) + + underTest.executeRunnableDismissingKeyguard( + runnable = {}, + cancelAction = null, + dismissShade = false, + afterKeyguardGone = false, + deferred = false + ) + + verify(centralSurfaces, never()).awakenDreams() + } + + @Test + fun postQSRunnableDismissingKeyguard_leaveOpenStatusBarState() { + underTest.postQSRunnableDismissingKeyguard {} + + assertThat(mainExecutor.numPending()).isEqualTo(1) + mainExecutor.runAllReady() + verify(statusBarStateController).setLeaveOpenOnKeyguardHide(true) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java index 872c5603b7a5..3870d996d2ae 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacksTest.java @@ -43,6 +43,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.assist.AssistManager; import com.android.systemui.keyguard.WakefulnessLifecycle; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.qs.QSHost; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.CameraLauncher; @@ -96,6 +97,7 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { @Mock private Lazy<CameraLauncher> mCameraLauncherLazy; @Mock private UserTracker mUserTracker; @Mock private QSHost mQSHost; + @Mock private ActivityStarter mActivityStarter; CentralSurfacesCommandQueueCallbacks mSbcqCallbacks; @@ -131,7 +133,8 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { mSystemBarAttributesListener, mCameraLauncherLazy, mUserTracker, - mQSHost); + mQSHost, + mActivityStarter); when(mUserTracker.getUserHandle()).thenReturn( UserHandle.of(ActivityManager.getCurrentUser())); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index 4ff225cc7f3f..6be0e2deaf35 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -72,6 +72,7 @@ import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerCallbackInt import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.navigationbar.TaskbarDelegate; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.shade.NotificationShadeWindowView; import com.android.systemui.shade.ShadeController; @@ -129,6 +130,7 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { @Mock private PrimaryBouncerInteractor mPrimaryBouncerInteractor; @Mock private AlternateBouncerInteractor mAlternateBouncerInteractor; @Mock private UdfpsOverlayInteractor mUdfpsOverlayInteractor; + @Mock private ActivityStarter mActivityStarter; @Mock private BouncerView mBouncerView; @Mock private BouncerViewDelegate mBouncerViewDelegate; @Mock private OnBackAnimationCallback mBouncerViewDelegateBackCallback; @@ -192,7 +194,8 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mPrimaryBouncerInteractor, mBouncerView, mAlternateBouncerInteractor, - mUdfpsOverlayInteractor) { + mUdfpsOverlayInteractor, + mActivityStarter) { @Override public ViewRootImpl getViewRootImpl() { return mViewRootImpl; @@ -680,7 +683,8 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { mPrimaryBouncerInteractor, mBouncerView, mAlternateBouncerInteractor, - mUdfpsOverlayInteractor) { + mUdfpsOverlayInteractor, + mActivityStarter) { @Override public ViewRootImpl getViewRootImpl() { return mViewRootImpl; diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/animation/FakeLaunchAnimator.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/animation/FakeLaunchAnimator.kt index 09830413bdc8..5b431e72e2ac 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/animation/FakeLaunchAnimator.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/animation/FakeLaunchAnimator.kt @@ -14,8 +14,6 @@ package com.android.systemui.animation -import com.android.app.animation.Interpolators - /** A [LaunchAnimator] to be used in tests. */ fun fakeLaunchAnimator(): LaunchAnimator { return LaunchAnimator(TEST_TIMINGS, TEST_INTERPOLATORS) diff --git a/services/core/java/com/android/server/SoundTriggerInternal.java b/services/core/java/com/android/server/SoundTriggerInternal.java index 65294652b92d..f184574c9a36 100644 --- a/services/core/java/com/android/server/SoundTriggerInternal.java +++ b/services/core/java/com/android/server/SoundTriggerInternal.java @@ -52,11 +52,6 @@ public interface SoundTriggerInternal { // Enumerate possible STModules to attach to List<ModuleProperties> listModuleProperties(Identity originatorIdentity); - /** - * Dumps service-wide information. - */ - void dump(FileDescriptor fd, PrintWriter pw, String[] args); - interface Session { /** * Starts recognition for the given keyphraseId. @@ -151,10 +146,5 @@ public interface SoundTriggerInternal { * Unloads (and stops if running) the given keyphraseId */ int unloadKeyphraseModel(int keyphaseId); - - /** - * Dumps session-wide information. - */ - void dump(FileDescriptor fd, PrintWriter pw, String[] args); } } diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index a3d89e73c2e0..b7082690276c 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -28,6 +28,7 @@ import static android.Manifest.permission.READ_PHONE_STATE; import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE; import static android.app.ActivityManager.PROCESS_STATE_UNKNOWN; import static android.app.ActivityManager.isProcStateConsideredInteraction; +import static android.app.ActivityManager.printCapabilitiesSummary; import static android.app.ActivityManager.procStateToString; import static android.app.PendingIntent.FLAG_IMMUTABLE; import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; @@ -1133,6 +1134,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { if (!callbackInfo.isPending) { mUidEventHandler.obtainMessage(UID_MSG_STATE_CHANGED, callbackInfo) .sendToTarget(); + callbackInfo.isPending = true; } } } @@ -1156,6 +1158,19 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { this.procStateSeq = procStateSeq; this.capability = capability; } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder(); + sb.append("{"); + sb.append("uid=").append(uid).append(","); + sb.append("proc_state=").append(procStateToString(procState)).append(","); + sb.append("seq=").append(procStateSeq).append(","); + sb.append("cap="); printCapabilitiesSummary(sb, capability); sb.append(","); + sb.append("pending=").append(isPending); + sb.append("}"); + return sb.toString(); + } } final private BroadcastReceiver mPowerSaveWhitelistReceiver = new BroadcastReceiver() { @@ -3982,31 +3997,31 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { synchronized (mUidBlockedState) { collectKeys(mUidBlockedState, knownUids); } + synchronized (mUidStateCallbackInfos) { + collectKeys(mUidStateCallbackInfos, knownUids); + } fout.println("Status for all known UIDs:"); fout.increaseIndent(); size = knownUids.size(); for (int i = 0; i < size; i++) { final int uid = knownUids.keyAt(i); - fout.print("UID="); - fout.print(uid); + fout.print("UID", uid); final UidState uidState = mUidState.get(uid); - if (uidState == null) { - fout.print(" state={null}"); - } else { - fout.print(" state="); - fout.print(uidState.toString()); - } + fout.print("state", uidState); synchronized (mUidBlockedState) { final UidBlockedState uidBlockedState = mUidBlockedState.get(uid); - if (uidBlockedState == null) { - fout.print(" blocked_state={null}"); - } else { - fout.print(" blocked_state="); - fout.print(uidBlockedState); - } + fout.print("blocked_state", uidBlockedState); + } + + synchronized (mUidStateCallbackInfos) { + final UidStateCallbackInfo callbackInfo = mUidStateCallbackInfos.get(uid); + fout.println(); + fout.increaseIndent(); + fout.print("callback_info", callbackInfo); + fout.decreaseIndent(); } fout.println(); } @@ -4052,27 +4067,49 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } @VisibleForTesting - boolean isUidForeground(int uid) { - synchronized (mUidRulesFirstLock) { - return isProcStateAllowedWhileIdleOrPowerSaveMode(mUidState.get(uid)); - } - } - @GuardedBy("mUidRulesFirstLock") - private boolean isUidForegroundOnRestrictBackgroundUL(int uid) { + boolean isUidForegroundOnRestrictBackgroundUL(int uid) { final UidState uidState = mUidState.get(uid); - return isProcStateAllowedWhileOnRestrictBackground(uidState); + if (isProcStateAllowedWhileOnRestrictBackground(uidState)) { + return true; + } + // Check if there is any pending state change. + synchronized (mUidStateCallbackInfos) { + final UidStateCallbackInfo callbackInfo = mUidStateCallbackInfos.get(uid); + final long prevProcStateSeq = uidState != null ? uidState.procStateSeq : -1; + if (callbackInfo != null && callbackInfo.isPending + && callbackInfo.procStateSeq >= prevProcStateSeq) { + return isProcStateAllowedWhileOnRestrictBackground(callbackInfo.procState, + callbackInfo.capability); + } + } + return false; } + @VisibleForTesting @GuardedBy("mUidRulesFirstLock") - private boolean isUidForegroundOnRestrictPowerUL(int uid) { + boolean isUidForegroundOnRestrictPowerUL(int uid) { final UidState uidState = mUidState.get(uid); - return isProcStateAllowedWhileIdleOrPowerSaveMode(uidState); + if (isProcStateAllowedWhileIdleOrPowerSaveMode(uidState)) { + return true; + } + // Check if there is any pending state change. + synchronized (mUidStateCallbackInfos) { + final UidStateCallbackInfo callbackInfo = mUidStateCallbackInfos.get(uid); + final long prevProcStateSeq = uidState != null ? uidState.procStateSeq : -1; + if (callbackInfo != null && callbackInfo.isPending + && callbackInfo.procStateSeq >= prevProcStateSeq) { + return isProcStateAllowedWhileIdleOrPowerSaveMode(callbackInfo.procState, + callbackInfo.capability); + } + } + return false; } @GuardedBy("mUidRulesFirstLock") private boolean isUidTop(int uid) { final UidState uidState = mUidState.get(uid); + // TODO: Consider taking pending uid state change into account. return isProcStateAllowedWhileInLowPowerStandby(uidState); } diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java index 20048ce543f3..a5e652cce41e 100644 --- a/services/core/java/com/android/server/wm/DisplayRotation.java +++ b/services/core/java/com/android/server/wm/DisplayRotation.java @@ -946,6 +946,10 @@ public class DisplayRotation { } void freezeRotation(int rotation) { + if (mDeviceStateController.shouldReverseRotationDirectionAroundZAxis()) { + rotation = RotationUtils.reverseRotationDirectionAroundZAxis(rotation); + } + rotation = (rotation == -1) ? mRotation : rotation; setUserRotation(WindowManagerPolicy.USER_ROTATION_LOCKED, rotation); } diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index b314ed17244c..54dfdd93b26c 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -107,6 +107,11 @@ import java.util.function.Predicate; * Represents a logical transition. This keeps track of all the changes associated with a logical * WM state -> state transition. * @see TransitionController + * + * In addition to tracking individual container changes, this also tracks ordering-changes (just + * on-top for now). However, since order is a "global" property, the mechanics of order-change + * detection/reporting is non-trivial when transitions are collecting in parallel. See + * {@link #collectOrderChanges} for more details. */ class Transition implements BLASTSyncEngine.TransactionReadyListener { private static final String TAG = "Transition"; @@ -192,6 +197,12 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { private final ArrayList<Task> mOnTopTasksStart = new ArrayList<>(); /** + * The (non alwaysOnTop) tasks which were on-top of their display when this transition became + * ready (via setReady, not animation-ready). + */ + private final ArrayList<Task> mOnTopTasksAtReady = new ArrayList<>(); + + /** * Set of participating windowtokens (activity/wallpaper) which are visible at the end of * the transition animation. */ @@ -244,6 +255,36 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { */ boolean mIsPlayerEnabled = true; + /** This transition doesn't run in parallel. */ + static final int PARALLEL_TYPE_NONE = 0; + + /** Any 2 transitions of this type can run in parallel with each other. Used for testing. */ + static final int PARALLEL_TYPE_MUTUAL = 1; + + @IntDef(prefix = { "PARALLEL_TYPE_" }, value = { + PARALLEL_TYPE_NONE, + PARALLEL_TYPE_MUTUAL + }) + @Retention(RetentionPolicy.SOURCE) + @interface ParallelType {} + + /** + * What category of parallel-collect support this transition has. The value of this is used + * by {@link TransitionController} to determine which transitions can collect in parallel. If + * a transition can collect in parallel, it means that it will start collecting as soon as the + * prior collecting transition is {@link #isPopulated}. This is a shortcut for supporting + * a couple specific situations before we have full-fledged support for parallel transitions. + */ + @ParallelType int mParallelCollectType = PARALLEL_TYPE_NONE; + + /** + * A "Track" is a set of animations which must cooperate with each other to play smoothly. If + * animations can play independently of each other, then they can be in different tracks. If + * a transition must cooperate with transitions in >1 other track, then it must be marked + * FLAG_SYNC and it will end-up flushing all animations before it starts. + */ + int mAnimationTrack = 0; + Transition(@TransitionType int type, @TransitionFlags int flags, TransitionController controller, BLASTSyncEngine syncEngine) { mType = type; @@ -447,7 +488,8 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { throw new IllegalStateException("Attempting to re-use a transition"); } mState = STATE_COLLECTING; - mSyncId = mSyncEngine.startSyncSet(this, timeoutMs, TAG, false /* parallel */); + mSyncId = mSyncEngine.startSyncSet(this, timeoutMs, TAG, + mParallelCollectType != PARALLEL_TYPE_NONE); mSyncEngine.setSyncMethod(mSyncId, TransitionController.SYNC_METHOD); mLogger.mSyncId = mSyncId; @@ -718,8 +760,15 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { final boolean ready = mReadyTracker.allReady(); ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Set transition ready=%b %d", ready, mSyncId); - mSyncEngine.setReady(mSyncId, ready); - if (ready) mLogger.mReadyTimeNs = SystemClock.elapsedRealtimeNanos(); + boolean changed = mSyncEngine.setReady(mSyncId, ready); + if (changed && ready) { + mLogger.mReadyTimeNs = SystemClock.elapsedRealtimeNanos(); + mOnTopTasksAtReady.clear(); + for (int i = 0; i < mTargetDisplays.size(); ++i) { + addOnTopTasks(mTargetDisplays.get(i), mOnTopTasksAtReady); + } + mController.onTransitionPopulated(this); + } } /** @@ -737,6 +786,11 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { return mReadyTracker.allReady(); } + /** This transition has all of its expected participants. */ + boolean isPopulated() { + return mState >= STATE_STARTED && mReadyTracker.allReady(); + } + /** * Build a transaction that "resets" all the re-parenting and layer changes. This is * intended to be applied at the end of the transition but before the finish callback. This @@ -1211,7 +1265,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { : mController.mAtm.mRootWindowContainer.getDefaultDisplay(); if (mState == STATE_ABORT) { - mController.abort(this); + mController.onAbort(this); primaryDisplay.getPendingTransaction().merge(transaction); mSyncId = -1; mOverrideOptions = null; @@ -1222,13 +1276,15 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { mState = STATE_PLAYING; mStartTransaction = transaction; mFinishTransaction = mController.mAtm.mWindowManager.mTransactionFactory.get(); - mController.moveToPlaying(this); // Flags must be assigned before calculateTransitionInfo. Otherwise it won't take effect. if (primaryDisplay.isKeyguardLocked()) { mFlags |= TRANSIT_FLAG_KEYGUARD_LOCKED; } - collectOrderChanges(); + + // This is the only (or last) transition that is collecting, so we need to report any + // leftover order changes. + collectOrderChanges(mController.mWaitingTransitions.isEmpty()); // Resolve the animating targets from the participants. mTargets = calculateTargets(mParticipants, mChanges); @@ -1236,6 +1292,9 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { mController.mAtm.mBackNavigationController.onTransactionReady(this, mTargets); final TransitionInfo info = calculateTransitionInfo(mType, mFlags, mTargets, transaction); info.setDebugId(mSyncId); + mController.assignTrack(this, info); + + mController.moveToPlaying(this); // Repopulate the displays based on the resolved targets. mTargetDisplays.clear(); @@ -1383,24 +1442,70 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { info.releaseAnimSurfaces(); } - /** Collect tasks which moved-to-top but didn't change otherwise. */ + /** + * Collect tasks which moved-to-top as part of this transition. This also updates the + * controller's latest-reported when relevant. + * + * This is a non-trivial operation because transition can collect in parallel; however, it can + * be made tenable by acknowledging that the "setup" part of collection (phase 1) is still + * globally serial; so, we can build some reasonable rules around it. + * + * First, we record the "start" on-top state (to compare against). Then, when this becomes + * ready (via allReady, NOT onTransactionReady), we also record the "onReady" on-top state + * -- the idea here is that upon "allReady", all the actual WM changes should be done and we + * are now just waiting for window content to become ready (finish drawing). + * + * Then, in this function (during onTransactionReady), we compare the two orders and include + * any changes to the order in the reported transition-info. Unfortunately, because of parallel + * collection, the order can change in unexpected ways by now. To resolve this, we ALSO keep a + * global "latest reported order" in TransitionController and use that to make decisions. + */ @VisibleForTesting - void collectOrderChanges() { + void collectOrderChanges(boolean reportCurrent) { if (mOnTopTasksStart.isEmpty()) return; - final ArrayList<Task> onTopTasksEnd = new ArrayList<>(); - for (int i = 0; i < mTargetDisplays.size(); ++i) { - addOnTopTasks(mTargetDisplays.get(i), onTopTasksEnd); - } - for (int i = 0; i < onTopTasksEnd.size(); ++i) { - final Task task = onTopTasksEnd.get(i); + boolean includesOrderChange = false; + for (int i = 0; i < mOnTopTasksAtReady.size(); ++i) { + final Task task = mOnTopTasksAtReady.get(i); if (mOnTopTasksStart.contains(task)) continue; - mParticipants.add(task); - int changeIdx = mChanges.indexOfKey(task); - if (changeIdx < 0) { - mChanges.put(task, new ChangeInfo(task)); - changeIdx = mChanges.indexOfKey(task); + includesOrderChange = true; + break; + } + if (!includesOrderChange && !reportCurrent) { + // This transition doesn't include an order change, so if it isn't required to report + // the current focus (eg. it's the last of a cluster of transitions), then don't + // report. + return; + } + // The transition included an order change, but it may not be up-to-date, so grab the + // latest state and compare with the last reported state (or our start state if no + // reported state exists). + ArrayList<Task> onTopTasksEnd = new ArrayList<>(); + for (int d = 0; d < mTargetDisplays.size(); ++d) { + addOnTopTasks(mTargetDisplays.get(d), onTopTasksEnd); + final int displayId = mTargetDisplays.get(d).mDisplayId; + ArrayList<Task> reportedOnTop = mController.mLatestOnTopTasksReported.get(displayId); + for (int i = onTopTasksEnd.size() - 1; i >= 0; --i) { + final Task task = onTopTasksEnd.get(i); + if (task.getDisplayId() != displayId) continue; + // If it didn't change since last report, don't report + if (reportedOnTop == null) { + if (mOnTopTasksStart.contains(task)) continue; + } else if (reportedOnTop.contains(task)) { + continue; + } + // Need to report it. + mParticipants.add(task); + int changeIdx = mChanges.indexOfKey(task); + if (changeIdx < 0) { + mChanges.put(task, new ChangeInfo(task)); + changeIdx = mChanges.indexOfKey(task); + } + mChanges.valueAt(changeIdx).mFlags |= ChangeInfo.FLAG_CHANGE_MOVED_TO_TOP; } - mChanges.valueAt(changeIdx).mFlags |= ChangeInfo.FLAG_CHANGE_MOVED_TO_TOP; + // Swap in the latest on-top tasks. + mController.mLatestOnTopTasksReported.put(displayId, onTopTasksEnd); + onTopTasksEnd = reportedOnTop != null ? reportedOnTop : new ArrayList<>(); + onTopTasksEnd.clear(); } } diff --git a/services/core/java/com/android/server/wm/TransitionController.java b/services/core/java/com/android/server/wm/TransitionController.java index e8e4792690be..8af037be8d06 100644 --- a/services/core/java/com/android/server/wm/TransitionController.java +++ b/services/core/java/com/android/server/wm/TransitionController.java @@ -39,6 +39,7 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.util.ArrayMap; import android.util.Slog; +import android.util.SparseArray; import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; import android.view.SurfaceControl; @@ -60,7 +61,34 @@ import java.util.ArrayList; import java.util.function.LongConsumer; /** - * Handles all the aspects of recording and synchronizing transitions. + * Handles all the aspects of recording (collecting) and synchronizing transitions. This is only + * concerned with the WM changes. The actual animations are handled by the Player. + * + * Currently, only 1 transition can be the primary "collector" at a time. This is because WM changes + * are still performed in a "global" manner. However, collecting can actually be broken into + * two phases: + * 1. Actually making WM changes and recording the participating containers. + * 2. Waiting for the participating containers to become ready (eg. redrawing content). + * Because (2) takes most of the time AND doesn't change WM, we can actually have multiple + * transitions in phase (2) concurrently with one in phase (1). We refer to this arrangement as + * "parallel" collection even though there is still only ever 1 transition actually able to gain + * participants. + * + * Parallel collection happens when the "primary collector" has finished "setup" (phase 1) and is + * just waiting. At this point, another transition can start collecting. When this happens, the + * first transition is moved to a "waiting" list and the new transition becomes the "primary + * collector". If at any time, the "primary collector" moves to playing before one of the waiting + * transitions, then the first waiting transition will move back to being the "primary collector". + * This maintains the "global"-like abstraction that the rest of WM currently expects. + * + * When a transition move-to-playing, we check it against all other playing transitions. If it + * doesn't overlap with them, it can also animate in parallel. In this case it will be assigned a + * new "track". "tracks" are a way to communicate to the player about which transitions need to be + * played serially with each-other. So, if we find that a transition overlaps with other transitions + * in one track, the transition will be assigned to that track. If, however, the transition overlaps + * with transition in >1 track, we will actually just mark it as SYNC meaning it can't actually + * play until all prior transition animations finish. This is heavy-handed because it is a fallback + * situation and supporting something fancier would be unnecessarily complicated. */ class TransitionController { private static final String TAG = "TransitionController"; @@ -109,6 +137,7 @@ class TransitionController { * removed from this list. */ private final ArrayList<Transition> mPlayingTransitions = new ArrayList<>(); + int mTrackCount = 0; /** The currently finishing transition. */ Transition mFinishingTransition; @@ -143,10 +172,26 @@ class TransitionController { private final ArrayList<QueuedTransition> mQueuedTransitions = new ArrayList<>(); - /** The transition currently being constructed (collecting participants). */ + /** + * The transition currently being constructed (collecting participants). Unless interrupted, + * all WM changes will go into this. + */ private Transition mCollectingTransition = null; /** + * The transitions that are complete but still waiting for participants to become ready + */ + final ArrayList<Transition> mWaitingTransitions = new ArrayList<>(); + + /** + * The (non alwaysOnTop) tasks which were reported as on-top of their display most recently + * within a cluster of simultaneous transitions. If tasks are nested, all the tasks that are + * parents of the on-top task are also included. This is used to decide which transitions + * report which on-top changes. + */ + final SparseArray<ArrayList<Task>> mLatestOnTopTasksReported = new SparseArray<>(); + + /** * `true` when building surface layer order for the finish transaction. We want to prevent * wm from touching z-order of surfaces during transitions, but we still need to be able to * calculate the layers for the finishTransaction. So, when assigning layers into the finish @@ -199,6 +244,11 @@ class TransitionController { mPlayingTransitions.get(i).cleanUpOnFailure(); } mPlayingTransitions.clear(); + // Clean up waiting transitions first since they technically started first. + for (int i = 0; i < mWaitingTransitions.size(); ++i) { + mWaitingTransitions.get(i).abort(); + } + mWaitingTransitions.clear(); if (mCollectingTransition != null) { mCollectingTransition.abort(); } @@ -223,8 +273,9 @@ class TransitionController { throw new IllegalStateException("Shell Transitions not enabled"); } if (mCollectingTransition != null) { - throw new IllegalStateException("Simultaneous transition collection not supported" - + " yet. Use {@link #createPendingTransition} for explicit queueing."); + throw new IllegalStateException("Trying to directly start transition collection while " + + " collection is already ongoing. Use {@link #startCollectOrQueue} if" + + " possible."); } Transition transit = new Transition(type, flags, this, mSyncEngine); ProtoLog.v(ProtoLogGroup.WM_DEBUG_WINDOW_TRANSITIONS, "Creating Transition: %s", transit); @@ -318,7 +369,12 @@ class TransitionController { * This is {@code false} once a transition is playing. */ boolean isCollecting(@NonNull WindowContainer wc) { - return mCollectingTransition != null && mCollectingTransition.mParticipants.contains(wc); + if (mCollectingTransition == null) return false; + if (mCollectingTransition.mParticipants.contains(wc)) return true; + for (int i = 0; i < mWaitingTransitions.size(); ++i) { + if (mWaitingTransitions.get(i).mParticipants.contains(wc)) return true; + } + return false; } /** @@ -327,7 +383,11 @@ class TransitionController { */ boolean inCollectingTransition(@NonNull WindowContainer wc) { if (!isCollecting()) return false; - return mCollectingTransition.isInTransition(wc); + if (mCollectingTransition.isInTransition(wc)) return true; + for (int i = 0; i < mWaitingTransitions.size(); ++i) { + if (mWaitingTransitions.get(i).isInTransition(wc)) return true; + } + return false; } /** @@ -369,6 +429,9 @@ class TransitionController { if (mCollectingTransition != null && mCollectingTransition.isOnDisplay(dc)) { return true; } + for (int i = mWaitingTransitions.size() - 1; i >= 0; --i) { + if (mWaitingTransitions.get(i).isOnDisplay(dc)) return true; + } for (int i = mPlayingTransitions.size() - 1; i >= 0; --i) { if (mPlayingTransitions.get(i).isOnDisplay(dc)) return true; } @@ -379,6 +442,9 @@ class TransitionController { if (mCollectingTransition != null && mCollectingTransition.isInTransientHide(task)) { return true; } + for (int i = mWaitingTransitions.size() - 1; i >= 0; --i) { + if (mWaitingTransitions.get(i).isInTransientHide(task)) return true; + } for (int i = mPlayingTransitions.size() - 1; i >= 0; --i) { if (mPlayingTransitions.get(i).isInTransientHide(task)) return true; } @@ -754,6 +820,8 @@ class TransitionController { mRunningLock.doNotifyLocked(); // Run state-validation checks when no transitions are active anymore. if (!inTransition()) { + // Can reset track-count now that everything is idle. + mTrackCount = 0; validateStates(); } } @@ -771,12 +839,39 @@ class TransitionController { mStateValidators.clear(); } + /** + * Called when the transition has a complete set of participants for its operation. In other + * words, it is when the transition is "ready" but is still waiting for participants to draw. + */ + void onTransitionPopulated(Transition transition) { + tryStartCollectFromQueue(); + } + + private boolean canStartCollectingNow(Transition queued) { + if (mCollectingTransition == null) return true; + // Population (collect until ready) is still serialized, so always wait for that. + if (!mCollectingTransition.isPopulated()) return false; + // Check if queued *can* be independent with all collecting/waiting transitions. + if (!getCanBeIndependent(mCollectingTransition, queued)) return false; + for (int i = 0; i < mWaitingTransitions.size(); ++i) { + if (!getCanBeIndependent(mWaitingTransitions.get(i), queued)) return false; + } + return true; + } + void tryStartCollectFromQueue() { if (mQueuedTransitions.isEmpty()) return; // Only need to try the next one since, even when transition can collect in parallel, // they still need to serialize on readiness. final QueuedTransition queued = mQueuedTransitions.get(0); - if (mCollectingTransition != null || mSyncEngine.hasActiveSync()) { + if (mCollectingTransition != null) { + // If it's a legacy sync, then it needs to wait until there is no collecting transition. + if (queued.mTransition == null) return; + if (!canStartCollectingNow(queued.mTransition)) return; + mWaitingTransitions.add(mCollectingTransition); + mCollectingTransition = null; + } else if (mSyncEngine.hasActiveSync()) { + // A legacy transition is on-going, so we must wait. return; } mQueuedTransitions.remove(0); @@ -797,16 +892,81 @@ class TransitionController { } void moveToPlaying(Transition transition) { - if (transition != mCollectingTransition) { - throw new IllegalStateException("Trying to move non-collecting transition to playing"); + if (transition == mCollectingTransition) { + mCollectingTransition = null; + if (!mWaitingTransitions.isEmpty()) { + mCollectingTransition = mWaitingTransitions.remove(0); + } + if (mCollectingTransition == null) { + // nothing collecting anymore, so clear order records. + mLatestOnTopTasksReported.clear(); + } + } else { + if (!mWaitingTransitions.remove(transition)) { + throw new IllegalStateException("Trying to move non-collecting transition to" + + "playing " + transition.getSyncId()); + } } - mCollectingTransition = null; mPlayingTransitions.add(transition); updateRunningRemoteAnimation(transition, true /* isPlaying */); mTransitionTracer.logState(transition); // Sync engine should become idle after this, so the idle listener will check the queue. } + /** + * Checks if the `queued` transition has the potential to run independently of the + * `collecting` transition. It may still ultimately block in sync-engine or become dependent + * in {@link #getIsIndependent} later. + */ + boolean getCanBeIndependent(Transition collecting, Transition queued) { + if (queued.mParallelCollectType == Transition.PARALLEL_TYPE_MUTUAL + && collecting.mParallelCollectType == Transition.PARALLEL_TYPE_MUTUAL) { + return true; + } + return false; + } + + /** + * Checks if `incoming` transition can run independently of `running` transition assuming that + * `running` is playing based on its current state. + */ + static boolean getIsIndependent(Transition running, Transition incoming) { + if (running.mParallelCollectType == Transition.PARALLEL_TYPE_MUTUAL + && incoming.mParallelCollectType == Transition.PARALLEL_TYPE_MUTUAL) { + return true; + } + return false; + } + + void assignTrack(Transition transition, TransitionInfo info) { + int track = -1; + boolean sync = false; + for (int i = 0; i < mPlayingTransitions.size(); ++i) { + // ignore ourself obviously + if (mPlayingTransitions.get(i) == transition) continue; + if (getIsIndependent(mPlayingTransitions.get(i), transition)) continue; + if (track >= 0) { + // At this point, transition overlaps with multiple tracks, so just wait for + // everything + sync = true; + break; + } + track = mPlayingTransitions.get(i).mAnimationTrack; + } + if (sync) { + track = 0; + } + if (track < 0) { + // Didn't overlap with anything, so give it its own track + track = mTrackCount; + } + if (sync) { + info.setFlags(info.getFlags() | TransitionInfo.FLAG_SYNC); + } + info.setTrack(track); + mTrackCount = Math.max(mTrackCount, track + 1); + } + void updateAnimatingState(SurfaceControl.Transaction t) { final boolean animatingState = !mPlayingTransitions.isEmpty() || (mCollectingTransition != null && mCollectingTransition.isStarted()); @@ -842,14 +1002,27 @@ class TransitionController { mRemotePlayer.update(delegate, isPlaying, true /* predict */); } - void abort(Transition transition) { + /** Called when a transition is aborted. This should only be called by {@link Transition} */ + void onAbort(Transition transition) { if (transition != mCollectingTransition) { - throw new IllegalStateException("Too late to abort."); + int waitingIdx = mWaitingTransitions.indexOf(transition); + if (waitingIdx < 0) { + throw new IllegalStateException("Too late for abort."); + } + mWaitingTransitions.remove(waitingIdx); + } else { + mCollectingTransition = null; + if (!mWaitingTransitions.isEmpty()) { + mCollectingTransition = mWaitingTransitions.remove(0); + } + if (mCollectingTransition == null) { + // nothing collecting anymore, so clear order records. + mLatestOnTopTasksReported.clear(); + } } - transition.abort(); - mCollectingTransition = null; mTransitionTracer.logState(transition); - // abort will call through the normal finish paths and thus check the queue. + // This is called during Transition.abort whose codepath will eventually check the queue + // via sync-engine idle. } /** @@ -956,7 +1129,17 @@ class TransitionController { return false; } if (mSyncEngine.hasActiveSync()) { - if (!isCollecting()) { + if (isCollecting()) { + // Check if we can run in parallel here. + if (canStartCollectingNow(transit)) { + // start running in parallel. + mWaitingTransitions.add(mCollectingTransition); + mCollectingTransition = null; + moveToCollecting(transit); + onStartCollect.onCollectStarted(false /* deferred */); + return true; + } + } else { Slog.w(TAG, "Ongoing Sync outside of transition."); } queueTransition(transit, onStartCollect); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 6ca35d0d2c79..40024f1f0be3 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -7515,6 +7515,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { boolean success = false; try { if (getCurrentForegroundUserId() == userId) { + // TODO: We need to special case headless here as we can't switch to the system user mInjector.getIActivityManager().switchUser(UserHandle.USER_SYSTEM); } @@ -7522,7 +7523,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!success) { Slogf.w(LOG_TAG, "Couldn't remove user " + userId); } else if (isManagedProfile(userId) && !wipeSilently) { - sendWipeProfileNotification(wipeReasonForUser); + sendWipeProfileNotification(wipeReasonForUser, + UserHandle.of(getProfileParentId(userId))); } } catch (RemoteException re) { // Shouldn't happen @@ -7870,7 +7872,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { }); } - private void sendWipeProfileNotification(String wipeReasonForUser) { + private void sendWipeProfileNotification(String wipeReasonForUser, UserHandle user) { Notification notification = new Notification.Builder(mContext, SystemNotificationChannels.DEVICE_ADMIN) .setSmallIcon(android.R.drawable.stat_sys_warning) @@ -7879,7 +7881,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { .setColor(mContext.getColor(R.color.system_notification_accent_color)) .setStyle(new Notification.BigTextStyle().bigText(wipeReasonForUser)) .build(); - mInjector.getNotificationManager().notify(SystemMessage.NOTE_PROFILE_WIPED, notification); + mInjector.getNotificationManager().notifyAsUser( + /* tag= */ null, SystemMessage.NOTE_PROFILE_WIPED, notification, user); } private String getWorkProfileDeletedTitle() { @@ -13380,7 +13383,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { throw new IllegalStateException("Feature flag is not enabled."); } if (isDeviceOwner(caller) || isProfileOwner(caller)) { - throw new IllegalStateException("Admins are not allowed to call this API."); + throw new SecurityException("Admins are not allowed to call this API."); } if (!mInjector.isChangeEnabled( ENABLE_COEXISTENCE_CHANGE, callerPackage, caller.getUserId())) { @@ -16219,17 +16222,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { deviceOwner.second); return result; } - } else if (DevicePolicyManager.POLICY_DISABLE_CAMERA.equals(restriction) - || DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE.equals(restriction)) { + } else if (DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE.equals(restriction)) { synchronized (getLockObject()) { final DevicePolicyData policy = getUserData(userId); final int N = policy.mAdminList.size(); for (int i = 0; i < N; i++) { final ActiveAdmin admin = policy.mAdminList.get(i); - if ((admin.disableCamera && - DevicePolicyManager.POLICY_DISABLE_CAMERA.equals(restriction)) - || (admin.disableScreenCapture && DevicePolicyManager - .POLICY_DISABLE_SCREEN_CAPTURE.equals(restriction))) { + if (admin.disableScreenCapture) { result = new Bundle(); result.putInt(Intent.EXTRA_USER_ID, userId); result.putParcelable(DevicePolicyManager.EXTRA_DEVICE_ADMIN, @@ -16237,17 +16236,44 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return result; } } - // For the camera, a device owner on a different user can disable it globally, - // so we need an additional check. - if (result == null - && DevicePolicyManager.POLICY_DISABLE_CAMERA.equals(restriction)) { - final ActiveAdmin admin = getDeviceOwnerAdminLocked(); - if (admin != null && admin.disableCamera) { - result = new Bundle(); - result.putInt(Intent.EXTRA_USER_ID, mOwners.getDeviceOwnerUserId()); - result.putParcelable(DevicePolicyManager.EXTRA_DEVICE_ADMIN, - admin.info.getComponent()); - return result; + } + } else if (DevicePolicyManager.POLICY_DISABLE_CAMERA.equals(restriction)) { + if (isPolicyEngineForFinanceFlagEnabled()) { + PolicyDefinition<Boolean> policyDefinition = + PolicyDefinition.getPolicyDefinitionForUserRestriction( + UserManager.DISALLOW_CAMERA); + Boolean value = mDevicePolicyEngine.getResolvedPolicy(policyDefinition, userId); + if (value != null && value) { + result = new Bundle(); + result.putInt(Intent.EXTRA_USER_ID, userId); + return result; + } + } else { + synchronized (getLockObject()) { + final DevicePolicyData policy = getUserData(userId); + final int N = policy.mAdminList.size(); + for (int i = 0; i < N; i++) { + final ActiveAdmin admin = policy.mAdminList.get(i); + if (admin.disableCamera) { + result = new Bundle(); + result.putInt(Intent.EXTRA_USER_ID, userId); + result.putParcelable(DevicePolicyManager.EXTRA_DEVICE_ADMIN, + admin.info.getComponent()); + return result; + } + } + // For the camera, a device owner on a different user can disable it globally, + // so we need an additional check. + if (result == null + && DevicePolicyManager.POLICY_DISABLE_CAMERA.equals(restriction)) { + final ActiveAdmin admin = getDeviceOwnerAdminLocked(); + if (admin != null && admin.disableCamera) { + result = new Bundle(); + result.putInt(Intent.EXTRA_USER_ID, mOwners.getDeviceOwnerUserId()); + result.putParcelable(DevicePolicyManager.EXTRA_DEVICE_ADMIN, + admin.info.getComponent()); + return result; + } } } } @@ -16923,6 +16949,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } else { granted = PackageManager.PERMISSION_GRANTED; } + } } } @@ -20026,6 +20053,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return; } + Objects.requireNonNull(who, "ComponentName is null"); Objects.requireNonNull(packageNames, "Package names is null"); final CallerIdentity caller = getCallerIdentity(who); @@ -20042,9 +20070,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { saveSettingsLocked(caller.getUserId()); } logSetCrossProfilePackages(who, packageNames); - final CrossProfileApps crossProfileApps = mContext.getSystemService(CrossProfileApps.class); + final CrossProfileApps crossProfileApps = + mContext.createContextAsUser( + caller.getUserHandle(), /* flags= */ 0) + .getSystemService(CrossProfileApps.class); mInjector.binderWithCleanCallingIdentity( - () -> crossProfileApps.resetInteractAcrossProfilesAppOps( + () -> crossProfileApps.resetInteractAcrossProfilesAppOps( previousCrossProfilePackages, new HashSet<>(packageNames))); } diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java index 16406bcb9a1f..4167c7e89758 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java @@ -23,8 +23,9 @@ import static org.mockito.Mockito.doReturn; import android.app.ActivityManagerInternal; import android.os.SystemClock; +import android.platform.test.annotations.Presubmit; -import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; import org.junit.Before; @@ -39,13 +40,14 @@ import org.mockito.MockitoAnnotations; * Build/Install/Run: * atest FrameworksServicesTests:ActivityManagerInternalTest */ +@Presubmit +@SmallTest public class ActivityManagerInternalTest { private static final int TEST_UID1 = 111; private static final int TEST_UID2 = 112; private static final long TEST_PROC_STATE_SEQ1 = 1111; private static final long TEST_PROC_STATE_SEQ2 = 1112; - private static final long TEST_PROC_STATE_SEQ3 = 1113; @Rule public ServiceThreadRule mServiceThreadRule = new ServiceThreadRule(); @@ -68,7 +70,6 @@ public class ActivityManagerInternalTest { mAmi = mAms.new LocalService(); } - @MediumTest @Test public void testNotifyNetworkPolicyRulesUpdated() throws Exception { // Check there is no crash when there are no active uid records. @@ -89,14 +90,6 @@ public class ActivityManagerInternalTest { TEST_PROC_STATE_SEQ1, // lastNetworkUpdateProcStateSeq TEST_PROC_STATE_SEQ1, // procStateSeq to notify false); // expectNotify - - // Notify that network policy rules are updated for TEST_UID1 with procStateSeq older - // than it's UidRecord.curProcStateSeq and verify that there is no notify call. - verifyNetworkUpdatedProcStateSeq( - TEST_PROC_STATE_SEQ3, // curProcStateSeq - TEST_PROC_STATE_SEQ1, // lastNetworkUpdateProcStateSeq - TEST_PROC_STATE_SEQ2, // procStateSeq to notify - false); // expectNotify } private void verifyNetworkUpdatedProcStateSeq(long curProcStateSeq, diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java index b7f90d43881b..c04df30cb6fd 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java @@ -18,6 +18,12 @@ package com.android.server.net; import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS; import static android.Manifest.permission.NETWORK_STACK; +import static android.app.ActivityManager.PROCESS_CAPABILITY_NONE; +import static android.app.ActivityManager.PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK; +import static android.app.ActivityManager.PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK; +import static android.app.ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND; +import static android.app.ActivityManager.PROCESS_STATE_SERVICE; +import static android.app.ActivityManager.PROCESS_STATE_TOP; import static android.net.ConnectivityManager.BLOCKED_METERED_REASON_DATA_SAVER; import static android.net.ConnectivityManager.BLOCKED_METERED_REASON_USER_RESTRICTED; import static android.net.ConnectivityManager.BLOCKED_REASON_APP_STANDBY; @@ -396,6 +402,26 @@ public class NetworkPolicyManagerServiceTest { } } + // TODO: Use TestLooperManager instead. + /** + * Helper that leverages try-with-resources to pause dispatch of + * {@link #mHandlerThread} until released. + */ + static class SyncBarrier implements AutoCloseable { + private final int mToken; + private Handler mHandler; + + SyncBarrier(Handler handler) { + mHandler = handler; + mToken = mHandler.getLooper().getQueue().postSyncBarrier(); + } + + @Override + public void close() throws Exception { + mHandler.getLooper().getQueue().removeSyncBarrier(mToken); + } + } + @Before public void callSystemReady() throws Exception { MockitoAnnotations.initMocks(this); @@ -1018,25 +1044,113 @@ public class NetworkPolicyManagerServiceTest { // don't check for side-effects (like calls to NetworkManagementService) neither cover all // different modes (Data Saver, Battery Saver, Doze, App idle, etc...). // These scenarios are extensively tested on CTS' HostsideRestrictBackgroundNetworkTests. + @SuppressWarnings("GuardedBy") @Test public void testUidForeground() throws Exception { // push all uids into background long procStateSeq = 0; - callOnUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, procStateSeq++); - callOnUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_SERVICE, procStateSeq++); - assertFalse(mService.isUidForeground(UID_A)); - assertFalse(mService.isUidForeground(UID_B)); + callAndWaitOnUidStateChanged(UID_A, PROCESS_STATE_SERVICE, procStateSeq++); + callAndWaitOnUidStateChanged(UID_B, PROCESS_STATE_SERVICE, procStateSeq++); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_B)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_B)); // push one of the uids into foreground - callOnUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_TOP, procStateSeq++); - assertTrue(mService.isUidForeground(UID_A)); - assertFalse(mService.isUidForeground(UID_B)); + callAndWaitOnUidStateChanged(UID_A, PROCESS_STATE_TOP, procStateSeq++); + assertTrue(mService.isUidForegroundOnRestrictPowerUL(UID_A)); + assertTrue(mService.isUidForegroundOnRestrictBackgroundUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_B)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_B)); // and swap another uid into foreground - callOnUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, procStateSeq++); - callOnUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_TOP, procStateSeq++); - assertFalse(mService.isUidForeground(UID_A)); - assertTrue(mService.isUidForeground(UID_B)); + callAndWaitOnUidStateChanged(UID_A, PROCESS_STATE_SERVICE, procStateSeq++); + callAndWaitOnUidStateChanged(UID_B, PROCESS_STATE_TOP, procStateSeq++); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_A)); + assertTrue(mService.isUidForegroundOnRestrictPowerUL(UID_B)); + assertTrue(mService.isUidForegroundOnRestrictBackgroundUL(UID_B)); + + // change capability of an uid to allow access to power restricted network + callAndWaitOnUidStateChanged(UID_A, PROCESS_STATE_SERVICE, procStateSeq++, + PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK); + callAndWaitOnUidStateChanged(UID_B, PROCESS_STATE_SERVICE, procStateSeq++, + PROCESS_CAPABILITY_NONE); + assertTrue(mService.isUidForegroundOnRestrictPowerUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_B)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_B)); + + // change capability of an uid to allow access to user restricted network + callAndWaitOnUidStateChanged(UID_A, PROCESS_STATE_IMPORTANT_FOREGROUND, procStateSeq++, + PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK); + callAndWaitOnUidStateChanged(UID_B, PROCESS_STATE_SERVICE, procStateSeq++, + PROCESS_CAPABILITY_NONE); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_A)); + assertTrue(mService.isUidForegroundOnRestrictBackgroundUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_B)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_B)); + } + + @SuppressWarnings("GuardedBy") + @Test + public void testUidForeground_withPendingState() throws Exception { + long procStateSeq = 0; + callAndWaitOnUidStateChanged(UID_A, PROCESS_STATE_SERVICE, + procStateSeq++, PROCESS_CAPABILITY_NONE); + callAndWaitOnUidStateChanged(UID_B, PROCESS_STATE_SERVICE, + procStateSeq++, PROCESS_CAPABILITY_NONE); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_B)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_B)); + + try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { + // Verify that a callback with an old procStateSeq is ignored. + callOnUidStatechanged(UID_A, PROCESS_STATE_TOP, 0, + PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_B)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_B)); + + callOnUidStatechanged(UID_A, PROCESS_STATE_SERVICE, procStateSeq++, + PROCESS_CAPABILITY_POWER_RESTRICTED_NETWORK); + assertTrue(mService.isUidForegroundOnRestrictPowerUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_B)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_B)); + + callOnUidStatechanged(UID_A, PROCESS_STATE_IMPORTANT_FOREGROUND, procStateSeq++, + PROCESS_CAPABILITY_USER_RESTRICTED_NETWORK); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_A)); + assertTrue(mService.isUidForegroundOnRestrictBackgroundUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_B)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_B)); + + callOnUidStatechanged(UID_A, PROCESS_STATE_TOP, procStateSeq++, + PROCESS_CAPABILITY_NONE); + assertTrue(mService.isUidForegroundOnRestrictPowerUL(UID_A)); + assertTrue(mService.isUidForegroundOnRestrictBackgroundUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_B)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_B)); + } + waitForUidEventHandlerIdle(); + + assertTrue(mService.isUidForegroundOnRestrictPowerUL(UID_A)); + assertTrue(mService.isUidForegroundOnRestrictBackgroundUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_B)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_B)); + + try (SyncBarrier b = new SyncBarrier(mService.mUidEventHandler)) { + callOnUidStatechanged(UID_A, PROCESS_STATE_SERVICE, procStateSeq++, + PROCESS_CAPABILITY_NONE); + assertTrue(mService.isUidForegroundOnRestrictPowerUL(UID_A)); + assertTrue(mService.isUidForegroundOnRestrictBackgroundUL(UID_A)); + assertFalse(mService.isUidForegroundOnRestrictPowerUL(UID_B)); + assertFalse(mService.isUidForegroundOnRestrictBackgroundUL(UID_B)); + } + waitForUidEventHandlerIdle(); } @Test @@ -1417,14 +1531,28 @@ public class NetworkPolicyManagerServiceTest { @Test public void testOnUidStateChanged_notifyAMS() throws Exception { final long procStateSeq = 222; - callOnUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_SERVICE, procStateSeq); + callAndWaitOnUidStateChanged(UID_A, PROCESS_STATE_SERVICE, procStateSeq); verify(mActivityManagerInternal).notifyNetworkPolicyRulesUpdated(UID_A, procStateSeq); } - private void callOnUidStateChanged(int uid, int procState, long procStateSeq) + private void callAndWaitOnUidStateChanged(int uid, int procState, long procStateSeq) + throws Exception { + callAndWaitOnUidStateChanged(uid, procState, procStateSeq, + PROCESS_CAPABILITY_NONE); + } + + private void callAndWaitOnUidStateChanged(int uid, int procState, long procStateSeq, + int capability) throws Exception { + callOnUidStatechanged(uid, procState, procStateSeq, capability); + waitForUidEventHandlerIdle(); + } + + private void callOnUidStatechanged(int uid, int procState, long procStateSeq, int capability) throws Exception { - mUidObserver.onUidStateChanged(uid, procState, procStateSeq, - ActivityManager.PROCESS_CAPABILITY_NONE); + mUidObserver.onUidStateChanged(uid, procState, procStateSeq, capability); + } + + private void waitForUidEventHandlerIdle() throws Exception { final CountDownLatch latch = new CountDownLatch(1); mService.mUidEventHandler.post(() -> { latch.countDown(); @@ -1927,9 +2055,9 @@ public class NetworkPolicyManagerServiceTest { @Test public void testLowPowerStandbyAllowlist() throws Exception { - callOnUidStateChanged(UID_A, ActivityManager.PROCESS_STATE_TOP, 0); - callOnUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0); - callOnUidStateChanged(UID_C, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0); + callAndWaitOnUidStateChanged(UID_A, PROCESS_STATE_TOP, 0); + callAndWaitOnUidStateChanged(UID_B, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0); + callAndWaitOnUidStateChanged(UID_C, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0); expectHasInternetPermission(UID_A, true); expectHasInternetPermission(UID_B, true); expectHasInternetPermission(UID_C, true); diff --git a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/SoundTriggerEventTest.java b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/SoundTriggerEventTest.java new file mode 100644 index 000000000000..1c8950696f59 --- /dev/null +++ b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/SoundTriggerEventTest.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.soundtrigger; + +import static com.google.common.truth.Truth.assertThat; + +import androidx.test.runner.AndroidJUnit4; + +import com.android.server.soundtrigger.SoundTriggerEvent.ServiceEvent; +import com.android.server.soundtrigger.SoundTriggerEvent.SessionEvent; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.UUID; + +@RunWith(AndroidJUnit4.class) +public final class SoundTriggerEventTest { + private static final ServiceEvent.Type serviceEventType = ServiceEvent.Type.ATTACH; + private static final SessionEvent.Type sessionEventType = SessionEvent.Type.DETACH; + + @Test + public void serviceEventNoPackageNoError_getStringContainsType() { + final var event = new ServiceEvent(serviceEventType); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(serviceEventType.name()); + assertThat(stringRep).ignoringCase().doesNotContain("error"); + } + + @Test + public void serviceEventPackageNoError_getStringContainsTypeAndPackage() { + final var packageName = "com.android.package.name"; + final var event = new ServiceEvent(serviceEventType, packageName); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(serviceEventType.name()); + assertThat(stringRep).contains(packageName); + assertThat(stringRep).ignoringCase().doesNotContain("error"); + } + + @Test + public void serviceEventPackageError_getStringContainsTypeAndPackageAndErrorAndMessage() { + final var packageName = "com.android.package.name"; + final var errorString = "oh no an ERROR occurred"; + final var event = new ServiceEvent(serviceEventType, packageName, errorString); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(serviceEventType.name()); + assertThat(stringRep).contains(packageName); + assertThat(stringRep).contains(errorString); + assertThat(stringRep).ignoringCase().contains("error"); + } + + @Test + public void sessionEventUUIDNoError_getStringContainsUUID() { + final var uuid = new UUID(5, -7); + final var event = new SessionEvent(sessionEventType, uuid); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(sessionEventType.name()); + assertThat(stringRep).contains(uuid.toString()); + assertThat(stringRep).ignoringCase().doesNotContain("error"); + } + + @Test + public void sessionEventUUIDError_getStringContainsUUIDAndError() { + final var uuid = new UUID(5, -7); + final var errorString = "oh no an ERROR occurred"; + final var event = new SessionEvent(sessionEventType, uuid, errorString); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(sessionEventType.name()); + assertThat(stringRep).contains(uuid.toString()); + assertThat(stringRep).ignoringCase().contains("error"); + assertThat(stringRep).contains(errorString); + } +} diff --git a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingTest.java b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingTest.java index 4d3c26f4973e..eb117d128383 100644 --- a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingTest.java +++ b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLoggingTest.java @@ -16,6 +16,8 @@ package com.android.server.soundtrigger_middleware; +import static com.android.server.soundtrigger_middleware.SoundTriggerMiddlewareLogging.ServiceEvent; +import static com.android.server.soundtrigger_middleware.SoundTriggerMiddlewareLogging.SessionEvent; import static com.android.internal.util.LatencyTracker.ACTION_SHOW_VOICE_INTERACTION; import static com.google.common.truth.Truth.assertThat; @@ -55,6 +57,9 @@ import java.util.Optional; @RunWith(JUnit4.class) public class SoundTriggerMiddlewareLoggingTest { + private static final ServiceEvent.Type SERVICE_TYPE = ServiceEvent.Type.ATTACH; + private static final SessionEvent.Type SESSION_TYPE = SessionEvent.Type.LOAD_MODEL; + private FakeLatencyTracker mLatencyTracker; @Mock private BatteryStatsInternal mBatteryStatsInternal; @@ -184,4 +189,138 @@ public class SoundTriggerMiddlewareLoggingTest { callback.onPhraseRecognition(0 /* modelHandle */, successEventWithKeyphraseId, 0 /* captureSession */); } + + @Test + public void serviceEventException_getStringContainsInfo() { + String packageName = "com.android.test"; + Exception exception = new Exception("test"); + Object param1 = new Object(); + Object param2 = new Object(); + final var event = ServiceEvent.createForException( + SERVICE_TYPE, packageName, exception, param1, param2); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(SERVICE_TYPE.name()); + assertThat(stringRep).contains(packageName); + assertThat(stringRep).contains(exception.toString()); + assertThat(stringRep).contains(param1.toString()); + assertThat(stringRep).contains(param2.toString()); + assertThat(stringRep).ignoringCase().contains("error"); + } + + @Test + public void serviceEventExceptionNoArgs_getStringContainsInfo() { + String packageName = "com.android.test"; + Exception exception = new Exception("test"); + final var event = ServiceEvent.createForException( + SERVICE_TYPE, packageName, exception); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(SERVICE_TYPE.name()); + assertThat(stringRep).contains(packageName); + assertThat(stringRep).contains(exception.toString()); + assertThat(stringRep).ignoringCase().contains("error"); + } + + @Test + public void serviceEventReturn_getStringContainsInfo() { + String packageName = "com.android.test"; + Object param1 = new Object(); + Object param2 = new Object(); + Object retValue = new Object(); + final var event = ServiceEvent.createForReturn( + SERVICE_TYPE, packageName, retValue, param1, param2); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(SERVICE_TYPE.name()); + assertThat(stringRep).contains(packageName); + assertThat(stringRep).contains(retValue.toString()); + assertThat(stringRep).contains(param1.toString()); + assertThat(stringRep).contains(param2.toString()); + assertThat(stringRep).ignoringCase().doesNotContain("error"); + } + + @Test + public void serviceEventReturnNoArgs_getStringContainsInfo() { + String packageName = "com.android.test"; + Object retValue = new Object(); + final var event = ServiceEvent.createForReturn( + SERVICE_TYPE, packageName, retValue); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(SERVICE_TYPE.name()); + assertThat(stringRep).contains(packageName); + assertThat(stringRep).contains(retValue.toString()); + assertThat(stringRep).ignoringCase().doesNotContain("error"); + } + + @Test + public void sessionEventException_getStringContainsInfo() { + Object param1 = new Object(); + Object param2 = new Object(); + Exception exception = new Exception("test"); + final var event = SessionEvent.createForException( + SESSION_TYPE, exception, param1, param2); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(SESSION_TYPE.name()); + assertThat(stringRep).contains(exception.toString()); + assertThat(stringRep).contains(param1.toString()); + assertThat(stringRep).contains(param2.toString()); + assertThat(stringRep).ignoringCase().contains("error"); + } + + @Test + public void sessionEventExceptionNoArgs_getStringContainsInfo() { + Exception exception = new Exception("test"); + final var event = SessionEvent.createForException( + SESSION_TYPE, exception); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(SESSION_TYPE.name()); + assertThat(stringRep).contains(exception.toString()); + assertThat(stringRep).ignoringCase().contains("error"); + } + + @Test + public void sessionEventReturn_getStringContainsInfo() { + Object param1 = new Object(); + Object param2 = new Object(); + Object retValue = new Object(); + final var event = SessionEvent.createForReturn( + SESSION_TYPE, retValue, param1, param2); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(SESSION_TYPE.name()); + assertThat(stringRep).contains(retValue.toString()); + assertThat(stringRep).contains(param1.toString()); + assertThat(stringRep).contains(param2.toString()); + assertThat(stringRep).ignoringCase().doesNotContain("error"); + } + + @Test + public void sessionEventReturnNoArgs_getStringContainsInfo() { + Object retValue = new Object(); + final var event = SessionEvent.createForReturn( + SESSION_TYPE, retValue); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(SESSION_TYPE.name()); + assertThat(stringRep).contains(retValue.toString()); + assertThat(stringRep).ignoringCase().doesNotContain("error"); + } + + @Test + public void sessionEventVoid_getStringContainsInfo() { + Object param1 = new Object(); + Object param2 = new Object(); + final var event = SessionEvent.createForVoid( + SESSION_TYPE, param1, param2); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(SESSION_TYPE.name()); + assertThat(stringRep).contains(param1.toString()); + assertThat(stringRep).contains(param2.toString()); + assertThat(stringRep).ignoringCase().doesNotContain("error"); + } + + @Test + public void sessionEventVoidNoArgs_getStringContainsInfo() { + final var event = SessionEvent.createForVoid( + SESSION_TYPE); + final var stringRep = event.eventToString(); + assertThat(stringRep).contains(SESSION_TYPE.name()); + assertThat(stringRep).ignoringCase().doesNotContain("error"); + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java index 4b2d1071d113..8e80485bca7c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java @@ -541,6 +541,24 @@ public class DisplayRotationTests { SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_180)); } + @Test + public void testFreezeRotation_reverseRotationDirectionAroundZAxis_yes() throws Exception { + mBuilder.build(); + when(mDeviceStateController.shouldReverseRotationDirectionAroundZAxis()).thenReturn(true); + + freezeRotation(Surface.ROTATION_90); + assertEquals(Surface.ROTATION_270, mTarget.getUserRotation()); + } + + @Test + public void testFreezeRotation_reverseRotationDirectionAroundZAxis_no() throws Exception { + mBuilder.build(); + when(mDeviceStateController.shouldReverseRotationDirectionAroundZAxis()).thenReturn(false); + + freezeRotation(Surface.ROTATION_90); + assertEquals(Surface.ROTATION_90, mTarget.getUserRotation()); + } + private boolean waitForUiHandler() { final CountDownLatch latch = new CountDownLatch(1); UiThread.getHandler().post(latch::countDown); diff --git a/services/tests/wmtests/src/com/android/server/wm/SurfaceSyncGroupTests.java b/services/tests/wmtests/src/com/android/server/wm/SurfaceSyncGroupTests.java index 9db647acebb7..89d7252b72a0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SurfaceSyncGroupTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SurfaceSyncGroupTests.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.os.Build.HW_TIMEOUT_MULTIPLIER; import static android.window.SurfaceSyncGroup.TRANSACTION_READY_TIMEOUT; import static org.junit.Assert.assertEquals; @@ -52,6 +53,8 @@ import java.util.concurrent.TimeUnit; public class SurfaceSyncGroupTests { private static final String TAG = "SurfaceSyncGroupTests"; + private static final long TIMEOUT_S = HW_TIMEOUT_MULTIPLIER * 5L; + @Rule public ActivityTestRule<SurfaceSyncGroupActivity> mActivityRule = new ActivityTestRule<>( SurfaceSyncGroupActivity.class); @@ -93,7 +96,7 @@ public class SurfaceSyncGroupTests { addSecondSyncGroup(secondSsg, secondDrawCompleteLatch, bothSyncGroupsComplete); assertTrue("Failed to draw two frames", - secondDrawCompleteLatch.await(5, TimeUnit.SECONDS)); + secondDrawCompleteLatch.await(TIMEOUT_S, TimeUnit.SECONDS)); mHandler.postDelayed(() -> { // Don't add a markSyncReady for the first sync group until after it's added to another @@ -105,7 +108,7 @@ public class SurfaceSyncGroupTests { }, 200); assertTrue("Failed to wait for both SurfaceSyncGroups to apply", - bothSyncGroupsComplete.await(5, TimeUnit.SECONDS)); + bothSyncGroupsComplete.await(TIMEOUT_S, TimeUnit.SECONDS)); validateScreenshot(); } @@ -123,7 +126,7 @@ public class SurfaceSyncGroupTests { transaction -> mHandler.postDelayed(() -> { try { assertTrue("Failed to draw two frames", - secondDrawCompleteLatch.await(5, TimeUnit.SECONDS)); + secondDrawCompleteLatch.await(TIMEOUT_S, TimeUnit.SECONDS)); } catch (InterruptedException e) { throw new RuntimeException(e); } @@ -143,7 +146,7 @@ public class SurfaceSyncGroupTests { addSecondSyncGroup(secondSsg, secondDrawCompleteLatch, bothSyncGroupsComplete); assertTrue("Failed to wait for both SurfaceSyncGroups to apply", - bothSyncGroupsComplete.await(5, TimeUnit.SECONDS)); + bothSyncGroupsComplete.await(TIMEOUT_S, TimeUnit.SECONDS)); validateScreenshot(); } 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 0dac346bb717..b59f027fec83 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java @@ -23,6 +23,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_SEAMLESS; +import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; @@ -36,6 +37,7 @@ import static android.window.TransitionInfo.FLAG_FILLS_TASK; import static android.window.TransitionInfo.FLAG_IN_TASK_WITH_EMBEDDED_ACTIVITY; import static android.window.TransitionInfo.FLAG_IS_BEHIND_STARTING_WINDOW; import static android.window.TransitionInfo.FLAG_IS_WALLPAPER; +import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP; import static android.window.TransitionInfo.FLAG_SHOW_WALLPAPER; import static android.window.TransitionInfo.FLAG_TRANSLUCENT; import static android.window.TransitionInfo.isIndependent; @@ -74,6 +76,7 @@ import android.platform.test.annotations.Presubmit; import android.util.ArrayMap; import android.util.ArraySet; import android.view.SurfaceControl; +import android.view.WindowManager; import android.window.IDisplayAreaOrganizer; import android.window.IRemoteTransition; import android.window.ITaskFragmentOrganizer; @@ -96,6 +99,7 @@ import java.util.ArrayList; import java.util.Objects; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; import java.util.function.Function; /** @@ -1903,7 +1907,7 @@ public class TransitionTests extends WindowTestsBase { assertTrue(targets.isEmpty()); // After collecting order changes, it should recognize that a task moved to top. - transition.collectOrderChanges(); + transition.collectOrderChanges(true); targets = Transition.calculateTargets(participants, changes); assertEquals(1, targets.size()); @@ -1914,6 +1918,192 @@ public class TransitionTests extends WindowTestsBase { assertEquals(TRANSIT_CHANGE, info.getChanges().get(0).getMode()); } + private class OrderChangeTestSetup { + final TransitionController mController; + final TestTransitionPlayer mPlayer; + final Transition mTransitA; + final Transition mTransitB; + + OrderChangeTestSetup() { + mController = mAtm.getTransitionController(); + mPlayer = registerTestTransitionPlayer(); + mController.setSyncEngine(mWm.mSyncEngine); + + mTransitA = createTestTransition(TRANSIT_OPEN, mController); + mTransitA.mParallelCollectType = Transition.PARALLEL_TYPE_MUTUAL; + mTransitB = createTestTransition(TRANSIT_OPEN, mController); + mTransitB.mParallelCollectType = Transition.PARALLEL_TYPE_MUTUAL; + } + + void startParallelCollect(boolean activityLevelFirst) { + // Start with taskB on top and taskA on bottom but both visible. + final Task taskA = createTask(mDisplayContent); + taskA.setVisibleRequested(true); + final ActivityRecord actA = createActivityRecord(taskA); + final TestWindowState winA = createWindowState( + new WindowManager.LayoutParams(TYPE_BASE_APPLICATION), actA); + actA.addWindow(winA); + final ActivityRecord actB = createActivityRecord(taskA); + final TestWindowState winB = createWindowState( + new WindowManager.LayoutParams(TYPE_BASE_APPLICATION), actB); + actB.addWindow(winB); + + final Task taskB = createTask(mDisplayContent); + actA.setVisibleRequested(true); + actB.setVisibleRequested(false); + taskB.setVisibleRequested(true); + assertTrue(actA.isAttached()); + + final Consumer<Boolean> startAndCollectA = (doReady) -> { + mController.startCollectOrQueue(mTransitA, (deferred) -> { + }); + + // Collect activity-level change into A + mTransitA.collect(actA); + actA.setVisibleRequested(false); + winA.onSyncFinishedDrawing(); + mTransitA.collect(actB); + actB.setVisibleRequested(true); + winB.onSyncFinishedDrawing(); + mTransitA.start(); + if (doReady) { + mTransitA.setReady(mDisplayContent, true); + } + }; + final Consumer<Boolean> startAndCollectB = (doReady) -> { + mController.startCollectOrQueue(mTransitB, (deferred) -> { + }); + mTransitB.collect(taskA); + taskA.moveToFront("test"); + mTransitB.start(); + if (doReady) { + mTransitB.setReady(mDisplayContent, true); + } + }; + + if (activityLevelFirst) { + startAndCollectA.accept(true); + startAndCollectB.accept(false); + } else { + startAndCollectB.accept(true); + startAndCollectA.accept(false); + } + } + } + + @Test + public void testMoveToTopStartAfterReadyAfterParallel() { + // Start collect activity-only transit A + // Start collect task transit B in parallel + // finish A first -> should not include order change from B. + final OrderChangeTestSetup setup = new OrderChangeTestSetup(); + setup.startParallelCollect(true /* activity first */); + + mWm.mSyncEngine.tryFinishForTest(setup.mTransitA.getSyncId()); + waitUntilHandlersIdle(); + for (int i = 0; i < setup.mPlayer.mLastReady.getChanges().size(); ++i) { + assertNull(setup.mPlayer.mLastReady.getChanges().get(i).getTaskInfo()); + } + + setup.mTransitB.setAllReady(); + mWm.mSyncEngine.tryFinishForTest(setup.mTransitB.getSyncId()); + waitUntilHandlersIdle(); + boolean hasOrderChange = false; + for (int i = 0; i < setup.mPlayer.mLastReady.getChanges().size(); ++i) { + final TransitionInfo.Change chg = setup.mPlayer.mLastReady.getChanges().get(i); + if (chg.getTaskInfo() == null) continue; + hasOrderChange = hasOrderChange || (chg.getFlags() & FLAG_MOVED_TO_TOP) != 0; + } + assertTrue(hasOrderChange); + } + + @Test + public void testMoveToTopStartAfterReadyBeforeParallel() { + // Start collect activity-only transit A + // Start collect task transit B in parallel + // finish B first -> should include order change + // then finish A -> should NOT include order change. + final OrderChangeTestSetup setup = new OrderChangeTestSetup(); + setup.startParallelCollect(true /* activity first */); + // Make it unready now so that it doesn't get dequeued automatically. + setup.mTransitA.setReady(mDisplayContent, false); + + // Make task change ready first + setup.mTransitB.setAllReady(); + mWm.mSyncEngine.tryFinishForTest(setup.mTransitB.getSyncId()); + waitUntilHandlersIdle(); + boolean hasOrderChange = false; + for (int i = 0; i < setup.mPlayer.mLastReady.getChanges().size(); ++i) { + final TransitionInfo.Change chg = setup.mPlayer.mLastReady.getChanges().get(i); + if (chg.getTaskInfo() == null) continue; + hasOrderChange = hasOrderChange || (chg.getFlags() & FLAG_MOVED_TO_TOP) != 0; + } + assertTrue(hasOrderChange); + + setup.mTransitA.setAllReady(); + mWm.mSyncEngine.tryFinishForTest(setup.mTransitA.getSyncId()); + waitUntilHandlersIdle(); + for (int i = 0; i < setup.mPlayer.mLastReady.getChanges().size(); ++i) { + assertNull(setup.mPlayer.mLastReady.getChanges().get(i).getTaskInfo()); + } + } + + @Test + public void testMoveToTopStartBeforeReadyAfterParallel() { + // Start collect task transit B + // Start collect activity-only transit A in parallel + // finish A first -> should not include order change from B. + final OrderChangeTestSetup setup = new OrderChangeTestSetup(); + setup.startParallelCollect(false /* activity first */); + // Make B unready now so that it doesn't get dequeued automatically. + setup.mTransitB.setReady(mDisplayContent, false); + + setup.mTransitA.setAllReady(); + mWm.mSyncEngine.tryFinishForTest(setup.mTransitA.getSyncId()); + waitUntilHandlersIdle(); + for (int i = 0; i < setup.mPlayer.mLastReady.getChanges().size(); ++i) { + assertNull(setup.mPlayer.mLastReady.getChanges().get(i).getTaskInfo()); + } + + setup.mTransitB.setAllReady(); + mWm.mSyncEngine.tryFinishForTest(setup.mTransitB.getSyncId()); + waitUntilHandlersIdle(); + boolean hasOrderChange = false; + for (int i = 0; i < setup.mPlayer.mLastReady.getChanges().size(); ++i) { + final TransitionInfo.Change chg = setup.mPlayer.mLastReady.getChanges().get(i); + if (chg.getTaskInfo() == null) continue; + hasOrderChange = hasOrderChange || (chg.getFlags() & FLAG_MOVED_TO_TOP) != 0; + } + assertTrue(hasOrderChange); + } + + @Test + public void testMoveToTopStartBeforeReadyBeforeParallel() { + // Start collect task transit B + // Start collect activity-only transit A in parallel + // finish B first -> should include order change + // then finish A -> should NOT include order change. + final OrderChangeTestSetup setup = new OrderChangeTestSetup(); + setup.startParallelCollect(false /* activity first */); + + mWm.mSyncEngine.tryFinishForTest(setup.mTransitB.getSyncId()); + waitUntilHandlersIdle(); + boolean hasOrderChange = false; + for (int i = 0; i < setup.mPlayer.mLastReady.getChanges().size(); ++i) { + final TransitionInfo.Change chg = setup.mPlayer.mLastReady.getChanges().get(i); + if (chg.getTaskInfo() == null) continue; + hasOrderChange = hasOrderChange || (chg.getFlags() & FLAG_MOVED_TO_TOP) != 0; + } + assertTrue(hasOrderChange); + + setup.mTransitA.setAllReady(); + mWm.mSyncEngine.tryFinishForTest(setup.mTransitA.getSyncId()); + waitUntilHandlersIdle(); + for (int i = 0; i < setup.mPlayer.mLastReady.getChanges().size(); ++i) { + assertNull(setup.mPlayer.mLastReady.getChanges().get(i).getTaskInfo()); + } + } + @Test public void testQueueStartCollect() { final TransitionController controller = mAtm.getTransitionController(); @@ -2018,6 +2208,94 @@ public class TransitionTests extends WindowTestsBase { assertTrue(transitB.isCollecting()); } + @Test + public void testQueueParallel() { + final TransitionController controller = mAtm.getTransitionController(); + final TestTransitionPlayer player = registerTestTransitionPlayer(); + + mSyncEngine = createTestBLASTSyncEngine(); + controller.setSyncEngine(mSyncEngine); + + final Transition transitA = createTestTransition(TRANSIT_OPEN, controller); + transitA.mParallelCollectType = Transition.PARALLEL_TYPE_MUTUAL; + final Transition transitB = createTestTransition(TRANSIT_OPEN, controller); + transitB.mParallelCollectType = Transition.PARALLEL_TYPE_MUTUAL; + final Transition transitC = createTestTransition(TRANSIT_OPEN, controller); + transitC.mParallelCollectType = Transition.PARALLEL_TYPE_MUTUAL; + final Transition transitSync = createTestTransition(TRANSIT_OPEN, controller); + final Transition transitD = createTestTransition(TRANSIT_OPEN, controller); + + controller.startCollectOrQueue(transitA, (deferred) -> {}); + controller.startCollectOrQueue(transitB, (deferred) -> {}); + controller.startCollectOrQueue(transitC, (deferred) -> {}); + controller.startCollectOrQueue(transitSync, (deferred) -> {}); + controller.startCollectOrQueue(transitD, (deferred) -> {}); + + assertTrue(transitA.isCollecting() && !transitA.isStarted()); + // We still serialize on readiness + assertTrue(transitB.isPending()); + assertTrue(transitC.isPending()); + + transitA.start(); + transitA.setAllReady(); + transitB.start(); + transitB.setAllReady(); + + // A, B, and C should be collecting in parallel now. + assertTrue(transitA.isStarted()); + assertTrue(transitB.isStarted()); + assertTrue(transitC.isCollecting() && !transitC.isStarted()); + + transitC.start(); + transitC.setAllReady(); + + assertTrue(transitA.isStarted()); + assertTrue(transitB.isStarted()); + assertTrue(transitC.isStarted()); + // Not parallel so should remain pending + assertTrue(transitSync.isPending()); + // After Sync, so should also remain pending. + assertTrue(transitD.isPending()); + // There should always be a collector, since Sync can't collect yet, C should remain. + assertEquals(transitC, controller.getCollectingTransition()); + + mSyncEngine.tryFinishForTest(transitB.getSyncId()); + + // The other transitions should remain waiting. + assertTrue(transitA.isStarted()); + assertTrue(transitB.isPlaying()); + assertTrue(transitC.isStarted()); + assertEquals(transitC, controller.getCollectingTransition()); + + mSyncEngine.tryFinishForTest(transitC.getSyncId()); + assertTrue(transitA.isStarted()); + assertTrue(transitC.isPlaying()); + // The "collecting" one became ready, so the first "waiting" should move back to collecting. + assertEquals(transitA, controller.getCollectingTransition()); + + assertTrue(transitSync.isPending()); + assertTrue(transitD.isPending()); + mSyncEngine.tryFinishForTest(transitA.getSyncId()); + + // Now all collectors are done, so sync can be pulled-off the queue. + assertTrue(transitSync.isCollecting() && !transitSync.isStarted()); + transitSync.start(); + transitSync.setAllReady(); + // Since D can run in parallel, it should be pulled-off the queue. + assertTrue(transitSync.isStarted()); + assertTrue(transitD.isPending()); + + mSyncEngine.tryFinishForTest(transitSync.getSyncId()); + assertTrue(transitD.isCollecting()); + + transitD.start(); + transitD.setAllReady(); + mSyncEngine.tryFinishForTest(transitD.getSyncId()); + + // Now nothing should be collecting + assertFalse(controller.isCollecting()); + } + private static void makeTaskOrganized(Task... tasks) { final ITaskOrganizer organizer = mock(ITaskOrganizer.class); for (Task t : tasks) { diff --git a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java index 453096306694..01ddcca99300 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WallpaperControllerTests.java @@ -382,7 +382,7 @@ public class WallpaperControllerTests extends WindowTestsBase { assertTrue(wallpaperWindow.isVisible()); assertTrue(token.isVisibleRequested()); assertTrue(token.isVisible()); - mWm.mAtmService.getTransitionController().abort(transit); + transit.abort(); // In a transition, setting invisible should ONLY set requestedVisible false; otherwise // wallpaper should remain "visible" until transition is over. diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerEvent.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerEvent.java new file mode 100644 index 000000000000..2a55496d2cd1 --- /dev/null +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerEvent.java @@ -0,0 +1,135 @@ +/** + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.soundtrigger; + +import android.util.Slog; + +import com.android.server.utils.EventLogger.Event; + +import java.util.UUID; + +public abstract class SoundTriggerEvent extends Event { + + @Override + public Event printLog(int type, String tag) { + switch (type) { + case ALOGI: + Slog.i(tag, eventToString()); + break; + case ALOGE: + Slog.e(tag, eventToString()); + break; + case ALOGW: + Slog.w(tag, eventToString()); + break; + case ALOGV: + default: + Slog.v(tag, eventToString()); + } + return this; + } + + public static class ServiceEvent extends SoundTriggerEvent { + public enum Type { + ATTACH, + LIST_MODULE, + DETACH, + } + + private final Type mType; + private final String mPackageName; + private final String mErrorString; + + public ServiceEvent(Type type) { + this(type, null, null); + } + + public ServiceEvent(Type type, String packageName) { + this(type, packageName, null); + } + + public ServiceEvent(Type type, String packageName, String errorString) { + mType = type; + mPackageName = packageName; + mErrorString = errorString; + } + + @Override + public String eventToString() { + var res = new StringBuilder(String.format("%-12s", mType.name())); + if (mErrorString != null) { + res.append(" ERROR: ").append(mErrorString); + } + if (mPackageName != null) { + res.append(" for: ").append(mPackageName); + } + return res.toString(); + } + } + + public static class SessionEvent extends SoundTriggerEvent { + public enum Type { + // Downward calls + START_RECOGNITION, + STOP_RECOGNITION, + LOAD_MODEL, + UNLOAD_MODEL, + UPDATE_MODEL, + DELETE_MODEL, + START_RECOGNITION_SERVICE, + STOP_RECOGNITION_SERVICE, + GET_MODEL_STATE, + SET_PARAMETER, + GET_MODULE_PROPERTIES, + DETACH, + // Callback events + RECOGNITION, + RESUME, + RESUME_FAILED, + PAUSE, + PAUSE_FAILED, + RESOURCES_AVAILABLE, + MODULE_DIED + } + + private final UUID mModelUuid; + private final Type mType; + private final String mErrorString; + + public SessionEvent(Type type, UUID modelUuid, String errorString) { + mType = type; + mModelUuid = modelUuid; + mErrorString = errorString; + } + + public SessionEvent(Type type, UUID modelUuid) { + this(type, modelUuid, null); + } + + @Override + public String eventToString() { + var res = new StringBuilder(String.format("%-25s", mType.name())); + if (mErrorString != null) { + res.append(" ERROR: ").append(mErrorString); + } + if (mModelUuid != null) { + res.append(" for: ").append(mModelUuid); + } + return res.toString(); + } + } +} diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java index 18d0c5a2d05f..bee75dfe785f 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java @@ -16,6 +16,9 @@ package com.android.server.soundtrigger; +import static com.android.server.soundtrigger.SoundTriggerEvent.SessionEvent.Type; +import static com.android.server.utils.EventLogger.Event.ALOGW; + import android.annotation.NonNull; import android.annotation.Nullable; import android.content.BroadcastReceiver; @@ -51,6 +54,9 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.logging.MetricsLogger; +import com.android.server.soundtrigger.SoundTriggerEvent.SessionEvent; +import com.android.server.utils.EventLogger.Event; +import com.android.server.utils.EventLogger; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -76,7 +82,6 @@ import java.util.function.Supplier; */ public class SoundTriggerHelper implements SoundTrigger.StatusListener { static final String TAG = "SoundTriggerHelper"; - static final boolean DBG = false; // Module ID if there is no available module to connect to. public static final int INVALID_MODULE_ID = -1; @@ -129,11 +134,12 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { private final int mModuleId; private final Function<SoundTrigger.StatusListener, SoundTriggerModule> mModuleProvider; private final Supplier<List<ModuleProperties>> mModulePropertiesProvider; + private final EventLogger mEventLogger; @GuardedBy("mLock") private boolean mIsDetached = false; - SoundTriggerHelper(Context context, + SoundTriggerHelper(Context context, EventLogger eventLogger, @NonNull Function<SoundTrigger.StatusListener, SoundTriggerModule> moduleProvider, int moduleId, @NonNull Supplier<List<ModuleProperties>> modulePropertiesProvider) { @@ -144,6 +150,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { mModelDataMap = new HashMap<UUID, ModelData>(); mKeyphraseUuidMap = new HashMap<Integer, UUID>(); mModuleProvider = moduleProvider; + mEventLogger = eventLogger; mModulePropertiesProvider = modulePropertiesProvider; if (moduleId == INVALID_MODULE_ID) { mModule = null; @@ -234,14 +241,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { throw new IllegalStateException("SoundTriggerHelper has been detached"); } - if (DBG) { - Slog.d(TAG, "startKeyphraseRecognition for keyphraseId=" + keyphraseId - + " soundModel=" + soundModel + ", callback=" + callback.asBinder() - + ", recognitionConfig=" + recognitionConfig - + ", runInBatterySaverMode=" + runInBatterySaverMode); - dumpModelStateLocked(); - } - ModelData model = getKeyphraseModelDataLocked(keyphraseId); if (model != null && !model.isKeyphraseModel()) { Slog.e(TAG, "Generic model with same UUID exists."); @@ -301,9 +300,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } modelData.setHandle(handle[0]); modelData.setLoaded(); - if (DBG) { - Slog.d(TAG, "prepareForRecognition: Sound model loaded with handle:" + handle[0]); - } } return STATUS_OK; } @@ -448,13 +444,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { return STATUS_ERROR; } - if (DBG) { - Slog.d(TAG, "stopRecognition for keyphraseId=" + keyphraseId + ", callback =" + - callback.asBinder()); - Slog.d(TAG, "current callback=" - + ((modelData == null || modelData.getCallback() == null) ? "null" : - modelData.getCallback().asBinder())); - } int status = stopRecognition(modelData, callback); if (status != SoundTrigger.STATUS_OK) { return status; @@ -635,7 +624,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { // Remove it from existence. mModelDataMap.remove(modelId); - if (DBG) dumpModelStateLocked(); return status; } } @@ -797,7 +785,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { return; } - if (DBG) Slog.d(TAG, "onRecognition: " + event); synchronized (mLock) { switch (event.status) { case SoundTrigger.RECOGNITION_STATUS_ABORT: @@ -845,12 +832,14 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } try { + mEventLogger.enqueue(new SessionEvent(Type.RECOGNITION, model.getModelId())); callback.onGenericSoundTriggerDetected((GenericRecognitionEvent) event); - } catch (DeadObjectException e) { + } catch (RemoteException e) { + mEventLogger.enqueue(new SessionEvent( + Type.RECOGNITION, model.getModelId(), "RemoteException") + .printLog(ALOGW, TAG)); forceStopAndUnloadModelLocked(model, e); return; - } catch (RemoteException e) { - Slog.w(TAG, "RemoteException in onGenericSoundTriggerDetected", e); } RecognitionConfig config = model.getRecognitionConfig(); @@ -869,7 +858,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { @Override public void onModelUnloaded(int modelHandle) { - if (DBG) Slog.d(TAG, "onModelUnloaded: " + modelHandle); synchronized (mLock) { MetricsLogger.count(mContext, "sth_sound_model_updated", 1); onModelUnloadedLocked(modelHandle); @@ -878,7 +866,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { @Override public void onResourcesAvailable() { - if (DBG) Slog.d(TAG, "onResourcesAvailable"); synchronized (mLock) { onResourcesAvailableLocked(); } @@ -920,6 +907,7 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } private void onResourcesAvailableLocked() { + mEventLogger.enqueue(new SessionEvent(Type.RESOURCES_AVAILABLE, null)); updateAllRecognitionsLocked(); } @@ -932,12 +920,14 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { try { IRecognitionStatusCallback callback = modelData.getCallback(); if (callback != null) { + mEventLogger.enqueue(new SessionEvent(Type.PAUSE, modelData.getModelId())); callback.onRecognitionPaused(); } - } catch (DeadObjectException e) { - forceStopAndUnloadModelLocked(modelData, e); } catch (RemoteException e) { - Slog.w(TAG, "RemoteException in onRecognitionPaused", e); + mEventLogger.enqueue(new SessionEvent( + Type.PAUSE, modelData.getModelId(), "RemoteException") + .printLog(ALOGW, TAG)); + forceStopAndUnloadModelLocked(modelData, e); } updateRecognitionLocked(modelData, true); } @@ -979,12 +969,14 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } try { + mEventLogger.enqueue(new SessionEvent(Type.RECOGNITION, modelData.getModelId())); modelData.getCallback().onKeyphraseDetected((KeyphraseRecognitionEvent) event); - } catch (DeadObjectException e) { + } catch (RemoteException e) { + mEventLogger.enqueue(new SessionEvent( + Type.RECOGNITION, modelData.getModelId(), "RemoteException") + .printLog(ALOGW, TAG)); forceStopAndUnloadModelLocked(modelData, e); return; - } catch (RemoteException e) { - Slog.w(TAG, "RemoteException in onKeyphraseDetected", e); } RecognitionConfig config = modelData.getRecognitionConfig(); @@ -1036,10 +1028,13 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { IRecognitionStatusCallback callback = modelData.getCallback(); if (callback != null) { try { + mEventLogger.enqueue(new SessionEvent(Type.MODULE_DIED, + modelData.getModelId()).printLog(ALOGW, TAG)); callback.onModuleDied(); } catch (RemoteException e) { - Slog.w(TAG, "RemoteException send moduleDied for model handle " + - modelData.getHandle(), e); + mEventLogger.enqueue(new SessionEvent(Type.MODULE_DIED, + modelData.getModelId(), "RemoteException") + .printLog(ALOGW, TAG)); } } } @@ -1085,7 +1080,6 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { @Override public void onCallStateChanged(int state, String arg1) { - if (DBG) Slog.d(TAG, "onCallStateChanged: " + state); if (mHandler != null) { synchronized (mLock) { @@ -1107,24 +1101,12 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { } @SoundTriggerPowerSaveMode int soundTriggerPowerSaveMode = mPowerManager.getSoundTriggerPowerSaveMode(); - if (DBG) { - Slog.d(TAG, "onPowerSaveModeChanged: " + soundTriggerPowerSaveMode); - } synchronized (mLock) { onPowerSaveModeChangedLocked(soundTriggerPowerSaveMode); } } } - void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - synchronized (mLock) { - pw.print(" module properties="); - pw.print(" call active="); - pw.println(mCallActive); - pw.println(" SoundTrigger Power State=" + mSoundTriggerPowerSaveMode); - } - } - private void initializeDeviceStateListeners() { if (mRecognitionRequested) { return; @@ -1160,13 +1142,13 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { public void detach() { synchronized (mLock) { if (mIsDetached) return; + mIsDetached = true; for (ModelData model : mModelDataMap.values()) { forceStopAndUnloadModelLocked(model, null); } mModelDataMap.clear(); internalClearGlobalStateLocked(); if (mModule != null) { - mIsDetached = true; mModule.detach(); mModule = null; } @@ -1370,11 +1352,16 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { // Notify of error if needed. if (notifyClientOnError) { try { + mEventLogger.enqueue(new SessionEvent(Type.RESUME_FAILED, + modelData.getModelId(), String.valueOf(status)) + .printLog(ALOGW, TAG)); callback.onResumeFailed(status); - } catch (DeadObjectException e) { - forceStopAndUnloadModelLocked(modelData, e); } catch (RemoteException e) { - Slog.w(TAG, "RemoteException in onResumeFailed", e); + mEventLogger.enqueue(new SessionEvent(Type.RESUME_FAILED, + modelData.getModelId(), + String.valueOf(status) + " - RemoteException") + .printLog(ALOGW, TAG)); + forceStopAndUnloadModelLocked(modelData, e); } } } else { @@ -1384,17 +1371,16 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { // Notify of resume if needed. if (notifyClientOnError) { try { + mEventLogger.enqueue(new SessionEvent(Type.RESUME, + modelData.getModelId())); callback.onRecognitionResumed(); - } catch (DeadObjectException e) { - forceStopAndUnloadModelLocked(modelData, e); } catch (RemoteException e) { - Slog.w(TAG, "RemoteException in onRecognitionResumed", e); + mEventLogger.enqueue(new SessionEvent(Type.RESUME, + modelData.getModelId(), "RemoteException").printLog(ALOGW, TAG)); + forceStopAndUnloadModelLocked(modelData, e); } } } - if (DBG) { - Slog.d(TAG, "Model being started :" + modelData.toString()); - } return status; } @@ -1414,11 +1400,16 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { MetricsLogger.count(mContext, "sth_stop_recognition_error", 1); if (notify) { try { + mEventLogger.enqueue(new SessionEvent(Type.PAUSE_FAILED, + modelData.getModelId(), String.valueOf(status)) + .printLog(ALOGW, TAG)); callback.onPauseFailed(status); - } catch (DeadObjectException e) { - forceStopAndUnloadModelLocked(modelData, e); } catch (RemoteException e) { - Slog.w(TAG, "RemoteException in onPauseFailed", e); + mEventLogger.enqueue(new SessionEvent(Type.PAUSE_FAILED, + modelData.getModelId(), + String.valueOf(status) + " - RemoteException") + .printLog(ALOGW, TAG)); + forceStopAndUnloadModelLocked(modelData, e); } } } else { @@ -1427,27 +1418,19 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener { // Notify of pause if needed. if (notify) { try { + mEventLogger.enqueue(new SessionEvent(Type.PAUSE, + modelData.getModelId())); callback.onRecognitionPaused(); - } catch (DeadObjectException e) { - forceStopAndUnloadModelLocked(modelData, e); } catch (RemoteException e) { - Slog.w(TAG, "RemoteException in onRecognitionPaused", e); + mEventLogger.enqueue(new SessionEvent(Type.PAUSE, + modelData.getModelId(), "RemoteException").printLog(ALOGW, TAG)); + forceStopAndUnloadModelLocked(modelData, e); } } } - if (DBG) { - Slog.d(TAG, "Model being stopped :" + modelData.toString()); - } return status; } - private void dumpModelStateLocked() { - for (UUID modelId : mModelDataMap.keySet()) { - ModelData modelData = mModelDataMap.get(modelId); - Slog.i(TAG, "Model :" + modelData.toString()); - } - } - // Computes whether we have any recognition running at all (voice or generic). Sets // the mRecognitionRequested variable with the result. private boolean computeRecognitionRequestedLocked() { diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java index 46e634fa7273..77e53177e6a8 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerService.java @@ -31,6 +31,9 @@ import static android.hardware.soundtrigger.SoundTrigger.STATUS_OK; import static android.provider.Settings.Global.MAX_SOUND_TRIGGER_DETECTION_SERVICE_OPS_PER_DAY; import static android.provider.Settings.Global.SOUND_TRIGGER_DETECTION_SERVICE_OP_TIMEOUT; +import static com.android.server.soundtrigger.SoundTriggerEvent.SessionEvent.Type; +import static com.android.server.utils.EventLogger.Event.ALOGW; + import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import android.Manifest; @@ -83,6 +86,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.SparseArray; import android.util.Slog; import com.android.internal.annotations.GuardedBy; @@ -90,6 +94,9 @@ import com.android.internal.app.ISoundTriggerService; import com.android.internal.app.ISoundTriggerSession; import com.android.server.SoundTriggerInternal; import com.android.server.SystemService; +import com.android.server.soundtrigger.SoundTriggerEvent.ServiceEvent; +import com.android.server.soundtrigger.SoundTriggerEvent.SessionEvent; +import com.android.server.utils.EventLogger.Event; import com.android.server.utils.EventLogger; import java.io.FileDescriptor; @@ -97,11 +104,16 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Set; +import java.util.Deque; import java.util.Map; import java.util.Objects; import java.util.TreeMap; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** @@ -116,6 +128,7 @@ import java.util.stream.Collectors; public class SoundTriggerService extends SystemService { private static final String TAG = "SoundTriggerService"; private static final boolean DEBUG = true; + private static final int SESSION_MAX_EVENT_SIZE = 128; final Context mContext; private Object mLock; @@ -123,6 +136,12 @@ public class SoundTriggerService extends SystemService { private final LocalSoundTriggerService mLocalSoundTriggerService; private SoundTriggerDbHelper mDbHelper; + private final EventLogger mServiceEventLogger = new EventLogger(256, "Service"); + + private final Set<EventLogger> mSessionEventLoggers = ConcurrentHashMap.newKeySet(4); + private final Deque<EventLogger> mDetachedSessionEventLoggers = new LinkedBlockingDeque<>(4); + private AtomicInteger mSessionIdCounter = new AtomicInteger(0); + class SoundModelStatTracker { private class SoundModelStat { SoundModelStat() { @@ -164,7 +183,7 @@ public class SoundTriggerService extends SystemService { public synchronized void onStop(UUID id) { SoundModelStat stat = mModelStats.get(id); if (stat == null) { - Slog.w(TAG, "error onStop(): Model " + id + " has no stats available"); + Slog.i(TAG, "error onStop(): Model " + id + " has no stats available"); return; } @@ -241,7 +260,9 @@ public class SoundTriggerService extends SystemService { } } - private SoundTriggerHelper newSoundTriggerHelper(ModuleProperties moduleProperties) { + private SoundTriggerHelper newSoundTriggerHelper( + ModuleProperties moduleProperties, EventLogger eventLogger) { + Identity middlemanIdentity = new Identity(); middlemanIdentity.packageName = ActivityThread.currentOpPackageName(); Identity originatorIdentity = IdentityContext.getNonNull(); @@ -260,6 +281,7 @@ public class SoundTriggerService extends SystemService { return new SoundTriggerHelper( mContext, + eventLogger, (SoundTrigger.StatusListener statusListener) -> SoundTrigger.attachModuleAsMiddleman( moduleId, statusListener, null /* handler */, @@ -269,14 +291,33 @@ public class SoundTriggerService extends SystemService { ); } + // Helper to add session logger to the capacity limited detached list. + // If we are at capacity, remove the oldest, and retry + private void addDetachedSessionLogger(EventLogger logger) { + // Attempt to push to the top of the queue + while (!mDetachedSessionEventLoggers.offerFirst(logger)) { + // Remove the oldest element, if one still exists + mDetachedSessionEventLoggers.pollLast(); + } + } + class SoundTriggerServiceStub extends ISoundTriggerService.Stub { @Override public ISoundTriggerSession attachAsOriginator(@NonNull Identity originatorIdentity, @NonNull ModuleProperties moduleProperties, @NonNull IBinder client) { + + int sessionId = mSessionIdCounter.getAndIncrement(); + mServiceEventLogger.enqueue(new ServiceEvent( + ServiceEvent.Type.ATTACH, originatorIdentity.packageName + "#" + sessionId)); try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect( originatorIdentity)) { - return new SoundTriggerSessionStub(client, newSoundTriggerHelper(moduleProperties)); + var eventLogger = new EventLogger(SESSION_MAX_EVENT_SIZE, + "SoundTriggerSessionLogs for package: " + + Objects.requireNonNull(originatorIdentity.packageName) + + "#" + sessionId); + return new SoundTriggerSessionStub(client, + newSoundTriggerHelper(moduleProperties, eventLogger), eventLogger); } } @@ -285,15 +326,26 @@ public class SoundTriggerService extends SystemService { @NonNull Identity middlemanIdentity, @NonNull ModuleProperties moduleProperties, @NonNull IBinder client) { + + int sessionId = mSessionIdCounter.getAndIncrement(); + mServiceEventLogger.enqueue(new ServiceEvent( + ServiceEvent.Type.ATTACH, originatorIdentity.packageName + "#" + sessionId)); try (SafeCloseable ignored = PermissionUtil.establishIdentityIndirect(mContext, SOUNDTRIGGER_DELEGATE_IDENTITY, middlemanIdentity, originatorIdentity)) { - return new SoundTriggerSessionStub(client, newSoundTriggerHelper(moduleProperties)); + var eventLogger = new EventLogger(SESSION_MAX_EVENT_SIZE, + "SoundTriggerSessionLogs for package: " + + Objects.requireNonNull(originatorIdentity.packageName) + "#" + + sessionId); + return new SoundTriggerSessionStub(client, + newSoundTriggerHelper(moduleProperties, eventLogger), eventLogger); } } @Override public List<ModuleProperties> listModuleProperties(@NonNull Identity originatorIdentity) { + mServiceEventLogger.enqueue(new ServiceEvent( + ServiceEvent.Type.LIST_MODULE, originatorIdentity.packageName)); try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect( originatorIdentity)) { return listUnderlyingModuleProperties(originatorIdentity); @@ -316,6 +368,31 @@ public class SoundTriggerService extends SystemService { throw e.rethrowFromSystemServer(); } } + + @Override + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + // Event loggers + pw.println("##Service-Wide logs:"); + mServiceEventLogger.dump(pw, /* indent = */ " "); + + pw.println("\n##Active Session dumps:\n"); + for (var sessionLogger : mSessionEventLoggers) { + sessionLogger.dump(pw, /* indent= */ " "); + pw.println(""); + } + pw.println("##Detached Session dumps:\n"); + for (var sessionLogger : mDetachedSessionEventLoggers) { + sessionLogger.dump(pw, /* indent= */ " "); + pw.println(""); + } + // enrolled models + pw.println("##Enrolled db dump:\n"); + mDbHelper.dump(pw); + + // stats + pw.println("\n##Sound Model Stats dump:\n"); + mSoundModelStatTracker.dump(pw); + } } class SoundTriggerSessionStub extends ISoundTriggerSession.Stub { @@ -326,17 +403,20 @@ public class SoundTriggerService extends SystemService { private final TreeMap<UUID, SoundModel> mLoadedModels = new TreeMap<>(); private final Object mCallbacksLock = new Object(); private final TreeMap<UUID, IRecognitionStatusCallback> mCallbacks = new TreeMap<>(); + private final EventLogger mEventLogger; - SoundTriggerSessionStub(@NonNull IBinder client, SoundTriggerHelper soundTriggerHelper) { + SoundTriggerSessionStub(@NonNull IBinder client, + SoundTriggerHelper soundTriggerHelper, EventLogger eventLogger) { mSoundTriggerHelper = soundTriggerHelper; mClient = client; mOriginatorIdentity = IdentityContext.getNonNull(); + mEventLogger = eventLogger; + mSessionEventLoggers.add(mEventLogger); + try { - mClient.linkToDeath(() -> { - clientDied(); - }, 0); + mClient.linkToDeath(() -> clientDied(), 0); } catch (RemoteException e) { - Slog.e(TAG, "Failed to register death listener.", e); + clientDied(); } } @@ -344,11 +424,14 @@ public class SoundTriggerService extends SystemService { public int startRecognition(GenericSoundModel soundModel, IRecognitionStatusCallback callback, RecognitionConfig config, boolean runInBatterySaverMode) { + mEventLogger.enqueue(new SessionEvent(Type.START_RECOGNITION, getUuid(soundModel))); + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); if (soundModel == null) { - Slog.e(TAG, "Null model passed to startRecognition"); + mEventLogger.enqueue(new SessionEvent(Type.START_RECOGNITION, + getUuid(soundModel), "Invalid sound model").printLog(ALOGW, TAG)); return STATUS_ERROR; } @@ -356,13 +439,6 @@ public class SoundTriggerService extends SystemService { enforceCallingPermission(Manifest.permission.SOUND_TRIGGER_RUN_IN_BATTERY_SAVER); } - if (DEBUG) { - Slog.i(TAG, "startRecognition(): Uuid : " + soundModel.toString()); - } - - sEventLogger.enqueue(new EventLogger.StringEvent( - "startRecognition(): Uuid : " + soundModel.getUuid().toString())); - int ret = mSoundTriggerHelper.startGenericRecognition(soundModel.getUuid(), soundModel, callback, config, runInBatterySaverMode); @@ -375,15 +451,9 @@ public class SoundTriggerService extends SystemService { @Override public int stopRecognition(ParcelUuid parcelUuid, IRecognitionStatusCallback callback) { + mEventLogger.enqueue(new SessionEvent(Type.STOP_RECOGNITION, getUuid(parcelUuid))); try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "stopRecognition(): Uuid : " + parcelUuid); - } - - sEventLogger.enqueue(new EventLogger.StringEvent("stopRecognition(): Uuid : " - + parcelUuid)); - int ret = mSoundTriggerHelper.stopGenericRecognition(parcelUuid.getUuid(), callback); if (ret == STATUS_OK) { @@ -397,13 +467,6 @@ public class SoundTriggerService extends SystemService { public SoundTrigger.GenericSoundModel getSoundModel(ParcelUuid soundModelId) { try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "getSoundModel(): id = " + soundModelId); - } - - sEventLogger.enqueue(new EventLogger.StringEvent("getSoundModel(): id = " - + soundModelId)); - SoundTrigger.GenericSoundModel model = mDbHelper.getGenericSoundModel( soundModelId.getUuid()); return model; @@ -412,29 +475,18 @@ public class SoundTriggerService extends SystemService { @Override public void updateSoundModel(SoundTrigger.GenericSoundModel soundModel) { + mEventLogger.enqueue(new SessionEvent(Type.UPDATE_MODEL, getUuid(soundModel))); try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "updateSoundModel(): model = " + soundModel); - } - - sEventLogger.enqueue(new EventLogger.StringEvent("updateSoundModel(): model = " - + soundModel)); - mDbHelper.updateGenericSoundModel(soundModel); + mDbHelper.updateGenericSoundModel(soundModel); } } @Override public void deleteSoundModel(ParcelUuid soundModelId) { + mEventLogger.enqueue(new SessionEvent(Type.DELETE_MODEL, getUuid(soundModelId))); try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "deleteSoundModel(): id = " + soundModelId); - } - - sEventLogger.enqueue(new EventLogger.StringEvent("deleteSoundModel(): id = " - + soundModelId)); - // Unload the model if it is loaded. mSoundTriggerHelper.unloadGenericSoundModel(soundModelId.getUuid()); @@ -447,22 +499,14 @@ public class SoundTriggerService extends SystemService { @Override public int loadGenericSoundModel(GenericSoundModel soundModel) { + mEventLogger.enqueue(new SessionEvent(Type.LOAD_MODEL, getUuid(soundModel))); try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); if (soundModel == null || soundModel.getUuid() == null) { - Slog.w(TAG, "Invalid sound model"); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "loadGenericSoundModel(): Invalid sound model")); - + mEventLogger.enqueue(new SessionEvent(Type.LOAD_MODEL, + getUuid(soundModel), "Invalid sound model").printLog(ALOGW, TAG)); return STATUS_ERROR; } - if (DEBUG) { - Slog.i(TAG, "loadGenericSoundModel(): id = " + soundModel.getUuid()); - } - - sEventLogger.enqueue(new EventLogger.StringEvent("loadGenericSoundModel(): id = " - + soundModel.getUuid())); synchronized (mLock) { SoundModel oldModel = mLoadedModels.get(soundModel.getUuid()); @@ -483,32 +527,22 @@ public class SoundTriggerService extends SystemService { @Override public int loadKeyphraseSoundModel(KeyphraseSoundModel soundModel) { + mEventLogger.enqueue(new SessionEvent(Type.LOAD_MODEL, getUuid(soundModel))); + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); if (soundModel == null || soundModel.getUuid() == null) { - Slog.w(TAG, "Invalid sound model"); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "loadKeyphraseSoundModel(): Invalid sound model")); + mEventLogger.enqueue(new SessionEvent(Type.LOAD_MODEL, getUuid(soundModel), + "Invalid sound model").printLog(ALOGW, TAG)); return STATUS_ERROR; } if (soundModel.getKeyphrases() == null || soundModel.getKeyphrases().length != 1) { - Slog.w(TAG, "Only one keyphrase per model is currently supported."); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "loadKeyphraseSoundModel(): Only one keyphrase per model" - + " is currently supported.")); - + mEventLogger.enqueue(new SessionEvent(Type.LOAD_MODEL, getUuid(soundModel), + "Only one keyphrase supported").printLog(ALOGW, TAG)); return STATUS_ERROR; } - if (DEBUG) { - Slog.i(TAG, "loadKeyphraseSoundModel(): id = " + soundModel.getUuid()); - } - sEventLogger.enqueue( - new EventLogger.StringEvent("loadKeyphraseSoundModel(): id = " - + soundModel.getUuid())); synchronized (mLock) { SoundModel oldModel = mLoadedModels.get(soundModel.getUuid()); @@ -530,23 +564,17 @@ public class SoundTriggerService extends SystemService { @Override public int startRecognitionForService(ParcelUuid soundModelId, Bundle params, - ComponentName detectionService, SoundTrigger.RecognitionConfig config) { + ComponentName detectionService, SoundTrigger.RecognitionConfig config) { + mEventLogger.enqueue(new SessionEvent(Type.START_RECOGNITION_SERVICE, + getUuid(soundModelId))); try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { Objects.requireNonNull(soundModelId); Objects.requireNonNull(detectionService); Objects.requireNonNull(config); enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - enforceDetectionPermissions(detectionService); - if (DEBUG) { - Slog.i(TAG, "startRecognition(): id = " + soundModelId); - } - - sEventLogger.enqueue(new EventLogger.StringEvent( - "startRecognitionForService(): id = " + soundModelId)); - IRecognitionStatusCallback callback = new RemoteSoundTriggerDetectionService(soundModelId.getUuid(), params, detectionService, Binder.getCallingUserHandle(), config); @@ -554,10 +582,10 @@ public class SoundTriggerService extends SystemService { synchronized (mLock) { SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); if (soundModel == null) { - Slog.w(TAG, soundModelId + " is not loaded"); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "startRecognitionForService():" + soundModelId + " is not loaded")); + mEventLogger.enqueue(new SessionEvent( + Type.START_RECOGNITION_SERVICE, + getUuid(soundModelId), + "Model not loaded").printLog(ALOGW, TAG)); return STATUS_ERROR; } @@ -566,12 +594,10 @@ public class SoundTriggerService extends SystemService { existingCallback = mCallbacks.get(soundModelId.getUuid()); } if (existingCallback != null) { - Slog.w(TAG, soundModelId + " is already running"); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "startRecognitionForService():" - + soundModelId + " is already running")); - + mEventLogger.enqueue(new SessionEvent( + Type.START_RECOGNITION_SERVICE, + getUuid(soundModelId), + "Model already running").printLog(ALOGW, TAG)); return STATUS_ERROR; } int ret; @@ -581,20 +607,18 @@ public class SoundTriggerService extends SystemService { (GenericSoundModel) soundModel, callback, config, false); break; default: - Slog.e(TAG, "Unknown model type"); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "startRecognitionForService(): Unknown model type")); - + mEventLogger.enqueue(new SessionEvent( + Type.START_RECOGNITION_SERVICE, + getUuid(soundModelId), + "Unsupported model type").printLog(ALOGW, TAG)); return STATUS_ERROR; } if (ret != STATUS_OK) { - Slog.e(TAG, "Failed to start model: " + ret); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "startRecognitionForService(): Failed to start model:")); - + mEventLogger.enqueue(new SessionEvent( + Type.START_RECOGNITION_SERVICE, + getUuid(soundModelId), + "Model start fail").printLog(ALOGW, TAG)); return ret; } synchronized (mCallbacksLock) { @@ -609,23 +633,20 @@ public class SoundTriggerService extends SystemService { @Override public int stopRecognitionForService(ParcelUuid soundModelId) { + mEventLogger.enqueue(new SessionEvent(Type.STOP_RECOGNITION_SERVICE, + getUuid(soundModelId))); + try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "stopRecognition(): id = " + soundModelId); - } - - sEventLogger.enqueue(new EventLogger.StringEvent( - "stopRecognitionForService(): id = " + soundModelId)); synchronized (mLock) { SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); if (soundModel == null) { - Slog.w(TAG, soundModelId + " is not loaded"); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "stopRecognitionForService(): " + soundModelId - + " is not loaded")); + mEventLogger.enqueue(new SessionEvent( + Type.STOP_RECOGNITION_SERVICE, + getUuid(soundModelId), + "Model not loaded") + .printLog(ALOGW, TAG)); return STATUS_ERROR; } @@ -634,12 +655,11 @@ public class SoundTriggerService extends SystemService { callback = mCallbacks.get(soundModelId.getUuid()); } if (callback == null) { - Slog.w(TAG, soundModelId + " is not running"); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "stopRecognitionForService(): " + soundModelId - + " is not running")); - + mEventLogger.enqueue(new SessionEvent( + Type.STOP_RECOGNITION_SERVICE, + getUuid(soundModelId), + "Model not running") + .printLog(ALOGW, TAG)); return STATUS_ERROR; } int ret; @@ -649,20 +669,21 @@ public class SoundTriggerService extends SystemService { soundModel.getUuid(), callback); break; default: - Slog.e(TAG, "Unknown model type"); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "stopRecognitionForService(): Unknown model type")); + mEventLogger.enqueue(new SessionEvent( + Type.STOP_RECOGNITION_SERVICE, + getUuid(soundModelId), + "Unknown model type") + .printLog(ALOGW, TAG)); return STATUS_ERROR; } if (ret != STATUS_OK) { - Slog.e(TAG, "Failed to stop model: " + ret); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "stopRecognitionForService(): Failed to stop model: " + ret)); - + mEventLogger.enqueue(new SessionEvent( + Type.STOP_RECOGNITION_SERVICE, + getUuid(soundModelId), + "Failed to stop model") + .printLog(ALOGW, TAG)); return ret; } synchronized (mCallbacksLock) { @@ -677,23 +698,18 @@ public class SoundTriggerService extends SystemService { @Override public int unloadSoundModel(ParcelUuid soundModelId) { + mEventLogger.enqueue(new SessionEvent(Type.UNLOAD_MODEL, getUuid(soundModelId))); try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "unloadSoundModel(): id = " + soundModelId); - } - - sEventLogger.enqueue(new EventLogger.StringEvent("unloadSoundModel(): id = " - + soundModelId)); synchronized (mLock) { SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); if (soundModel == null) { - Slog.w(TAG, soundModelId + " is not loaded"); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "unloadSoundModel(): " + soundModelId + " is not loaded")); - + mEventLogger.enqueue(new SessionEvent( + Type.UNLOAD_MODEL, + getUuid(soundModelId), + "Model not loaded") + .printLog(ALOGW, TAG)); return STATUS_ERROR; } int ret; @@ -706,19 +722,19 @@ public class SoundTriggerService extends SystemService { ret = mSoundTriggerHelper.unloadGenericSoundModel(soundModel.getUuid()); break; default: - Slog.e(TAG, "Unknown model type"); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "unloadSoundModel(): Unknown model type")); - + mEventLogger.enqueue(new SessionEvent( + Type.UNLOAD_MODEL, + getUuid(soundModelId), + "Unknown model type") + .printLog(ALOGW, TAG)); return STATUS_ERROR; } if (ret != STATUS_OK) { - Slog.e(TAG, "Failed to unload model"); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "unloadSoundModel(): Failed to unload model")); - + mEventLogger.enqueue(new SessionEvent( + Type.UNLOAD_MODEL, + getUuid(soundModelId), + "Failed to unload model") + .printLog(ALOGW, TAG)); return ret; } mLoadedModels.remove(soundModelId.getUuid()); @@ -743,24 +759,19 @@ public class SoundTriggerService extends SystemService { @Override public int getModelState(ParcelUuid soundModelId) { + mEventLogger.enqueue(new SessionEvent(Type.GET_MODEL_STATE, getUuid(soundModelId))); try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); int ret = STATUS_ERROR; - if (DEBUG) { - Slog.i(TAG, "getModelState(): id = " + soundModelId); - } - - sEventLogger.enqueue(new EventLogger.StringEvent("getModelState(): id = " - + soundModelId)); synchronized (mLock) { SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); if (soundModel == null) { - Slog.w(TAG, soundModelId + " is not loaded"); - - sEventLogger.enqueue(new EventLogger.StringEvent("getModelState(): " - + soundModelId + " is not loaded")); - + mEventLogger.enqueue(new SessionEvent( + Type.GET_MODEL_STATE, + getUuid(soundModelId), + "Model is not loaded") + .printLog(ALOGW, TAG)); return ret; } switch (soundModel.getType()) { @@ -769,13 +780,13 @@ public class SoundTriggerService extends SystemService { break; default: // SoundModel.TYPE_KEYPHRASE is not supported to increase privacy. - Slog.e(TAG, "Unsupported model type, " + soundModel.getType()); - sEventLogger.enqueue(new EventLogger.StringEvent( - "getModelState(): Unsupported model type, " - + soundModel.getType())); + mEventLogger.enqueue(new SessionEvent( + Type.GET_MODEL_STATE, + getUuid(soundModelId), + "Unsupported model type") + .printLog(ALOGW, TAG)); break; } - return ret; } } @@ -784,16 +795,11 @@ public class SoundTriggerService extends SystemService { @Override @Nullable public ModuleProperties getModuleProperties() { + mEventLogger.enqueue(new SessionEvent(Type.GET_MODULE_PROPERTIES, null)); try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.i(TAG, "getModuleProperties()"); - } - synchronized (mLock) { ModuleProperties properties = mSoundTriggerHelper.getModuleProperties(); - sEventLogger.enqueue(new EventLogger.StringEvent( - "getModuleProperties(): " + properties)); return properties; } } @@ -802,33 +808,21 @@ public class SoundTriggerService extends SystemService { @Override public int setParameter(ParcelUuid soundModelId, @ModelParams int modelParam, int value) { + mEventLogger.enqueue(new SessionEvent(Type.SET_PARAMETER, getUuid(soundModelId))); try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.d(TAG, "setParameter(): id=" + soundModelId - + ", param=" + modelParam - + ", value=" + value); - } - - sEventLogger.enqueue(new EventLogger.StringEvent( - "setParameter(): id=" + soundModelId - + ", param=" + modelParam - + ", value=" + value)); - synchronized (mLock) { SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); if (soundModel == null) { - Slog.w(TAG, soundModelId + " is not loaded. Loaded models: " - + mLoadedModels.toString()); - - sEventLogger.enqueue(new EventLogger.StringEvent("setParameter(): " - + soundModelId + " is not loaded")); - + mEventLogger.enqueue(new SessionEvent( + Type.SET_PARAMETER, + getUuid(soundModelId), + "Model not loaded") + .printLog(ALOGW, TAG)); return STATUS_BAD_VALUE; } - - return mSoundTriggerHelper.setParameter(soundModel.getUuid(), modelParam, - value); + return mSoundTriggerHelper.setParameter( + soundModel.getUuid(), modelParam, value); } } } @@ -839,26 +833,11 @@ public class SoundTriggerService extends SystemService { throws UnsupportedOperationException, IllegalArgumentException { try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.d(TAG, "getParameter(): id=" + soundModelId - + ", param=" + modelParam); - } - - sEventLogger.enqueue(new EventLogger.StringEvent( - "getParameter(): id=" + soundModelId - + ", param=" + modelParam)); - synchronized (mLock) { SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); if (soundModel == null) { - Slog.w(TAG, soundModelId + " is not loaded"); - - sEventLogger.enqueue(new EventLogger.StringEvent("getParameter(): " - + soundModelId + " is not loaded")); - throw new IllegalArgumentException("sound model is not loaded"); } - return mSoundTriggerHelper.getParameter(soundModel.getUuid(), modelParam); } } @@ -870,37 +849,28 @@ public class SoundTriggerService extends SystemService { @ModelParams int modelParam) { try (SafeCloseable ignored = ClearCallingIdentityContext.create()) { enforceCallingPermission(Manifest.permission.MANAGE_SOUND_TRIGGER); - if (DEBUG) { - Slog.d(TAG, "queryParameter(): id=" + soundModelId - + ", param=" + modelParam); - } - - sEventLogger.enqueue(new EventLogger.StringEvent( - "queryParameter(): id=" + soundModelId - + ", param=" + modelParam)); - synchronized (mLock) { SoundModel soundModel = mLoadedModels.get(soundModelId.getUuid()); if (soundModel == null) { - Slog.w(TAG, soundModelId + " is not loaded"); - - sEventLogger.enqueue(new EventLogger.StringEvent( - "queryParameter(): " - + soundModelId + " is not loaded")); - return null; } - return mSoundTriggerHelper.queryParameter(soundModel.getUuid(), modelParam); } } } private void clientDied() { - Slog.w(TAG, "Client died, cleaning up session."); - sEventLogger.enqueue(new EventLogger.StringEvent( - "Client died, cleaning up session.")); + mEventLogger.enqueue(new SessionEvent(Type.DETACH, null)); + mServiceEventLogger.enqueue(new ServiceEvent( + ServiceEvent.Type.DETACH, mOriginatorIdentity.packageName, "Client died") + .printLog(ALOGW, TAG)); + detach(); + } + + private void detach() { mSoundTriggerHelper.detach(); + mSessionEventLoggers.remove(mEventLogger); + addDetachedSessionLogger(mEventLogger); } private void enforceCallingPermission(String permission) { @@ -922,6 +892,14 @@ public class SoundTriggerService extends SystemService { } } + private UUID getUuid(ParcelUuid uuid) { + return (uuid != null) ? uuid.getUuid() : null; + } + + private UUID getUuid(SoundModel model) { + return (model != null) ? model.getUuid() : null; + } + /** * Local end for a {@link SoundTriggerDetectionService}. Operations are queued up and * executed when the service connects. @@ -1068,7 +1046,7 @@ public class SoundTriggerService extends SystemService { } catch (Exception e) { Slog.e(TAG, mPuuid + ": Cannot remove client", e); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": Cannot remove client")); } @@ -1091,9 +1069,7 @@ public class SoundTriggerService extends SystemService { * dropped. */ private void destroy() { - if (DEBUG) Slog.v(TAG, mPuuid + ": destroy"); - - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": destroy")); + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": destroy")); synchronized (mRemoteServiceLock) { disconnectLocked(); @@ -1127,7 +1103,7 @@ public class SoundTriggerService extends SystemService { Slog.e(TAG, mPuuid + ": Could not stop operation " + mRunningOpIds.valueAt(i), e); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": Could not stop operation " + mRunningOpIds.valueAt( i))); @@ -1157,7 +1133,7 @@ public class SoundTriggerService extends SystemService { if (ri == null) { Slog.w(TAG, mPuuid + ": " + mServiceName + " not found"); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": " + mServiceName + " not found")); return; @@ -1168,7 +1144,7 @@ public class SoundTriggerService extends SystemService { Slog.w(TAG, mPuuid + ": " + mServiceName + " does not require " + BIND_SOUND_TRIGGER_DETECTION_SERVICE); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": " + mServiceName + " does not require " + BIND_SOUND_TRIGGER_DETECTION_SERVICE)); @@ -1184,7 +1160,7 @@ public class SoundTriggerService extends SystemService { } else { Slog.w(TAG, mPuuid + ": Could not bind to " + mServiceName); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": Could not bind to " + mServiceName)); } @@ -1206,7 +1182,7 @@ public class SoundTriggerService extends SystemService { mPuuid + ": Dropped operation as already destroyed or marked for " + "destruction"); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ":Dropped operation as already destroyed or marked for " + "destruction")); @@ -1238,7 +1214,7 @@ public class SoundTriggerService extends SystemService { mPuuid + ": Dropped operation as too many operations " + "were run in last 24 hours"); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": Dropped operation as too many operations " + "were run in last 24 hours")); @@ -1248,7 +1224,7 @@ public class SoundTriggerService extends SystemService { } catch (Exception e) { Slog.e(TAG, mPuuid + ": Could not drop operation", e); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": Could not drop operation")); } @@ -1265,7 +1241,7 @@ public class SoundTriggerService extends SystemService { try { if (DEBUG) Slog.v(TAG, mPuuid + ": runOp " + opId); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": runOp " + opId)); op.run(opId, mService); @@ -1273,7 +1249,7 @@ public class SoundTriggerService extends SystemService { } catch (Exception e) { Slog.e(TAG, mPuuid + ": Could not run operation " + opId, e); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": Could not run operation " + opId)); } @@ -1303,11 +1279,6 @@ public class SoundTriggerService extends SystemService { @Override public void onKeyphraseDetected(SoundTrigger.KeyphraseRecognitionEvent event) { - Slog.w(TAG, mPuuid + "->" + mServiceName + ": IGNORED onKeyphraseDetected(" + event - + ")"); - - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + "->" + mServiceName - + ": IGNORED onKeyphraseDetected(" + event + ")")); } /** @@ -1325,7 +1296,7 @@ public class SoundTriggerService extends SystemService { AudioFormat originalFormat = event.getCaptureFormat(); - sEventLogger.enqueue(new EventLogger.StringEvent("createAudioRecordForEvent")); + mEventLogger.enqueue(new EventLogger.StringEvent("createAudioRecordForEvent")); return (new AudioRecord.Builder()) .setAudioAttributes(attributes) @@ -1340,11 +1311,6 @@ public class SoundTriggerService extends SystemService { @Override public void onGenericSoundTriggerDetected(SoundTrigger.GenericRecognitionEvent event) { - if (DEBUG) Slog.v(TAG, mPuuid + ": Generic sound trigger event: " + event); - - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid - + ": Generic sound trigger event: " + event)); - runOrAddOperation(new Operation( // always execute: () -> { @@ -1376,7 +1342,7 @@ public class SoundTriggerService extends SystemService { private void onError(int status) { if (DEBUG) Slog.v(TAG, mPuuid + ": onError: " + status); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": onError: " + status)); runOrAddOperation( @@ -1421,27 +1387,17 @@ public class SoundTriggerService extends SystemService { @Override public void onRecognitionPaused() { - Slog.i(TAG, mPuuid + "->" + mServiceName + ": IGNORED onRecognitionPaused"); - - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid - + "->" + mServiceName + ": IGNORED onRecognitionPaused")); - } @Override public void onRecognitionResumed() { - Slog.i(TAG, mPuuid + "->" + mServiceName + ": IGNORED onRecognitionResumed"); - - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid - + "->" + mServiceName + ": IGNORED onRecognitionResumed")); - } @Override public void onServiceConnected(ComponentName name, IBinder service) { if (DEBUG) Slog.v(TAG, mPuuid + ": onServiceConnected(" + service + ")"); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": onServiceConnected(" + service + ")")); synchronized (mRemoteServiceLock) { @@ -1464,7 +1420,7 @@ public class SoundTriggerService extends SystemService { public void onServiceDisconnected(ComponentName name) { if (DEBUG) Slog.v(TAG, mPuuid + ": onServiceDisconnected"); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": onServiceDisconnected")); synchronized (mRemoteServiceLock) { @@ -1476,7 +1432,7 @@ public class SoundTriggerService extends SystemService { public void onBindingDied(ComponentName name) { if (DEBUG) Slog.v(TAG, mPuuid + ": onBindingDied"); - sEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + mEventLogger.enqueue(new EventLogger.StringEvent(mPuuid + ": onBindingDied")); synchronized (mRemoteServiceLock) { @@ -1488,7 +1444,7 @@ public class SoundTriggerService extends SystemService { public void onNullBinding(ComponentName name) { Slog.w(TAG, name + " for model " + mPuuid + " returned a null binding"); - sEventLogger.enqueue(new EventLogger.StringEvent(name + " for model " + mEventLogger.enqueue(new EventLogger.StringEvent(name + " for model " + mPuuid + " returned a null binding")); synchronized (mRemoteServiceLock) { @@ -1613,17 +1569,25 @@ public class SoundTriggerService extends SystemService { private class SessionImpl implements Session { private final @NonNull SoundTriggerHelper mSoundTriggerHelper; private final @NonNull IBinder mClient; + private final EventLogger mEventLogger; + private final Identity mOriginatorIdentity; + + private final SparseArray<UUID> mModelUuid = new SparseArray<>(1); + + private SessionImpl(@NonNull SoundTriggerHelper soundTriggerHelper, + @NonNull IBinder client, + @NonNull EventLogger eventLogger, @NonNull Identity originatorIdentity) { - private SessionImpl( - @NonNull SoundTriggerHelper soundTriggerHelper, @NonNull IBinder client) { mSoundTriggerHelper = soundTriggerHelper; mClient = client; + mOriginatorIdentity = originatorIdentity; + mEventLogger = eventLogger; + + mSessionEventLoggers.add(mEventLogger); try { - mClient.linkToDeath(() -> { - clientDied(); - }, 0); + mClient.linkToDeath(() -> clientDied(), 0); } catch (RemoteException e) { - Slog.e(TAG, "Failed to register death listener.", e); + clientDied(); } } @@ -1631,6 +1595,9 @@ public class SoundTriggerService extends SystemService { public int startRecognition(int keyphraseId, KeyphraseSoundModel soundModel, IRecognitionStatusCallback listener, RecognitionConfig recognitionConfig, boolean runInBatterySaverMode) { + mModelUuid.put(keyphraseId, soundModel.getUuid()); + mEventLogger.enqueue(new SessionEvent(Type.START_RECOGNITION, + soundModel.getUuid())); return mSoundTriggerHelper.startKeyphraseRecognition(keyphraseId, soundModel, listener, recognitionConfig, runInBatterySaverMode); } @@ -1638,16 +1605,21 @@ public class SoundTriggerService extends SystemService { @Override public synchronized int stopRecognition(int keyphraseId, IRecognitionStatusCallback listener) { + var uuid = mModelUuid.get(keyphraseId); + mEventLogger.enqueue(new SessionEvent(Type.STOP_RECOGNITION, uuid)); return mSoundTriggerHelper.stopKeyphraseRecognition(keyphraseId, listener); } @Override public ModuleProperties getModuleProperties() { + mEventLogger.enqueue(new SessionEvent(Type.GET_MODULE_PROPERTIES, null)); return mSoundTriggerHelper.getModuleProperties(); } @Override public int setParameter(int keyphraseId, @ModelParams int modelParam, int value) { + var uuid = mModelUuid.get(keyphraseId); + mEventLogger.enqueue(new SessionEvent(Type.SET_PARAMETER, uuid)); return mSoundTriggerHelper.setKeyphraseParameter(keyphraseId, modelParam, value); } @@ -1664,57 +1636,54 @@ public class SoundTriggerService extends SystemService { @Override public void detach() { - mSoundTriggerHelper.detach(); + detachInternal(); } @Override public int unloadKeyphraseModel(int keyphraseId) { + var uuid = mModelUuid.get(keyphraseId); + mEventLogger.enqueue(new SessionEvent(Type.UNLOAD_MODEL, uuid)); return mSoundTriggerHelper.unloadKeyphraseSoundModel(keyphraseId); } - @Override - public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - mSoundTriggerHelper.dump(fd, pw, args); + private void clientDied() { + mServiceEventLogger.enqueue(new ServiceEvent( + ServiceEvent.Type.DETACH, mOriginatorIdentity.packageName, + "Client died") + .printLog(ALOGW, TAG)); + detachInternal(); } - private void clientDied() { - Slog.w(TAG, "Client died, cleaning up session."); - sEventLogger.enqueue(new EventLogger.StringEvent( - "Client died, cleaning up session.")); + private void detachInternal() { + mEventLogger.enqueue(new SessionEvent(Type.DETACH, null)); + mSessionEventLoggers.remove(mEventLogger); + addDetachedSessionLogger(mEventLogger); mSoundTriggerHelper.detach(); } } @Override public Session attach(@NonNull IBinder client, ModuleProperties underlyingModule) { - return new SessionImpl(newSoundTriggerHelper(underlyingModule), client); + var identity = IdentityContext.getNonNull(); + int sessionId = mSessionIdCounter.getAndIncrement(); + mServiceEventLogger.enqueue(new ServiceEvent( + ServiceEvent.Type.ATTACH, identity.packageName + "#" + sessionId)); + var eventLogger = new EventLogger(SESSION_MAX_EVENT_SIZE, + "LocalSoundTriggerEventLogger for package: " + + identity.packageName + "#" + sessionId); + + return new SessionImpl(newSoundTriggerHelper(underlyingModule, eventLogger), + client, eventLogger, identity); } @Override public List<ModuleProperties> listModuleProperties(Identity originatorIdentity) { + mServiceEventLogger.enqueue(new ServiceEvent( + ServiceEvent.Type.LIST_MODULE, originatorIdentity.packageName)); try (SafeCloseable ignored = PermissionUtil.establishIdentityDirect( originatorIdentity)) { return listUnderlyingModuleProperties(originatorIdentity); } } - - @Override - public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - // log - sEventLogger.dump(pw); - - // enrolled models - mDbHelper.dump(pw); - - // stats - mSoundModelStatTracker.dump(pw); - } } - - //================================================================= - // For logging - - private static final EventLogger sEventLogger = new EventLogger(200, - "SoundTrigger activity"); - } diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ObjectPrinter.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ObjectPrinter.java index fba0fb49da5c..cbc959c0b33a 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ObjectPrinter.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/ObjectPrinter.java @@ -45,6 +45,16 @@ class ObjectPrinter { } /** + * Same as {@link #print(StringBuilder, Object, int)} with default max length. + * + * @param builder StringBuilder to print into. + * @param obj The object to print. + */ + static void print(@NonNull StringBuilder builder, @Nullable Object obj) { + print(builder, obj, kDefaultMaxCollectionLength); + } + + /** * A version of {@link #print(Object, int)} that uses a {@link StringBuilder}. * * @param builder StringBuilder to print into. diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java index 4c134af18552..0e796d1afbd6 100644 --- a/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java +++ b/services/voiceinteraction/java/com/android/server/soundtrigger_middleware/SoundTriggerMiddlewareLogging.java @@ -16,6 +16,10 @@ package com.android.server.soundtrigger_middleware; +import static com.android.server.soundtrigger_middleware.SoundTriggerMiddlewareLogging.SessionEvent.Type.*; +import static com.android.server.utils.EventLogger.Event.ALOGI; +import static com.android.server.utils.EventLogger.Event.ALOGW; + import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; @@ -41,13 +45,20 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.LatencyTracker; import com.android.server.LocalServices; +import com.android.server.utils.EventLogger.Event; +import com.android.server.utils.EventLogger; + import java.io.PrintWriter; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.LinkedList; +import java.util.Arrays; import java.util.Objects; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; +import java.util.Deque; + /** * An ISoundTriggerMiddlewareService decorator, which adds logging of all API calls (and @@ -74,9 +85,17 @@ import java.util.function.Supplier; */ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInternal, Dumpable { private static final String TAG = "SoundTriggerMiddlewareLogging"; + private static final int SESSION_MAX_EVENT_SIZE = 128; private final @NonNull ISoundTriggerMiddlewareInternal mDelegate; private final @NonNull LatencyTracker mLatencyTracker; private final @NonNull Supplier<BatteryStatsInternal> mBatteryStatsInternalSupplier; + private final @NonNull EventLogger mServiceEventLogger = new EventLogger(256, + "Service Events"); + + private final Set<EventLogger> mSessionEventLoggers = ConcurrentHashMap.newKeySet(4); + private final Deque<EventLogger> mDetachedSessionEventLoggers = new LinkedBlockingDeque<>(4); + private final AtomicInteger mSessionCount = new AtomicInteger(0); + public SoundTriggerMiddlewareLogging(@NonNull Context context, @NonNull ISoundTriggerMiddlewareInternal delegate) { @@ -99,10 +118,19 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt SoundTriggerModuleDescriptor[] listModules() { try { SoundTriggerModuleDescriptor[] result = mDelegate.listModules(); - logReturn("listModules", result); + var moduleSummary = Arrays.stream(result).map((descriptor) -> + new ModulePropertySummary(descriptor.handle, + descriptor.properties.implementor, + descriptor.properties.version)).toArray(ModulePropertySummary[]::new); + + mServiceEventLogger.enqueue(ServiceEvent.createForReturn( + ServiceEvent.Type.LIST_MODULE, + IdentityContext.get().packageName, moduleSummary).printLog(ALOGI, TAG)); return result; } catch (Exception e) { - logException("listModules", e); + mServiceEventLogger.enqueue(ServiceEvent.createForException( + ServiceEvent.Type.LIST_MODULE, + IdentityContext.get().packageName, e).printLog(ALOGW, TAG)); throw e; } } @@ -111,12 +139,29 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt public @NonNull ISoundTriggerModule attach(int handle, ISoundTriggerCallback callback) { try { - ModuleLogging result = new ModuleLogging(callback); - result.attach(mDelegate.attach(handle, result.getCallbackWrapper())); - logReturn("attach", result, handle, callback); + var originatorIdentity = IdentityContext.getNonNull(); + String packageIdentification = originatorIdentity.packageName + + mSessionCount.getAndIncrement(); + ModuleLogging result = new ModuleLogging(); + var eventLogger = new EventLogger(SESSION_MAX_EVENT_SIZE, + "Session logger for: " + packageIdentification); + + var callbackWrapper = new CallbackLogging(callback, eventLogger, originatorIdentity); + + result.attach(mDelegate.attach(handle, callbackWrapper), eventLogger); + + mServiceEventLogger.enqueue(ServiceEvent.createForReturn( + ServiceEvent.Type.ATTACH, + packageIdentification, result, handle, callback) + .printLog(ALOGI, TAG)); + + mSessionEventLoggers.add(eventLogger); return result; } catch (Exception e) { - logException("attach", e, handle, callback); + mServiceEventLogger.enqueue(ServiceEvent.createForException( + ServiceEvent.Type.ATTACH, + IdentityContext.get().packageName, e, handle, callback) + .printLog(ALOGW, TAG)); throw e; } } @@ -127,44 +172,27 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt return mDelegate.toString(); } - private void logException(String methodName, Exception ex, Object... args) { - logExceptionWithObject(this, IdentityContext.get(), methodName, ex, args); - } - - private void logReturn(String methodName, Object retVal, Object... args) { - logReturnWithObject(this, IdentityContext.get(), methodName, retVal, args); - } - - private void logVoidReturn(String methodName, Object... args) { - logVoidReturnWithObject(this, IdentityContext.get(), methodName, args); - } - private class ModuleLogging implements ISoundTriggerModule { private ISoundTriggerModule mDelegate; - private final @NonNull CallbackLogging mCallbackWrapper; - private final @NonNull Identity mOriginatorIdentity; + private EventLogger mEventLogger; - ModuleLogging(@NonNull ISoundTriggerCallback callback) { - mCallbackWrapper = new CallbackLogging(callback); - mOriginatorIdentity = IdentityContext.getNonNull(); - } - - void attach(@NonNull ISoundTriggerModule delegate) { + void attach(@NonNull ISoundTriggerModule delegate, EventLogger eventLogger) { mDelegate = delegate; - } - - ISoundTriggerCallback getCallbackWrapper() { - return mCallbackWrapper; + mEventLogger = eventLogger; } @Override public int loadModel(SoundModel model) throws RemoteException { try { int result = mDelegate.loadModel(model); - logReturn("loadModel", result, model); + mEventLogger.enqueue(SessionEvent.createForReturn( + LOAD_MODEL, result, model.uuid) + .printLog(ALOGI, TAG)); return result; } catch (Exception e) { - logException("loadModel", e, model); + mEventLogger.enqueue(SessionEvent.createForReturn( + LOAD_MODEL, e, model.uuid) + .printLog(ALOGW, TAG)); throw e; } } @@ -173,10 +201,14 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt public int loadPhraseModel(PhraseSoundModel model) throws RemoteException { try { int result = mDelegate.loadPhraseModel(model); - logReturn("loadPhraseModel", result, model); + mEventLogger.enqueue(SessionEvent.createForReturn( + LOAD_PHRASE_MODEL, result, model.common.uuid) + .printLog(ALOGI, TAG)); return result; } catch (Exception e) { - logException("loadPhraseModel", e, model); + mEventLogger.enqueue(SessionEvent.createForException( + LOAD_PHRASE_MODEL, e, model.common.uuid) + .printLog(ALOGW, TAG)); throw e; } } @@ -185,9 +217,13 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt public void unloadModel(int modelHandle) throws RemoteException { try { mDelegate.unloadModel(modelHandle); - logVoidReturn("unloadModel", modelHandle); + mEventLogger.enqueue(SessionEvent.createForVoid( + UNLOAD_MODEL, modelHandle) + .printLog(ALOGI, TAG)); } catch (Exception e) { - logException("unloadModel", e, modelHandle); + mEventLogger.enqueue(SessionEvent.createForException( + UNLOAD_MODEL, e, modelHandle) + .printLog(ALOGW, TAG)); throw e; } } @@ -197,9 +233,13 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt throws RemoteException { try { mDelegate.startRecognition(modelHandle, config); - logVoidReturn("startRecognition", modelHandle, config); + mEventLogger.enqueue(SessionEvent.createForVoid( + START_RECOGNITION, modelHandle, config) + .printLog(ALOGI, TAG)); } catch (Exception e) { - logException("startRecognition", e, modelHandle, config); + mEventLogger.enqueue(SessionEvent.createForException( + START_RECOGNITION, e, modelHandle, config) + .printLog(ALOGW, TAG)); throw e; } } @@ -208,9 +248,13 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt public void stopRecognition(int modelHandle) throws RemoteException { try { mDelegate.stopRecognition(modelHandle); - logVoidReturn("stopRecognition", modelHandle); + mEventLogger.enqueue(SessionEvent.createForVoid( + STOP_RECOGNITION, modelHandle) + .printLog(ALOGI, TAG)); } catch (Exception e) { - logException("stopRecognition", e, modelHandle); + mEventLogger.enqueue(SessionEvent.createForException( + STOP_RECOGNITION, e, modelHandle) + .printLog(ALOGW, TAG)); throw e; } } @@ -219,9 +263,13 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt public void forceRecognitionEvent(int modelHandle) throws RemoteException { try { mDelegate.forceRecognitionEvent(modelHandle); - logVoidReturn("forceRecognitionEvent", modelHandle); + mEventLogger.enqueue(SessionEvent.createForVoid( + FORCE_RECOGNITION, modelHandle) + .printLog(ALOGI, TAG)); } catch (Exception e) { - logException("forceRecognitionEvent", e, modelHandle); + mEventLogger.enqueue(SessionEvent.createForException( + FORCE_RECOGNITION, e, modelHandle) + .printLog(ALOGW, TAG)); throw e; } } @@ -231,9 +279,13 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt throws RemoteException { try { mDelegate.setModelParameter(modelHandle, modelParam, value); - logVoidReturn("setModelParameter", modelHandle, modelParam, value); + mEventLogger.enqueue(SessionEvent.createForVoid( + SET_MODEL_PARAMETER, modelHandle, modelParam, value) + .printLog(ALOGI, TAG)); } catch (Exception e) { - logException("setModelParameter", e, modelHandle, modelParam, value); + mEventLogger.enqueue(SessionEvent.createForException( + SET_MODEL_PARAMETER, e, modelHandle, modelParam, value) + .printLog(ALOGW, TAG)); throw e; } } @@ -242,10 +294,14 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt public int getModelParameter(int modelHandle, int modelParam) throws RemoteException { try { int result = mDelegate.getModelParameter(modelHandle, modelParam); - logReturn("getModelParameter", result, modelHandle, modelParam); + mEventLogger.enqueue(SessionEvent.createForReturn( + GET_MODEL_PARAMETER, result, modelHandle, modelParam) + .printLog(ALOGI, TAG)); return result; } catch (Exception e) { - logException("getModelParameter", e, modelHandle, modelParam); + mEventLogger.enqueue(SessionEvent.createForException( + GET_MODEL_PARAMETER, e, modelHandle, modelParam) + .printLog(ALOGW, TAG)); throw e; } } @@ -256,10 +312,14 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt try { ModelParameterRange result = mDelegate.queryModelParameterSupport(modelHandle, modelParam); - logReturn("queryModelParameterSupport", result, modelHandle, modelParam); + mEventLogger.enqueue(SessionEvent.createForReturn( + QUERY_MODEL_PARAMETER, result, modelHandle, modelParam) + .printLog(ALOGI, TAG)); return result; } catch (Exception e) { - logException("queryModelParameterSupport", e, modelHandle, modelParam); + mEventLogger.enqueue(SessionEvent.createForException( + QUERY_MODEL_PARAMETER, e, modelHandle, modelParam) + .printLog(ALOGW, TAG)); throw e; } } @@ -267,10 +327,20 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt @Override public void detach() throws RemoteException { try { + if (mSessionEventLoggers.remove(mEventLogger)) { + while (!mDetachedSessionEventLoggers.offerFirst(mEventLogger)) { + // Remove the oldest element, if one still exists + mDetachedSessionEventLoggers.pollLast(); + } + } mDelegate.detach(); - logVoidReturn("detach"); + mEventLogger.enqueue(SessionEvent.createForVoid( + DETACH) + .printLog(ALOGI, TAG)); } catch (Exception e) { - logException("detach", e); + mEventLogger.enqueue(SessionEvent.createForException( + DETACH, e) + .printLog(ALOGW, TAG)); throw e; } } @@ -285,107 +355,112 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt public String toString() { return Objects.toString(mDelegate); } + } - private void logException(String methodName, Exception ex, Object... args) { - logExceptionWithObject(this, mOriginatorIdentity, methodName, ex, args); - } - - private void logReturn(String methodName, Object retVal, Object... args) { - logReturnWithObject(this, mOriginatorIdentity, methodName, retVal, args); - } + private class CallbackLogging implements ISoundTriggerCallback { + private final ISoundTriggerCallback mCallbackDelegate; + private final EventLogger mEventLogger; + private final Identity mOriginatorIdentity; - private void logVoidReturn(String methodName, Object... args) { - logVoidReturnWithObject(this, mOriginatorIdentity, methodName, args); + private CallbackLogging(ISoundTriggerCallback delegate, + EventLogger eventLogger, Identity originatorIdentity) { + mCallbackDelegate = Objects.requireNonNull(delegate); + mEventLogger = Objects.requireNonNull(eventLogger); + mOriginatorIdentity = originatorIdentity; } - private class CallbackLogging implements ISoundTriggerCallback { - private final ISoundTriggerCallback mCallbackDelegate; - - private CallbackLogging(ISoundTriggerCallback delegate) { - mCallbackDelegate = delegate; - } - - @Override - public void onRecognition(int modelHandle, RecognitionEvent event, int captureSession) - throws RemoteException { - try { - mBatteryStatsInternalSupplier.get().noteWakingSoundTrigger( - SystemClock.elapsedRealtime(), mOriginatorIdentity.uid); - mCallbackDelegate.onRecognition(modelHandle, event, captureSession); - logVoidReturn("onRecognition", modelHandle, event); - } catch (Exception e) { - logException("onRecognition", e, modelHandle, event); - throw e; - } - } - - @Override - public void onPhraseRecognition(int modelHandle, PhraseRecognitionEvent event, - int captureSession) - throws RemoteException { - try { - mBatteryStatsInternalSupplier.get().noteWakingSoundTrigger( - SystemClock.elapsedRealtime(), mOriginatorIdentity.uid); - startKeyphraseEventLatencyTracking(event); - mCallbackDelegate.onPhraseRecognition(modelHandle, event, captureSession); - logVoidReturn("onPhraseRecognition", modelHandle, event); - } catch (Exception e) { - logException("onPhraseRecognition", e, modelHandle, event); - throw e; - } - } - - @Override - public void onModelUnloaded(int modelHandle) throws RemoteException { - try { - mCallbackDelegate.onModelUnloaded(modelHandle); - logVoidReturn("onModelUnloaded", modelHandle); - } catch (Exception e) { - logException("onModelUnloaded", e, modelHandle); - throw e; - } + @Override + public void onRecognition(int modelHandle, RecognitionEvent event, int captureSession) + throws RemoteException { + try { + mBatteryStatsInternalSupplier.get().noteWakingSoundTrigger( + SystemClock.elapsedRealtime(), mOriginatorIdentity.uid); + mCallbackDelegate.onRecognition(modelHandle, event, captureSession); + mEventLogger.enqueue(SessionEvent.createForVoid( + RECOGNITION, modelHandle, event, captureSession) + .printLog(ALOGI, TAG)); + } catch (Exception e) { + mEventLogger.enqueue(SessionEvent.createForException( + RECOGNITION, e, modelHandle, event, captureSession) + .printLog(ALOGW, TAG)); + throw e; } + } - @Override - public void onResourcesAvailable() throws RemoteException { - try { - mCallbackDelegate.onResourcesAvailable(); - logVoidReturn("onResourcesAvailable"); - } catch (Exception e) { - logException("onResourcesAvailable", e); - throw e; - } + @Override + public void onPhraseRecognition(int modelHandle, PhraseRecognitionEvent event, + int captureSession) + throws RemoteException { + try { + mBatteryStatsInternalSupplier.get().noteWakingSoundTrigger( + SystemClock.elapsedRealtime(), mOriginatorIdentity.uid); + startKeyphraseEventLatencyTracking(event); + mCallbackDelegate.onPhraseRecognition(modelHandle, event, captureSession); + mEventLogger.enqueue(SessionEvent.createForVoid( + RECOGNITION, modelHandle, event, captureSession) + .printLog(ALOGI, TAG)); + } catch (Exception e) { + mEventLogger.enqueue(SessionEvent.createForException( + RECOGNITION, e, modelHandle, event, captureSession) + .printLog(ALOGW, TAG)); + throw e; } + } - @Override - public void onModuleDied() throws RemoteException { - try { - mCallbackDelegate.onModuleDied(); - logVoidReturn("onModuleDied"); - } catch (Exception e) { - logException("onModuleDied", e); - throw e; - } + @Override + public void onModelUnloaded(int modelHandle) throws RemoteException { + try { + mCallbackDelegate.onModelUnloaded(modelHandle); + mEventLogger.enqueue(SessionEvent.createForVoid( + MODEL_UNLOADED, modelHandle) + .printLog(ALOGI, TAG)); + } catch (Exception e) { + mEventLogger.enqueue(SessionEvent.createForException( + MODEL_UNLOADED, e, modelHandle) + .printLog(ALOGW, TAG)); + throw e; } + } - private void logException(String methodName, Exception ex, Object... args) { - logExceptionWithObject(this, mOriginatorIdentity, methodName, ex, args); + @Override + public void onResourcesAvailable() throws RemoteException { + try { + mCallbackDelegate.onResourcesAvailable(); + mEventLogger.enqueue(SessionEvent.createForVoid( + RESOURCES_AVAILABLE) + .printLog(ALOGI, TAG)); + } catch (Exception e) { + mEventLogger.enqueue(SessionEvent.createForException( + RESOURCES_AVAILABLE, e) + .printLog(ALOGW, TAG)); + throw e; } + } - private void logVoidReturn(String methodName, Object... args) { - logVoidReturnWithObject(this, mOriginatorIdentity, methodName, args); + @Override + public void onModuleDied() throws RemoteException { + try { + mCallbackDelegate.onModuleDied(); + mEventLogger.enqueue(SessionEvent.createForVoid( + MODULE_DIED) + .printLog(ALOGW, TAG)); + } catch (Exception e) { + mEventLogger.enqueue(SessionEvent.createForException( + MODULE_DIED, e) + .printLog(ALOGW, TAG)); + throw e; } + } - @Override - public IBinder asBinder() { - return mCallbackDelegate.asBinder(); - } + @Override + public IBinder asBinder() { + return mCallbackDelegate.asBinder(); + } - // Override toString() in order to have the delegate's ID in it. - @Override - public String toString() { - return Objects.toString(mCallbackDelegate); - } + // Override toString() in order to have the delegate's ID in it. + @Override + public String toString() { + return Objects.toString(mCallbackDelegate); } } @@ -418,105 +493,193 @@ public class SoundTriggerMiddlewareLogging implements ISoundTriggerMiddlewareInt latencyTrackerTag); } - //////////////////////////////////////////////////////////////////////////////////////////////// - // Actual logging logic below. - private static final int NUM_EVENTS_TO_DUMP = 64; - private final static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss:SSS"); - private final @NonNull LinkedList<Event> mLastEvents = new LinkedList<>(); - - static private class Event { - public final long timestamp = System.currentTimeMillis(); - public final String message; - - private Event(String message) { - this.message = message; - } - } - - private static String printArgs(@NonNull Object[] args) { - StringBuilder result = new StringBuilder(); + private static StringBuilder printArgs(StringBuilder builder, @NonNull Object[] args) { for (int i = 0; i < args.length; ++i) { if (i > 0) { - result.append(", "); + builder.append(", "); } - printObject(result, args[i]); + ObjectPrinter.print(builder, args[i]); } - return result.toString(); + return builder; } - private static void printObject(@NonNull StringBuilder builder, @Nullable Object obj) { - ObjectPrinter.print(builder, obj, 16); - } + @Override + public void dump(PrintWriter pw) { + // Event loggers + pw.println("##Service-Wide logs:"); + mServiceEventLogger.dump(pw, /* indent = */ " "); + + pw.println("\n##Active Session dumps:\n"); + for (var sessionLogger : mSessionEventLoggers) { + sessionLogger.dump(pw, /* indent= */ " "); + pw.println(""); + } + pw.println("##Detached Session dumps:\n"); + for (var sessionLogger : mDetachedSessionEventLoggers) { + sessionLogger.dump(pw, /* indent= */ " "); + pw.println(""); + } - private static String printObject(@Nullable Object obj) { - StringBuilder builder = new StringBuilder(); - printObject(builder, obj); - return builder.toString(); + if (mDelegate instanceof Dumpable) { + ((Dumpable) mDelegate).dump(pw); + } } - private void logReturnWithObject(@NonNull Object object, @Nullable Identity originatorIdentity, - String methodName, - @Nullable Object retVal, - @NonNull Object[] args) { - final String message = String.format("%s[this=%s, client=%s](%s) -> %s", methodName, - object, - printObject(originatorIdentity), - printArgs(args), - printObject(retVal)); - Slog.i(TAG, message); - appendMessage(message); + public static void printSystemLog(int type, String tag, String message, Exception e) { + switch (type) { + case Event.ALOGI: + Slog.i(tag, message, e); + break; + case Event.ALOGE: + Slog.e(tag, message, e); + break; + case Event.ALOGW: + Slog.w(tag, message, e); + break; + case Event.ALOGV: + default: + Slog.v(tag, message, e); + } } - private void logVoidReturnWithObject(@NonNull Object object, - @Nullable Identity originatorIdentity, @NonNull String methodName, - @NonNull Object[] args) { - final String message = String.format("%s[this=%s, client=%s](%s)", methodName, - object, - printObject(originatorIdentity), - printArgs(args)); - Slog.i(TAG, message); - appendMessage(message); - } + public static class ServiceEvent extends Event { + private final Type mType; + private final String mPackageName; + private final Object mReturnValue; + private final Object[] mParams; + private final Exception mException; - private void logExceptionWithObject(@NonNull Object object, - @Nullable Identity originatorIdentity, @NonNull String methodName, - @NonNull Exception ex, - Object[] args) { - final String message = String.format("%s[this=%s, client=%s](%s) threw", methodName, - object, - printObject(originatorIdentity), - printArgs(args)); - Slog.e(TAG, message, ex); - appendMessage(message + " " + ex.toString()); - } + public enum Type { + ATTACH, + LIST_MODULE, + } + + public static ServiceEvent createForException(Type type, String packageName, + Exception exception, Object... params) { + return new ServiceEvent(exception, type, packageName, null, params); + } + + public static ServiceEvent createForReturn(Type type, String packageName, + Object returnValue, Object... params) { + return new ServiceEvent(null , type, packageName, returnValue, params); + } - private void appendMessage(@NonNull String message) { - Event event = new Event(message); - synchronized (mLastEvents) { - if (mLastEvents.size() > NUM_EVENTS_TO_DUMP) { - mLastEvents.remove(); + private ServiceEvent(Exception exception, Type type, String packageName, Object returnValue, + Object... params) { + mException = exception; + mType = type; + mPackageName = packageName; + mReturnValue = returnValue; + mParams = params; + } + + @Override + public Event printLog(int type, String tag) { + printSystemLog(type, tag, eventToString(), mException); + return this; + } + + @Override + public String eventToString() { + var sb = new StringBuilder(mType.name()).append(" [client= "); + ObjectPrinter.print(sb, mPackageName); + sb.append("] ("); + printArgs(sb, mParams); + sb.append(") -> "); + if (mException != null) { + sb.append("ERROR: "); + ObjectPrinter.print(sb, mException); + } else { + ObjectPrinter.print(sb, mReturnValue); } - mLastEvents.add(event); + return sb.toString(); } } - @Override - public void dump(PrintWriter pw) { - pw.println(); - pw.println("========================================="); - pw.println("Last events"); - pw.println("========================================="); - synchronized (mLastEvents) { - for (Event event : mLastEvents) { - pw.print(DATE_FORMAT.format(new Date(event.timestamp))); - pw.print('\t'); - pw.println(event.message); + public static class SessionEvent extends Event { + public enum Type { + LOAD_MODEL, + LOAD_PHRASE_MODEL, + START_RECOGNITION, + STOP_RECOGNITION, + FORCE_RECOGNITION, + UNLOAD_MODEL, + GET_MODEL_PARAMETER, + SET_MODEL_PARAMETER, + QUERY_MODEL_PARAMETER, + DETACH, + RECOGNITION, + MODEL_UNLOADED, + MODULE_DIED, + RESOURCES_AVAILABLE, + } + + private final Type mType; + private final Exception mException; + private final Object mReturnValue; + private final Object[] mParams; + + public static SessionEvent createForException(Type type, Exception exception, + Object... params) { + return new SessionEvent(exception, type, null, params); + } + + public static SessionEvent createForReturn(Type type, + Object returnValue, Object... params) { + return new SessionEvent(null , type, returnValue, params); + } + + public static SessionEvent createForVoid(Type type, Object... params) { + return new SessionEvent(null, type, null, params); + } + + + private SessionEvent(Exception exception, Type type, Object returnValue, + Object... params) { + mException = exception; + mType = type; + mReturnValue = returnValue; + mParams = params; + } + + @Override + public Event printLog(int type, String tag) { + printSystemLog(type, tag, eventToString(), mException); + return this; + } + + @Override + public String eventToString() { + var sb = new StringBuilder(mType.name()); + sb.append(" ("); + printArgs(sb, mParams); + sb.append(")"); + if (mException != null) { + sb.append(" -> ERROR: "); + ObjectPrinter.print(sb, mException); + } else if (mReturnValue != null) { + sb.append(" -> "); + ObjectPrinter.print(sb, mReturnValue); } + return sb.toString(); } - pw.println(); + } - if (mDelegate instanceof Dumpable) { - ((Dumpable) mDelegate).dump(pw); + private static final class ModulePropertySummary { + private int mId; + private String mImplementor; + private int mVersion; + + ModulePropertySummary(int id, String implementor, int version) { + mId = id; + mImplementor = implementor; + mVersion = version; } + + @Override + public String toString() { + return "{Id: " + mId + ", Implementor: " + mImplementor + + ", Version: " + mVersion + "}"; + } } } diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordAudioStreamCopier.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordAudioStreamCopier.java index 2413072d036d..65c95d1261f3 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordAudioStreamCopier.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/HotwordAudioStreamCopier.java @@ -339,7 +339,11 @@ final class HotwordAudioStreamCopier { } catch (IOException e) { mAudioSource.closeWithError(e.getMessage()); mAudioSink.closeWithError(e.getMessage()); - Slog.e(TAG, mStreamTaskId + ": Failed to copy audio stream", e); + // This is expected when VIS closes the read side of the pipe on their end, + // so when the HotwordAudioStreamCopier tries to write, we will get that broken + // pipe error. HDS is also closing the write side of the pipe (the system is on the + // read end of that pipe). + Slog.i(TAG, mStreamTaskId + ": Failed to copy audio stream", e); HotwordMetricsLogger.writeAudioEgressEvent(mDetectorType, HOTWORD_AUDIO_EGRESS_EVENT_REPORTED__EVENT__CLOSE_ERROR_FROM_SYSTEM, mUid, /* streamSizeBytes= */ 0, /* bundleSizeBytes= */ 0, diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index bb50c792c4f8..27f3fb3898ee 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -2138,8 +2138,6 @@ public class VoiceInteractionManagerService extends SystemService { mImpl.dumpLocked(fd, pw, args); } } - - mSoundTriggerInternal.dump(fd, pw, args); } @Override |