diff options
846 files changed, 13803 insertions, 6964 deletions
diff --git a/AconfigFlags.bp b/AconfigFlags.bp index 8591a9c4a195..6ecd38f054aa 100644 --- a/AconfigFlags.bp +++ b/AconfigFlags.bp @@ -21,6 +21,7 @@ aconfig_declarations_group { // !!! KEEP THIS LIST ALPHABETICAL !!! "aconfig_mediacodec_flags_java_lib", "android.adaptiveauth.flags-aconfig-java", + "android.app.contextualsearch.flags-aconfig-java", "android.app.flags-aconfig-java", "android.app.ondeviceintelligence-aconfig-java", "android.app.smartspace.flags-aconfig-java", @@ -974,6 +975,19 @@ java_aconfig_library { ], } +// Contextual Search +aconfig_declarations { + name: "android.app.contextualsearch.flags-aconfig", + package: "android.app.contextualsearch.flags", + srcs: ["core/java/android/app/contextualsearch/flags.aconfig"], +} + +java_aconfig_library { + name: "android.app.contextualsearch.flags-aconfig-java", + aconfig_declarations: "android.app.contextualsearch.flags-aconfig", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} + // Smartspace aconfig_declarations { name: "android.app.smartspace.flags-aconfig", diff --git a/Android.bp b/Android.bp index 8d7ab983593d..057b1d62ea5a 100644 --- a/Android.bp +++ b/Android.bp @@ -355,8 +355,11 @@ java_defaults { "packages/modules/Media/apex/aidl/stable", "hardware/interfaces/biometrics/common/aidl", "hardware/interfaces/biometrics/fingerprint/aidl", + "hardware/interfaces/common/aidl", + "hardware/interfaces/common/fmq/aidl", "hardware/interfaces/graphics/common/aidl", "hardware/interfaces/keymaster/aidl", + "hardware/interfaces/power/aidl", "system/hardware/interfaces/media/aidl", ], }, diff --git a/api/Android.bp b/api/Android.bp index 093ee4beab50..010a2a587057 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -342,8 +342,11 @@ stubs_defaults { "packages/modules/Media/apex/aidl/stable", "hardware/interfaces/biometrics/common/aidl", "hardware/interfaces/biometrics/fingerprint/aidl", + "hardware/interfaces/common/aidl", + "hardware/interfaces/common/fmq/aidl", "hardware/interfaces/graphics/common/aidl", "hardware/interfaces/keymaster/aidl", + "hardware/interfaces/power/aidl", "system/hardware/interfaces/media/aidl", ], }, diff --git a/cmds/screencap/screencap.cpp b/cmds/screencap/screencap.cpp index 917529ec1dcf..7e4f95bc9274 100644 --- a/cmds/screencap/screencap.cpp +++ b/cmds/screencap/screencap.cpp @@ -51,11 +51,13 @@ using namespace android; void usage(const char* pname, ftl::Optional<DisplayId> displayIdOpt) { fprintf(stderr, R"( -usage: %s [-hp] [-d display-id] [FILENAME] +usage: %s [-ahp] [-d display-id] [FILENAME] -h: this message - -p: save the file as a png. + -a: captures all the active displays. This appends an integer postfix to the FILENAME. + e.g., FILENAME_0.png, FILENAME_1.png. If both -a and -d are given, it ignores -d. -d: specify the display ID to capture%s see "dumpsys SurfaceFlinger --display-id" for valid display IDs. + -p: outputs in png format. --hint-for-seamless If set will use the hintForSeamless path in SF If FILENAME ends with .png it will be saved as a png. @@ -63,11 +65,13 @@ If FILENAME is not given, the results will be printed to stdout. )", pname, displayIdOpt - .transform([](DisplayId id) { - return std::string(ftl::Concat(" (default: ", id.value, ')').str()); - }) - .value_or(std::string()) - .c_str()); + .transform([](DisplayId id) { + return std::string(ftl::Concat( + " (If the id is not given, it defaults to ", id.value,')' + ).str()); + }) + .value_or(std::string()) + .c_str()); } // For options that only exist in long-form. Anything in the @@ -123,8 +127,8 @@ static status_t notifyMediaScanner(const char* fileName) { int status; int pid = fork(); if (pid < 0){ - fprintf(stderr, "Unable to fork in order to send intent for media scanner.\n"); - return UNKNOWN_ERROR; + fprintf(stderr, "Unable to fork in order to send intent for media scanner.\n"); + return UNKNOWN_ERROR; } if (pid == 0){ int fd = open("/dev/null", O_WRONLY); @@ -146,19 +150,119 @@ static status_t notifyMediaScanner(const char* fileName) { return NO_ERROR; } +status_t capture(const DisplayId displayId, + const gui::CaptureArgs& captureArgs, + ScreenCaptureResults& outResult) { + sp<SyncScreenCaptureListener> captureListener = new SyncScreenCaptureListener(); + ScreenshotClient::captureDisplay(displayId, captureArgs, captureListener); + + ScreenCaptureResults captureResults = captureListener->waitForResults(); + if (!captureResults.fenceResult.ok()) { + fprintf(stderr, "Failed to take screenshot. Status: %d\n", + fenceStatus(captureResults.fenceResult)); + return 1; + } + + outResult = captureResults; + + return 0; +} + +status_t saveImage(const char* fn, bool png, const ScreenCaptureResults& captureResults) { + void* base = nullptr; + ui::Dataspace dataspace = captureResults.capturedDataspace; + sp<GraphicBuffer> buffer = captureResults.buffer; + + status_t result = buffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &base); + + if (base == nullptr || result != NO_ERROR) { + String8 reason; + if (result != NO_ERROR) { + reason.appendFormat(" Error Code: %d", result); + } else { + reason = "Failed to write to buffer"; + } + fprintf(stderr, "Failed to take screenshot (%s)\n", reason.c_str()); + return 1; + } + + int fd = -1; + if (fn == nullptr) { + fd = dup(STDOUT_FILENO); + if (fd == -1) { + fprintf(stderr, "Error writing to stdout. (%s)\n", strerror(errno)); + return 1; + } + } else { + fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0664); + if (fd == -1) { + fprintf(stderr, "Error opening file: %s (%s)\n", fn, strerror(errno)); + return 1; + } + } + + if (png) { + AndroidBitmapInfo info; + info.format = flinger2bitmapFormat(buffer->getPixelFormat()); + info.flags = ANDROID_BITMAP_FLAGS_ALPHA_PREMUL; + info.width = buffer->getWidth(); + info.height = buffer->getHeight(); + info.stride = buffer->getStride() * bytesPerPixel(buffer->getPixelFormat()); + + int result = AndroidBitmap_compress(&info, static_cast<int32_t>(dataspace), base, + ANDROID_BITMAP_COMPRESS_FORMAT_PNG, 100, &fd, + [](void* fdPtr, const void* data, size_t size) -> bool { + int bytesWritten = write(*static_cast<int*>(fdPtr), + data, size); + return bytesWritten == size; + }); + + if (result != ANDROID_BITMAP_RESULT_SUCCESS) { + fprintf(stderr, "Failed to compress PNG (error code: %d)\n", result); + } + + if (fn != NULL) { + notifyMediaScanner(fn); + } + } else { + uint32_t w = buffer->getWidth(); + uint32_t h = buffer->getHeight(); + uint32_t s = buffer->getStride(); + uint32_t f = buffer->getPixelFormat(); + uint32_t c = dataSpaceToInt(dataspace); + + write(fd, &w, 4); + write(fd, &h, 4); + write(fd, &f, 4); + write(fd, &c, 4); + size_t Bpp = bytesPerPixel(f); + for (size_t y=0 ; y<h ; y++) { + write(fd, base, w*Bpp); + base = (void *)((char *)base + s*Bpp); + } + } + close(fd); + + return 0; +} + int main(int argc, char** argv) { - const std::vector<PhysicalDisplayId> ids = SurfaceComposerClient::getPhysicalDisplayIds(); - if (ids.empty()) { + const std::vector<PhysicalDisplayId> physicalDisplays = + SurfaceComposerClient::getPhysicalDisplayIds(); + + if (physicalDisplays.empty()) { fprintf(stderr, "Failed to get ID for any displays.\n"); return 1; } std::optional<DisplayId> displayIdOpt; + std::vector<DisplayId> displaysToCapture; gui::CaptureArgs captureArgs; const char* pname = argv[0]; bool png = false; + bool all = false; int c; - while ((c = getopt_long(argc, argv, "phd:", LONG_OPTIONS, nullptr)) != -1) { + while ((c = getopt_long(argc, argv, "aphd:", LONG_OPTIONS, nullptr)) != -1) { switch (c) { case 'p': png = true; @@ -177,12 +281,17 @@ int main(int argc, char** argv) fprintf(stderr, "Invalid display ID: Incorrect encoding.\n"); return 1; } + displaysToCapture.push_back(displayIdOpt.value()); + break; + } + case 'a': { + all = true; break; } case '?': case 'h': - if (ids.size() == 1) { - displayIdOpt = ids.front(); + if (physicalDisplays.size() >= 1) { + displayIdOpt = physicalDisplays.front(); } usage(pname, displayIdOpt); return 1; @@ -192,44 +301,52 @@ int main(int argc, char** argv) } } - if (!displayIdOpt) { - displayIdOpt = ids.front(); - if (ids.size() > 1) { - fprintf(stderr, - "[Warning] Multiple displays were found, but no display id was specified! " - "Defaulting to the first display found, however this default is not guaranteed " - "to be consistent across captures. A display id should be specified.\n"); - fprintf(stderr, "A display ID can be specified with the [-d display-id] option.\n"); - fprintf(stderr, "See \"dumpsys SurfaceFlinger --display-id\" for valid display IDs.\n"); - } - } - argc -= optind; argv += optind; - int fd = -1; - const char* fn = NULL; - if (argc == 0) { - fd = dup(STDOUT_FILENO); - } else if (argc == 1) { - fn = argv[0]; - fd = open(fn, O_WRONLY | O_CREAT | O_TRUNC, 0664); - if (fd == -1) { - fprintf(stderr, "Error opening file: %s (%s)\n", fn, strerror(errno)); - return 1; + // We don't expect more than 2 arguments. + if (argc >= 2) { + if (physicalDisplays.size() >= 1) { + usage(pname, physicalDisplays.front()); + } else { + usage(pname, std::nullopt); } - const int len = strlen(fn); - if (len >= 4 && 0 == strcmp(fn+len-4, ".png")) { + return 1; + } + + std::string baseName; + std::string suffix; + + if (argc == 1) { + std::string_view filename = { argv[0] }; + if (filename.ends_with(".png")) { + baseName = filename.substr(0, filename.size()-4); + suffix = ".png"; png = true; + } else { + baseName = filename; } } - if (fd == -1) { - usage(pname, displayIdOpt); - return 1; + if (all) { + // Ignores -d if -a is given. + displaysToCapture.clear(); + for (int i = 0; i < physicalDisplays.size(); i++) { + displaysToCapture.push_back(physicalDisplays[i]); + } } - void* base = NULL; + if (displaysToCapture.empty()) { + displaysToCapture.push_back(physicalDisplays.front()); + if (physicalDisplays.size() > 1) { + fprintf(stderr, + "[Warning] Multiple displays were found, but no display id was specified! " + "Defaulting to the first display found, however this default is not guaranteed " + "to be consistent across captures. A display id should be specified.\n"); + fprintf(stderr, "A display ID can be specified with the [-d display-id] option.\n"); + fprintf(stderr, "See \"dumpsys SurfaceFlinger --display-id\" for valid display IDs.\n"); + } + } // setThreadPoolMaxThreadCount(0) actually tells the kernel it's // not allowed to spawn any additional threads, but we still spawn @@ -238,74 +355,39 @@ int main(int argc, char** argv) ProcessState::self()->setThreadPoolMaxThreadCount(0); ProcessState::self()->startThreadPool(); - sp<SyncScreenCaptureListener> captureListener = new SyncScreenCaptureListener(); - ScreenshotClient::captureDisplay(*displayIdOpt, captureArgs, captureListener); - - ScreenCaptureResults captureResults = captureListener->waitForResults(); - if (!captureResults.fenceResult.ok()) { - close(fd); - fprintf(stderr, "Failed to take screenshot. Status: %d\n", - fenceStatus(captureResults.fenceResult)); - return 1; - } - ui::Dataspace dataspace = captureResults.capturedDataspace; - sp<GraphicBuffer> buffer = captureResults.buffer; + std::vector<ScreenCaptureResults> results; + const size_t numDisplays = displaysToCapture.size(); + for (int i=0; i<numDisplays; i++) { + ScreenCaptureResults result; - status_t result = buffer->lock(GraphicBuffer::USAGE_SW_READ_OFTEN, &base); + // 1. Capture the screen + if (const status_t captureStatus = + capture(displaysToCapture[i], captureArgs, result) != 0) { - if (base == nullptr || result != NO_ERROR) { - String8 reason; - if (result != NO_ERROR) { - reason.appendFormat(" Error Code: %d", result); - } else { - reason = "Failed to write to buffer"; + fprintf(stderr, "Capturing failed.\n"); + return captureStatus; } - fprintf(stderr, "Failed to take screenshot (%s)\n", reason.c_str()); - close(fd); - return 1; - } - - if (png) { - AndroidBitmapInfo info; - info.format = flinger2bitmapFormat(buffer->getPixelFormat()); - info.flags = ANDROID_BITMAP_FLAGS_ALPHA_PREMUL; - info.width = buffer->getWidth(); - info.height = buffer->getHeight(); - info.stride = buffer->getStride() * bytesPerPixel(buffer->getPixelFormat()); - - int result = AndroidBitmap_compress(&info, static_cast<int32_t>(dataspace), base, - ANDROID_BITMAP_COMPRESS_FORMAT_PNG, 100, &fd, - [](void* fdPtr, const void* data, size_t size) -> bool { - int bytesWritten = write(*static_cast<int*>(fdPtr), - data, size); - return bytesWritten == size; - }); - if (result != ANDROID_BITMAP_RESULT_SUCCESS) { - fprintf(stderr, "Failed to compress PNG (error code: %d)\n", result); + // 2. Save the capture result as an image. + // When there's more than one file to capture, add the index as postfix. + std::string filename; + if (!baseName.empty()) { + filename = baseName; + if (numDisplays > 1) { + filename += "_"; + filename += std::to_string(i); + } + filename += suffix; } - - if (fn != NULL) { - notifyMediaScanner(fn); + const char* fn = nullptr; + if (!filename.empty()) { + fn = filename.c_str(); } - } else { - uint32_t w = buffer->getWidth(); - uint32_t h = buffer->getHeight(); - uint32_t s = buffer->getStride(); - uint32_t f = buffer->getPixelFormat(); - uint32_t c = dataSpaceToInt(dataspace); - - write(fd, &w, 4); - write(fd, &h, 4); - write(fd, &f, 4); - write(fd, &c, 4); - size_t Bpp = bytesPerPixel(f); - for (size_t y=0 ; y<h ; y++) { - write(fd, base, w*Bpp); - base = (void *)((char *)base + s*Bpp); + if (const status_t saveImageStatus = saveImage(fn, png, result) != 0) { + fprintf(stderr, "Saving image failed.\n"); + return saveImageStatus; } } - close(fd); return 0; } diff --git a/core/api/current.txt b/core/api/current.txt index 2c2a75924684..b91dc20ae888 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -293,7 +293,7 @@ package android { field public static final String SET_ALARM = "com.android.alarm.permission.SET_ALARM"; field public static final String SET_ALWAYS_FINISH = "android.permission.SET_ALWAYS_FINISH"; field public static final String SET_ANIMATION_SCALE = "android.permission.SET_ANIMATION_SCALE"; - field @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") public static final String SET_BIOMETRIC_DIALOG_LOGO = "android.permission.SET_BIOMETRIC_DIALOG_LOGO"; + field @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") public static final String SET_BIOMETRIC_DIALOG_ADVANCED = "android.permission.SET_BIOMETRIC_DIALOG_ADVANCED"; field public static final String SET_DEBUG_APP = "android.permission.SET_DEBUG_APP"; field @Deprecated public static final String SET_PREFERRED_APPLICATIONS = "android.permission.SET_PREFERRED_APPLICATIONS"; field public static final String SET_PROCESS_LIMIT = "android.permission.SET_PROCESS_LIMIT"; @@ -18904,9 +18904,9 @@ package android.hardware.biometrics { method @Nullable public int getAllowedAuthenticators(); method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @Nullable public android.hardware.biometrics.PromptContentView getContentView(); method @Nullable public CharSequence getDescription(); - method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @Nullable @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_LOGO) public android.graphics.Bitmap getLogoBitmap(); - method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @Nullable @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_LOGO) public String getLogoDescription(); - method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @DrawableRes @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_LOGO) public int getLogoRes(); + method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @Nullable @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED) public android.graphics.Bitmap getLogoBitmap(); + method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @Nullable @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED) public String getLogoDescription(); + method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @DrawableRes @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED) public int getLogoRes(); method @Nullable public CharSequence getNegativeButtonText(); method @Nullable public CharSequence getSubtitle(); method @NonNull public CharSequence getTitle(); @@ -18956,9 +18956,9 @@ package android.hardware.biometrics { method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setContentView(@NonNull android.hardware.biometrics.PromptContentView); method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setDescription(@NonNull CharSequence); method @Deprecated @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setDeviceCredentialAllowed(boolean); - method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @NonNull @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_LOGO) public android.hardware.biometrics.BiometricPrompt.Builder setLogoBitmap(@NonNull android.graphics.Bitmap); - method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @NonNull @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_LOGO) public android.hardware.biometrics.BiometricPrompt.Builder setLogoDescription(@NonNull String); - method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @NonNull @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_LOGO) public android.hardware.biometrics.BiometricPrompt.Builder setLogoRes(@DrawableRes int); + method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @NonNull @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED) public android.hardware.biometrics.BiometricPrompt.Builder setLogoBitmap(@NonNull android.graphics.Bitmap); + method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @NonNull @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED) public android.hardware.biometrics.BiometricPrompt.Builder setLogoDescription(@NonNull String); + method @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") @NonNull @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED) public android.hardware.biometrics.BiometricPrompt.Builder setLogoRes(@DrawableRes int); method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setNegativeButton(@NonNull CharSequence, @NonNull java.util.concurrent.Executor, @NonNull android.content.DialogInterface.OnClickListener); method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setSubtitle(@NonNull CharSequence); method @NonNull public android.hardware.biometrics.BiometricPrompt.Builder setTitle(@NonNull CharSequence); @@ -18971,6 +18971,7 @@ package android.hardware.biometrics { ctor @Deprecated public BiometricPrompt.CryptoObject(@NonNull android.security.identity.IdentityCredential); ctor public BiometricPrompt.CryptoObject(@NonNull android.security.identity.PresentationSession); ctor @FlaggedApi("android.hardware.biometrics.add_key_agreement_crypto_object") public BiometricPrompt.CryptoObject(@NonNull javax.crypto.KeyAgreement); + ctor @FlaggedApi("android.hardware.biometrics.get_op_id_crypto_object") public BiometricPrompt.CryptoObject(long); method @Nullable public javax.crypto.Cipher getCipher(); method @Deprecated @Nullable public android.security.identity.IdentityCredential getIdentityCredential(); method @FlaggedApi("android.hardware.biometrics.add_key_agreement_crypto_object") @Nullable public javax.crypto.KeyAgreement getKeyAgreement(); @@ -19000,6 +19001,21 @@ package android.hardware.biometrics { @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") public interface PromptContentView { } + @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") public final class PromptContentViewWithMoreOptionsButton implements android.os.Parcelable android.hardware.biometrics.PromptContentView { + method public int describeContents(); + method @Nullable @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED) public String getDescription(); + method @NonNull @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED) public android.content.DialogInterface.OnClickListener getMoreOptionsButtonListener(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.hardware.biometrics.PromptContentViewWithMoreOptionsButton> CREATOR; + } + + public static final class PromptContentViewWithMoreOptionsButton.Builder { + ctor public PromptContentViewWithMoreOptionsButton.Builder(); + method @NonNull @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED) public android.hardware.biometrics.PromptContentViewWithMoreOptionsButton build(); + method @NonNull @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED) public android.hardware.biometrics.PromptContentViewWithMoreOptionsButton.Builder setDescription(@NonNull String); + method @NonNull @RequiresPermission(android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED) public android.hardware.biometrics.PromptContentViewWithMoreOptionsButton.Builder setMoreOptionsButtonListener(@NonNull java.util.concurrent.Executor, @NonNull android.content.DialogInterface.OnClickListener); + } + @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") public final class PromptVerticalListContentView implements android.os.Parcelable android.hardware.biometrics.PromptContentView { method public int describeContents(); method @Nullable public String getDescription(); @@ -20121,9 +20137,14 @@ package android.hardware.camera2.params { ctor public OutputConfiguration(@NonNull android.view.Surface); ctor public OutputConfiguration(int, @NonNull android.view.Surface); ctor public <T> OutputConfiguration(@NonNull android.util.Size, @NonNull Class<T>); + ctor @FlaggedApi("com.android.internal.camera.flags.camera_device_setup") public OutputConfiguration(int, @NonNull android.util.Size); + ctor @FlaggedApi("com.android.internal.camera.flags.camera_device_setup") public OutputConfiguration(int, int, @NonNull android.util.Size); + ctor @FlaggedApi("com.android.internal.camera.flags.camera_device_setup") public OutputConfiguration(int, @NonNull android.util.Size, long); + ctor @FlaggedApi("com.android.internal.camera.flags.camera_device_setup") public OutputConfiguration(int, int, @NonNull android.util.Size, long); method public void addSensorPixelModeUsed(int); method public void addSurface(@NonNull android.view.Surface); method @NonNull public static java.util.Collection<android.hardware.camera2.params.OutputConfiguration> createInstancesForMultiResolutionOutput(@NonNull android.hardware.camera2.MultiResolutionImageReader); + method @FlaggedApi("com.android.internal.camera.flags.camera_device_setup") @NonNull public static java.util.List<android.hardware.camera2.params.OutputConfiguration> createInstancesForMultiResolutionOutput(@NonNull java.util.Collection<android.hardware.camera2.params.MultiResolutionStreamInfo>, int); method public int describeContents(); method public void enableSurfaceSharing(); method public long getDynamicRangeProfile(); @@ -20142,6 +20163,7 @@ package android.hardware.camera2.params { method public void setPhysicalCameraId(@Nullable String); method public void setReadoutTimestampEnabled(boolean); method public void setStreamUseCase(long); + method @FlaggedApi("com.android.internal.camera.flags.camera_device_setup") public static void setSurfacesForMultiResolutionOutput(@NonNull java.util.Collection<android.hardware.camera2.params.OutputConfiguration>, @NonNull android.hardware.camera2.MultiResolutionImageReader); method public void setTimestampBase(int); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.hardware.camera2.params.OutputConfiguration> CREATOR; @@ -20203,6 +20225,7 @@ package android.hardware.camera2.params { public final class SessionConfiguration implements android.os.Parcelable { ctor public SessionConfiguration(int, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, @NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback); + ctor @FlaggedApi("com.android.internal.camera.flags.camera_device_setup") public SessionConfiguration(int, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>); method public void clearColorSpace(); method public int describeContents(); method @Nullable public android.graphics.ColorSpace getColorSpace(); @@ -20212,6 +20235,7 @@ package android.hardware.camera2.params { method public android.hardware.camera2.CaptureRequest getSessionParameters(); method public int getSessionType(); method public android.hardware.camera2.CameraCaptureSession.StateCallback getStateCallback(); + method @FlaggedApi("com.android.internal.camera.flags.camera_device_setup") public void setCallback(@NonNull java.util.concurrent.Executor, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback); method public void setColorSpace(@NonNull android.graphics.ColorSpace.Named); method public void setInputConfiguration(@NonNull android.hardware.camera2.params.InputConfiguration); method public void setSessionParameters(android.hardware.camera2.CaptureRequest); @@ -23711,6 +23735,13 @@ package android.media { field public static final int VIDEO_ENCODING_STATISTICS_LEVEL_NONE = 0; // 0x0 } + @FlaggedApi("android.media.codec.region_of_interest") public static final class MediaFormat.QpOffsetRect { + ctor public MediaFormat.QpOffsetRect(@NonNull android.graphics.Rect, int); + method @NonNull public String flattenToString(); + method @NonNull public static String flattenToString(@NonNull java.util.List<android.media.MediaFormat.QpOffsetRect>); + method public void set(@NonNull android.graphics.Rect, int); + } + public final class MediaMetadata implements android.os.Parcelable { method public boolean containsKey(String); method public int describeContents(); @@ -24503,7 +24534,7 @@ package android.media { method @Nullable public android.media.MediaRouter2.RoutingController getController(@NonNull String); method @NonNull public java.util.List<android.media.MediaRouter2.RoutingController> getControllers(); method @NonNull public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context); - method @FlaggedApi("com.android.media.flags.enable_cross_user_routing_in_media_router2") @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MEDIA_CONTENT_CONTROL, android.Manifest.permission.MEDIA_ROUTING_CONTROL}) public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context, @NonNull String); + method @FlaggedApi("com.android.media.flags.enable_privileged_routing_for_media_routing_control") @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MEDIA_CONTENT_CONTROL, android.Manifest.permission.MEDIA_ROUTING_CONTROL}) public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull Runnable); method @FlaggedApi("com.android.media.flags.enable_rlp_callbacks_in_media_router2") @Nullable public android.media.RouteListingPreference getRouteListingPreference(); method @NonNull public java.util.List<android.media.MediaRoute2Info> getRoutes(); method @NonNull public android.media.MediaRouter2.RoutingController getSystemController(); @@ -33960,6 +33991,7 @@ package android.os { method public static boolean supportsMultipleUsers(); field public static final String ALLOW_PARENT_PROFILE_APP_LINKING = "allow_parent_profile_app_linking"; field @Deprecated public static final String DISALLOW_ADD_MANAGED_PROFILE = "no_add_managed_profile"; + field @FlaggedApi("android.os.allow_private_profile") public static final String DISALLOW_ADD_PRIVATE_PROFILE = "no_add_private_profile"; field public static final String DISALLOW_ADD_USER = "no_add_user"; field public static final String DISALLOW_ADD_WIFI_CONFIG = "no_add_wifi_config"; field public static final String DISALLOW_ADJUST_VOLUME = "no_adjust_volume"; @@ -34147,9 +34179,8 @@ package android.os { method @RequiresPermission(android.Manifest.permission.VIBRATE) public final void vibrate(@NonNull android.os.CombinedVibration, @Nullable android.os.VibrationAttributes); } - @FlaggedApi("android.os.adpf_gpu_report_actual_work_duration") public final class WorkDuration implements android.os.Parcelable { + @FlaggedApi("android.os.adpf_gpu_report_actual_work_duration") public final class WorkDuration { ctor public WorkDuration(); - method public int describeContents(); method public long getActualCpuDurationNanos(); method public long getActualGpuDurationNanos(); method public long getActualTotalDurationNanos(); @@ -34158,8 +34189,6 @@ package android.os { method public void setActualGpuDurationNanos(long); method public void setActualTotalDurationNanos(long); method public void setWorkPeriodStartTimestampNanos(long); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.os.WorkDuration> CREATOR; } public class WorkSource implements android.os.Parcelable { diff --git a/core/api/system-current.txt b/core/api/system-current.txt index fbcadd80aca9..eae30e07ec72 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -7,6 +7,7 @@ package android { field public static final String ACCESS_BROADCAST_RADIO = "android.permission.ACCESS_BROADCAST_RADIO"; field public static final String ACCESS_BROADCAST_RESPONSE_STATS = "android.permission.ACCESS_BROADCAST_RESPONSE_STATS"; field public static final String ACCESS_CACHE_FILESYSTEM = "android.permission.ACCESS_CACHE_FILESYSTEM"; + field @FlaggedApi("android.app.contextualsearch.flags.enable_service") public static final String ACCESS_CONTEXTUAL_SEARCH = "android.permission.ACCESS_CONTEXTUAL_SEARCH"; field public static final String ACCESS_CONTEXT_HUB = "android.permission.ACCESS_CONTEXT_HUB"; field public static final String ACCESS_DRM_CERTIFICATES = "android.permission.ACCESS_DRM_CERTIFICATES"; field @Deprecated public static final String ACCESS_FM_RADIO = "android.permission.ACCESS_FM_RADIO"; @@ -2176,6 +2177,39 @@ package android.app.contentsuggestions { } +package android.app.contextualsearch { + + @FlaggedApi("android.app.contextualsearch.flags.enable_service") public class ContextualSearchManager { + method public void getContextualSearchState(@NonNull android.os.IBinder, @NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.app.contextualsearch.ContextualSearchState,java.lang.Throwable>); + method @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXTUAL_SEARCH) public void startContextualSearch(int); + field public static final String ACTION_LAUNCH_CONTEXTUAL_SEARCH = "android.app.contextualsearch.action.LAUNCH_CONTEXTUAL_SEARCH"; + field public static final int ENTRYPOINT_LONG_PRESS_HOME = 2; // 0x2 + field public static final int ENTRYPOINT_LONG_PRESS_META = 10; // 0xa + field public static final int ENTRYPOINT_LONG_PRESS_NAV_HANDLE = 1; // 0x1 + field public static final int ENTRYPOINT_LONG_PRESS_OVERVIEW = 3; // 0x3 + field public static final int ENTRYPOINT_OVERVIEW_ACTION = 4; // 0x4 + field public static final int ENTRYPOINT_OVERVIEW_MENU = 5; // 0x5 + field public static final int ENTRYPOINT_SYSTEM_ACTION = 9; // 0x9 + field public static final String EXTRA_ENTRYPOINT = "android.app.contextualsearch.extra.ENTRYPOINT"; + field public static final String EXTRA_FLAG_SECURE_FOUND = "android.app.contextualsearch.extra.FLAG_SECURE_FOUND"; + field public static final String EXTRA_IS_MANAGED_PROFILE_VISIBLE = "android.app.contextualsearch.extra.IS_MANAGED_PROFILE_VISIBLE"; + field public static final String EXTRA_SCREENSHOT = "android.app.contextualsearch.extra.SCREENSHOT"; + field public static final String EXTRA_TOKEN = "android.app.contextualsearch.extra.TOKEN"; + field public static final String EXTRA_VISIBLE_PACKAGE_NAMES = "android.app.contextualsearch.extra.VISIBLE_PACKAGE_NAMES"; + } + + @FlaggedApi("android.app.contextualsearch.flags.enable_service") public final class ContextualSearchState implements android.os.Parcelable { + ctor public ContextualSearchState(@Nullable android.app.assist.AssistStructure, @Nullable android.app.assist.AssistContent, @NonNull android.os.Bundle); + method public int describeContents(); + method @Nullable public android.app.assist.AssistContent getContent(); + method @NonNull public android.os.Bundle getExtras(); + method @Nullable public android.app.assist.AssistStructure getStructure(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator<android.app.contextualsearch.ContextualSearchState> CREATOR; + } + +} + package android.app.job { public abstract class JobScheduler { @@ -3747,6 +3781,7 @@ package android.content { field public static final String CLOUDSEARCH_SERVICE = "cloudsearch"; field public static final String CONTENT_SUGGESTIONS_SERVICE = "content_suggestions"; field public static final String CONTEXTHUB_SERVICE = "contexthub"; + field @FlaggedApi("android.app.contextualsearch.flags.enable_service") public static final String CONTEXTUAL_SEARCH_SERVICE = "contextual_search"; field @FlaggedApi("android.permission.flags.enhanced_confirmation_mode_apis_enabled") public static final String ECM_ENHANCED_CONFIRMATION_SERVICE = "ecm_enhanced_confirmation"; field public static final String ETHERNET_SERVICE = "ethernet"; field public static final String EUICC_CARD_SERVICE = "euicc_card"; @@ -7275,6 +7310,7 @@ package android.media { public final class MediaRouter2 { method @NonNull public java.util.List<android.media.MediaRoute2Info> getAllRoutes(); method @Nullable public String getClientPackageName(); + method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MEDIA_CONTENT_CONTROL, android.Manifest.permission.MEDIA_ROUTING_CONTROL}) public static android.media.MediaRouter2 getInstance(@NonNull android.content.Context, @NonNull String); method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void startScan(); method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void stopScan(); method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void transfer(@NonNull android.media.MediaRouter2.RoutingController, @NonNull android.media.MediaRoute2Info); @@ -10403,6 +10439,7 @@ package android.nfc.cardemulation { @FlaggedApi("android.nfc.enable_nfc_mainline") public final class ApduServiceInfo implements android.os.Parcelable { ctor @FlaggedApi("android.nfc.enable_nfc_mainline") public ApduServiceInfo(@NonNull android.content.pm.PackageManager, @NonNull android.content.pm.ResolveInfo, boolean) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method @FlaggedApi("android.nfc.nfc_read_polling_loop") public void addPollingLoopFilter(@NonNull String, boolean); + method @FlaggedApi("android.nfc.nfc_read_polling_loop") public void addPollingLoopPatternFilter(@NonNull String, boolean); method @FlaggedApi("android.nfc.enable_nfc_mainline") public int describeContents(); method @FlaggedApi("android.nfc.enable_nfc_mainline") public void dump(@NonNull android.os.ParcelFileDescriptor, @NonNull java.io.PrintWriter, @NonNull String[]); method @FlaggedApi("android.nfc.enable_nfc_mainline") public void dumpDebug(@NonNull android.util.proto.ProtoOutputStream); @@ -10414,6 +10451,7 @@ package android.nfc.cardemulation { method @FlaggedApi("android.nfc.enable_nfc_mainline") @NonNull public android.nfc.cardemulation.AidGroup getDynamicAidGroupForCategory(@NonNull String); method @FlaggedApi("android.nfc.enable_nfc_mainline") @Nullable public String getOffHostSecureElement(); method @FlaggedApi("android.nfc.nfc_read_polling_loop") @NonNull public java.util.List<java.lang.String> getPollingLoopFilters(); + method @FlaggedApi("android.nfc.nfc_read_polling_loop") @NonNull public java.util.List<java.util.regex.Pattern> getPollingLoopPatternFilters(); method @FlaggedApi("android.nfc.enable_nfc_mainline") @NonNull public java.util.List<java.lang.String> getPrefixAids(); method @FlaggedApi("android.nfc.enable_nfc_mainline") @NonNull public String getSettingsActivityName(); method @FlaggedApi("android.nfc.nfc_read_polling_loop") public boolean getShouldAutoTransact(@NonNull String); @@ -10428,6 +10466,7 @@ package android.nfc.cardemulation { method @FlaggedApi("android.nfc.enable_nfc_mainline") @NonNull public CharSequence loadLabel(@NonNull android.content.pm.PackageManager); method @FlaggedApi("android.nfc.enable_nfc_mainline") @NonNull public boolean removeDynamicAidGroupForCategory(@NonNull String); method @FlaggedApi("android.nfc.nfc_read_polling_loop") public void removePollingLoopFilter(@NonNull String); + method @FlaggedApi("android.nfc.nfc_read_polling_loop") public void removePollingLoopPatternFilter(@NonNull String); method @FlaggedApi("android.nfc.enable_nfc_mainline") public boolean requiresScreenOn(); method @FlaggedApi("android.nfc.enable_nfc_mainline") public boolean requiresUnlock(); method @FlaggedApi("android.nfc.enable_nfc_mainline") public void resetOffHostSecureElement(); @@ -12956,15 +12995,15 @@ package android.service.ondeviceintelligence { @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence") public abstract class OnDeviceSandboxedInferenceService extends android.app.Service { ctor public OnDeviceSandboxedInferenceService(); - method public final void fetchFeatureFileInputStreamMap(@NonNull android.app.ondeviceintelligence.Feature, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.util.Map<java.lang.String,java.io.FileInputStream>>); + method public final void fetchFeatureFileDescriptorMap(@NonNull android.app.ondeviceintelligence.Feature, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.util.Map<java.lang.String,android.os.ParcelFileDescriptor>>); method @NonNull public java.util.concurrent.Executor getCallbackExecutor(); + method public final void getReadOnlyFileDescriptor(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.os.ParcelFileDescriptor>) throws java.io.FileNotFoundException; method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent); method @NonNull public abstract void onProcessRequest(int, @NonNull android.app.ondeviceintelligence.Feature, @NonNull android.os.Bundle, int, @Nullable android.os.CancellationSignal, @Nullable android.app.ondeviceintelligence.ProcessingSignal, @NonNull android.app.ondeviceintelligence.ProcessingCallback); method @NonNull public abstract void onProcessRequestStreaming(int, @NonNull android.app.ondeviceintelligence.Feature, @NonNull android.os.Bundle, int, @Nullable android.os.CancellationSignal, @Nullable android.app.ondeviceintelligence.ProcessingSignal, @NonNull android.app.ondeviceintelligence.StreamingProcessingCallback); method @NonNull public abstract void onTokenInfoRequest(int, @NonNull android.app.ondeviceintelligence.Feature, @NonNull android.os.Bundle, @Nullable android.os.CancellationSignal, @NonNull android.os.OutcomeReceiver<android.app.ondeviceintelligence.TokenInfo,android.app.ondeviceintelligence.OnDeviceIntelligenceException>); method public abstract void onUpdateProcessingState(@NonNull android.os.Bundle, @NonNull android.os.OutcomeReceiver<android.os.PersistableBundle,android.app.ondeviceintelligence.OnDeviceIntelligenceException>); method public final java.io.FileInputStream openFileInput(@NonNull String) throws java.io.FileNotFoundException; - method public final void openFileInputAsync(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.io.FileInputStream>) throws java.io.FileNotFoundException; field public static final String SERVICE_INTERFACE = "android.service.ondeviceintelligence.OnDeviceSandboxedInferenceService"; } @@ -12979,11 +13018,11 @@ package android.service.persistentdata { method public long getMaximumDataBlockSize(); method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.READ_OEM_UNLOCK_STATE, "android.permission.OEM_UNLOCK_STATE"}) public boolean getOemUnlockEnabled(); method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_PDB_STATE) public String getPersistentDataPackageName(); - method public byte[] read(); + method @Nullable public byte[] read(); method @FlaggedApi("android.security.frp_enforcement") public boolean setFactoryResetProtectionSecret(@NonNull byte[]); method @Deprecated @RequiresPermission("android.permission.OEM_UNLOCK_STATE") public void setOemUnlockEnabled(boolean); method @RequiresPermission("android.permission.OEM_UNLOCK_STATE") public void wipe(); - method public int write(byte[]); + method public int write(@Nullable byte[]); field public static final int FLASH_LOCK_LOCKED = 1; // 0x1 field public static final int FLASH_LOCK_UNKNOWN = -1; // 0xffffffff field public static final int FLASH_LOCK_UNLOCKED = 0; // 0x0 @@ -13936,9 +13975,8 @@ package android.telecom { } @FlaggedApi("com.android.server.telecom.flags.telecom_resolve_hidden_dependencies") public static final class DisconnectCause.Builder { - ctor public DisconnectCause.Builder(); + ctor public DisconnectCause.Builder(int); method @NonNull public android.telecom.DisconnectCause build(); - method @NonNull public android.telecom.DisconnectCause.Builder setCode(int); method @NonNull public android.telecom.DisconnectCause.Builder setDescription(@Nullable CharSequence); method @NonNull public android.telecom.DisconnectCause.Builder setImsReasonInfo(@Nullable android.telephony.ims.ImsReasonInfo); method @NonNull public android.telecom.DisconnectCause.Builder setLabel(@Nullable CharSequence); diff --git a/core/api/test-current.txt b/core/api/test-current.txt index c1af719e91c9..0a26490b772f 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -3065,6 +3065,7 @@ package android.service.dreams { } public static final class DreamService.DreamMetadata { + field @FlaggedApi("android.service.controls.flags.home_panel_dream") @NonNull public final int dreamCategory; field @Nullable public final android.graphics.drawable.Drawable previewImage; field @Nullable public final android.content.ComponentName settingsActivity; field @NonNull public final boolean showComplications; diff --git a/core/java/Android.bp b/core/java/Android.bp index 4f96206bfd08..db5888ec64b4 100644 --- a/core/java/Android.bp +++ b/core/java/Android.bp @@ -135,8 +135,6 @@ filegroup { srcs: [ "android/os/Temperature.aidl", "android/os/CoolingDevice.aidl", - "android/os/IHintManager.aidl", - "android/os/IHintSession.aidl", "android/os/IThermalEventListener.aidl", "android/os/IThermalStatusListener.aidl", "android/os/IThermalService.aidl", @@ -145,6 +143,30 @@ filegroup { ], } +aidl_interface { + name: "android.os.hintmanager_aidl", + srcs: [ + "android/os/IHintManager.aidl", + "android/os/IHintSession.aidl", + ], + unstable: true, + backend: { + java: { + sdk_version: "module_current", + enabled: true, + }, + cpp: { + enabled: false, + }, + ndk: { + enabled: true, + }, + }, + imports: [ + "android.hardware.power-V5", + ], +} + aidl_library { name: "ILogcatManagerService_aidl", srcs: ["android/os/logcat/ILogcatManagerService.aidl"], diff --git a/core/java/android/accessibilityservice/OWNERS b/core/java/android/accessibilityservice/OWNERS index fb06e236dd8a..1265dfa2c441 100644 --- a/core/java/android/accessibilityservice/OWNERS +++ b/core/java/android/accessibilityservice/OWNERS @@ -1,6 +1,4 @@ -pweaver@google.com -ryanlwlin@google.com -danielnorman@google.com -sallyyuen@google.com -aarmaly@google.com -fuego@google.com +# Bug component: 44215 + +# Android Accessibility Framework owners +include /services/accessibility/OWNERS
\ No newline at end of file diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index df566db5ba97..6f6e0911fa4b 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -272,10 +272,15 @@ class ContextImpl extends Context { @UnsupportedAppUsage private Context mOuterContext; + + private final Object mThemeLock = new Object(); @UnsupportedAppUsage + @GuardedBy("mThemeLock") private int mThemeResource = 0; @UnsupportedAppUsage + @GuardedBy("mThemeLock") private Resources.Theme mTheme = null; + @UnsupportedAppUsage private PackageManager mPackageManager; private Context mReceiverRestrictedContext = null; @@ -288,7 +293,6 @@ class ContextImpl extends Context { private ContentCaptureOptions mContentCaptureOptions = null; - private final Object mSync = new Object(); /** * Indicates this {@link Context} can not handle UI components properly and is not associated * with a {@link Display} instance. @@ -340,20 +344,21 @@ class ContextImpl extends Context { */ private boolean mOwnsToken = false; - @GuardedBy("mSync") + private final Object mDirsLock = new Object(); + @GuardedBy("mDirsLock") private File mDatabasesDir; - @GuardedBy("mSync") + @GuardedBy("mDirsLock") @UnsupportedAppUsage private File mPreferencesDir; - @GuardedBy("mSync") + @GuardedBy("mDirsLock") private File mFilesDir; - @GuardedBy("mSync") + @GuardedBy("mDirsLock") private File mCratesDir; - @GuardedBy("mSync") + @GuardedBy("mDirsLock") private File mNoBackupFilesDir; - @GuardedBy("mSync") + @GuardedBy("mDirsLock") private File mCacheDir; - @GuardedBy("mSync") + @GuardedBy("mDirsLock") private File mCodeCacheDir; // The system service cache for the system services that are cached per-ContextImpl. @@ -458,7 +463,7 @@ class ContextImpl extends Context { @Override public void setTheme(int resId) { - synchronized (mSync) { + synchronized (mThemeLock) { if (mThemeResource != resId) { mThemeResource = resId; initializeTheme(); @@ -468,14 +473,14 @@ class ContextImpl extends Context { @Override public int getThemeResId() { - synchronized (mSync) { + synchronized (mThemeLock) { return mThemeResource; } } @Override public Resources.Theme getTheme() { - synchronized (mSync) { + synchronized (mThemeLock) { if (mTheme != null) { return mTheme; } @@ -737,7 +742,7 @@ class ContextImpl extends Context { @UnsupportedAppUsage private File getPreferencesDir() { - synchronized (mSync) { + synchronized (mDirsLock) { if (mPreferencesDir == null) { mPreferencesDir = new File(getDataDir(), "shared_prefs"); } @@ -826,7 +831,7 @@ class ContextImpl extends Context { @Override public File getFilesDir() { - synchronized (mSync) { + synchronized (mDirsLock) { if (mFilesDir == null) { mFilesDir = new File(getDataDir(), "files"); } @@ -841,7 +846,7 @@ class ContextImpl extends Context { final Path absoluteNormalizedCratePath = cratesRootPath.resolve(crateId) .toAbsolutePath().normalize(); - synchronized (mSync) { + synchronized (mDirsLock) { if (mCratesDir == null) { mCratesDir = cratesRootPath.toFile(); } @@ -854,7 +859,7 @@ class ContextImpl extends Context { @Override public File getNoBackupFilesDir() { - synchronized (mSync) { + synchronized (mDirsLock) { if (mNoBackupFilesDir == null) { mNoBackupFilesDir = new File(getDataDir(), "no_backup"); } @@ -871,7 +876,7 @@ class ContextImpl extends Context { @Override public File[] getExternalFilesDirs(String type) { - synchronized (mSync) { + synchronized (mDirsLock) { File[] dirs = Environment.buildExternalStorageAppFilesDirs(getPackageName()); if (type != null) { dirs = Environment.buildPaths(dirs, type); @@ -889,7 +894,7 @@ class ContextImpl extends Context { @Override public File[] getObbDirs() { - synchronized (mSync) { + synchronized (mDirsLock) { File[] dirs = Environment.buildExternalStorageAppObbDirs(getPackageName()); return ensureExternalDirsExistOrFilter(dirs, true /* tryCreateInProcess */); } @@ -897,7 +902,7 @@ class ContextImpl extends Context { @Override public File getCacheDir() { - synchronized (mSync) { + synchronized (mDirsLock) { if (mCacheDir == null) { mCacheDir = new File(getDataDir(), "cache"); } @@ -907,7 +912,7 @@ class ContextImpl extends Context { @Override public File getCodeCacheDir() { - synchronized (mSync) { + synchronized (mDirsLock) { if (mCodeCacheDir == null) { mCodeCacheDir = getCodeCacheDirBeforeBind(getDataDir()); } @@ -933,7 +938,7 @@ class ContextImpl extends Context { @Override public File[] getExternalCacheDirs() { - synchronized (mSync) { + synchronized (mDirsLock) { File[] dirs = Environment.buildExternalStorageAppCacheDirs(getPackageName()); // We don't try to create cache directories in-process, because they need special // setup for accurate quota tracking. This ensures the cache dirs are always @@ -944,7 +949,7 @@ class ContextImpl extends Context { @Override public File[] getExternalMediaDirs() { - synchronized (mSync) { + synchronized (mDirsLock) { File[] dirs = Environment.buildExternalStorageAppMediaDirs(getPackageName()); return ensureExternalDirsExistOrFilter(dirs, true /* tryCreateInProcess */); } @@ -1046,7 +1051,7 @@ class ContextImpl extends Context { } private File getDatabasesDir() { - synchronized (mSync) { + synchronized (mDirsLock) { if (mDatabasesDir == null) { if ("android".equals(getPackageName())) { mDatabasesDir = new File("/data/system"); diff --git a/core/java/android/app/ForegroundServiceDelegationOptions.java b/core/java/android/app/ForegroundServiceDelegationOptions.java index 875e01f32f54..d6b6a5844ff1 100644 --- a/core/java/android/app/ForegroundServiceDelegationOptions.java +++ b/core/java/android/app/ForegroundServiceDelegationOptions.java @@ -92,6 +92,16 @@ public class ForegroundServiceDelegationOptions { */ public final @DelegationService int mDelegationService; + /** + * The optional notification Id of the foreground service delegation. + */ + public final int mClientNotificationId; + + /** + * The optional notification of the foreground service delegation. + */ + public final @Nullable Notification mClientNotification; + public ForegroundServiceDelegationOptions(int clientPid, int clientUid, @NonNull String clientPackageName, @@ -100,6 +110,21 @@ public class ForegroundServiceDelegationOptions { @NonNull String clientInstanceName, int foregroundServiceTypes, @DelegationService int delegationService) { + this(clientPid, clientUid, clientPackageName, clientAppThread, isSticky, + clientInstanceName, foregroundServiceTypes, delegationService, + 0 /* notificationId */, null /* notification */); + } + + public ForegroundServiceDelegationOptions(int clientPid, + int clientUid, + @NonNull String clientPackageName, + @NonNull IApplicationThread clientAppThread, + boolean isSticky, + @NonNull String clientInstanceName, + int foregroundServiceTypes, + @DelegationService int delegationService, + int clientNotificationId, + @Nullable Notification clientNotification) { mClientPid = clientPid; mClientUid = clientUid; mClientPackageName = clientPackageName; @@ -108,6 +133,8 @@ public class ForegroundServiceDelegationOptions { mClientInstanceName = clientInstanceName; mForegroundServiceTypes = foregroundServiceTypes; mDelegationService = delegationService; + mClientNotificationId = clientNotificationId; + mClientNotification = clientNotification; } /** @@ -201,7 +228,8 @@ public class ForegroundServiceDelegationOptions { int mClientPid; // The actual app PID int mClientUid; // The actual app UID String mClientPackageName; // The actual app's package name - int mClientNotificationId; // The actual app's notification + int mClientNotificationId; // The actual app's notification id + Notification mClientNotification; // The actual app's notification IApplicationThread mClientAppThread; // The actual app's app thread boolean mSticky; // Is it a sticky service String mClientInstanceName; // The delegation service instance name @@ -233,10 +261,12 @@ public class ForegroundServiceDelegationOptions { } /** - * Set the notification ID from the client app. + * Set the notification from the client app. */ - public Builder setClientNotificationId(int clientNotificationId) { + public Builder setClientNotification(int clientNotificationId, + @Nullable Notification clientNotification) { mClientNotificationId = clientNotificationId; + mClientNotification = clientNotification; return this; } @@ -291,7 +321,9 @@ public class ForegroundServiceDelegationOptions { mSticky, mClientInstanceName, mForegroundServiceTypes, - mDelegationService + mDelegationService, + mClientNotificationId, + mClientNotification ); } } diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index fa4a4009ebc9..66269a52f0c7 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -32,6 +32,7 @@ import android.app.appsearch.AppSearchManagerFrameworkInitializer; import android.app.blob.BlobStoreManagerFrameworkInitializer; import android.app.contentsuggestions.ContentSuggestionsManager; import android.app.contentsuggestions.IContentSuggestionsManager; +import android.app.contextualsearch.ContextualSearchManager; import android.app.ecm.EnhancedConfirmationFrameworkInitializer; import android.app.job.JobSchedulerFrameworkInitializer; import android.app.ondeviceintelligence.IOnDeviceIntelligenceManager; @@ -1282,6 +1283,16 @@ public final class SystemServiceRegistry { } }); + registerService(Context.CONTEXTUAL_SEARCH_SERVICE, ContextualSearchManager.class, + new CachedServiceFetcher<>() { + @Override + public ContextualSearchManager createService(ContextImpl ctx) + throws ServiceNotFoundException { + IBinder b = ServiceManager.getService(Context.CONTEXTUAL_SEARCH_SERVICE); + return b == null ? null : new ContextualSearchManager(); + } + }); + registerService(Context.APP_PREDICTION_SERVICE, AppPredictionManager.class, new CachedServiceFetcher<AppPredictionManager>() { @Override diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index d6f138fa45be..5b28f50b5152 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -5952,7 +5952,8 @@ public class DevicePolicyManager { * <p> * This method can be called on the {@link DevicePolicyManager} instance returned by * {@link #getParentProfileInstance(ComponentName)} in order to set a value on the parent - * profile. + * profile. This allows a profile wipe after too many incorrect device-unlock password have + * been entered on the parent profile even if each profile has a separate challenge. * <p>On devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, the * password is always empty and this method has no effect - i.e. the policy is not set. * @@ -9979,17 +9980,22 @@ public class DevicePolicyManager { /** * Called by a profile owner or device owner or holder of the permission * {@link android.Manifest.permission#MANAGE_DEVICE_POLICY_LOCK_TASK}. to set a default activity - * that the system selects to handle intents that match the given {@link IntentFilter}. + * that the system selects to handle intents that match the given {@link IntentFilter} instead + * of showing the default disambiguation mechanism. * This activity will remain the default intent handler even if the set of potential event * handlers for the intent filter changes and if the intent preferences are reset. * <p> - * Note that the caller should still declare the activity in the manifest, the API just sets - * the activity to be the default one to handle the given intent filter. + * Note that the target application should still declare the activity in the manifest, the API + * just sets the activity to be the default one to handle the given intent filter. * <p> * The default disambiguation mechanism takes over if the activity is not installed (anymore). * When the activity is (re)installed, it is automatically reset as default intent handler for * the filter. * <p> + * Note that calling this API to set a default intent handler, only allow to avoid the default + * disambiguation mechanism. Implicit intents that do not trigger this mechanism (like invoking + * the browser) cannot be configured as they are controlled by other configurations. + * <p> * The calling device admin must be a profile owner or device owner. If it is not, a security * exception will be thrown. * <p> diff --git a/core/java/android/app/contextualsearch/ContextualSearchManager.java b/core/java/android/app/contextualsearch/ContextualSearchManager.java new file mode 100644 index 000000000000..693de219e7d7 --- /dev/null +++ b/core/java/android/app/contextualsearch/ContextualSearchManager.java @@ -0,0 +1,230 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.contextualsearch; + +import static android.Manifest.permission.ACCESS_CONTEXTUAL_SEARCH; + +import android.annotation.CallbackExecutor; +import android.annotation.FlaggedApi; +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.RequiresPermission; +import android.annotation.SystemApi; +import android.app.contextualsearch.flags.Flags; +import android.content.Context; +import android.os.Binder; +import android.os.Bundle; +import android.os.IBinder; +import android.os.OutcomeReceiver; +import android.os.ParcelableException; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.util.Log; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.concurrent.Executor; + +/** + * {@link ContextualSearchManager} is a system service to facilitate contextual search experience on + * configured Android devices. + * <p> + * This class lets + * <ul> + * <li> a caller start contextual search by calling {@link #startContextualSearch} method. + * <li> a handler request {@link ContextualSearchState} by calling the + * {@link #getContextualSearchState} method. + * </ul> + * + * @hide + */ +@SystemApi +@FlaggedApi(Flags.FLAG_ENABLE_SERVICE) +public class ContextualSearchManager { + + /** + * Key to get the entrypoint from the extras of the activity launched by contextual search. + * Only supposed to be used with ACTON_LAUNCH_CONTEXTUAL_SEARCH. + */ + public static final String EXTRA_ENTRYPOINT = + "android.app.contextualsearch.extra.ENTRYPOINT"; + /** + * Key to get the flag_secure value from the extras of the activity launched by contextual + * search. The value will be true if flag_secure is found in any of the visible activities. + * Only supposed to be used with ACTON_LAUNCH_CONTEXTUAL_SEARCH. + */ + public static final String EXTRA_FLAG_SECURE_FOUND = + "android.app.contextualsearch.extra.FLAG_SECURE_FOUND"; + /** + * Key to get the screenshot from the extras of the activity launched by contextual search. + * Only supposed to be used with ACTON_LAUNCH_CONTEXTUAL_SEARCH. + */ + public static final String EXTRA_SCREENSHOT = + "android.app.contextualsearch.extra.SCREENSHOT"; + /** + * Key to check whether managed profile is visible from the extras of the activity launched by + * contextual search. The value will be true if any one of the visible apps is managed. + * Only supposed to be used with ACTON_LAUNCH_CONTEXTUAL_SEARCH. + */ + public static final String EXTRA_IS_MANAGED_PROFILE_VISIBLE = + "android.app.contextualsearch.extra.IS_MANAGED_PROFILE_VISIBLE"; + /** + * Key to get the list of visible packages from the extras of the activity launched by + * contextual search. + * Only supposed to be used with ACTON_LAUNCH_CONTEXTUAL_SEARCH. + */ + public static final String EXTRA_VISIBLE_PACKAGE_NAMES = + "android.app.contextualsearch.extra.VISIBLE_PACKAGE_NAMES"; + + /** + * Key to get the binder token from the extras of the activity launched by contextual search. + * This token is needed to invoke {@link #getContextualSearchState} method. + * Only supposed to be used with ACTON_LAUNCH_CONTEXTUAL_SEARCH. + */ + public static final String EXTRA_TOKEN = "android.app.contextualsearch.extra.TOKEN"; + /** + * Intent action for contextual search invocation. The app providing the contextual search + * experience must add this intent filter action to the activity it wants to be launched. + * <br> + * <b>Note</b> This activity must not be exported. + */ + public static final String ACTION_LAUNCH_CONTEXTUAL_SEARCH = + "android.app.contextualsearch.action.LAUNCH_CONTEXTUAL_SEARCH"; + + /** Entrypoint to be used when a user long presses on the nav handle. */ + public static final int ENTRYPOINT_LONG_PRESS_NAV_HANDLE = 1; + /** Entrypoint to be used when a user long presses on the home button. */ + public static final int ENTRYPOINT_LONG_PRESS_HOME = 2; + /** Entrypoint to be used when a user long presses on the overview button. */ + public static final int ENTRYPOINT_LONG_PRESS_OVERVIEW = 3; + /** Entrypoint to be used when a user presses the action button in overview. */ + public static final int ENTRYPOINT_OVERVIEW_ACTION = 4; + /** Entrypoint to be used when a user presses the context menu button in overview. */ + public static final int ENTRYPOINT_OVERVIEW_MENU = 5; + /** Entrypoint to be used by system actions like TalkBack, Accessibility etc. */ + public static final int ENTRYPOINT_SYSTEM_ACTION = 9; + /** Entrypoint to be used when a user long presses on the meta key. */ + public static final int ENTRYPOINT_LONG_PRESS_META = 10; + /** + * The {@link Entrypoint} annotation is used to standardize the entrypoints supported by + * {@link #startContextualSearch} method. + * + * @hide + */ + @IntDef(prefix = {"ENTRYPOINT_"}, value = { + ENTRYPOINT_LONG_PRESS_NAV_HANDLE, + ENTRYPOINT_LONG_PRESS_HOME, + ENTRYPOINT_LONG_PRESS_OVERVIEW, + ENTRYPOINT_OVERVIEW_ACTION, + ENTRYPOINT_OVERVIEW_MENU, + ENTRYPOINT_SYSTEM_ACTION, + ENTRYPOINT_LONG_PRESS_META + }) + @Retention(RetentionPolicy.SOURCE) + public @interface Entrypoint { + } + private static final String TAG = ContextualSearchManager.class.getSimpleName(); + private static final boolean DEBUG = false; + + private final IContextualSearchManager mService; + + /** @hide */ + public ContextualSearchManager() { + if (DEBUG) Log.d(TAG, "ContextualSearchManager created"); + IBinder b = ServiceManager.getService(Context.CONTEXTUAL_SEARCH_SERVICE); + mService = IContextualSearchManager.Stub.asInterface(b); + } + + /** + * Used to start contextual search. + * <p> + * When {@link #startContextualSearch} is called, the system server does the following: + * <ul> + * <li>Resolves the activity using the package name and intent filter. The package name + * is fetched from the config specified in ContextualSearchManagerService. + * The activity must have ACTION_LAUNCH_CONTEXTUAL_SEARCH specified in its manifest. + * <li>Puts the required extras in the launch intent. + * <li>Launches the activity. + * </ul> + * </p> + * + * @param entrypoint the invocation entrypoint + */ + @RequiresPermission(ACCESS_CONTEXTUAL_SEARCH) + public void startContextualSearch(@Entrypoint int entrypoint) { + if (DEBUG) Log.d(TAG, "startContextualSearch for entrypoint: " + entrypoint); + try { + mService.startContextualSearch(entrypoint); + } catch (RemoteException e) { + if (DEBUG) Log.d(TAG, "Failed to startContextualSearch", e); + e.rethrowFromSystemServer(); + } + } + + /** + * Returns the {@link ContextualSearchState} to the handler via the provided callback. + * + * @param token The caller is expected to get the token from the launch extras of the handling + * activity using {@link Bundle#getIBinder} with {@link #EXTRA_TOKEN} key. + * <br> + * <b>Note</b> This token is for one time use only. Subsequent uses will invoke + * callback's {@link OutcomeReceiver#onError}. + * @param executor The executor which will be used to invoke the callback. + * @param callback The callback which will be used to return {@link ContextualSearchState} + * if/when it is available via {@link OutcomeReceiver#onResult}. It will also be + * used to return errors via {@link OutcomeReceiver#onError}. + */ + public void getContextualSearchState(@NonNull IBinder token, + @NonNull @CallbackExecutor Executor executor, + @NonNull OutcomeReceiver<ContextualSearchState, Throwable> callback) { + if (DEBUG) Log.d(TAG, "getContextualSearchState for token:" + token); + try { + final CallbackWrapper wrapper = new CallbackWrapper(executor, callback); + mService.getContextualSearchState(token, wrapper); + } catch (RemoteException e) { + if (DEBUG) Log.d(TAG, "Failed to getContextualSearchState", e); + e.rethrowFromSystemServer(); + } + } + + private static class CallbackWrapper extends IContextualSearchCallback.Stub { + private final OutcomeReceiver<ContextualSearchState, Throwable> mCallback; + private final Executor mExecutor; + + CallbackWrapper(@NonNull Executor callbackExecutor, + @NonNull OutcomeReceiver<ContextualSearchState, Throwable> callback) { + mCallback = callback; + mExecutor = callbackExecutor; + } + + @Override + public void onResult(ContextualSearchState state) { + Binder.withCleanCallingIdentity(() -> { + if (DEBUG) Log.d(TAG, "onResult state:" + state); + mExecutor.execute(() -> mCallback.onResult(state)); + }); + } + + @Override + public void onError(ParcelableException error) { + Binder.withCleanCallingIdentity(() -> { + if (DEBUG) Log.w(TAG, "onError", error); + mExecutor.execute(() -> mCallback.onError(error)); + }); + } + } +} diff --git a/core/java/android/os/WorkDuration.aidl b/core/java/android/app/contextualsearch/ContextualSearchState.aidl index 0f61204d72c4..7f64484b0f38 100644 --- a/core/java/android/os/WorkDuration.aidl +++ b/core/java/android/app/contextualsearch/ContextualSearchState.aidl @@ -1,11 +1,11 @@ -/* - * Copyright (C) 2023 The Android Open Source Project +/** + * Copyright (c) 2021, 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 + * 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, @@ -14,6 +14,6 @@ * limitations under the License. */ -package android.os; +package android.app.contextualsearch; -parcelable WorkDuration cpp_header "android/WorkDuration.h";
\ No newline at end of file +parcelable ContextualSearchState;
\ No newline at end of file diff --git a/core/java/android/app/contextualsearch/ContextualSearchState.java b/core/java/android/app/contextualsearch/ContextualSearchState.java new file mode 100644 index 000000000000..5c04bc8933c0 --- /dev/null +++ b/core/java/android/app/contextualsearch/ContextualSearchState.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.contextualsearch; + +import android.annotation.FlaggedApi; +import android.annotation.Nullable; +import android.annotation.SystemApi; +import android.app.assist.AssistContent; +import android.app.assist.AssistStructure; +import android.app.contextualsearch.flags.Flags; +import android.os.Bundle; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + +/** + * {@link ContextualSearchState} contains additional data a contextual search handler can request + * via {@link ContextualSearchManager#getContextualSearchState} method. + * + * @hide + */ +@FlaggedApi(Flags.FLAG_ENABLE_SERVICE) +@SystemApi +public final class ContextualSearchState implements Parcelable { + private final @NonNull Bundle mExtras; + private final @Nullable AssistStructure mStructure; + private final @Nullable AssistContent mContent; + + public ContextualSearchState(@Nullable AssistStructure structure, + @Nullable AssistContent content, @NonNull Bundle extras) { + mStructure = structure; + mContent = content; + mExtras = extras; + } + + private ContextualSearchState(Parcel source) { + this.mStructure = source.readTypedObject(AssistStructure.CREATOR); + this.mContent = source.readTypedObject(AssistContent.CREATOR); + Bundle extras = source.readBundle(getClass().getClassLoader()); + this.mExtras = extras != null ? extras : Bundle.EMPTY; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeTypedObject(this.mStructure, flags); + dest.writeTypedObject(this.mContent, flags); + dest.writeBundle(this.mExtras); + } + + /** Gets an instance of {@link AssistContent}. */ + @Nullable + public AssistContent getContent() { + return mContent; + } + + /** Gets an instance of {@link AssistStructure}. */ + @Nullable + public AssistStructure getStructure() { + return mStructure; + } + + /** + * Gets an instance of {@link Bundle} containing the extras added by the system server. + * The contents of this bundle vary by usecase. When Contextual is invoked via Launcher, this + * bundle is empty. + */ + @NonNull + public Bundle getExtras() { + return mExtras; + } + + @NonNull + public static final Creator<ContextualSearchState> CREATOR = new Creator<>() { + @Override + public ContextualSearchState createFromParcel(Parcel source) { + return new ContextualSearchState(source); + } + + @Override + public ContextualSearchState[] newArray(int size) { + return new ContextualSearchState[size]; + } + }; +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/SceneContainerFlagsExtension.kt b/core/java/android/app/contextualsearch/IContextualSearchCallback.aidl index 7dfd53e544c0..5fe5fd23c501 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/shared/SceneContainerFlagsExtension.kt +++ b/core/java/android/app/contextualsearch/IContextualSearchCallback.aidl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 The Android Open Source Project + * Copyright (C) 2021 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. @@ -14,14 +14,14 @@ * limitations under the License. */ -package com.android.systemui.statusbar.notification.stack.shared - -import com.android.systemui.scene.shared.flag.SceneContainerFlags - -private const val FLEXI_NOTIFS = true +package android.app.contextualsearch; +import android.os.ParcelableException; +import android.app.contextualsearch.ContextualSearchState; /** - * Returns whether flexiglass is displaying notifications, which is currently an optional piece of - * flexiglass + * @hide */ -fun SceneContainerFlags.flexiNotifsEnabled() = FLEXI_NOTIFS && isEnabled() +oneway interface IContextualSearchCallback { + void onResult(in ContextualSearchState state); + void onError(in ParcelableException error); +} diff --git a/core/java/android/app/contextualsearch/IContextualSearchManager.aidl b/core/java/android/app/contextualsearch/IContextualSearchManager.aidl new file mode 100644 index 000000000000..1735a7139e6f --- /dev/null +++ b/core/java/android/app/contextualsearch/IContextualSearchManager.aidl @@ -0,0 +1,11 @@ +package android.app.contextualsearch; + + +import android.app.contextualsearch.IContextualSearchCallback; +/** + * @hide + */ +oneway interface IContextualSearchManager { + void startContextualSearch(int entrypoint); + void getContextualSearchState(in IBinder token, in IContextualSearchCallback callback); +} diff --git a/core/java/android/app/contextualsearch/flags.aconfig b/core/java/android/app/contextualsearch/flags.aconfig new file mode 100644 index 000000000000..5ab07620bc81 --- /dev/null +++ b/core/java/android/app/contextualsearch/flags.aconfig @@ -0,0 +1,8 @@ +package: "android.app.contextualsearch.flags" + +flag { + name: "enable_service" + namespace: "machine_learning" + description: "Flag to enable the service" + bug: "309689654" +} diff --git a/core/java/android/companion/AssociationInfo.java b/core/java/android/companion/AssociationInfo.java index b4b96e2c69d6..843158c0e9fb 100644 --- a/core/java/android/companion/AssociationInfo.java +++ b/core/java/android/companion/AssociationInfo.java @@ -252,14 +252,6 @@ public final class AssociationInfo implements Parcelable { } /** - * @return true if the association is not revoked nor pending - * @hide - */ - public boolean isActive() { - return !mRevoked && !mPending; - } - - /** * @return the last time self reported disconnected for selfManaged only. * @hide */ diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 7f2ec53ea41a..1653bf538435 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -5396,6 +5396,19 @@ public abstract class Context { public static final String SMARTSPACE_SERVICE = "smartspace"; /** + * Used for getting the contextual search service. + * + * <p><b>NOTE: </b> this service is optional; callers of + * {@code Context.getSystemServiceName(CONTEXTUAL_SEARCH_SERVICE)} must check for {@code null}. + * + * @hide + * @see #getSystemService(String) + */ + @FlaggedApi(android.app.contextualsearch.flags.Flags.FLAG_ENABLE_SERVICE) + @SystemApi + public static final String CONTEXTUAL_SEARCH_SERVICE = "contextual_search"; + + /** * Used for getting the cloudsearch service. * * <p><b>NOTE: </b> this service is optional; callers of diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 443aadd505bd..8bc5e8c1ef34 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -6129,10 +6129,14 @@ public class Intent implements Parcelable, Cloneable { * the selection changes made by the user. * Applications may implement this method to change any of the following Chooser arguments by * returning new values in the result bundle: - * {@link #EXTRA_CHOOSER_TARGETS}, {@link #EXTRA_ALTERNATE_INTENTS}, + * {@link #EXTRA_CHOOSER_TARGETS}, + * {@link #EXTRA_ALTERNATE_INTENTS}, * {@link #EXTRA_CHOOSER_CUSTOM_ACTIONS}, * {@link #EXTRA_CHOOSER_MODIFY_SHARE_ACTION}, - * {@link #EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER}.</p> + * {@link #EXTRA_METADATA_TEXT}, + * {@link #EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER}, + * {@link #EXTRA_CHOOSER_RESULT_INTENT_SENDER}. + * </p> */ @FlaggedApi(android.service.chooser.Flags.FLAG_CHOOSER_PAYLOAD_TOGGLING) public static final String EXTRA_CHOOSER_ADDITIONAL_CONTENT_URI = diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index 535cebb1d1af..bd04634ac4f1 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -1280,26 +1280,6 @@ public class ActivityInfo extends ComponentInfo implements Parcelable { 264301586L; // buganizer id /** - * Excludes the packages the override is applied to from the camera compatibility treatment - * in free-form windowing mode for fixed-orientation apps. - * - * <p>In free-form windowing mode, the compatibility treatment emulates running on a portrait - * device by letterboxing the app window and changing the camera characteristics to what apps - * commonly expect in a portrait device: 90 and 270 degree sensor rotation for back and front - * cameras, respectively, and setting display rotation to 0. - * - * <p>Use this flag to disable the compatibility treatment for apps that do not respond well to - * the treatment. - * - * @hide - */ - @ChangeId - @Overridable - @Disabled - public static final long OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT = - 314961188L; - - /** * This change id forces the packages it is applied to sandbox {@link android.view.View} API to * an activity bounds for: * diff --git a/core/java/android/content/pm/multiuser.aconfig b/core/java/android/content/pm/multiuser.aconfig index 749e0f84db77..2d32aed5a1ad 100644 --- a/core/java/android/content/pm/multiuser.aconfig +++ b/core/java/android/content/pm/multiuser.aconfig @@ -193,3 +193,10 @@ flag { bug: "290333800" is_fixed_read_only: true } + +flag { + name: "delete_private_space_from_reset" + namespace: "profile_experiences" + description: "Add entrypoint in Settings Reset options for deleting private space when lock is forgotten" + bug: "329601751" +} diff --git a/core/java/android/database/sqlite/SQLiteConnection.java b/core/java/android/database/sqlite/SQLiteConnection.java index dfb77c046c9a..faa2c7018d6f 100644 --- a/core/java/android/database/sqlite/SQLiteConnection.java +++ b/core/java/android/database/sqlite/SQLiteConnection.java @@ -34,22 +34,17 @@ import android.util.Log; import android.util.LruCache; import android.util.Pair; import android.util.Printer; -import com.android.internal.util.RingBuffer; import dalvik.system.BlockGuard; import dalvik.system.CloseGuard; - import java.io.File; import java.io.IOException; import java.lang.ref.Reference; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; -import java.time.Instant; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; -import java.util.Locale; import java.util.Map; import java.util.function.BinaryOperator; import java.util.function.UnaryOperator; @@ -190,7 +185,7 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen SQLiteDatabaseConfiguration configuration, int connectionId, boolean primaryConnection) { mPool = pool; - mRecentOperations = new OperationLog(); + mRecentOperations = new OperationLog(mPool); mConfiguration = new SQLiteDatabaseConfiguration(configuration); mConnectionId = connectionId; mIsPrimaryConnection = primaryConnection; @@ -312,16 +307,6 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen } } - /** Record the start of a transaction for logging and debugging. */ - void recordBeginTransaction(String mode) { - mRecentOperations.beginTransaction(mode); - } - - /** Record the end of a transaction for logging and debugging. */ - void recordEndTransaction(boolean successful) { - mRecentOperations.endTransaction(successful); - } - private void setPageSize() { if (!mConfiguration.isInMemoryDb() && !mIsReadOnlyConnection) { final long newValue = SQLiteGlobal.getDefaultPageSize(); @@ -1352,7 +1337,6 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen } printer.println(" isPrimaryConnection: " + mIsPrimaryConnection); printer.println(" onlyAllowReadOnlyOperations: " + mOnlyAllowReadOnlyOperations); - printer.println(" totalLongOperations: " + mRecentOperations.getTotalLongOperations()); mRecentOperations.dump(printer); @@ -1611,39 +1595,51 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen } } - private final class OperationLog { + private static final class OperationLog { private static final int MAX_RECENT_OPERATIONS = 20; private static final int COOKIE_GENERATION_SHIFT = 8; private static final int COOKIE_INDEX_MASK = 0xff; - // Operations over 2s are long. Save the last ten. - private static final long LONG_OPERATION_THRESHOLD_MS = 2_000; - private static final int MAX_LONG_OPERATIONS = 10; - private final Operation[] mOperations = new Operation[MAX_RECENT_OPERATIONS]; - private int mIndex = -1; - private int mGeneration = 0; - private final Operation mTransaction = new Operation(); + private int mIndex; + private int mGeneration; + private final SQLiteConnectionPool mPool; private long mResultLong = Long.MIN_VALUE; private String mResultString; - private final RingBuffer<Operation> mLongOperations = - new RingBuffer<>(()->{return new Operation();}, - (n) ->{return new Operation[n];}, - MAX_LONG_OPERATIONS); - private int mTotalLongOperations = 0; + OperationLog(SQLiteConnectionPool pool) { + mPool = pool; + } public int beginOperation(String kind, String sql, Object[] bindArgs) { mResultLong = Long.MIN_VALUE; mResultString = null; synchronized (mOperations) { - Operation operation = newOperationLocked(); + final int index = (mIndex + 1) % MAX_RECENT_OPERATIONS; + Operation operation = mOperations[index]; + if (operation == null) { + operation = new Operation(); + mOperations[index] = operation; + } else { + operation.mFinished = false; + operation.mException = null; + if (operation.mBindArgs != null) { + operation.mBindArgs.clear(); + } + } + operation.mStartWallTime = System.currentTimeMillis(); + operation.mStartTime = SystemClock.uptimeMillis(); operation.mKind = kind; operation.mSql = sql; + operation.mPath = mPool.getPath(); + operation.mResultLong = Long.MIN_VALUE; + operation.mResultString = null; if (bindArgs != null) { if (operation.mBindArgs == null) { operation.mBindArgs = new ArrayList<Object>(); + } else { + operation.mBindArgs.clear(); } for (int i = 0; i < bindArgs.length; i++) { final Object arg = bindArgs[i]; @@ -1655,44 +1651,16 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen } } } + operation.mCookie = newOperationCookieLocked(index); if (Trace.isTagEnabled(Trace.TRACE_TAG_DATABASE)) { Trace.asyncTraceBegin(Trace.TRACE_TAG_DATABASE, operation.getTraceMethodName(), operation.mCookie); } + mIndex = index; return operation.mCookie; } } - public void beginTransaction(String kind) { - synchronized (mOperations) { - Operation operation = newOperationLocked(); - operation.mKind = kind; - mTransaction.copyFrom(operation); - - if (Trace.isTagEnabled(Trace.TRACE_TAG_DATABASE)) { - Trace.asyncTraceBegin(Trace.TRACE_TAG_DATABASE, operation.getTraceMethodName(), - operation.mCookie); - } - } - } - - /** - * Fetch a new operation from the ring buffer. The operation is properly initialized. - * This advances mIndex to point to the next element. - */ - private Operation newOperationLocked() { - final int index = (mIndex + 1) % MAX_RECENT_OPERATIONS; - Operation operation = mOperations[index]; - if (operation == null) { - mOperations[index] = new Operation(); - operation = mOperations[index]; - } - operation.start(); - operation.mCookie = newOperationCookieLocked(index); - mIndex = index; - return operation; - } - public void failOperation(int cookie, Exception ex) { synchronized (mOperations) { final Operation operation = getOperationLocked(cookie); @@ -1716,20 +1684,6 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen } } - public boolean endTransaction(boolean success) { - synchronized (mOperations) { - mTransaction.mResultLong = success ? 1 : 0; - final long execTime = finishOperationLocked(mTransaction); - final Operation operation = getOperationLocked(mTransaction.mCookie); - if (operation != null) { - operation.copyFrom(mTransaction); - } - mTransaction.setEmpty(); - return NoPreloadHolder.DEBUG_LOG_SLOW_QUERIES - && SQLiteDebug.shouldLogSlowQuery(execTime); - } - } - public void logOperation(int cookie, String detail) { synchronized (mOperations) { logOperationLocked(cookie, detail); @@ -1751,7 +1705,9 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen Trace.asyncTraceEnd(Trace.TRACE_TAG_DATABASE, operation.getTraceMethodName(), operation.mCookie); } - final long execTime = finishOperationLocked(operation); + operation.mEndTime = SystemClock.uptimeMillis(); + operation.mFinished = true; + final long execTime = operation.mEndTime - operation.mStartTime; mPool.onStatementExecuted(execTime); return NoPreloadHolder.DEBUG_LOG_SLOW_QUERIES && SQLiteDebug.shouldLogSlowQuery( execTime); @@ -1776,22 +1732,10 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen return generation << COOKIE_GENERATION_SHIFT | index; } - /** Close out the operation and return the elapsed time. */ - private long finishOperationLocked(Operation operation) { - operation.mEndTime = SystemClock.uptimeMillis(); - operation.mFinished = true; - final long elapsed = operation.mEndTime - operation.mStartTime; - if (elapsed > LONG_OPERATION_THRESHOLD_MS) { - mLongOperations.getNextSlot().copyFrom(operation); - mTotalLongOperations++; - } - return elapsed; - } - private Operation getOperationLocked(int cookie) { final int index = cookie & COOKIE_INDEX_MASK; final Operation operation = mOperations[index]; - return (operation != null && operation.mCookie == cookie) ? operation : null; + return operation.mCookie == cookie ? operation : null; } public String describeCurrentOperation() { @@ -1806,87 +1750,48 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen } } - /** - * Dump an Operation if it is not in the recent operations list. Return 1 if the - * operation was dumped and 0 if not. - */ - private int dumpIfNotRecentLocked(Printer pw, Operation op, int counter) { - if (op == null || op.isEmpty() || getOperationLocked(op.mCookie) != null) { - return 0; - } - pw.println(op.describe(counter)); - return 1; - } - - private void dumpRecentLocked(Printer printer) { + public void dump(Printer printer) { synchronized (mOperations) { printer.println(" Most recently executed operations:"); int index = mIndex; - if (index == 0) { - printer.println(" <none>"); - return; - } - - // Operations are dumped in order of most recent first. - int counter = 0; - int n = 0; Operation operation = mOperations[index]; - do { - printer.println(operation.describe(counter)); - - if (index > 0) { - index -= 1; - } else { - index = MAX_RECENT_OPERATIONS - 1; - } - n++; - counter++; - operation = mOperations[index]; - } while (operation != null && n < MAX_RECENT_OPERATIONS); - counter += dumpIfNotRecentLocked(printer, mTransaction, counter); - } - } - - private void dumpLongLocked(Printer printer) { - printer.println(" Operations exceeding " + LONG_OPERATION_THRESHOLD_MS + "ms:"); - if (mLongOperations.isEmpty()) { - printer.println(" <none>"); - return; - } - Operation[] longOps = mLongOperations.toArray(); - for (int i = 0; i < longOps.length; i++) { - if (longOps[i] != null) { - printer.println(longOps[i].describe(i)); + if (operation != null) { + // Note: SimpleDateFormat is not thread-safe, cannot be compile-time created, + // and is relatively expensive to create during preloading. This method is only + // used when dumping a connection, which is a rare (mainly error) case. + SimpleDateFormat opDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + int n = 0; + do { + StringBuilder msg = new StringBuilder(); + msg.append(" ").append(n).append(": ["); + String formattedStartTime = opDF.format(new Date(operation.mStartWallTime)); + msg.append(formattedStartTime); + msg.append("] "); + operation.describe(msg, false); // Never dump bingargs in a bugreport + printer.println(msg.toString()); + + if (index > 0) { + index -= 1; + } else { + index = MAX_RECENT_OPERATIONS - 1; + } + n += 1; + operation = mOperations[index]; + } while (operation != null && n < MAX_RECENT_OPERATIONS); + } else { + printer.println(" <none>"); } } } - - public long getTotalLongOperations() { - return mTotalLongOperations; - } - - public void dump(Printer printer) { - synchronized (mOperations) { - dumpRecentLocked(printer); - dumpLongLocked(printer); - } - } } - private final class Operation { + private static final class Operation { // Trim all SQL statements to 256 characters inside the trace marker. // This limit gives plenty of context while leaving space for other // entries in the trace buffer (and ensures atrace doesn't truncate the // marker for us, potentially losing metadata in the process). private static final int MAX_TRACE_METHOD_NAME_LEN = 256; - // The reserved start time that indicates the Operation is empty. - private static final long EMPTY_OPERATION = -1; - - // The formatter for the timestamp. - private static final DateTimeFormatter sDateTime = - DateTimeFormatter.ofPattern("MM-dd HH:mm:ss.SSS", Locale.US); - public long mStartWallTime; // in System.currentTimeMillis() public long mStartTime; // in SystemClock.uptimeMillis(); public long mEndTime; // in SystemClock.uptimeMillis(); @@ -1896,58 +1801,16 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen public boolean mFinished; public Exception mException; public int mCookie; + public String mPath; public long mResultLong; // MIN_VALUE means "value not set". public String mResultString; - /** Reset the object to begin a new operation. */ - void start() { - mStartWallTime = System.currentTimeMillis(); - mStartTime = SystemClock.uptimeMillis(); - mEndTime = Long.MIN_VALUE; - mKind = null; - mSql = null; - if (mBindArgs != null) mBindArgs.clear(); - mFinished = false; - mException = null; - mCookie = -1; - mResultLong = Long.MIN_VALUE; - mResultString = null; - } - - /** - * Initialize from the source object. This is meant to clone the object for use in a - * transaction operation. To that end, the local bind args are set to null. - */ - void copyFrom(Operation r) { - mStartWallTime = r.mStartWallTime; - mStartTime = r.mStartTime; - mEndTime = r.mEndTime; - mKind = r.mKind; - mSql = r.mSql; - mBindArgs = null; - mFinished = r.mFinished; - mException = r.mException; - mCookie = r.mCookie; - mResultLong = r.mResultLong; - mResultString = r.mResultString; - } - - /** Mark the operation empty. */ - void setEmpty() { - mStartWallTime = EMPTY_OPERATION; - } - - /** Return true if the operation is empty. */ - boolean isEmpty() { - return mStartWallTime == EMPTY_OPERATION; - } - public void describe(StringBuilder msg, boolean allowDetailedLog) { msg.append(mKind); if (mFinished) { msg.append(" took ").append(mEndTime - mStartTime).append("ms"); } else { - msg.append(" started ").append(SystemClock.uptimeMillis() - mStartTime) + msg.append(" started ").append(System.currentTimeMillis() - mStartWallTime) .append("ms ago"); } msg.append(" - ").append(getStatus()); @@ -1976,7 +1839,7 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen } msg.append("]"); } - msg.append(", path=").append(mPool.getPath()); + msg.append(", path=").append(mPath); if (mException != null) { msg.append(", exception=\"").append(mException.getMessage()).append("\""); } @@ -1988,21 +1851,6 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen } } - /** - * Convert a wall-clock time in milliseconds to logcat format. - */ - private String timeString(long millis) { - return sDateTime.withZone(ZoneId.systemDefault()).format(Instant.ofEpochMilli(millis)); - } - - public String describe(int n) { - final StringBuilder msg = new StringBuilder(); - final String start = timeString(mStartWallTime); - msg.append(" ").append(n).append(": [").append(start).append("] "); - describe(msg, false); // Never dump bingargs in a bugreport - return msg.toString(); - } - private String getStatus() { if (!mFinished) { return "running"; @@ -2016,6 +1864,7 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen return methodName.substring(0, MAX_TRACE_METHOD_NAME_LEN); return methodName; } + } /** diff --git a/core/java/android/database/sqlite/SQLiteConnectionPool.java b/core/java/android/database/sqlite/SQLiteConnectionPool.java index 15d7d6675c8e..ad335b62f05e 100644 --- a/core/java/android/database/sqlite/SQLiteConnectionPool.java +++ b/core/java/android/database/sqlite/SQLiteConnectionPool.java @@ -1175,7 +1175,7 @@ public final class SQLiteConnectionPool implements Closeable { + ", isLegacyCompatibilityWalEnabled=" + isCompatibilityWalEnabled + ", journalMode=" + TextUtils.emptyIfNull(mConfiguration.resolveJournalMode()) + ", syncMode=" + TextUtils.emptyIfNull(mConfiguration.resolveSyncMode())); - printer.println(" IsReadOnlyDatabase: " + mConfiguration.isReadOnlyDatabase()); + printer.println(" IsReadOnlyDatabase=" + mConfiguration.isReadOnlyDatabase()); if (isCompatibilityWalEnabled) { printer.println(" Compatibility WAL enabled: wal_syncmode=" diff --git a/core/java/android/database/sqlite/SQLiteSession.java b/core/java/android/database/sqlite/SQLiteSession.java index 3b14d9d71b3e..7d9f02d6a96d 100644 --- a/core/java/android/database/sqlite/SQLiteSession.java +++ b/core/java/android/database/sqlite/SQLiteSession.java @@ -312,15 +312,6 @@ public final class SQLiteSession { cancellationSignal); } - private String modeString(int transactionMode) { - switch (transactionMode) { - case TRANSACTION_MODE_IMMEDIATE: return "TRANSACTION-IMMEDIATE"; - case TRANSACTION_MODE_EXCLUSIVE: return "TRANSACTION-EXCLUSIVE"; - case TRANSACTION_MODE_DEFERRED: return "TRANSACTION-DEFERRED"; - default: return "TRANSACTION"; - } - } - private void beginTransactionUnchecked(int transactionMode, SQLiteTransactionListener transactionListener, int connectionFlags, CancellationSignal cancellationSignal) { @@ -330,7 +321,6 @@ public final class SQLiteSession { if (mTransactionStack == null) { acquireConnection(null, connectionFlags, cancellationSignal); // might throw - mConnection.recordBeginTransaction(modeString(transactionMode)); } try { // Set up the transaction such that we can back out safely @@ -475,7 +465,6 @@ public final class SQLiteSession { mConnection.execute("ROLLBACK;", null, cancellationSignal); // might throw } } finally { - mConnection.recordEndTransaction(successful); releaseConnection(); // might throw } } diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java index be9f0a0c8d13..a8d54ed970b7 100644 --- a/core/java/android/hardware/biometrics/BiometricPrompt.java +++ b/core/java/android/hardware/biometrics/BiometricPrompt.java @@ -16,7 +16,7 @@ package android.hardware.biometrics; -import static android.Manifest.permission.SET_BIOMETRIC_DIALOG_LOGO; +import static android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED; import static android.Manifest.permission.TEST_BIOMETRIC; import static android.Manifest.permission.USE_BIOMETRIC; import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL; @@ -135,7 +135,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan @Retention(RetentionPolicy.SOURCE) public @interface DismissedReason {} - private static class ButtonInfo { + static class ButtonInfo { Executor executor; DialogInterface.OnClickListener listener; ButtonInfo(Executor ex, DialogInterface.OnClickListener l) { @@ -150,6 +150,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan public static class Builder { private PromptInfo mPromptInfo; private ButtonInfo mNegativeButtonInfo; + private ButtonInfo mContentViewMoreOptionsButtonInfo; private Context mContext; private IAuthService mService; @@ -175,7 +176,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @return This builder. */ @FlaggedApi(FLAG_CUSTOM_BIOMETRIC_PROMPT) - @RequiresPermission(SET_BIOMETRIC_DIALOG_LOGO) + @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED) @NonNull public BiometricPrompt.Builder setLogoRes(@DrawableRes int logoRes) { mPromptInfo.setLogoRes(logoRes); @@ -194,7 +195,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @return This builder. */ @FlaggedApi(FLAG_CUSTOM_BIOMETRIC_PROMPT) - @RequiresPermission(SET_BIOMETRIC_DIALOG_LOGO) + @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED) @NonNull public BiometricPrompt.Builder setLogoBitmap(@NonNull Bitmap logoBitmap) { mPromptInfo.setLogoBitmap(logoBitmap); @@ -213,7 +214,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @return This builder. */ @FlaggedApi(FLAG_CUSTOM_BIOMETRIC_PROMPT) - @RequiresPermission(SET_BIOMETRIC_DIALOG_LOGO) + @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED) @NonNull public BiometricPrompt.Builder setLogoDescription(@NonNull String logoDescription) { mPromptInfo.setLogoDescription(logoDescription); @@ -301,6 +302,12 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan @NonNull public BiometricPrompt.Builder setContentView(@NonNull PromptContentView view) { mPromptInfo.setContentView(view); + + if (mPromptInfo.isContentViewMoreOptionsButtonUsed()) { + mContentViewMoreOptionsButtonInfo = + ((PromptContentViewWithMoreOptionsButton) view).getButtonInfo(); + } + return this; } @@ -619,7 +626,8 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan } mService = (mService == null) ? IAuthService.Stub.asInterface( ServiceManager.getService(Context.AUTH_SERVICE)) : mService; - return new BiometricPrompt(mContext, mPromptInfo, mNegativeButtonInfo, mService); + return new BiometricPrompt(mContext, mPromptInfo, mNegativeButtonInfo, + mContentViewMoreOptionsButtonInfo, mService); } } @@ -646,6 +654,9 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan private final IAuthService mService; private final PromptInfo mPromptInfo; private final ButtonInfo mNegativeButtonInfo; + // TODO(b/328843028): add callback onContentViewMoreOptionsButtonClicked() in + // IBiometricServiceReceiver. + private final ButtonInfo mContentViewMoreOptionsButtonInfo; private CryptoObject mCryptoObject; private Executor mExecutor; @@ -751,10 +762,11 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan private boolean mIsPromptShowing; private BiometricPrompt(Context context, PromptInfo promptInfo, ButtonInfo negativeButtonInfo, - IAuthService service) { + ButtonInfo contentViewMoreOptionsButtonInfo, IAuthService service) { mContext = context; mPromptInfo = promptInfo; mNegativeButtonInfo = negativeButtonInfo; + mContentViewMoreOptionsButtonInfo = contentViewMoreOptionsButtonInfo; mService = service; mIsPromptShowing = false; } @@ -766,7 +778,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @return The drawable resource of the logo, or -1 if the prompt has no logo resource set. */ @FlaggedApi(FLAG_CUSTOM_BIOMETRIC_PROMPT) - @RequiresPermission(SET_BIOMETRIC_DIALOG_LOGO) + @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED) @DrawableRes public int getLogoRes() { return mPromptInfo.getLogoRes(); @@ -779,7 +791,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @return The logo bitmap of the prompt, or null if the prompt has no logo bitmap set. */ @FlaggedApi(FLAG_CUSTOM_BIOMETRIC_PROMPT) - @RequiresPermission(SET_BIOMETRIC_DIALOG_LOGO) + @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED) @Nullable public Bitmap getLogoBitmap() { return mPromptInfo.getLogoBitmap(); @@ -794,7 +806,7 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * set. */ @FlaggedApi(FLAG_CUSTOM_BIOMETRIC_PROMPT) - @RequiresPermission(SET_BIOMETRIC_DIALOG_LOGO) + @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED) @Nullable public String getLogoDescription() { return mPromptInfo.getLogoDescription(); @@ -932,14 +944,29 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan * @see Builder#setAllowedAuthenticators(int) */ public static final class CryptoObject extends android.hardware.biometrics.CryptoObject { + /** + * Create from a {@link Signature} object. + * + * @param signature a {@link Signature} object. + */ public CryptoObject(@NonNull Signature signature) { super(signature); } + /** + * Create from a {@link Cipher} object. + * + * @param cipher a {@link Cipher} object. + */ public CryptoObject(@NonNull Cipher cipher) { super(cipher); } + /** + * Create from a {@link Mac} object. + * + * @param mac a {@link Mac} object. + */ public CryptoObject(@NonNull Mac mac) { super(mac); } @@ -955,16 +982,37 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan super(credential); } + /** + * Create from a {@link PresentationSession} object. + * + * @param session a {@link PresentationSession} object. + */ public CryptoObject(@NonNull PresentationSession session) { super(session); } + /** + * Create from a {@link KeyAgreement} object. + * + * @param keyAgreement a {@link KeyAgreement} object. + */ @FlaggedApi(FLAG_ADD_KEY_AGREEMENT_CRYPTO_OBJECT) public CryptoObject(@NonNull KeyAgreement keyAgreement) { super(keyAgreement); } /** + * Create from an operation handle. + * @see CryptoObject#getOperationHandle() + * + * @param operationHandle the operation handle associated with this object. + */ + @FlaggedApi(FLAG_GET_OP_ID_CRYPTO_OBJECT) + public CryptoObject(long operationHandle) { + super(operationHandle); + } + + /** * Get {@link Signature} object. * @return {@link Signature} object or null if this doesn't contain one. */ @@ -1016,7 +1064,20 @@ public class BiometricPrompt implements BiometricAuthenticator, BiometricConstan } /** - * Get the operation handle associated with this object or 0 if none. + * Returns the {@code operationHandle} associated with this object or 0 if none. + * The {@code operationHandle} is the underlying identifier associated with + * the {@code CryptoObject}. + * + * <p> The {@code operationHandle} can be used to reconstruct a {@code CryptoObject} + * instance. This is useful for any cross-process communication as the {@code CryptoObject} + * class is not {@link android.os.Parcelable}. Hence, if the {@code CryptoObject} is + * constructed in one process, and needs to be propagated to another process, + * before calling the + * {@link BiometricPrompt#authenticate(CryptoObject, CancellationSignal, Executor, + * AuthenticationCallback)} API in the second process, the recommendation is to retrieve the + * {@code operationHandle} using this API, and then reconstruct the + * {@code CryptoObject}using the constructor that takes in an {@code operationHandle}, and + * pass that in to the {@code authenticate} API mentioned above. */ @FlaggedApi(FLAG_GET_OP_ID_CRYPTO_OBJECT) public long getOperationHandle() { diff --git a/core/java/android/hardware/biometrics/CryptoObject.java b/core/java/android/hardware/biometrics/CryptoObject.java index 8d3ea3f914ec..81b4c21f4b71 100644 --- a/core/java/android/hardware/biometrics/CryptoObject.java +++ b/core/java/android/hardware/biometrics/CryptoObject.java @@ -97,6 +97,10 @@ public class CryptoObject { mCrypto = keyAgreement; } + public CryptoObject(long operationHandle) { + mCrypto = operationHandle; + } + /** * Get {@link Signature} object. * @return {@link Signature} object or null if this doesn't contain one. @@ -157,6 +161,8 @@ public class CryptoObject { public long getOpId() { if (mCrypto == null) { return 0; + } else if (mCrypto instanceof Long) { + return (long) mCrypto; } else if (mCrypto instanceof IdentityCredential) { return ((IdentityCredential) mCrypto).getCredstoreOperationHandle(); } else if (mCrypto instanceof PresentationSession) { diff --git a/core/java/android/hardware/biometrics/PromptContentViewParcelable.java b/core/java/android/hardware/biometrics/PromptContentViewParcelable.java index 43b965bb696d..b5982d4f7251 100644 --- a/core/java/android/hardware/biometrics/PromptContentViewParcelable.java +++ b/core/java/android/hardware/biometrics/PromptContentViewParcelable.java @@ -26,5 +26,5 @@ import android.os.Parcelable; */ @FlaggedApi(FLAG_CUSTOM_BIOMETRIC_PROMPT) sealed interface PromptContentViewParcelable extends PromptContentView, Parcelable - permits PromptVerticalListContentView { + permits PromptVerticalListContentView, PromptContentViewWithMoreOptionsButton { } diff --git a/core/java/android/hardware/biometrics/PromptContentViewWithMoreOptionsButton.java b/core/java/android/hardware/biometrics/PromptContentViewWithMoreOptionsButton.java new file mode 100644 index 000000000000..9ebfa8f4301d --- /dev/null +++ b/core/java/android/hardware/biometrics/PromptContentViewWithMoreOptionsButton.java @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.biometrics; + +import static android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED; +import static android.hardware.biometrics.Flags.FLAG_CUSTOM_BIOMETRIC_PROMPT; + +import android.annotation.CallbackExecutor; +import android.annotation.FlaggedApi; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.RequiresPermission; +import android.content.DialogInterface; +import android.hardware.biometrics.BiometricPrompt.ButtonInfo; +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.concurrent.Executor; + +/** + * Contains the information of the template of content view with a more options button for Biometric + * Prompt. + * This button should be used to provide more options for sign in or other purposes, such as when a + * user needs to select between multiple app-specific accounts or profiles that are available for + * sign in. This is not common and apps should avoid using it if there is only one choice available + * or if the user has already selected the appropriate account to use before invoking + * BiometricPrompt because it will create additional steps that the user must navigate through. + * Clicking the more options button will dismiss the prompt, provide the app an opportunity to ask + * the user for the correct account, &finally allow the app to decide how to proceed once selected. + * <p> + * Here's how you'd set a <code>PromptContentViewWithMoreOptionsButton</code> on a Biometric Prompt: + * <pre class="prettyprint"> + * BiometricPrompt biometricPrompt = new BiometricPrompt.Builder(...) + * .setTitle(...) + * .setSubTitle(...) + * .setContentView(new PromptContentViewWithMoreOptionsButton.Builder() + * .setDescription("test description") + * .setMoreOptionsButtonListener(executor, listener) + * .build()) + * .build(); + * </pre> + */ +@FlaggedApi(FLAG_CUSTOM_BIOMETRIC_PROMPT) +public final class PromptContentViewWithMoreOptionsButton implements PromptContentViewParcelable { + + private final String mDescription; + private DialogInterface.OnClickListener mListener; + private ButtonInfo mButtonInfo; + + private PromptContentViewWithMoreOptionsButton( + @NonNull String description, @NonNull @CallbackExecutor Executor executor, + @NonNull DialogInterface.OnClickListener listener) { + mDescription = description; + mListener = listener; + mButtonInfo = new ButtonInfo(executor, listener); + } + + private PromptContentViewWithMoreOptionsButton(Parcel in) { + mDescription = in.readString(); + } + + /** + * Gets the description for the content view, as set by + * {@link PromptContentViewWithMoreOptionsButton.Builder#setDescription(String)}. + * + * @return The description for the content view, or null if the content view has no description. + */ + @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED) + @Nullable + public String getDescription() { + return mDescription; + } + + /** + * Gets the click listener for the more options button on the content view, as set by + * {@link PromptContentViewWithMoreOptionsButton.Builder#setMoreOptionsButtonListener(Executor, + * DialogInterface.OnClickListener)}. + * + * @return The click listener for the more options button on the content view. + */ + @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED) + @NonNull + public DialogInterface.OnClickListener getMoreOptionsButtonListener() { + return mListener; + } + + ButtonInfo getButtonInfo() { + return mButtonInfo; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeString(mDescription); + } + + /** + * @see Parcelable.Creator + */ + @NonNull + public static final Creator<PromptContentViewWithMoreOptionsButton> CREATOR = new Creator<>() { + @Override + public PromptContentViewWithMoreOptionsButton createFromParcel(Parcel in) { + return new PromptContentViewWithMoreOptionsButton(in); + } + + @Override + public PromptContentViewWithMoreOptionsButton[] newArray(int size) { + return new PromptContentViewWithMoreOptionsButton[size]; + } + }; + + public static final class Builder { + private String mDescription; + private Executor mExecutor; + private DialogInterface.OnClickListener mListener; + + /** + * Optional: Sets a description that will be shown on the content view. Note that there are + * limits on the number of characters allowed for description. + * + * @param description The description to display. + * @return This builder. + */ + @NonNull + @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED) + public Builder setDescription(@NonNull String description) { + mDescription = description; + return this; + } + + /** + * Required: Sets the executor and click listener for the more options button on the + * prompt content. + * This button should be used to provide more options for sign in or other purposes, such + * as when a user needs to select between multiple app-specific accounts or profiles that + * are available for sign in. This is not common and apps should avoid using it if there + * is only one choice available or if the user has already selected the appropriate + * account to use before invoking BiometricPrompt because it will create additional steps + * that the user must navigate through. Clicking the more options button will dismiss the + * prompt, provide the app an opportunity to ask the user for the correct account, &finally + * allow the app to decide how to proceed once selected. + * + * @param executor Executor that will be used to run the on click callback. + * @param listener Listener containing a callback to be run when the button is pressed. + * @return This builder. + */ + @NonNull + @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED) + public Builder setMoreOptionsButtonListener(@NonNull @CallbackExecutor Executor executor, + @NonNull DialogInterface.OnClickListener listener) { + if (executor == null) { + throw new IllegalArgumentException("Executor must not be null"); + } + if (listener == null) { + throw new IllegalArgumentException("Listener must not be null"); + } + mExecutor = executor; + mListener = listener; + return this; + } + + + /** + * Creates a {@link PromptContentViewWithMoreOptionsButton}. + * + * @return An instance of {@link PromptContentViewWithMoreOptionsButton}. + */ + @NonNull + @RequiresPermission(SET_BIOMETRIC_DIALOG_ADVANCED) + public PromptContentViewWithMoreOptionsButton build() { + if (mListener == null) { + throw new IllegalArgumentException( + "The listener of more options button on prompt content must be set if " + + "PromptContentViewWithMoreOptionsButton is used."); + } + return new PromptContentViewWithMoreOptionsButton(mDescription, mExecutor, mListener); + } + } +} diff --git a/core/java/android/hardware/biometrics/PromptInfo.java b/core/java/android/hardware/biometrics/PromptInfo.java index 8bb958553673..814321319e2f 100644 --- a/core/java/android/hardware/biometrics/PromptInfo.java +++ b/core/java/android/hardware/biometrics/PromptInfo.java @@ -172,7 +172,7 @@ public class PromptInfo implements Parcelable { } /** - * Returns whether SET_BIOMETRIC_DIALOG_LOGO is contained. + * Returns whether SET_BIOMETRIC_DIALOG_ADVANCED is contained. */ public boolean containsSetLogoApiConfigurations() { if (mLogoRes != -1) { @@ -191,6 +191,15 @@ public class PromptInfo implements Parcelable { public boolean shouldUseParentProfileForDeviceCredential() { return mUseParentProfileForDeviceCredential; } + + /** + * Returns if the PromptContentViewWithMoreOptionsButton is set. + */ + public boolean isContentViewMoreOptionsButtonUsed() { + return Flags.customBiometricPrompt() && mContentView != null + && mContentView instanceof PromptContentViewWithMoreOptionsButton; + } + // LINT.ThenChange(frameworks/base/core/java/android/hardware/biometrics/BiometricPrompt.java) // Setters diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java index 991bade09a25..ec9b013c34cc 100644 --- a/core/java/android/hardware/camera2/CameraDevice.java +++ b/core/java/android/hardware/camera2/CameraDevice.java @@ -585,6 +585,11 @@ public abstract class CameraDevice implements AutoCloseable { * <p>Configuring a session with an empty or null list will close the current session, if * any. This can be used to release the current session's target surfaces for another use.</p> * + * <p>This function throws an {@code IllegalArgumentException} if called with a + * SessionConfiguration lacking state callbacks or valid output surfaces. The only exceptions + * are deferred SurfaceView or SurfaceTexture outputs. See {@link + * OutputConfiguration#OutputConfiguration(Size, Class)} for details.</p> + * * <h3>Regular capture</h3> * * <p>While any of the sizes from {@link StreamConfigurationMap#getOutputSizes} can be used when @@ -1675,19 +1680,32 @@ public abstract class CameraDevice implements AutoCloseable { * * <p><b>IMPORTANT:</b></p> * <ul> - * <li>If a feature support can be queried via + * <li>If feature support can be queried via * {@link CameraCharacteristics#SCALER_MANDATORY_STREAM_COMBINATIONS} or * {@link CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP}, applications should - * directly use it rather than calling this function as: (1) using - * {@code CameraCharacteristics} is more efficient, and (2) calling this function with on - * non-supported devices will throw a {@link UnsupportedOperationException}. + * directly use that route rather than calling this function as: (1) using + * {@code CameraCharacteristics} is more efficient, and (2) calling this function with + * certain non-supported features will throw a {@link IllegalArgumentException}.</li> * - * <li>To minimize latency of {@link SessionConfiguration} creation, applications can - * use deferred surfaces for SurfaceView and SurfaceTexture to avoid waiting for UI - * creation before setting up the camera. For {@link android.media.MediaRecorder} and - * {@link android.media.MediaCodec} uses, applications can use {@code ImageReader} with - * {@link android.hardware.HardwareBuffer#USAGE_VIDEO_ENCODE}. The lightweight nature of - * {@code ImageReader} helps minimize the latency cost. + * <li>To minimize {@link SessionConfiguration} creation latency due to its dependency on + * output surfaces, the application can call this method before acquiring valid + * {@link android.view.SurfaceView}, {@link android.graphics.SurfaceTexture}, + * {@link android.media.MediaRecorder}, {@link android.media.MediaCodec}, or {@link + * android.media.ImageReader} surfaces. For {@link android.view.SurfaceView}, + * {@link android.graphics.SurfaceTexture}, {@link android.media.MediaRecorder}, and + * {@link android.media.MediaCodec}, the application can call + * {@link OutputConfiguration#OutputConfiguration(Size, Class)}. For {@link + * android.media.ImageReader}, the application can call {@link + * OutputConfiguration#OutputConfiguration(int, Size)}, {@link + * OutputConfiguration#OutputConfiguration(int, int, Size)}, {@link + * OutputConfiguration#OutputConfiguration(int, Size, long)}, or {@link + * OutputConfiguration#OutputConfiguration(int, int, Size, long)}. The {@link + * SessionConfiguration} can then be created using the OutputConfiguration objects and + * be used to query whether it's supported by the camera device. To create the + * CameraCaptureSession, the application still needs to make sure all output surfaces + * are added via {@link OutputConfiguration#addSurfaces} with the exception of deferred + * surfaces for {@link android.view.SurfaceView} and + * {@link android.graphics.SurfaceTexture}.</li> * </ul> * * @return {@code true} if the given session configuration is supported by the camera @@ -1706,8 +1724,8 @@ public abstract class CameraDevice implements AutoCloseable { @NonNull SessionConfiguration config) throws CameraAccessException; /** - * <p>Get camera characteristics for a particular session configuration for this camera - * device</p> + * Get camera characteristics for a particular session configuration for this camera + * device. * * <p>The camera characteristics returned by this method are different from those returned * from {@link CameraManager#getCameraCharacteristics}. The characteristics returned here @@ -1718,6 +1736,24 @@ public abstract class CameraDevice implements AutoCloseable { * <p>Other than that, the characteristics returned here can be used in the same way as * those returned from {@link CameraManager#getCameraCharacteristics}.</p> * + * <p>To optimize latency, the application can call this method before acquiring valid + * {@link android.view.SurfaceView}, {@link android.graphics.SurfaceTexture}, + * {@link android.media.MediaRecorder}, {@link android.media.MediaCodec}, or {@link + * android.media.ImageReader} surfaces. For {@link android.view.SurfaceView}, + * {@link android.graphics.SurfaceTexture}, {@link android.media.MediaRecorder}, and + * {@link android.media.MediaCodec}, the application can call + * {@link OutputConfiguration#OutputConfiguration(Size, Class)}. For {@link + * android.media.ImageReader}, the application can call {@link + * OutputConfiguration#OutputConfiguration(int, Size)}, {@link + * OutputConfiguration#OutputConfiguration(int, int, Size)}, {@link + * OutputConfiguration#OutputConfiguration(int, Size, long)}, or {@link + * OutputConfiguration#OutputConfiguration(int, int, Size, long)}. The {@link + * SessionConfiguration} can then be created using the OutputConfiguration objects and + * be used for this function. To create the CameraCaptureSession, the application still + * needs to make sure all output surfaces are added via {@link + * OutputConfiguration#addSurfaces} with the exception of deferred surfaces for {@link + * android.view.SurfaceView} and {@link android.graphics.SurfaceTexture}.</p> + * * @param sessionConfig The session configuration for which characteristics are fetched. * @return CameraCharacteristics specific to a given session configuration. * diff --git a/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java b/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java index 6962811ab860..eb644e8cfa01 100644 --- a/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java @@ -229,9 +229,10 @@ public final class CameraExtensionCharacteristics { StreamConfigurationMap streamMap) { ArrayList<Size> ret = getSupportedSizes(sizesList, format); - if (format == ImageFormat.JPEG || format == ImageFormat.YUV_420_888) { + if (format == ImageFormat.JPEG || format == ImageFormat.YUV_420_888 || + format == ImageFormat.PRIVATE) { // Per API contract it is assumed that the extension is able to support all - // camera advertised sizes for JPEG and YUV_420_888 in case it doesn't return + // camera advertised sizes for JPEG, YUV_420_888 and PRIVATE in case it doesn't return // a valid non-empty size list. Size[] supportedSizes = streamMap.getOutputSizes(format); if ((ret.isEmpty()) && (supportedSizes != null)) { diff --git a/core/java/android/hardware/camera2/MultiResolutionImageReader.java b/core/java/android/hardware/camera2/MultiResolutionImageReader.java index 8a18a0d2d367..116928b4283a 100644 --- a/core/java/android/hardware/camera2/MultiResolutionImageReader.java +++ b/core/java/android/hardware/camera2/MultiResolutionImageReader.java @@ -16,6 +16,8 @@ package android.hardware.camera2; +import static com.android.internal.util.Preconditions.checkNotNull; + import android.annotation.CallbackExecutor; import android.annotation.FlaggedApi; import android.annotation.IntRange; @@ -26,20 +28,15 @@ import android.graphics.ImageFormat; import android.graphics.ImageFormat.Format; import android.hardware.HardwareBuffer; import android.hardware.HardwareBuffer.Usage; +import android.hardware.camera2.params.MultiResolutionStreamInfo; import android.media.Image; import android.media.ImageReader; -import android.hardware.camera2.params.MultiResolutionStreamInfo; -import android.os.Looper; -import android.os.Message; -import android.util.Log; +import android.util.Size; import android.view.Surface; import com.android.internal.camera.flags.Flags; -import java.nio.NioUtils; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; import java.util.concurrent.Executor; /** @@ -351,6 +348,52 @@ public class MultiResolutionImageReader implements AutoCloseable { } /** + * Get the internal ImageReader surface based on configured size and physical camera Id. + * + * <p>The {@code configuredSize} and {@code physicalCameraId} parameters must match one of the + * MultiResolutionStreamInfo used to create this {@link MultiResolutionImageReader}.</p> + * + * <p>The Surface returned from this function isn't meant to be used directly as part of a + * {@link CaptureRequest}. It should instead be used for creating an OutputConfiguration + * before session creation. See {@link OutputConfiguration#setSurfacesForMultiResolutionOutput} + * for details. For {@link CaptureRequest}, use {@link #getSurface()} instead.</p> + * + * <p>Please note that holding on to the Surface objects returned by this method is not enough + * to keep their parent MultiResolutionImageReaders from being reclaimed. In that sense, a + * Surface acts like a {@link java.lang.ref.WeakReference weak reference} to the + * MultiResolutionImageReader that provides it.</p> + * + * @param configuredSize The configured size corresponding to one of the internal ImageReader. + * @param physicalCameraId The physical camera Id the internal ImageReader targets for. If + * the ImageReader is not targeting a physical camera of a logical + * multi-camera, this parameter is set to "". + * + * @return The {@link Surface} of the internal ImageReader corresponding to the provided + * configured size and physical camera Id. + * + * @throws IllegalArgumentException If {@code configuredSize} is {@code null}, or the ({@code + * configuredSize} and {@code physicalCameraId}) combo is not + * part of this {@code MultiResolutionImageReader}. + * @hide + */ + @FlaggedApi(Flags.FLAG_CAMERA_DEVICE_SETUP) + public @NonNull Surface getSurface(@NonNull Size configuredSize, + @NonNull String physicalCameraId) { + checkNotNull(configuredSize, "configuredSize must not be null"); + checkNotNull(physicalCameraId, "physicalCameraId must not be null"); + + for (int i = 0; i < mStreamInfo.length; i++) { + if (mStreamInfo[i].getWidth() == configuredSize.getWidth() + && mStreamInfo[i].getHeight() == configuredSize.getHeight() + && physicalCameraId.equals(mStreamInfo[i].getPhysicalCameraId())) { + return mReaders[i].getSurface(); + } + } + throw new IllegalArgumentException("configuredSize and physicalCameraId don't match with " + + "this MultiResolutionImageReader"); + } + + /** * Get the surface that is used as a target for {@link CaptureRequest} * * <p>The application must use the surface returned by this function as a target for diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java index 0f199b15af6c..9e014386a6e5 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java @@ -90,7 +90,6 @@ public class CameraDeviceSetupImpl extends CameraDevice.CameraDeviceSetup { @Override public boolean isSessionConfigurationSupported(@NonNull SessionConfiguration config) throws CameraAccessException { - // TODO(b/298033056): restructure the OutputConfiguration API for better usability synchronized (mInterfaceLock) { if (mCameraManager.isCameraServiceDisabled()) { throw new IllegalArgumentException("No cameras available on device"); diff --git a/core/java/android/hardware/camera2/params/OutputConfiguration.java b/core/java/android/hardware/camera2/params/OutputConfiguration.java index 8aacd5e3908f..dda52dd5e8cc 100644 --- a/core/java/android/hardware/camera2/params/OutputConfiguration.java +++ b/core/java/android/hardware/camera2/params/OutputConfiguration.java @@ -19,6 +19,7 @@ package android.hardware.camera2.params; import static com.android.internal.util.Preconditions.*; +import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -27,6 +28,9 @@ import android.annotation.SystemApi; import android.annotation.TestApi; import android.graphics.ColorSpace; import android.graphics.ImageFormat; +import android.graphics.ImageFormat.Format; +import android.hardware.HardwareBuffer; +import android.hardware.HardwareBuffer.Usage; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraDevice; @@ -43,6 +47,8 @@ import android.util.Log; import android.util.Size; import android.view.Surface; +import com.android.internal.camera.flags.Flags; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -50,6 +56,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; /** * A class for describing camera output, which contains a {@link Surface} and its specific @@ -361,6 +368,21 @@ public final class OutputConfiguration implements Parcelable { private final int SURFACE_TYPE_SURFACE_TEXTURE = 1; /** + * The surface is obtained from {@link android.media.MediaRecorder}. + */ + private static final int SURFACE_TYPE_MEDIA_RECORDER = 2; + + /** + * The surface is obtained from {@link android.media.MediaCodec}. + */ + private static final int SURFACE_TYPE_MEDIA_CODEC = 3; + + /** + * The surface is obtained from {@link android.media.ImageReader}. + */ + private static final int SURFACE_TYPE_IMAGE_READER = 4; + + /** * Maximum number of surfaces supported by one {@link OutputConfiguration}. * * <p>The combined number of surfaces added by the constructor and @@ -576,6 +598,7 @@ public final class OutputConfiguration implements Parcelable { mMirrorMode = MIRROR_MODE_AUTO; mReadoutTimestampEnabled = false; mIsReadoutSensorTimestampBase = false; + mUsage = 0; } /** @@ -592,13 +615,7 @@ public final class OutputConfiguration implements Parcelable { @NonNull MultiResolutionImageReader multiResolutionImageReader) { checkNotNull(multiResolutionImageReader, "Multi-resolution image reader must not be null"); - int groupId = MULTI_RESOLUTION_GROUP_ID_COUNTER; - MULTI_RESOLUTION_GROUP_ID_COUNTER++; - // Skip in case the group id counter overflows to -1, the invalid value. - if (MULTI_RESOLUTION_GROUP_ID_COUNTER == -1) { - MULTI_RESOLUTION_GROUP_ID_COUNTER++; - } - + int groupId = getAndIncreaseMultiResolutionGroupId(); ImageReader[] imageReaders = multiResolutionImageReader.getReaders(); ArrayList<OutputConfiguration> configs = new ArrayList<OutputConfiguration>(); for (int i = 0; i < imageReaders.length; i++) { @@ -620,6 +637,115 @@ public final class OutputConfiguration implements Parcelable { } /** + * Create a list of {@link OutputConfiguration} instances for a + * {@link android.hardware.camera2.params.MultiResolutionImageReader}. + * + * <p>This method can be used to create query OutputConfigurations for a + * MultiResolutionImageReader that can be included in a SessionConfiguration passed into + * {@link CameraDeviceSetup#isSessionConfigurationSupported} before opening and setting up + * a camera device in full, at which point {@link #setSurfacesForMultiResolutionOutput} + * can be used to link to the actual MultiResolutionImageReader.</p> + * + * <p>This constructor takes same arguments used to create a {@link + * MultiResolutionImageReader}: a collection of {@link MultiResolutionStreamInfo} + * objects and the format.</p> + * + * @param streams The group of multi-resolution stream info objects, which are used to create a + * multi-resolution image reader containing a number of ImageReaders. + * @param format The format of the MultiResolutionImageReader. This must be one of the {@link + * android.graphics.ImageFormat} or {@link android.graphics.PixelFormat} constants + * supported by the camera device. Note that not all formats are supported, like + * {@link ImageFormat.NV21}. The supported multi-resolution reader format can be + * queried by {@link MultiResolutionStreamConfigurationMap#getOutputFormats}. + * + * @return The list of {@link OutputConfiguration} objects for a MultiResolutionImageReader. + * + * @throws IllegaArgumentException If the {@code streams} is null or doesn't contain + * at least 2 items, or if {@code format} isn't a valid camera + * format. + * + * @see MultiResolutionImageReader + * @see MultiResolutionStreamInfo + */ + @FlaggedApi(Flags.FLAG_CAMERA_DEVICE_SETUP) + public static @NonNull List<OutputConfiguration> createInstancesForMultiResolutionOutput( + @NonNull Collection<MultiResolutionStreamInfo> streams, + @Format int format) { + if (streams == null || streams.size() <= 1) { + throw new IllegalArgumentException( + "The streams list must contain at least 2 entries"); + } + if (format == ImageFormat.NV21) { + throw new IllegalArgumentException( + "NV21 format is not supported"); + } + + int groupId = getAndIncreaseMultiResolutionGroupId(); + ArrayList<OutputConfiguration> configs = new ArrayList<OutputConfiguration>(); + for (MultiResolutionStreamInfo stream : streams) { + Size surfaceSize = new Size(stream.getWidth(), stream.getHeight()); + OutputConfiguration config = new OutputConfiguration( + groupId, format, surfaceSize); + config.setPhysicalCameraId(stream.getPhysicalCameraId()); + config.setMultiResolutionOutput(); + configs.add(config); + + // No need to call addSensorPixelModeUsed for ultra high resolution sensor camera, + // because regular and max resolution output configurations are used for DEFAULT mode + // and MAX_RESOLUTION mode respectively by default. + } + + return configs; + } + + /** + * Set the OutputConfiguration surfaces corresponding to the {@link MultiResolutionImageReader}. + * + * <p>This function should be used together with {@link + * #createInstancesForMultiResolutionOutput}. The application calls {@link + * #createInstancesForMultiResolutionOutput} first to create a list of + * OutputConfiguration objects without the actual MultiResolutionImageReader. + * Once the MultiResolutionImageReader is created later during full camera setup, the + * application then calls this function to assign the surfaces to the OutputConfiguration + * instances.</p> + * + * @param outputConfigurations The OutputConfiguration objects created by {@link + * #createInstancesFromMultiResolutionOutput} + * @param multiResolutionImageReader The MultiResolutionImageReader object created from the same + * MultiResolutionStreamInfo parameters as + * {@code outputConfigurations}. + * @throws IllegalArgumentException If {@code outputConfigurations} or {@code + * multiResolutionImageReader} is {@code null}, the {@code + * outputConfigurations} and {@code multiResolutionImageReader} + * sizes don't match, or if the + * {@code multiResolutionImageReader}'s surfaces don't match + * with the {@code outputConfigurations}. + * @throws IllegalStateException If {@code outputConfigurations} already contains valid output + * surfaces. + */ + @FlaggedApi(Flags.FLAG_CAMERA_DEVICE_SETUP) + public static void setSurfacesForMultiResolutionOutput( + @NonNull Collection<OutputConfiguration> outputConfigurations, + @NonNull MultiResolutionImageReader multiResolutionImageReader) { + checkNotNull(outputConfigurations, "outputConfigurations must not be null"); + checkNotNull(multiResolutionImageReader, "multiResolutionImageReader must not be null"); + if (outputConfigurations.size() != multiResolutionImageReader.getReaders().length) { + throw new IllegalArgumentException( + "outputConfigurations and multiResolutionImageReader sizes must match"); + } + + for (OutputConfiguration config : outputConfigurations) { + String physicalCameraId = config.getPhysicalCameraId(); + if (physicalCameraId == null) { + physicalCameraId = ""; + } + Surface surface = multiResolutionImageReader.getSurface(config.getConfiguredSize(), + physicalCameraId); + config.addSurface(surface); + } + } + + /** * Create a new {@link OutputConfiguration} instance, with desired Surface size and Surface * source class. * <p> @@ -628,30 +754,64 @@ public final class OutputConfiguration implements Parcelable { * with a deferred Surface. The application can use this output configuration to create a * session. * </p> - * <p> - * However, the actual output Surface must be set via {@link #addSurface} and the deferred - * Surface configuration must be finalized via {@link - * CameraCaptureSession#finalizeOutputConfigurations} before submitting a request with this - * Surface target. The deferred Surface can only be obtained either from {@link - * android.view.SurfaceView} by calling {@link android.view.SurfaceHolder#getSurface}, or from + * + * <p>Starting from {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM Android V}, + * the deferred Surface can be obtained: (1) from {@link android.view.SurfaceView} + * by calling {@link android.view.SurfaceHolder#getSurface}, (2) from * {@link android.graphics.SurfaceTexture} via - * {@link android.view.Surface#Surface(android.graphics.SurfaceTexture)}). - * </p> + * {@link android.view.Surface#Surface(android.graphics.SurfaceTexture)}, (3) from {@link + * android.media.MediaRecorder} via {@link android.media.MediaRecorder.getSurface} or {@link + * android.media.MediaCodec#createPersistentInputSurface}, or (4) from {@link + * android.media.MediaCodce} via {@link android.media.MediaCodec#createInputSurface} or {@link + * android.media.MediaCodec#createPersistentInputSource}.</p> + * + * <ul> + * <li>Surfaces for {@link android.view.SurfaceView} and {@link android.graphics.SurfaceTexture} + * can be deferred until after {@link CameraDevice#createCaptureSession}. In that case, the + * output Surface must be set via {@link #addSurface}, and the Surface configuration must be + * finalized via {@link CameraCaptureSession#finalizeOutputConfiguration} before submitting + * a request with the Surface target.</li> + * <li>For all other target types, the output Surface must be set by {@link #addSurface}, + * and {@link CameraCaptureSession#finalizeOutputConfiguration} is not needed because the + * OutputConfiguration used to create the session will contain the actual Surface.</li> + * </ul> + * + * <p>Before {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM Android V}, only {@link + * android.view.SurfaceView} and {@link android.graphics.SurfaceTexture} are supported. Both + * kind of outputs can be deferred until after {@link + * CameraDevice#createCaptureSessionByOutputConfiguration}.</p> + * + * <p>An OutputConfiguration object created by this constructor can be used for {@link + * CameraDeviceSetup.isSessionConfigurationSupported} and {@link + * CameraDeviceSetup.getSessionCharacteristics} without having called {@link #addSurface}.</p> * * @param surfaceSize Size for the deferred surface. * @param klass a non-{@code null} {@link Class} object reference that indicates the source of - * this surface. Only {@link android.view.SurfaceHolder SurfaceHolder.class} and - * {@link android.graphics.SurfaceTexture SurfaceTexture.class} are supported. + * this surface. Only {@link android.view.SurfaceHolder SurfaceHolder.class}, + * {@link android.graphics.SurfaceTexture SurfaceTexture.class}, {@link + * android.media.MediaRecorder MediaRecorder.class}, and + * {@link android.media.MediaCodec MediaCodec.class} are supported. + * Before {@link android.os.Build.VERSION_CODES#VANILLA_ICE_CREAM Android V}, only + * {@link android.view.SurfaceHolder SurfaceHolder.class} and {@link + * android.graphics.SurfaceTexture SurfaceTexture.class} are supported. * @throws IllegalArgumentException if the Surface source class is not supported, or Surface * size is zero. */ public <T> OutputConfiguration(@NonNull Size surfaceSize, @NonNull Class<T> klass) { - checkNotNull(klass, "surfaceSize must not be null"); + checkNotNull(surfaceSize, "surfaceSize must not be null"); checkNotNull(klass, "klass must not be null"); if (klass == android.view.SurfaceHolder.class) { mSurfaceType = SURFACE_TYPE_SURFACE_VIEW; + mIsDeferredConfig = true; } else if (klass == android.graphics.SurfaceTexture.class) { mSurfaceType = SURFACE_TYPE_SURFACE_TEXTURE; + mIsDeferredConfig = true; + } else if (klass == android.media.MediaRecorder.class) { + mSurfaceType = SURFACE_TYPE_MEDIA_RECORDER; + mIsDeferredConfig = false; + } else if (klass == android.media.MediaCodec.class) { + mSurfaceType = SURFACE_TYPE_MEDIA_CODEC; + mIsDeferredConfig = false; } else { mSurfaceType = SURFACE_TYPE_UNKNOWN; throw new IllegalArgumentException("Unknown surface source class type"); @@ -668,7 +828,6 @@ public final class OutputConfiguration implements Parcelable { mConfiguredFormat = StreamConfigurationMap.imageFormatToInternal(ImageFormat.PRIVATE); mConfiguredDataspace = StreamConfigurationMap.imageFormatToDataspace(ImageFormat.PRIVATE); mConfiguredGenerationId = 0; - mIsDeferredConfig = true; mIsShared = false; mPhysicalCameraId = null; mIsMultiResolution = false; @@ -678,6 +837,131 @@ public final class OutputConfiguration implements Parcelable { mStreamUseCase = CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT; mReadoutTimestampEnabled = false; mIsReadoutSensorTimestampBase = false; + mUsage = 0; + } + + /** + * Create a new {@link OutputConfiguration} instance for an {@link ImageReader} for a given + * format and size. + * + * <p>This constructor creates an OutputConfiguration for an ImageReader without providing + * the actual output Surface. The actual output Surface must be set via {@link #addSurface} + * before creating the capture session.</p> + * + * <p>An OutputConfiguration object created by this constructor can be used for {@link + * CameraDeviceSetup.isSessionConfigurationSupported} and {@link + * CameraDeviceSetup.getSessionCharacteristics} without having called {@link #addSurface}.</p> + * + * @param format The format of the ImageReader output. This must be one of the + * {@link android.graphics.ImageFormat} or {@link android.graphics.PixelFormat} + * constants. Note that not all formats are supported by the camera device. + * @param surfaceSize Size for the ImageReader surface. + * @throws IllegalArgumentException if the Surface size is null or zero. + */ + @FlaggedApi(Flags.FLAG_CAMERA_DEVICE_SETUP) + public OutputConfiguration(@Format int format, @NonNull Size surfaceSize) { + this(format, surfaceSize, + format == ImageFormat.PRIVATE ? 0 : HardwareBuffer.USAGE_CPU_READ_OFTEN); + } + + /** + * Create a new {@link OutputConfiguration} instance for an {@link ImageReader} for a given + * surfaceGroupId, format, and size. + * + * <p>This constructor creates an OutputConfiguration for an ImageReader without providing + * the actual output Surface. The actual output Surface must be set via {@link #addSurface} + * before creating the capture session.</p> + * + * <p>An OutputConfiguration object created by this constructor can be used for {@link + * CameraDeviceSetup.isSessionConfigurationSupported} and {@link + * CameraDeviceSetup.getSessionCharacteristics} without having called {@link #addSurface}.</p> + * + * @param surfaceGroupId A group ID for this output, used for sharing memory between multiple + * outputs. + * @param format The format of the ImageReader output. This must be one of the + * {@link android.graphics.ImageFormat} or {@link android.graphics.PixelFormat} + * constants. Note that not all formats are supported by the camera device. + * @param surfaceSize Size for the ImageReader surface. + * @throws IllegalArgumentException if the Surface size is null or zero. + */ + @FlaggedApi(Flags.FLAG_CAMERA_DEVICE_SETUP) + public OutputConfiguration(int surfaceGroupId, @Format int format, @NonNull Size surfaceSize) { + this(surfaceGroupId, format, surfaceSize, + format == ImageFormat.PRIVATE ? 0 : HardwareBuffer.USAGE_CPU_READ_OFTEN); + } + + /** + * Create a new {@link OutputConfiguration} instance for an {@link ImageReader} for a given + * format, size, and usage flags. + * + * <p>This constructor creates an OutputConfiguration for an ImageReader without providing + * the actual output Surface. The actual output Surface must be set via {@link #addSurface} + * before creating the capture session.</p> + * + * <p>An OutputConfiguration object created by this constructor can be used for {@link + * CameraDeviceSetup.isSessionConfigurationSupported} and {@link + * CameraDeviceSetup.getSessionCharacteristics} without having called {@link #addSurface}.</p> + * + * @param format The format of the ImageReader output. This must be one of the + * {@link android.graphics.ImageFormat} or {@link android.graphics.PixelFormat} + * constants. Note that not all formats are supported by the camera device. + * @param surfaceSize Size for the ImageReader surface. + * @param usage The usage flags of the ImageReader output surface. + * @throws IllegalArgumentException if the Surface size is null or zero. + */ + @FlaggedApi(Flags.FLAG_CAMERA_DEVICE_SETUP) + public OutputConfiguration(@Format int format, @NonNull Size surfaceSize, @Usage long usage) { + this(SURFACE_GROUP_ID_NONE, format, surfaceSize, usage); + } + + /** + * Create a new {@link OutputConfiguration} instance for an {@link ImageReader} for a given + * surface group id, format, size, and usage flags. + * + * <p>This constructor creates an OutputConfiguration for an ImageReader without providing + * the actual output Surface. The actual output Surface must be set via {@link #addSurface} + * before creating the capture session.</p> + * + * <p>An OutputConfiguration object created by this constructor can be used for {@link + * CameraDeviceSetup.isSessionConfigurationSupported} and {@link + * CameraDeviceSetup.getSessionCharacteristics} without having called {@link #addSurface}.</p> + * + * @param surfaceGroupId A group ID for this output, used for sharing memory between multiple + * outputs. + * @param format The format of the ImageReader output. This must be one of the + * {@link android.graphics.ImageFormat} or {@link android.graphics.PixelFormat} + * constants. Note that not all formats are supported by the camera device. + * @param surfaceSize Size for the ImageReader surface. + * @param usage The usage flags of the ImageReader output surface. + * @throws IllegalArgumentException if the Surface size is null or zero. + */ + @FlaggedApi(Flags.FLAG_CAMERA_DEVICE_SETUP) + public OutputConfiguration(int surfaceGroupId, @Format int format, + @NonNull Size surfaceSize, @Usage long usage) { + checkNotNull(surfaceSize, "surfaceSize must not be null"); + if (surfaceSize.getWidth() == 0 || surfaceSize.getHeight() == 0) { + throw new IllegalArgumentException("Surface size needs to be non-zero"); + } + + mSurfaceType = SURFACE_TYPE_IMAGE_READER; + mSurfaceGroupId = surfaceGroupId; + mSurfaces = new ArrayList<Surface>(); + mRotation = ROTATION_0; + mConfiguredSize = surfaceSize; + mConfiguredFormat = StreamConfigurationMap.imageFormatToInternal(format); + mConfiguredDataspace = StreamConfigurationMap.imageFormatToDataspace(format); + mConfiguredGenerationId = 0; + mIsDeferredConfig = false; + mIsShared = false; + mPhysicalCameraId = null; + mIsMultiResolution = false; + mSensorPixelModesUsed = new ArrayList<Integer>(); + mDynamicRangeProfile = DynamicRangeProfiles.STANDARD; + mColorSpace = ColorSpaceProfiles.UNSPECIFIED; + mStreamUseCase = CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT; + mReadoutTimestampEnabled = false; + mIsReadoutSensorTimestampBase = false; + mUsage = usage; } /** @@ -852,7 +1136,8 @@ public final class OutputConfiguration implements Parcelable { /** * Check if this configuration has deferred configuration. * - * <p>This will return true if the output configuration was constructed with surface deferred by + * <p>This will return true if the output configuration was constructed with {@link + * android.view.SurfaceView} or {@link android.graphics.SurfaceTexture} deferred by * {@link OutputConfiguration#OutputConfiguration(Size, Class)}. It will return true even after * the deferred surface is added later by {@link OutputConfiguration#addSurface}.</p> * @@ -872,13 +1157,28 @@ public final class OutputConfiguration implements Parcelable { * {@link CameraCaptureSession#finalizeOutputConfigurations}. It is possible to call this method * after the output configurations have been finalized only in cases of enabled surface sharing * see {@link #enableSurfaceSharing}. The modified output configuration must be updated with - * {@link CameraCaptureSession#updateOutputConfiguration}.</p> - * - * <p> If the OutputConfiguration was constructed with a deferred surface by {@link - * OutputConfiguration#OutputConfiguration(Size, Class)}, the added surface must be obtained - * from {@link android.view.SurfaceView} by calling {@link android.view.SurfaceHolder#getSurface}, - * or from {@link android.graphics.SurfaceTexture} via - * {@link android.view.Surface#Surface(android.graphics.SurfaceTexture)}).</p> + * {@link CameraCaptureSession#updateOutputConfiguration}. If this function is called before + * session creation, {@link CameraCaptureSession#finalizeOutputConfigurations} doesn't need to + * be called.</p> + * + * <p> If the OutputConfiguration was constructed by {@link + * OutputConfiguration#OutputConfiguration(Size, Class)}, the added surface must be obtained: + * <ul> + * <li>from {@link android.view.SurfaceView} by calling + * {@link android.view.SurfaceHolder#getSurface}</li> + * <li>from {@link android.graphics.SurfaceTexture} by calling + * {@link android.view.Surface#Surface(android.graphics.SurfaceTexture)}</li> + * <li>from {@link android.media.MediaRecorder} by calling + * {@link android.media.MediaRecorder#getSurface} or {@link + * android.media.MediaCodec#createPersistentInputSurface}</li> + * <li>from {@link android.media.MediaCodce} by calling + * {@link android.media.MediaCodec#createInputSurface} or {@link + * android.media.MediaCodec#createPersistentInputSource}</li> + * </ul> + * + * <p> If the OutputConfiguration was constructed by {@link #OutputConfiguration(int, Size)} + * or its variants, the added surface must be obtained from {@link android.media.ImageReader} + * by calling {@link android.media.ImageReader#getSurface}.</p> * * <p> If the OutputConfiguration was constructed by other constructors, the added * surface must be compatible with the existing surface. See {@link #enableSurfaceSharing} for @@ -934,9 +1234,13 @@ public final class OutputConfiguration implements Parcelable { * * <p> Surfaces added via calls to {@link #addSurface} can also be removed from the * OutputConfiguration. The only notable exception is the surface associated with - * the OutputConfiguration see {@link #getSurface} which was passed as part of the constructor - * or was added first in the deferred case - * {@link OutputConfiguration#OutputConfiguration(Size, Class)}.</p> + * the OutputConfiguration (see {@link #getSurface}) which was passed as part of the + * constructor or was added first in the case of + * {@link OutputConfiguration#OutputConfiguration(Size, Class)}, {@link + * OutputConfiguration#OutputConfiguration(int, Size)}, {@link + * OutputConfiguration#OutputConfiguration(int, Size, long)}, {@link + * OutputConfiguration#OutputConfiguration(int, int, Size)}, {@link + * OutputConfiguration#OutputConfiguration(int, int, Size, long)}.</p> * * @param surface The surface to be removed. * @@ -945,6 +1249,7 @@ public final class OutputConfiguration implements Parcelable { * with {@link #addSurface}. */ public void removeSurface(@NonNull Surface surface) { + checkNotNull(surface, "Surface must not be null"); if (getSurface() == surface) { throw new IllegalArgumentException( "Cannot remove surface associated with this output configuration"); @@ -1175,6 +1480,7 @@ public final class OutputConfiguration implements Parcelable { this.mTimestampBase = other.mTimestampBase; this.mMirrorMode = other.mMirrorMode; this.mReadoutTimestampEnabled = other.mReadoutTimestampEnabled; + this.mUsage = other.mUsage; } /** @@ -1203,6 +1509,9 @@ public final class OutputConfiguration implements Parcelable { int timestampBase = source.readInt(); int mirrorMode = source.readInt(); boolean readoutTimestampEnabled = source.readInt() == 1; + int format = source.readInt(); + int dataSpace = source.readInt(); + long usage = source.readLong(); mSurfaceGroupId = surfaceSetId; mRotation = rotation; @@ -1211,6 +1520,7 @@ public final class OutputConfiguration implements Parcelable { mIsDeferredConfig = isDeferred; mIsShared = isShared; mSurfaces = surfaces; + mUsage = 0; if (mSurfaces.size() > 0) { mSurfaceType = SURFACE_TYPE_UNKNOWN; mConfiguredFormat = SurfaceUtils.getSurfaceFormat(mSurfaces.get(0)); @@ -1218,9 +1528,16 @@ public final class OutputConfiguration implements Parcelable { mConfiguredGenerationId = mSurfaces.get(0).getGenerationId(); } else { mSurfaceType = surfaceType; - mConfiguredFormat = StreamConfigurationMap.imageFormatToInternal(ImageFormat.PRIVATE); - mConfiguredDataspace = - StreamConfigurationMap.imageFormatToDataspace(ImageFormat.PRIVATE); + if (mSurfaceType != SURFACE_TYPE_IMAGE_READER) { + mConfiguredFormat = StreamConfigurationMap.imageFormatToInternal( + ImageFormat.PRIVATE); + mConfiguredDataspace = + StreamConfigurationMap.imageFormatToDataspace(ImageFormat.PRIVATE); + } else { + mConfiguredFormat = format; + mConfiguredDataspace = dataSpace; + mUsage = usage; + } mConfiguredGenerationId = 0; } mPhysicalCameraId = physicalCameraId; @@ -1293,6 +1610,31 @@ public final class OutputConfiguration implements Parcelable { return mSurfaceGroupId; } + /** + * Get the configured size associated with this {@link OutputConfiguration}. + * + * @return The configured size associated with this {@link OutputConfiguration}. + * + * @hide + */ + public Size getConfiguredSize() { + return mConfiguredSize; + } + + /** + * Get the physical camera ID associated with this {@link OutputConfiguration}. + * + * <p>If this OutputConfiguration isn't targeting a physical camera of a logical + * multi-camera, this function returns {@code null}.</p> + * + * @return The physical camera Id associated with this {@link OutputConfiguration}. + * + * @hide + */ + public @Nullable String getPhysicalCameraId() { + return mPhysicalCameraId; + } + public static final @android.annotation.NonNull Parcelable.Creator<OutputConfiguration> CREATOR = new Parcelable.Creator<OutputConfiguration>() { @Override @@ -1353,6 +1695,9 @@ public final class OutputConfiguration implements Parcelable { dest.writeInt(mTimestampBase); dest.writeInt(mMirrorMode); dest.writeInt(mReadoutTimestampEnabled ? 1 : 0); + dest.writeInt(mConfiguredFormat); + dest.writeInt(mConfiguredDataspace); + dest.writeLong(mUsage); } /** @@ -1372,22 +1717,24 @@ public final class OutputConfiguration implements Parcelable { return true; } else if (obj instanceof OutputConfiguration) { final OutputConfiguration other = (OutputConfiguration) obj; - if (mRotation != other.mRotation || - !mConfiguredSize.equals(other.mConfiguredSize) || - mConfiguredFormat != other.mConfiguredFormat || - mSurfaceGroupId != other.mSurfaceGroupId || - mSurfaceType != other.mSurfaceType || - mIsDeferredConfig != other.mIsDeferredConfig || - mIsShared != other.mIsShared || - mConfiguredDataspace != other.mConfiguredDataspace || - mConfiguredGenerationId != other.mConfiguredGenerationId || - !Objects.equals(mPhysicalCameraId, other.mPhysicalCameraId) || - mIsMultiResolution != other.mIsMultiResolution || - mStreamUseCase != other.mStreamUseCase || - mTimestampBase != other.mTimestampBase || - mMirrorMode != other.mMirrorMode || - mReadoutTimestampEnabled != other.mReadoutTimestampEnabled) + if (mRotation != other.mRotation + || !mConfiguredSize.equals(other.mConfiguredSize) + || mConfiguredFormat != other.mConfiguredFormat + || mSurfaceGroupId != other.mSurfaceGroupId + || mSurfaceType != other.mSurfaceType + || mIsDeferredConfig != other.mIsDeferredConfig + || mIsShared != other.mIsShared + || mConfiguredDataspace != other.mConfiguredDataspace + || mConfiguredGenerationId != other.mConfiguredGenerationId + || !Objects.equals(mPhysicalCameraId, other.mPhysicalCameraId) + || mIsMultiResolution != other.mIsMultiResolution + || mStreamUseCase != other.mStreamUseCase + || mTimestampBase != other.mTimestampBase + || mMirrorMode != other.mMirrorMode + || mReadoutTimestampEnabled != other.mReadoutTimestampEnabled + || mUsage != other.mUsage) { return false; + } if (mSensorPixelModesUsed.size() != other.mSensorPixelModesUsed.size()) { return false; } @@ -1416,6 +1763,16 @@ public final class OutputConfiguration implements Parcelable { } /** + * Get and increase the next MultiResolution group id. + * + * If the ID reaches -1, skip it. + */ + private static int getAndIncreaseMultiResolutionGroupId() { + return sNextMultiResolutionGroupId.getAndUpdate(i -> + i + 1 == SURFACE_GROUP_ID_NONE ? i + 2 : i + 1); + } + + /** * {@inheritDoc} */ @Override @@ -1430,7 +1787,8 @@ public final class OutputConfiguration implements Parcelable { mPhysicalCameraId == null ? 0 : mPhysicalCameraId.hashCode(), mIsMultiResolution ? 1 : 0, mSensorPixelModesUsed.hashCode(), mDynamicRangeProfile, mColorSpace, mStreamUseCase, - mTimestampBase, mMirrorMode, mReadoutTimestampEnabled ? 1 : 0); + mTimestampBase, mMirrorMode, mReadoutTimestampEnabled ? 1 : 0, + Long.hashCode(mUsage)); } return HashCodeHelpers.hashCode( @@ -1440,14 +1798,14 @@ public final class OutputConfiguration implements Parcelable { mPhysicalCameraId == null ? 0 : mPhysicalCameraId.hashCode(), mIsMultiResolution ? 1 : 0, mSensorPixelModesUsed.hashCode(), mDynamicRangeProfile, mColorSpace, mStreamUseCase, mTimestampBase, - mMirrorMode, mReadoutTimestampEnabled ? 1 : 0); + mMirrorMode, mReadoutTimestampEnabled ? 1 : 0, Long.hashCode(mUsage)); } private static final String TAG = "OutputConfiguration"; // A surfaceGroupId counter used for MultiResolutionImageReader. Its value is // incremented every time {@link createInstancesForMultiResolutionOutput} is called. - private static int MULTI_RESOLUTION_GROUP_ID_COUNTER = 0; + private static AtomicInteger sNextMultiResolutionGroupId = new AtomicInteger(0); private ArrayList<Surface> mSurfaces; private final int mRotation; @@ -1486,4 +1844,6 @@ public final class OutputConfiguration implements Parcelable { private boolean mReadoutTimestampEnabled; // Whether the timestamp base is set to READOUT_SENSOR private boolean mIsReadoutSensorTimestampBase; + // The usage flags. Only set for instances created for ImageReader without specifying surface. + private long mUsage; } diff --git a/core/java/android/hardware/camera2/params/SessionConfiguration.java b/core/java/android/hardware/camera2/params/SessionConfiguration.java index 991f545b5193..b0f354fac009 100644 --- a/core/java/android/hardware/camera2/params/SessionConfiguration.java +++ b/core/java/android/hardware/camera2/params/SessionConfiguration.java @@ -20,6 +20,7 @@ package android.hardware.camera2.params; import static com.android.internal.util.Preconditions.*; import android.annotation.CallbackExecutor; +import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -28,6 +29,7 @@ import android.graphics.ColorSpace; import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CameraDevice.CameraDeviceSetup; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.impl.CameraMetadataNative; import android.hardware.camera2.params.InputConfiguration; @@ -125,6 +127,34 @@ public final class SessionConfiguration implements Parcelable { } /** + * Create a new {@link SessionConfiguration} with sessionType and output configurations. + * + * <p>The SessionConfiguration objects created by this constructor can be used by + * {@link CameraDeviceSetup.isSessionConfigurationSupported} and {@link + * CameraDeviceSetup.getSessionCharacteristics} to query a camera device's feature + * combination support and session specific characteristics. For the SessionConfiguration + * object to be used to create a capture session, {@link #setCallback} must be called to + * specify the state callback function, and any incomplete OutputConfigurations must be + * completed via {@link OutputConfiguration#addSurface} or + * {@link OutputConfiguration#setSurfacesForMultiResolutionOutput} as appropriate.</p> + * + * @param sessionType The session type. + * @param outputs A list of output configurations for the capture session. + * + * @see #SESSION_REGULAR + * @see #SESSION_HIGH_SPEED + * @see CameraDevice#createCaptureSession(SessionConfiguration) + * @see CameraDeviceSetup#isSessionConfigurationSupported + * @see CameraDeviceSetup#getSessionCharacteristics + */ + @FlaggedApi(Flags.FLAG_CAMERA_DEVICE_SETUP) + public SessionConfiguration(@SessionMode int sessionType, + @NonNull List<OutputConfiguration> outputs) { + mSessionType = sessionType; + mOutputConfigurations = Collections.unmodifiableList(new ArrayList<>(outputs)); + } + + /** * Create a SessionConfiguration from Parcel. * No support for parcelable 'mStateCallback' and 'mExecutor' yet. */ @@ -376,4 +406,23 @@ public final class SessionConfiguration implements Parcelable { return null; } } + + /** + * Set the state callback and executor. + * + * <p>This function must be called for the SessionConfiguration object created via {@link + * #SessionConfiguration(int, List) SessionConfiguration(int, List<OutputConfiguration>)} + * before it's used to create a capture session.</p> + * + * @param executor The executor which should be used to invoke the callback. In general it is + * recommended that camera operations are not done on the main (UI) thread. + * @param cb A state callback interface implementation. + */ + @FlaggedApi(Flags.FLAG_CAMERA_DEVICE_SETUP) + public void setCallback( + @NonNull @CallbackExecutor Executor executor, + @NonNull CameraCaptureSession.StateCallback cb) { + mStateCallback = cb; + mExecutor = executor; + } } diff --git a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java index b85d6869a1ff..b067095668b2 100644 --- a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java +++ b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java @@ -1509,6 +1509,8 @@ public final class StreamConfigurationMap { return HAL_DATASPACE_HEIF; case ImageFormat.JPEG_R: return HAL_DATASPACE_JPEG_R; + case ImageFormat.YUV_420_888: + return HAL_DATASPACE_JFIF; default: return HAL_DATASPACE_UNKNOWN; } @@ -2025,6 +2027,10 @@ public final class StreamConfigurationMap { * @hide */ public static final int HAL_DATASPACE_JPEG_R = 0x1005; + /** + * @hide + */ + public static final int HAL_DATASPACE_JFIF = 0x8C20000; private static final long DURATION_20FPS_NS = 50000000L; /** * @see #getDurations(int, int) diff --git a/core/java/android/os/IHintSession.aidl b/core/java/android/os/IHintSession.aidl index fe85da26e610..6fd4f3c7c01a 100644 --- a/core/java/android/os/IHintSession.aidl +++ b/core/java/android/os/IHintSession.aidl @@ -17,7 +17,7 @@ package android.os; -import android.os.WorkDuration; +import android.hardware.power.WorkDuration; /** {@hide} */ oneway interface IHintSession { diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 318c2911197c..84619a0eee2e 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -1024,7 +1024,11 @@ public class UserManager { /** * Specifies if a user is disallowed from creating a private profile. * <p>The default value for an unmanaged user is <code>false</code>. - * For users with a device owner set, the default is <code>true</code>. + * For users with a device owner set, the default value is <code>true</code> and the + * device owner currently cannot change it to <code>false</code>. + * On organization-owned managed profile devices, the default value is <code>false</code> but + * the profile owner can change it to <code>true</code> via the parent profile to block creating + * of private profiles on the personal user. * * <p>Holders of the permission * {@link android.Manifest.permission#MANAGE_DEVICE_POLICY_PROFILES} @@ -1034,9 +1038,10 @@ public class UserManager { * <p>Type: Boolean * @see DevicePolicyManager#addUserRestriction(ComponentName, String) * @see DevicePolicyManager#clearUserRestriction(ComponentName, String) + * @see DevicePolicyManager#getParentProfileInstance(ComponentName) * @see #getUserRestrictions() - * @hide */ + @FlaggedApi(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE) public static final String DISALLOW_ADD_PRIVATE_PROFILE = "no_add_private_profile"; /** diff --git a/core/java/android/os/WorkDuration.java b/core/java/android/os/WorkDuration.java index 5a54e90372fc..3627502ed2d9 100644 --- a/core/java/android/os/WorkDuration.java +++ b/core/java/android/os/WorkDuration.java @@ -17,7 +17,6 @@ package android.os; import android.annotation.FlaggedApi; -import android.annotation.NonNull; import java.util.Objects; @@ -29,24 +28,11 @@ import java.util.Objects; * All timings should be in {@link SystemClock#uptimeNanos()} and measured in wall time. */ @FlaggedApi(Flags.FLAG_ADPF_GPU_REPORT_ACTUAL_WORK_DURATION) -public final class WorkDuration implements Parcelable { - long mWorkPeriodStartTimestampNanos = 0; +public final class WorkDuration { long mActualTotalDurationNanos = 0; + long mWorkPeriodStartTimestampNanos = 0; long mActualCpuDurationNanos = 0; long mActualGpuDurationNanos = 0; - long mTimestampNanos = 0; - - public static final @NonNull Creator<WorkDuration> CREATOR = new Creator<>() { - @Override - public WorkDuration createFromParcel(Parcel in) { - return new WorkDuration(in); - } - - @Override - public WorkDuration[] newArray(int size) { - return new WorkDuration[size]; - } - }; public WorkDuration() {} @@ -58,47 +44,37 @@ public final class WorkDuration implements Parcelable { public WorkDuration(long workPeriodStartTimestampNanos, long actualTotalDurationNanos, long actualCpuDurationNanos, - long actualGpuDurationNanos, - long timestampNanos) { - mWorkPeriodStartTimestampNanos = workPeriodStartTimestampNanos; + long actualGpuDurationNanos) { mActualTotalDurationNanos = actualTotalDurationNanos; + mWorkPeriodStartTimestampNanos = workPeriodStartTimestampNanos; mActualCpuDurationNanos = actualCpuDurationNanos; mActualGpuDurationNanos = actualGpuDurationNanos; - mTimestampNanos = timestampNanos; - } - - WorkDuration(@NonNull Parcel in) { - mWorkPeriodStartTimestampNanos = in.readLong(); - mActualTotalDurationNanos = in.readLong(); - mActualCpuDurationNanos = in.readLong(); - mActualGpuDurationNanos = in.readLong(); - mTimestampNanos = in.readLong(); } /** - * Sets the work period start timestamp in nanoseconds. + * Sets the actual total duration in nanoseconds. * * All timings should be in {@link SystemClock#uptimeNanos()}. */ - public void setWorkPeriodStartTimestampNanos(long workPeriodStartTimestampNanos) { - if (workPeriodStartTimestampNanos <= 0) { + public void setActualTotalDurationNanos(long actualTotalDurationNanos) { + if (actualTotalDurationNanos <= 0) { throw new IllegalArgumentException( - "the work period start timestamp should be greater than zero."); + "the actual total duration should be greater than zero."); } - mWorkPeriodStartTimestampNanos = workPeriodStartTimestampNanos; + mActualTotalDurationNanos = actualTotalDurationNanos; } /** - * Sets the actual total duration in nanoseconds. + * Sets the work period start timestamp in nanoseconds. * * All timings should be in {@link SystemClock#uptimeNanos()}. */ - public void setActualTotalDurationNanos(long actualTotalDurationNanos) { - if (actualTotalDurationNanos <= 0) { + public void setWorkPeriodStartTimestampNanos(long workPeriodStartTimestampNanos) { + if (workPeriodStartTimestampNanos <= 0) { throw new IllegalArgumentException( - "the actual total duration should be greater than zero."); + "the work period start timestamp should be greater than zero."); } - mActualTotalDurationNanos = actualTotalDurationNanos; + mWorkPeriodStartTimestampNanos = workPeriodStartTimestampNanos; } /** @@ -128,21 +104,21 @@ public final class WorkDuration implements Parcelable { } /** - * Returns the work period start timestamp based in nanoseconds. + * Returns the actual total duration in nanoseconds. * * All timings should be in {@link SystemClock#uptimeNanos()}. */ - public long getWorkPeriodStartTimestampNanos() { - return mWorkPeriodStartTimestampNanos; + public long getActualTotalDurationNanos() { + return mActualTotalDurationNanos; } /** - * Returns the actual total duration in nanoseconds. + * Returns the work period start timestamp based in nanoseconds. * * All timings should be in {@link SystemClock#uptimeNanos()}. */ - public long getActualTotalDurationNanos() { - return mActualTotalDurationNanos; + public long getWorkPeriodStartTimestampNanos() { + return mWorkPeriodStartTimestampNanos; } /** @@ -163,27 +139,6 @@ public final class WorkDuration implements Parcelable { return mActualGpuDurationNanos; } - /** - * @hide - */ - public long getTimestampNanos() { - return mTimestampNanos; - } - - @Override - public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeLong(mWorkPeriodStartTimestampNanos); - dest.writeLong(mActualTotalDurationNanos); - dest.writeLong(mActualCpuDurationNanos); - dest.writeLong(mActualGpuDurationNanos); - dest.writeLong(mTimestampNanos); - } - - @Override - public int describeContents() { - return 0; - } - @Override public boolean equals(Object obj) { if (obj == this) { @@ -193,9 +148,8 @@ public final class WorkDuration implements Parcelable { return false; } WorkDuration workDuration = (WorkDuration) obj; - return workDuration.mTimestampNanos == this.mTimestampNanos + return workDuration.mActualTotalDurationNanos == this.mActualTotalDurationNanos && workDuration.mWorkPeriodStartTimestampNanos == this.mWorkPeriodStartTimestampNanos - && workDuration.mActualTotalDurationNanos == this.mActualTotalDurationNanos && workDuration.mActualCpuDurationNanos == this.mActualCpuDurationNanos && workDuration.mActualGpuDurationNanos == this.mActualGpuDurationNanos; } @@ -203,6 +157,6 @@ public final class WorkDuration implements Parcelable { @Override public int hashCode() { return Objects.hash(mWorkPeriodStartTimestampNanos, mActualTotalDurationNanos, - mActualCpuDurationNanos, mActualGpuDurationNanos, mTimestampNanos); + mActualCpuDurationNanos, mActualGpuDurationNanos); } } diff --git a/core/java/android/permission/flags.aconfig b/core/java/android/permission/flags.aconfig index dc782d4e1e9b..999bc99b6915 100644 --- a/core/java/android/permission/flags.aconfig +++ b/core/java/android/permission/flags.aconfig @@ -121,17 +121,6 @@ flag { } flag { - name: "new_permission_gid_enabled" - is_fixed_read_only: true - namespace: "permissions" - description: "Enable new permission GID implementation" - bug: "325137277" - metadata { - purpose: PURPOSE_BUGFIX - } -} - -flag { name: "ignore_process_text" namespace: "permissions" description: "Ignore activities that handle PROCESS_TEXT in TextView" diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 2d657c2813a5..4060b242292a 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -18,7 +18,9 @@ package android.service.dreams; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import android.annotation.FlaggedApi; import android.annotation.IdRes; +import android.annotation.IntDef; import android.annotation.LayoutRes; import android.annotation.NonNull; import android.annotation.Nullable; @@ -47,6 +49,7 @@ import android.os.Looper; import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; +import android.service.controls.flags.Flags; import android.util.AttributeSet; import android.util.Log; import android.util.MathUtils; @@ -76,6 +79,8 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.function.Consumer; /** @@ -217,6 +222,33 @@ public class DreamService extends Service implements Window.Callback { */ public static final boolean DEFAULT_SHOW_COMPLICATIONS = false; + /** + * The default value for dream category + * @hide + */ + public static final int DREAM_CATEGORY_DEFAULT = 0; + + /** + * Dream category for Low Light Dream + * @hide + */ + public static final int DREAM_CATEGORY_LOW_LIGHT = 1 << 0; + + /** + * Dream category for Home Panel Dream + * @hide + */ + public static final int DREAM_CATEGORY_HOME_PANEL = 1 << 1; + + /** @hide */ + @IntDef(flag = true, prefix = {"DREAM_CATEGORY"}, value = { + DREAM_CATEGORY_DEFAULT, + DREAM_CATEGORY_LOW_LIGHT, + DREAM_CATEGORY_HOME_PANEL + }) + @Retention(RetentionPolicy.SOURCE) + @interface DreamCategory {} + private final IDreamManager mDreamManager; private final Handler mHandler = new Handler(Looper.getMainLooper()); private IBinder mDreamToken; @@ -1122,12 +1154,15 @@ public class DreamService extends Service implements Window.Callback { try (TypedArray rawMetadata = readMetadata(pm, serviceInfo)) { if (rawMetadata == null) return null; return new DreamMetadata( - convertToComponentName(rawMetadata.getString( + convertToComponentName( + rawMetadata.getString( com.android.internal.R.styleable.Dream_settingsActivity), serviceInfo), rawMetadata.getDrawable( com.android.internal.R.styleable.Dream_previewImage), rawMetadata.getBoolean(R.styleable.Dream_showClockAndComplications, - DEFAULT_SHOW_COMPLICATIONS)); + DEFAULT_SHOW_COMPLICATIONS), + rawMetadata.getInt(R.styleable.Dream_dreamCategory, DREAM_CATEGORY_DEFAULT) + ); } } @@ -1543,11 +1578,23 @@ public class DreamService extends Service implements Window.Callback { @NonNull public final boolean showComplications; - DreamMetadata(ComponentName settingsActivity, Drawable previewImage, - boolean showComplications) { + @NonNull + @FlaggedApi(Flags.FLAG_HOME_PANEL_DREAM) + public final int dreamCategory; + + DreamMetadata( + ComponentName settingsActivity, + Drawable previewImage, + boolean showComplications, + int dreamCategory) { this.settingsActivity = settingsActivity; this.previewImage = previewImage; this.showComplications = showComplications; + if (Flags.homePanelDream()) { + this.dreamCategory = dreamCategory; + } else { + this.dreamCategory = DREAM_CATEGORY_DEFAULT; + } } } } diff --git a/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java b/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java index d943c80e525b..fc7a4c83f82c 100644 --- a/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java +++ b/core/java/android/service/ondeviceintelligence/OnDeviceSandboxedInferenceService.java @@ -27,21 +27,21 @@ import android.annotation.SdkConstant; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.app.Service; -import android.app.ondeviceintelligence.OnDeviceIntelligenceException; -import android.os.Bundle; import android.app.ondeviceintelligence.Feature; import android.app.ondeviceintelligence.IProcessingSignal; import android.app.ondeviceintelligence.IResponseCallback; import android.app.ondeviceintelligence.IStreamingResponseCallback; import android.app.ondeviceintelligence.ITokenInfoCallback; +import android.app.ondeviceintelligence.OnDeviceIntelligenceException; import android.app.ondeviceintelligence.OnDeviceIntelligenceManager; import android.app.ondeviceintelligence.OnDeviceIntelligenceManager.InferenceParams; -import android.app.ondeviceintelligence.ProcessingSignal; import android.app.ondeviceintelligence.ProcessingCallback; +import android.app.ondeviceintelligence.ProcessingSignal; import android.app.ondeviceintelligence.StreamingProcessingCallback; import android.app.ondeviceintelligence.TokenInfo; import android.content.Context; import android.content.Intent; +import android.os.Bundle; import android.os.CancellationSignal; import android.os.Handler; import android.os.HandlerExecutor; @@ -292,15 +292,15 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { /** * Provides read-only access to the internal app storage via the - * {@link OnDeviceIntelligenceService}. This is an asynchronous implementation for + * {@link OnDeviceIntelligenceService}. This is an asynchronous alternative for * {@link #openFileInput(String)}. * * @param fileName File name relative to the {@link Context#getFilesDir()}. - * @param resultConsumer Consumer to populate the corresponding file stream in. + * @param resultConsumer Consumer to populate the corresponding file descriptor in. */ - public final void openFileInputAsync(@NonNull String fileName, + public final void getReadOnlyFileDescriptor(@NonNull String fileName, @NonNull @CallbackExecutor Executor executor, - @NonNull Consumer<FileInputStream> resultConsumer) throws FileNotFoundException { + @NonNull Consumer<ParcelFileDescriptor> resultConsumer) throws FileNotFoundException { AndroidFuture<ParcelFileDescriptor> future = new AndroidFuture<>(); try { mRemoteStorageService.getReadOnlyFileDescriptor(fileName, future); @@ -314,7 +314,7 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { executor.execute(() -> resultConsumer.accept(null)); } else { executor.execute( - () -> resultConsumer.accept(new FileInputStream(pfd.getFileDescriptor()))); + () -> resultConsumer.accept(pfd)); } }, executor); } @@ -328,12 +328,12 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { * @param resultConsumer Consumer to receive a map of filePath to the corresponding file input * stream. */ - public final void fetchFeatureFileInputStreamMap(@NonNull Feature feature, + public final void fetchFeatureFileDescriptorMap(@NonNull Feature feature, @NonNull @CallbackExecutor Executor executor, - @NonNull Consumer<Map<String, FileInputStream>> resultConsumer) { + @NonNull Consumer<Map<String, ParcelFileDescriptor>> resultConsumer) { try { mRemoteStorageService.getReadOnlyFeatureFileDescriptorMap(feature, - wrapResultReceiverAsReadOnly(resultConsumer, executor)); + wrapAsRemoteCallback(resultConsumer, executor)); } catch (RemoteException e) { throw new RuntimeException(e); } @@ -359,22 +359,18 @@ public abstract class OnDeviceSandboxedInferenceService extends Service { } - private RemoteCallback wrapResultReceiverAsReadOnly( - @NonNull Consumer<Map<String, FileInputStream>> resultConsumer, + private RemoteCallback wrapAsRemoteCallback( + @NonNull Consumer<Map<String, ParcelFileDescriptor>> resultConsumer, @NonNull Executor executor) { return new RemoteCallback(result -> { if (result == null) { executor.execute(() -> resultConsumer.accept(new HashMap<>())); } else { - Map<String, FileInputStream> bundleMap = new HashMap<>(); - result.keySet().forEach(key -> { - ParcelFileDescriptor pfd = result.getParcelable(key, - ParcelFileDescriptor.class); - if (pfd != null) { - bundleMap.put(key, new FileInputStream(pfd.getFileDescriptor())); - } - }); - executor.execute(() -> resultConsumer.accept(bundleMap)); + Map<String, ParcelFileDescriptor> pfdMap = new HashMap<>(); + result.keySet().forEach(key -> + pfdMap.put(key, result.getParcelable(key, + ParcelFileDescriptor.class))); + executor.execute(() -> resultConsumer.accept(pfdMap)); } }); } diff --git a/core/java/android/service/persistentdata/PersistentDataBlockManager.java b/core/java/android/service/persistentdata/PersistentDataBlockManager.java index 9b9cc1933b93..7a1c75a6034f 100644 --- a/core/java/android/service/persistentdata/PersistentDataBlockManager.java +++ b/core/java/android/service/persistentdata/PersistentDataBlockManager.java @@ -19,6 +19,7 @@ package android.service.persistentdata; import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.SystemApi; @@ -100,7 +101,7 @@ public class PersistentDataBlockManager { */ @SystemApi @SuppressLint("RequiresPermission") - public int write(byte[] data) { + public int write(@Nullable byte[] data) { try { return sService.write(data); } catch (RemoteException e) { @@ -115,7 +116,7 @@ public class PersistentDataBlockManager { */ @SystemApi @SuppressLint("RequiresPermission") - public byte[] read() { + public @Nullable byte[] read() { try { return sService.read(); } catch (RemoteException e) { diff --git a/core/java/android/view/ImeInsetsSourceConsumer.java b/core/java/android/view/ImeInsetsSourceConsumer.java index 821e13d85370..b30002228d54 100644 --- a/core/java/android/view/ImeInsetsSourceConsumer.java +++ b/core/java/android/view/ImeInsetsSourceConsumer.java @@ -49,9 +49,9 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { /** * Tracks whether we have an outstanding request from the IME to show, but weren't able to - * execute it because we didn't have control yet. + * execute it because we didn't have control yet, or we didn't have a leash on the control yet. */ - private boolean mIsRequestedVisibleAwaitingControl; + private boolean mIsRequestedVisibleAwaitingLeash; public ImeInsetsSourceConsumer( int id, InsetsState state, Supplier<Transaction> transactionSupplier, @@ -68,7 +68,7 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { } final boolean insetsChanged = super.onAnimationStateChanged(running); if (!isShowRequested()) { - mIsRequestedVisibleAwaitingControl = false; + mIsRequestedVisibleAwaitingLeash = false; if (!running && !mHasPendingRequest) { final var statsToken = ImeTracker.forLogging().onStart(ImeTracker.TYPE_HIDE, ImeTracker.ORIGIN_CLIENT, @@ -91,8 +91,8 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { public void onWindowFocusGained(boolean hasViewFocus) { super.onWindowFocusGained(hasViewFocus); getImm().registerImeConsumer(this); - if ((mController.getRequestedVisibleTypes() & getType()) != 0 && getControl() == null) { - mIsRequestedVisibleAwaitingControl = true; + if ((mController.getRequestedVisibleTypes() & getType()) != 0 && !hasLeash()) { + mIsRequestedVisibleAwaitingLeash = true; } } @@ -100,7 +100,7 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { public void onWindowFocusLost() { super.onWindowFocusLost(); getImm().unregisterImeConsumer(this); - mIsRequestedVisibleAwaitingControl = false; + mIsRequestedVisibleAwaitingLeash = false; } @Override @@ -130,15 +130,15 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { ImeTracker.forLogging().onProgress(statsToken, ImeTracker.PHASE_CLIENT_INSETS_CONSUMER_REQUEST_SHOW); - if (getControl() == null) { - // If control is null, schedule to show IME when control is available. - mIsRequestedVisibleAwaitingControl = true; + if (!hasLeash()) { + // If control or leash is null, schedule to show IME when both available. + mIsRequestedVisibleAwaitingLeash = true; } // If we had a request before to show from IME (tracked with mImeRequestedShow), reaching // this code here means that we now got control, so we can start the animation immediately. // If client window is trying to control IME and IME is already visible, it is immediate. if (fromIme - || (mState.isSourceOrDefaultVisible(getId(), getType()) && getControl() != null)) { + || (mState.isSourceOrDefaultVisible(getId(), getType()) && hasLeash())) { return ShowResult.SHOW_IMMEDIATELY; } @@ -148,9 +148,9 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { void requestHide(boolean fromIme, @Nullable ImeTracker.Token statsToken) { if (!fromIme) { - // Create a new token to track the hide request when we have control, + // Create a new token to track the hide request when we have control and leash, // as we use the passed in token for the insets animation already. - final var notifyStatsToken = getControl() != null + final var notifyStatsToken = hasLeash() ? ImeTracker.forLogging().onStart(ImeTracker.TYPE_HIDE, ImeTracker.ORIGIN_CLIENT, SoftInputShowHideReason.HIDE_SOFT_INPUT_REQUEST_HIDE_WITH_CONTROL, @@ -176,7 +176,7 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { ImeTracker.PHASE_CLIENT_INSETS_CONSUMER_NOTIFY_HIDDEN); getImm().notifyImeHidden(mController.getHost().getWindowToken(), statsToken); - mIsRequestedVisibleAwaitingControl = false; + mIsRequestedVisibleAwaitingLeash = false; Trace.asyncTraceEnd(TRACE_TAG_VIEW, "IC.hideRequestFromApi", 0); } @@ -196,19 +196,28 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { if (!super.setControl(control, showTypes, hideTypes)) { return false; } - if (control == null && !mIsRequestedVisibleAwaitingControl) { + final boolean hasLeash = control != null && control.getLeash() != null; + if (!hasLeash && !mIsRequestedVisibleAwaitingLeash) { mController.setRequestedVisibleTypes(0 /* visibleTypes */, getType()); removeSurface(); } - if (control != null) { - mIsRequestedVisibleAwaitingControl = false; + if (hasLeash) { + mIsRequestedVisibleAwaitingLeash = false; } return true; } @Override protected boolean isRequestedVisibleAwaitingControl() { - return super.isRequestedVisibleAwaitingControl() || mIsRequestedVisibleAwaitingControl; + return super.isRequestedVisibleAwaitingControl() || mIsRequestedVisibleAwaitingLeash; + } + + /** + * Checks whether the consumer has an insets source control with a leash. + */ + private boolean hasLeash() { + final var control = getControl(); + return control != null && control.getLeash() != null; } @Override @@ -224,7 +233,7 @@ public final class ImeInsetsSourceConsumer extends InsetsSourceConsumer { public void dumpDebug(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); super.dumpDebug(proto, INSETS_SOURCE_CONSUMER); - proto.write(IS_REQUESTED_VISIBLE_AWAITING_CONTROL, mIsRequestedVisibleAwaitingControl); + proto.write(IS_REQUESTED_VISIBLE_AWAITING_CONTROL, mIsRequestedVisibleAwaitingLeash); proto.write(HAS_PENDING_REQUEST, mHasPendingRequest); proto.end(token); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 0ac893665241..0a75f4e6d731 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -18,6 +18,7 @@ package android.view; import static android.content.res.Resources.ID_NULL; import static android.os.Trace.TRACE_TAG_APP; +import static android.os.Trace.TRACE_TAG_VIEW; import static android.service.autofill.Flags.FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION; import static android.view.ContentInfo.SOURCE_DRAG_AND_DROP; import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH; @@ -16356,20 +16357,20 @@ public class View implements Drawable.Callback, KeyEvent.Callback, ListenerInfo li = mListenerInfo; if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED) { try { - Trace.traceBegin(Trace.TRACE_TAG_VIEW, "View.onTouchListener#onTouch"); + Trace.traceBegin(TRACE_TAG_VIEW, "View.onTouchListener#onTouch"); handled = li.mOnTouchListener.onTouch(this, event); } finally { - Trace.traceEnd(Trace.TRACE_TAG_VIEW); + Trace.traceEnd(TRACE_TAG_VIEW); } } if (handled) { return true; } try { - Trace.traceBegin(Trace.TRACE_TAG_VIEW, "View#onTouchEvent"); + Trace.traceBegin(TRACE_TAG_VIEW, "View#onTouchEvent"); return onTouchEvent(event); } finally { - Trace.traceEnd(Trace.TRACE_TAG_VIEW); + Trace.traceEnd(TRACE_TAG_VIEW); } } @@ -23846,14 +23847,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback, public void buildDrawingCache(boolean autoScale) { if ((mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == 0 || (autoScale ? mDrawingCache == null : mUnscaledDrawingCache == null)) { - if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { - Trace.traceBegin(Trace.TRACE_TAG_VIEW, + if (Trace.isTagEnabled(TRACE_TAG_VIEW)) { + Trace.traceBegin(TRACE_TAG_VIEW, "buildDrawingCache/SW Layer for " + getClass().getSimpleName()); } try { buildDrawingCacheImpl(autoScale); } finally { - Trace.traceEnd(Trace.TRACE_TAG_VIEW); + Trace.traceEnd(TRACE_TAG_VIEW); } } } @@ -28980,6 +28981,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, surface.copyFrom(surfaceControl); IBinder token = null; try { + Trace.traceBegin(TRACE_TAG_VIEW, "startDragAndDrop#drawDragShadow"); final Canvas canvas = isHardwareAccelerated() ? surface.lockHardwareCanvas() : surface.lockCanvas(null); @@ -28988,33 +28990,40 @@ public class View implements Drawable.Callback, KeyEvent.Callback, shadowBuilder.onDrawShadow(canvas); } finally { surface.unlockCanvasAndPost(canvas); + Trace.traceEnd(TRACE_TAG_VIEW); } - token = mAttachInfo.mSession.performDrag(mAttachInfo.mWindow, flags, surfaceControl, - root.getLastTouchSource(), root.getLastTouchDeviceId(), - root.getLastTouchPointerId(), lastTouchPoint.x, lastTouchPoint.y, - shadowTouchPoint.x, shadowTouchPoint.y, data); - if (ViewDebug.DEBUG_DRAG) { - Log.d(VIEW_LOG_TAG, "performDrag returned " + token); - } - if (token != null) { - if (mAttachInfo.mDragSurface != null) { - mAttachInfo.mDragSurface.release(); - } - if (mAttachInfo.mDragData != null) { - View.cleanUpPendingIntents(mAttachInfo.mDragData); + Trace.traceBegin(TRACE_TAG_VIEW, "startDragAndDrop#performDrag"); + try { + token = mAttachInfo.mSession.performDrag(mAttachInfo.mWindow, flags, surfaceControl, + root.getLastTouchSource(), root.getLastTouchDeviceId(), + root.getLastTouchPointerId(), lastTouchPoint.x, lastTouchPoint.y, + shadowTouchPoint.x, shadowTouchPoint.y, data); + if (ViewDebug.DEBUG_DRAG) { + Log.d(VIEW_LOG_TAG, "performDrag returned " + token); } - mAttachInfo.mDragSurface = surface; - mAttachInfo.mDragToken = token; - mAttachInfo.mDragData = data; - // Cache the local state object for delivery with DragEvents - root.setLocalDragState(myLocalState); - if (a11yEnabled) { - // Set for AccessibilityEvents - mAttachInfo.mViewRootImpl.setDragStartedViewForAccessibility(this); + if (token != null) { + if (mAttachInfo.mDragSurface != null) { + mAttachInfo.mDragSurface.release(); + } + if (mAttachInfo.mDragData != null) { + // Clean up previous drag data intents + View.cleanUpPendingIntents(mAttachInfo.mDragData); + } + mAttachInfo.mDragSurface = surface; + mAttachInfo.mDragToken = token; + mAttachInfo.mDragData = data; + // Cache the local state object for delivery with DragEvents + root.setLocalDragState(myLocalState); + if (a11yEnabled) { + // Set for AccessibilityEvents + mAttachInfo.mViewRootImpl.setDragStartedViewForAccessibility(this); + } } + return token != null; + } finally { + Trace.traceEnd(TRACE_TAG_VIEW); } - return token != null; } catch (Exception e) { Log.e(VIEW_LOG_TAG, "Unable to initiate drag", e); return false; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 8c3cf5f7fe71..cae66720e49e 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -21,8 +21,10 @@ import static android.content.pm.ActivityInfo.OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS; import static android.graphics.HardwareRenderer.SYNC_CONTEXT_IS_STOPPED; import static android.graphics.HardwareRenderer.SYNC_LOST_SURFACE_REWARD_IF_FOUND; import static android.os.IInputConstants.INVALID_INPUT_EVENT_ID; +import static android.os.Trace.TRACE_TAG_VIEW; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; +import static android.view.DragEvent.ACTION_DRAG_LOCATION; import static android.view.InputDevice.SOURCE_CLASS_NONE; import static android.view.InsetsSource.ID_IME; import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH; @@ -6473,7 +6475,18 @@ public final class ViewRootImpl implements ViewParent, DragEvent event = (DragEvent) msg.obj; // only present when this app called startDrag() event.mLocalState = mLocalDragState; - handleDragEvent(event); + final boolean traceDragEvent = event.mAction != ACTION_DRAG_LOCATION; + try { + if (traceDragEvent) { + Trace.traceBegin(TRACE_TAG_VIEW, + "c#" + DragEvent.actionToString(event.mAction)); + } + handleDragEvent(event); + } finally { + if (traceDragEvent) { + Trace.traceEnd(TRACE_TAG_VIEW); + } + } } break; case MSG_DISPATCH_SYSTEM_UI_VISIBILITY: { handleDispatchSystemUiVisibilityChanged(); diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index c127a432f0bb..107c5f20acde 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -5871,7 +5871,10 @@ public interface WindowManager extends ViewManager { && height == WindowManager.LayoutParams.MATCH_PARENT; } - private static String layoutInDisplayCutoutModeToString( + /** + * @hide + */ + public static String layoutInDisplayCutoutModeToString( @LayoutInDisplayCutoutMode int mode) { switch (mode) { case LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT: diff --git a/core/java/android/view/accessibility/OWNERS b/core/java/android/view/accessibility/OWNERS index 73d134146c3f..b0943e9cff62 100644 --- a/core/java/android/view/accessibility/OWNERS +++ b/core/java/android/view/accessibility/OWNERS @@ -1,16 +1,13 @@ -# Bug component: 44214 +# Bug component: 44215 -romainguy@google.com -alanv@google.com -adamp@google.com -aurimas@google.com -nduca@google.com -sumir@google.com -ogunwale@google.com -jjaggi@google.com -pweaver@google.com -ryanlwlin@google.com -danielnorman@google.com -sallyyuen@google.com -aarmaly@google.com -fuego@google.com +# Android Accessibility Framework owners +include /services/accessibility/OWNERS + +# Android members outside of Accessibility +adamp@google.com #{LAST_RESORT_SUGGESTION} +alanv@google.com #{LAST_RESORT_SUGGESTION} +aurimas@google.com #{LAST_RESORT_SUGGESTION} +jjaggi@google.com #{LAST_RESORT_SUGGESTION} +ogunwale@google.com #{LAST_RESORT_SUGGESTION} +romainguy@google.com #{LAST_RESORT_SUGGESTION} +sumir@google.com #{LAST_RESORT_SUGGESTION} diff --git a/core/java/com/android/internal/accessibility/OWNERS b/core/java/com/android/internal/accessibility/OWNERS index 0955e005791e..1265dfa2c441 100644 --- a/core/java/com/android/internal/accessibility/OWNERS +++ b/core/java/com/android/internal/accessibility/OWNERS @@ -1,6 +1,4 @@ -# Bug component: 44214 -pweaver@google.com -danielnorman@google.com -sallyyuen@google.com -aarmaly@google.com -fuego@google.com +# Bug component: 44215 + +# Android Accessibility Framework owners +include /services/accessibility/OWNERS
\ No newline at end of file diff --git a/core/java/com/android/internal/os/CpuScalingPolicyReader.java b/core/java/com/android/internal/os/CpuScalingPolicyReader.java index 0d272fdd1578..720577eadd19 100644 --- a/core/java/com/android/internal/os/CpuScalingPolicyReader.java +++ b/core/java/com/android/internal/os/CpuScalingPolicyReader.java @@ -129,6 +129,9 @@ public class CpuScalingPolicyReader { String[] strings = contents.split(" "); intArray.clear(); for (String s : strings) { + if (s.isBlank()) { + continue; + } try { intArray.add(Integer.parseInt(s)); } catch (NumberFormatException e) { diff --git a/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java b/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java index 5e89d06facd1..e1aff2af0965 100644 --- a/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java +++ b/core/java/com/android/internal/pm/parsing/pkg/PackageImpl.java @@ -3281,6 +3281,11 @@ public class PackageImpl implements ParsedPackage, AndroidPackageInternal, } public PackageImpl(Parcel in) { + this(in, /* callback */ null); + } + + public PackageImpl(@NonNull Parcel in, @Nullable ParsingPackageUtils.Callback callback) { + mCallback = callback; // We use the boot classloader for all classes that we load. final ClassLoader boot = Object.class.getClassLoader(); this.supportsSmallScreens = sForBoolean.unparcel(in); diff --git a/core/java/com/android/internal/policy/TransitionAnimation.java b/core/java/com/android/internal/policy/TransitionAnimation.java index 40a437f300f3..9dec1027d398 100644 --- a/core/java/com/android/internal/policy/TransitionAnimation.java +++ b/core/java/com/android/internal/policy/TransitionAnimation.java @@ -129,7 +129,6 @@ public class TransitionAnimation { private final int mDefaultWindowAnimationStyleResId; private final boolean mDebug; - private final boolean mGridLayoutRecentsEnabled; private final boolean mLowRamRecentsEnabled; public TransitionAnimation(Context context, boolean debug, String tag) { @@ -166,7 +165,6 @@ public class TransitionAnimation { mConfigShortAnimTime = context.getResources().getInteger( com.android.internal.R.integer.config_shortAnimTime); - mGridLayoutRecentsEnabled = SystemProperties.getBoolean("ro.recents.grid", false); mLowRamRecentsEnabled = ActivityManager.isLowRamDeviceStatic(); final TypedArray windowStyle = mContext.getTheme().obtainStyledAttributes( @@ -768,10 +766,8 @@ public class TransitionAnimation { // We scale the width and clip to the top/left square float scale = thumbWidth / (appWidth - contentInsets.left - contentInsets.right); - if (!mGridLayoutRecentsEnabled) { - int unscaledThumbHeight = (int) (thumbHeight / scale); - mTmpFromClipRect.bottom = mTmpFromClipRect.top + unscaledThumbHeight; - } + int unscaledThumbHeight = (int) (thumbHeight / scale); + mTmpFromClipRect.bottom = mTmpFromClipRect.top + unscaledThumbHeight; Animation scaleAnim = new ScaleAnimation( scaleUp ? scale : 1, scaleUp ? 1 : scale, @@ -887,12 +883,6 @@ public class TransitionAnimation { toY = appRect.height() / 2 * (1 - 1 / scaleW) + appRect.top; pivotX = mTmpRect.width() / 2; pivotY = appRect.height() / 2 / scaleW; - if (mGridLayoutRecentsEnabled) { - // In the grid layout, the header is displayed above the thumbnail instead of - // overlapping it. - fromY -= thumbHeightI; - toY -= thumbHeightI * scaleW; - } } else { pivotX = 0; pivotY = 0; @@ -936,10 +926,7 @@ public class TransitionAnimation { // This AnimationSet uses the Interpolators assigned above. AnimationSet set = new AnimationSet(false); set.addAnimation(scale); - if (!mGridLayoutRecentsEnabled) { - // In the grid layout, the header should be shown for the whole animation. - set.addAnimation(alpha); - } + set.addAnimation(alpha); set.addAnimation(translate); set.addAnimation(clipAnim); a = set; @@ -958,10 +945,7 @@ public class TransitionAnimation { // This AnimationSet uses the Interpolators assigned above. AnimationSet set = new AnimationSet(false); set.addAnimation(scale); - if (!mGridLayoutRecentsEnabled) { - // In the grid layout, the header should be shown for the whole animation. - set.addAnimation(alpha); - } + set.addAnimation(alpha); set.addAnimation(translate); a = set; @@ -1081,8 +1065,7 @@ public class TransitionAnimation { * @return whether the transition should show the thumbnail being scaled down. */ private boolean shouldScaleDownThumbnailTransition(int orientation) { - return mGridLayoutRecentsEnabled - || orientation == Configuration.ORIENTATION_PORTRAIT; + return orientation == Configuration.ORIENTATION_PORTRAIT; } private static int updateToTranslucentAnimIfNeeded(int anim, @TransitionOldType int transit) { diff --git a/core/res/Android.bp b/core/res/Android.bp index 79b13765dcc6..a44e92ca4019 100644 --- a/core/res/Android.bp +++ b/core/res/Android.bp @@ -156,6 +156,7 @@ android_app { generate_product_characteristics_rro: true, flags_packages: [ + "android.app.contextualsearch.flags-aconfig", "android.content.pm.flags-aconfig", "android.provider.flags-aconfig", "camera_platform_flags", diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 12320d708293..31f2d8b13794 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -154,6 +154,7 @@ <protected-broadcast android:name="android.app.backup.intent.INIT" /> <protected-broadcast android:name="android.bluetooth.intent.DISCOVERABLE_TIMEOUT" /> + <protected-broadcast android:name="android.bluetooth.action.AUTO_ON_STATE_CHANGED" /> <protected-broadcast android:name="android.bluetooth.adapter.action.STATE_CHANGED" /> <protected-broadcast android:name="android.bluetooth.adapter.action.SCAN_MODE_CHANGED" /> <protected-broadcast android:name="android.bluetooth.adapter.action.DISCOVERY_STARTED" /> @@ -6776,11 +6777,12 @@ <permission android:name="android.permission.MANAGE_BIOMETRIC_DIALOG" android:protectionLevel="signature" /> - <!-- Allows an application to set the BiometricDialog (SystemUI) logo . + <!-- Allows an application to set the advanced features on BiometricDialog (SystemUI), including + logo, logo description. <p>Not for use by third-party applications. @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt") --> - <permission android:name="android.permission.SET_BIOMETRIC_DIALOG_LOGO" + <permission android:name="android.permission.SET_BIOMETRIC_DIALOG_ADVANCED" android:protectionLevel="signature|privileged" /> <!-- Allows an application to control keyguard. Only allowed for system processes. @@ -7208,6 +7210,13 @@ <permission android:name="android.permission.ACCESS_SMARTSPACE" android:protectionLevel="signature|privileged|development" /> + <!-- @SystemApi Allows an application to start a contextual search. + @FlaggedApi("android.app.contextualsearch.flags.enable_service") + @hide <p>Not for use by third-party applications.</p> --> + <permission android:name="android.permission.ACCESS_CONTEXTUAL_SEARCH" + android:protectionLevel="signature|privileged" + android:featureFlag="android.app.contextualsearch.flags.enable_service"/> + <!-- @SystemApi Allows an application to manage the wallpaper effects generation service. @hide <p>Not for use by third-party applications.</p> --> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 09d23fa82da1..5e435124f46e 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Jy kan boodskappe stuur en ontvang sonder ’n selfoon- of wi-fi-netwerk"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Maak Boodskappe oop"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Hoe dit werk"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Hangend …"</string> </resources> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 6de4a20252f0..a06d4d4a0b9a 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"ያለ ሞባይል ወይም የWi-Fi አውታረ መረብ መልዕክቶችን መላክ እና መቀበል ይችላሉ"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"መልዕክቶች ይክፈቱ"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"እንዴት እንደሚሠራ"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"በመጠባበቅ ላይ..."</string> </resources> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 3e98391416e9..894371cd46e8 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -2397,6 +2397,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"يمكنك إرسال الرسائل واستلامها بدون شبكة الجوّال أو شبكة Wi-Fi."</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"فتح تطبيق \"الرسائل\""</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"طريقة العمل"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"بانتظار الإزالة من الأرشيف…"</string> </resources> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 0e3773b06fdd..b1af54f96f1c 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"আপুনি ম’বাইল বা ৱাই-ফাই নেটৱৰ্কৰ জৰিয়তে পাঠ বাৰ্তা পঠিয়াব বা লাভ কৰিব পাৰে"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages খোলক"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"ই কেনেকৈ কাম কৰে"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"বিবেচনাধীন হৈ আছে..."</string> </resources> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 98ec79861393..0d0d102fa999 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Mobil və ya Wi-Fi şəbəkəsi olmadan mesaj göndərə və qəbul edə bilərsiniz"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Mesajı açın"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Haqqında"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Gözləmədə..."</string> </resources> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 04b5a3869ac7..653a06bbf6f2 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Možete da šaljete i primate poruke bez mobilne ili WiFi mreže"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otvori Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Princip rada"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Na čekanju..."</string> </resources> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index bb1b2d3973cc..2f517a587bd6 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -2395,6 +2395,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Вы можаце адпраўляць і атрымліваць паведамленні без доступу да мабільнай сеткі або Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Адкрыць Паведамленні"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Як гэта працуе"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"У чаканні..."</string> </resources> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index b03faf7072e4..1b486fbac0c4 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Можете да изпращате и получавате съобщения без мобилна или Wi-Fi мрежа"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Отваряне на Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Начин на работа"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Изчаква..."</string> </resources> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index f637f5af8bf4..b9fde04e2d00 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"আপনি কোনও মেবাইল বা ওয়াই-ফাই নেটওয়ার্ক ছাড়াই মেসেজ পাঠাতে ও পেতে পারবেন"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages খুলুন"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"এটি কীভাবে কাজ করে"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"বাকি আছে…"</string> </resources> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 9700fe150d80..2414b7e07574 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Možete slati i primati poruke bez mobilne ili WiFi mreže"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otvorite Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Kako ovo funkcionira"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Na čekanju…"</string> </resources> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index e56b8bcf02b3..8e733ec39545 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Pots enviar i rebre missatges sense una xarxa mòbil o Wi‑Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Obre Missatges"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Com funciona"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Pendent..."</string> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 0c168e59eeb3..dee6bbb1dc2d 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -2395,6 +2395,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Zprávy můžete odesílat a přijímat bez mobilní sítě nebo sítě Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otevřít Zprávy"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Jak to funguje"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Čeká na vyřízení…"</string> </resources> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index aa037c7983d2..bde7dbdfac8b 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -338,7 +338,7 @@ <string name="permgrouplab_phone" msgid="570318944091926620">"Telefon"</string> <string name="permgroupdesc_phone" msgid="270048070781478204">"foretage og administrere telefonopkald"</string> <string name="permgrouplab_sensors" msgid="9134046949784064495">"Kropssensorer"</string> - <string name="permgroupdesc_sensors" msgid="2610631290633747752">"få adgang til sensordata om dine livstegn"</string> + <string name="permgroupdesc_sensors" msgid="2610631290633747752">"få adgang til sensordata om dine vitale værdier"</string> <string name="permgrouplab_notifications" msgid="5472972361980668884">"Notifikationer"</string> <string name="permgroupdesc_notifications" msgid="4608679556801506580">"vise notifikationer"</string> <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"Hente indholdet i vinduet"</string> @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Du kan sende og modtage beskeder uden et mobil- eller Wi-Fi-netværk"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Åbn Beskeder"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Sådan fungerer det"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Afventer…"</string> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 9f1af2400d98..27d3848bbf46 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Du kannst Nachrichten ohne Mobilfunknetz oder WLAN senden und empfangen"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages öffnen"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"So funktionierts"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Ausstehend…"</string> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index bc4d92914b26..1f9c09fd3d07 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Μπορείτε να στέλνετε και να λαμβάνετε μηνύματα χωρίς δίκτυο κινητής τηλεφωνίας ή Wi-Fi."</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Άνοιγμα Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Πώς λειτουργεί"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Σε εκκρεμότητα…"</string> </resources> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 969bbbfb5630..907026a5c2c8 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"You can send and receive messages without a mobile or Wi-Fi network"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Open Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"How it works"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Pending…"</string> </resources> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 0a890b21f7a2..a3f50c50748e 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"You can send and receive messages without a mobile or Wi-Fi network"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Open Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"How it works"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Pending…"</string> </resources> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 5ca52366355c..72d89fbba907 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"You can send and receive messages without a mobile or Wi-Fi network"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Open Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"How it works"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Pending…"</string> </resources> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 65e53dbd9dac..c23ad312edfe 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Puedes enviar y recibir mensajes incluso si no tienes conexión a una red móvil o Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abrir Mensajes"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Cómo funciona"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Pendiente…"</string> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index a0e4a512cc6a..def340d329d9 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Puedes enviar y recibir mensajes sin una red móvil o Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abre Mensajes"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Cómo funciona"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Pendiente..."</string> </resources> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index d6553abb8bef..90a98a5ced13 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Teil on võimalik sõnumeid saata ja vastu võtta ilma mobiilside- ja WiFi-võrguta"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Ava rakendus Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Tööpõhimõtted"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Ootel …"</string> </resources> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index bdf946e8074e..45d9e2503fe5 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Mezuak bidal eta jaso ditzakezu sare mugikorrik edo wifi-sarerik gabe"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Ireki Mezuak"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Nola funtzionatzen du?"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Zain…"</string> </resources> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 827ddaab9e4d..c1a1b827f8db 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"میتوانید بدون شبکه تلفن همراه یا Wi-Fi پیام ارسال و دریافت کنید"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"باز کردن «پیامها»"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"روش کار"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"درحال تعلیق…"</string> </resources> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index dca0e26e2615..88ede78d10c9 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Voit lähettää ja vastaanottaa viestejä ilman mobiili‑ tai Wi-Fi-verkkoa"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Avaa Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Näin se toimii"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Odottaa…"</string> </resources> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index dc030bbac03c..12176c89f489 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Vous pouvez envoyer et recevoir des messages sans avoir recours à un appareil mobile ou à un réseau Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Ouvrir Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Fonctionnement"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"En attente…"</string> </resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 31754e40c1d5..91b2e3481dd7 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Vous pouvez envoyer et recevoir des messages sans connexion au réseau mobile ou Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Ouvrir Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Fonctionnement"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"En attente…"</string> </resources> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 1b99b4b89510..4f1b88e622e2 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Podes enviar e recibir mensaxes sen unha rede de telefonía móbil ou wifi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abrir Mensaxes"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Como funciona?"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Pendente..."</string> </resources> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 57c09da6a8ce..6bd19ea90498 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"તમે મોબાઇલ અથવા વાઇ-ફાઇ નેટવર્ક વિના મેસેજ મોકલી અને પ્રાપ્ત કરી શકો છો"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ખોલો"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"તેની કામ કરવાની રીત"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"બાકી..."</string> </resources> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 6bba6b00765c..53c3c6325840 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"मोबाइल या वाई-फ़ाई नेटवर्क के बिना भी मैसेज भेजे और पाए जा सकते हैं"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ऐप्लिकेशन खोलें"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"यह सेटिंग कैसे काम करती है"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"प्रोसेस जारी है..."</string> </resources> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 75ca762ddf03..69d88f0b017c 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Možete slati i primati poruke bez mobilne mreže ili Wi-Fi mreže"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otvori Poruke"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Kako to funkcionira"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Na čekanju..."</string> </resources> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index c825bd728ae4..8a3d5519e576 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Küldhet és fogadhat üzeneteket mobil- és Wi-Fi-hálózat nélkül is"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"A Messages megnyitása"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Hogyan működik?"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Függőben…"</string> </resources> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 1745f27219a1..84d18c7f818d 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Դուք կարող եք ուղարկել և ստանալ հաղորդագրություններ՝ առանց բջջային կամ Wi-Fi կապի"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Բացել Messages-ը"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Ինչպես է դա աշխատում"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Առկախ է…"</string> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index af1ec297802a..aadf58d39002 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Anda dapat mengirim dan menerima pesan tanpa jaringan seluler atau Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Buka Message"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Cara kerjanya"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Tertunda..."</string> </resources> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index d921828ffe2b..c56e35faee32 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Þú getur sent og móttekið skilaboð án tengingar við farsímakerfi eða Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Opna Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Svona virkar þetta"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Í bið…"</string> </resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 86640f8e23b0..1c12a97865f9 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Puoi inviare e ricevere messaggi senza una rete mobile o Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Apri Messaggi"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Come funziona"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"In attesa…"</string> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index d0ad38c33d60..744c2ed8b09d 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"אפשר לשלוח ולקבל הודעות ללא רשת סלולרית או רשת Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"לפתיחת Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"איך זה עובד"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"בהמתנה..."</string> </resources> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index f8990841849d..576e1df90aee 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -2175,7 +2175,7 @@ <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"ヘッドセット: フック"</string> <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"画面上のユーザー補助機能のショートカット"</string> <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"画面上のユーザー補助機能のショートカットの選択メニュー"</string> - <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ユーザー補助機能のショートカット"</string> + <string name="accessibility_system_action_hardware_a11y_shortcut_label" msgid="5764644187715255107">"ユーザー補助のショートカット"</string> <string name="accessibility_system_action_dismiss_notification_shade" msgid="8931637495533770352">"通知シェードを閉じる"</string> <string name="accessibility_system_action_dpad_up_label" msgid="1029042950229333782">"D-pad: 上"</string> <string name="accessibility_system_action_dpad_down_label" msgid="3441918448624921461">"D-pad: 下"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index e4e60428541b..43f13a332807 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"შეგიძლიათ გაგზავნოთ და მიიღოთ შეტყობინებები მობილური ან Wi-Fi ქსელის გარეშე"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages-ის გახსნა"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"მუშაობის პრინციპი"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"მომლოდინე..."</string> </resources> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index e9d00c787285..e029b70bbc42 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Мобильдік не Wi-Fi желісіне қосылмастан хабар жібере аласыз және ала аласыз."</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages қолданбасын ашу"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Бұл қалай орындалады?"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Дайын емес…"</string> </resources> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 118e6e62ceeb..1dee12ebaf0f 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"អ្នកអាចផ្ញើ និងទទួលសារដោយមិនប្រើបណ្តាញទូរសព្ទចល័ត ឬ Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"បើកកម្មវិធី Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"របៀបដែលវាដំណើរការ"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"កំពុងរង់ចាំ..."</string> </resources> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 4331819039a0..1574a84edc4e 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -1861,7 +1861,7 @@ <string name="write_fail_reason_cannot_write" msgid="432118118378451508">"ವಿಷಯವನ್ನು ಬರೆಯುವಲ್ಲಿ ದೋಷ ಎದುರಾಗಿದೆ"</string> <string name="reason_unknown" msgid="5599739807581133337">"ಅಪರಿಚಿತ"</string> <string name="reason_service_unavailable" msgid="5288405248063804713">"ಮುದ್ರಣ ಸೇವೆ ಸಕ್ರಿಯಗೊಂಡಿಲ್ಲ"</string> - <string name="print_service_installed_title" msgid="6134880817336942482">"<xliff:g id="NAME">%s</xliff:g> ಸೇವೆಯನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆ"</string> + <string name="print_service_installed_title" msgid="6134880817336942482">"<xliff:g id="NAME">%s</xliff:g> ಸೇವೆಯನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="print_service_installed_message" msgid="7005672469916968131">"ಸಕ್ರಿಯಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="restr_pin_enter_admin_pin" msgid="1199419462726962697">"ನಿರ್ವಾಹಕ ಪಿನ್ ನಮೂದಿಸಿ"</string> <string name="restr_pin_enter_pin" msgid="373139384161304555">"ಪಿನ್ ನಮೂದಿಸಿ"</string> @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"ನೀವು ಮೊಬೈಲ್ ಅಥವಾ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ ಇಲ್ಲದೆಯೇ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಬಹುದು ಮತ್ತು ಸ್ವೀಕರಿಸಬಹುದು"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ಅನ್ನು ತೆರೆಯಿರಿ"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"ಇದು ಹೇಗೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"ಬಾಕಿ ಉಳಿದಿದೆ..."</string> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 8975b4327361..75d4a2d51659 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"모바일 또는 Wi-Fi 네트워크 없이 메시지를 주고 받을 수 있습니다"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"메시지 열기"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"작동 방식"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"대기 중…"</string> </resources> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index c8b5981671ba..118a54260ecd 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Сиз мобилдик же Wi-Fi тармагы жок эле билдирүүлөрдү жөнөтүп, ала аласыз"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Жазышуулар колдонмосун ачуу"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Ал кантип иштейт"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Кезекте турат..."</string> </resources> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 06a572df4080..7057324465fb 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"ທ່ານສາມາດສົ່ງ ແລະ ຮັບຂໍ້ຄວາມໂດຍບໍ່ຕ້ອງໃຊ້ເຄືອຂ່າຍມືຖື ຫຼື Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"ເປີດ Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"ມັນເຮັດວຽກແນວໃດ"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"ລໍຖ້າດຳເນີນການ..."</string> </resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 98bcca9bf9db..e3405d60a0a7 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -2395,6 +2395,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Galite siųsti ir gauti pranešimus be mobiliojo ryšio ar „Wi-Fi“ tinklo"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Atidaryti programą „Messages“"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Kaip tai veikia"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Laukiama..."</string> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 6ed95d34f4d7..d297856a2e1d 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Varat sūtīt un saņemt ziņojumus bez mobilā vai Wi-Fi tīkla."</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Atvērt lietotni Ziņojumi"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Darbības principi"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Gaida…"</string> </resources> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 3a60709fac15..a15aa6e5e7f7 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Може да испраќате и примате пораки без мобилна или Wi-Fi мрежа"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Отворете ја Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Дознајте како функционира"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Во фаза на чекање…"</string> </resources> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 55633dc442b8..8043293f83d4 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"മൊബൈലോ വൈഫൈ നെറ്റ്വർക്കോ ഇല്ലാതെ തന്നെ സന്ദേശങ്ങൾ അയയ്ക്കാനും സ്വീകരിക്കാനും നിങ്ങൾക്ക് കഴിയും"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages തുറക്കുക"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"ഇത് പ്രവർത്തിക്കുന്നത് എങ്ങനെയാണ്"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"തീർപ്പാക്കിയിട്ടില്ല..."</string> </resources> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index a9e1c1493044..615369c28b95 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Та мобайл эсвэл Wi-Fi сүлжээгүйгээр мессеж илгээх болон хүлээн авах боломжтой"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Мессежийг нээх"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Энэ хэрхэн ажилладаг вэ?"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Хүлээгдэж буй..."</string> </resources> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index c20bdb050be3..d96bb41f83d0 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"तुम्ही मोबाइल किंवा वाय-फाय नेटवर्कशिवाय मेसेज पाठवू आणि मिळवू शकता"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages उघडा"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"ते कसे काम करते"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"प्रलंबित आहे..."</string> </resources> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 9048ffc89cea..d794ae05af22 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Anda boleh menghantar dan menerima mesej tanpa rangkaian mudah alih atau Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Buka Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Cara ciri ini berfungsi"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Belum selesai..."</string> </resources> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 32aed951539b..825d3a635d88 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"မိုဘိုင်း (သို့) Wi-Fi ကွန်ရက်မရှိဘဲ မက်ဆေ့ဂျ်များကို ပို့နိုင်၊ လက်ခံနိုင်သည်"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ဖွင့်ရန်"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"အလုပ်လုပ်ပုံ"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"ဆိုင်းငံ့ထားသည်…"</string> </resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 41e217d3dd01..3c07ba71856a 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Du kan sende og motta meldinger uten mobil- eller wifi-nettverk"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Åpne Meldinger"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Slik fungerer det"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Venter …"</string> </resources> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 6f139cd0f3a0..8d0ac72ca0a2 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"तपाईं मोबाइल वा Wi-Fi नेटवर्कविनै म्यासेज पठाउन र प्राप्त गर्न सक्नुहुन्छ"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages खोल्नुहोस्"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"यसले काम गर्ने तरिका"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"विचाराधीन..."</string> </resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index b17d7a8acca0..bc2fc691b8ac 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Je kunt berichten sturen en krijgen zonder een mobiel of wifi-netwerk"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Berichten openen"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Hoe het werkt"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"In behandeling…"</string> </resources> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index ade7c82648a4..1b68a740a0f5 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"ଏକ ମୋବାଇଲ କିମ୍ବା ୱାଇ-ଫାଇ ନେଟୱାର୍କ ବିନା ଆପଣ ମେସେଜ ପଠାଇପାରିବେ ଏବଂ ପାଇପାରିବେ"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ଖୋଲନ୍ତୁ"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"ଏହା କିପରି କାମ କରେ"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"ବାକି ଅଛି…"</string> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 61814b7969bd..8f742eb624d5 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -2395,6 +2395,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Możesz wymieniać wiadomości bez dostępu do sieci komórkowej lub Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otwórz Wiadomości"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Jak to działa"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Oczekiwanie…"</string> </resources> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index cf1a200b91e8..786e58260f22 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Você pode enviar e receber mensagens sem um dispositivo móvel ou uma rede Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abrir o app Mensagens"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Como funciona"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Pendente…"</string> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 9f6b733b92a7..4418acd40a50 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1418,7 +1418,7 @@ <string name="share_remote_bugreport_action" msgid="7630880678785123682">"PARTILHAR"</string> <string name="decline_remote_bugreport_action" msgid="4040894777519784346">"RECUSAR"</string> <string name="select_input_method" msgid="3971267998568587025">"Escolher o método de entrada"</string> - <string name="show_ime" msgid="6406112007347443383">"Manter no ecrã enquanto o teclado físico estiver ativo"</string> + <string name="show_ime" msgid="6406112007347443383">"Mantê-lo no ecrã enquanto o teclado físico estiver ativo"</string> <string name="hardware" msgid="3611039921284836033">"Usar o teclado no ecrã"</string> <string name="select_keyboard_layout_notification_title" msgid="5823199895322205589">"Configure o dispositivo <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string> <string name="select_multiple_keyboards_layout_notification_title" msgid="6999491025126641938">"Configure teclados físicos"</string> @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Pode enviar e receber mensagens sem uma rede móvel ou Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abre a app Mensagens"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Como funciona"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Pendente…"</string> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index cf1a200b91e8..786e58260f22 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Você pode enviar e receber mensagens sem um dispositivo móvel ou uma rede Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Abrir o app Mensagens"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Como funciona"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Pendente…"</string> </resources> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 38b6e53bdcab..bc2eae17bf0d 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Poți să trimiți și să primești mesaje fără o rețea mobilă sau Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Deschide Mesaje"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Cum funcționează"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"În așteptare..."</string> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 866f316d8ab0..a476bca1d435 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -2395,6 +2395,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Вы можете отправлять и получать сообщения без доступа к мобильной сети или Wi-Fi."</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Открыть Сообщения"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Узнать принцип работы"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Обработка…"</string> </resources> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 3668de1ea039..8bbf199f5cc8 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"ඔබට ජංගම හෝ Wi-Fi ජාලයක් නොමැතිව පණිවිඩ යැවීමට සහ ලැබීමට හැක"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages විවෘත කරන්න"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"එය ක්රියා කරන ආකාරය"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"පොරොත්තුයි..."</string> </resources> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 1c642f62396d..928371d9825e 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1169,7 +1169,7 @@ <string name="elapsed_time_short_format_h_mm_ss" msgid="2302144714803345056">"<xliff:g id="HOURS">%1$d</xliff:g>:<xliff:g id="MINUTES">%2$02d</xliff:g>:<xliff:g id="SECONDS">%3$02d</xliff:g>"</string> <string name="selectAll" msgid="1532369154488982046">"Vybrať všetko"</string> <string name="cut" msgid="2561199725874745819">"Vystrihnúť"</string> - <string name="copy" msgid="5472512047143665218">"Kopírovať"</string> + <string name="copy" msgid="5472512047143665218">"Skopírovať"</string> <string name="failed_to_copy_to_clipboard" msgid="725919885138539875">"Nepodarilo sa skopírovať do schránky"</string> <string name="paste" msgid="461843306215520225">"Prilepiť"</string> <string name="paste_as_plain_text" msgid="7664800665823182587">"Prilepiť ako obyčajný text"</string> @@ -2395,6 +2395,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Správy môžete odosielať a prijímať bez mobilnej siete či siete Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Otvoriť Správy"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Ako to funguje"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Nespracovaná…"</string> </resources> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 0e72e0cd595b..e4abb4425ab7 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -2395,6 +2395,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Sporočila SMS lahko pošiljate in prejemate brez mobilnega omrežja ali omrežja Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Odpri Sporočila"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Kako deluje"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"V teku …"</string> </resources> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index caa34099d882..29d6fe5883aa 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Mund të dërgosh dhe të marrësh mesazhe pa një rrjet celular apo rrjet Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Hap \"Mesazhet\""</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Si funksionon"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Në pritje..."</string> </resources> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 75439d7c2fec..db9c849dd431 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -2394,6 +2394,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Можете да шаљете и примате поруке без мобилне или WiFi мреже"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Отвори Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Принцип рада"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"На чекању..."</string> </resources> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index be777f098df2..657eb2c9b25c 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Du kan skicka och ta emot meddelanden utan mobil- eller wifi-nätverk"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Öppna Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Så fungerar det"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Väntar …"</string> </resources> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 65c63212c1fd..83be3fcd63bf 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Unaweza kutuma na kupokea ujumbe bila mtandao wa simu au Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Fungua Programu ya Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Utaratibu wake"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Inashughulikiwa..."</string> </resources> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index b3d16d76c40d..362a18d20fce 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"மொபைல்/வைஃபை நெட்வொர்க் இல்லாமல் நீங்கள் மெசேஜ்களை அனுப்பலாம் பெறலாம்"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messages ஆப்ஸைத் திறக்கவும்"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"இது செயல்படும் விதம்"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"நிலுவையிலுள்ளது..."</string> </resources> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index c8778a423023..738b41010d76 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"మీరు మొబైల్ లేదా Wi-Fi నెట్వర్క్ లేకుండా మెసేజ్లను పంపవచ్చు, స్వీకరించవచ్చు"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Messagesను తెరవండి"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"ఇది ఎలా పని చేస్తుంది"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"పెండింగ్లో ఉంది..."</string> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 8a056893adb3..785636910d7e 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"คุณรับส่งข้อความผ่านดาวเทียมได้โดยไม่ต้องใช้เครือข่ายมือถือหรือ Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"เปิด Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"วิธีการทำงาน"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"รอดำเนินการ..."</string> </resources> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 3b3797a58ce1..f95c6b231dc7 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Puwede kang magpadala at tumanggap ng mga mensahe nang walang mobile o Wi-Fi network"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Buksan ang Messages"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Paano ito gumagana"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Nakabinbin..."</string> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 70ea4149cea6..963898329867 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Mobil veya kablosuz ağa bağlı olmadan mesaj alıp gönderebilirsiniz"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Mesajlar\'ı aç"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"İşleyiş şekli"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Bekliyor..."</string> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 9c7c8efe332b..640e7fc50f18 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -2395,6 +2395,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Ви можете надсилати й отримувати повідомлення, не використовуючи Wi-Fi або мобільну мережу"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Відкрийте Повідомлення"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Як це працює"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Обробка…"</string> </resources> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index e60299f0dbfd..f8f7dde56a59 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"آپ موبائل یا Wi-Fi نیٹ ورک کے بغیر پیغامات بھیج اور موصول کر سکتے ہیں"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"پیغامات ایپ کو کھولیں"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"اس کے کام کرنے کا طریقہ"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"زیر التواء..."</string> </resources> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 58e576b732bd..5c73637183ad 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Mobil yoki Wi-Fi tarmoqsiz xabarlarni yuborishingiz va qabul qilishingiz mumkin"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Xabarlar ilovasini ochish"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Ishlash tartibi"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Kutilmoqda..."</string> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index a8d8188c7015..2b39b8aa4745 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Bạn có thể gửi và nhận tin nhắn mà không cần có mạng di động hoặc mạng Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Mở ứng dụng Tin nhắn"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Cách hoạt động"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Đang chờ xử lý..."</string> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index b0f052ee53ec..036e91f722a1 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1417,7 +1417,7 @@ <string name="share_remote_bugreport_action" msgid="7630880678785123682">"分享"</string> <string name="decline_remote_bugreport_action" msgid="4040894777519784346">"拒绝"</string> <string name="select_input_method" msgid="3971267998568587025">"选择输入法"</string> - <string name="show_ime" msgid="6406112007347443383">"开启后,连接到实体键盘时,它会一直显示在屏幕上"</string> + <string name="show_ime" msgid="6406112007347443383">"连接到实体键盘时,在屏幕上显示一个虚拟键盘"</string> <string name="hardware" msgid="3611039921284836033">"使用屏幕键盘"</string> <string name="select_keyboard_layout_notification_title" msgid="5823199895322205589">"配置“<xliff:g id="DEVICE_NAME">%s</xliff:g>”"</string> <string name="select_multiple_keyboards_layout_notification_title" msgid="6999491025126641938">"配置物理键盘"</string> @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"您无需使用移动网络或 WLAN 网络便能收发消息"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"打开“信息”应用"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"运作方式"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"待归档…"</string> </resources> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 0bf9079bd7f2..460067f26e73 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"你可在沒有流動/Wi-Fi 網絡的情況下收發訊息"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"開啟「訊息」"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"運作方式"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"待處理…"</string> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index c15262d6ff7b..1a6b1d5b87fa 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1586,7 +1586,7 @@ <string name="keyboardview_keycode_done" msgid="2524518019001653851">"完成"</string> <string name="keyboardview_keycode_mode_change" msgid="2743735349997999020">"模式變更"</string> <string name="keyboardview_keycode_shift" msgid="3026509237043975573">"Shift 鍵"</string> - <string name="keyboardview_keycode_enter" msgid="168054869339091055">"Enter 鍵"</string> + <string name="keyboardview_keycode_enter" msgid="168054869339091055">"Enter"</string> <string name="activitychooserview_choose_application" msgid="3500574466367891463">"選擇應用程式"</string> <string name="activitychooserview_choose_application_error" msgid="6937782107559241734">"無法啟動 <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="shareactionprovider_share_with" msgid="2753089758467748982">"分享對象:"</string> @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"你可以收發訊息,沒有行動/Wi-Fi 網路也無妨"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"開啟「訊息」應用程式"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"運作方式"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"待處理…"</string> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 91050bf5ba1e..cf4858ec4a31 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -2393,6 +2393,5 @@ <string name="satellite_notification_summary" msgid="5207364139430767162">"Ungathumela futhi wamukele imilayezo ngaphandle kwenethiwekhi yeselula noma ye-Wi-Fi"</string> <string name="satellite_notification_open_message" msgid="4149234979688273729">"Vula Imilayezo"</string> <string name="satellite_notification_how_it_works" msgid="3132069321977520519">"Indlela esebenza ngayo"</string> - <!-- no translation found for unarchival_session_app_label (6811856981546348205) --> - <skip /> + <string name="unarchival_session_app_label" msgid="6811856981546348205">"Ilindile..."</string> </resources> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 48cf09a84e57..81c79f23af46 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -4484,6 +4484,21 @@ <attr name="autoTransact" format="boolean"/> </declare-styleable> + <!-- Specify one or more <code>polling-loop-pattern-filter</code> elements inside a + <code>host-apdu-service</code> to indicate polling loop frames that + your service can handle. --> + <!-- @FlaggedApi("android.nfc.Flags.FLAG_NFC_READ_POLLING_LOOP") --> + <declare-styleable name="PollingLoopPatternFilter"> + <!-- The patter to match polling loop frames to, must to be compatible with + {@link java.util.regex.Pattern#compile(String)} and only contain hexadecimal numbers and + `.`, `?` and `*` operators. This attribute is mandatory. --> + <attr name="name" /> + <!-- Whether or not the system should automatically start a transaction when this polling + loop filter matches. If not set, default value is false. --> + <!-- @FlaggedApi("android.nfc.Flags.FLAG_NFC_READ_POLLING_LOOP") --> + <attr name="autoTransact" format="boolean"/> + </declare-styleable> + <!-- Use <code>host-nfcf-service</code> as the root tag of the XML resource that describes an {@link android.nfc.cardemulation.HostNfcFService} service, which is referenced from its {@link android.nfc.cardemulation.HostNfcFService#SERVICE_META_DATA} @@ -8988,6 +9003,14 @@ <!-- Whether to show clock and other complications such as weather in the overlay. Default to true. Note that the overlay on dreams is currently only supported on tablets. --> <attr name="showClockAndComplications" format="boolean" /> + + <!-- Dream Category to determine the type of dream. Default to default. + @hide --> + <attr name="dreamCategory" format="integer"> + <flag name="none" value="0x0" /> + <flag name="low_light" value="0x1" /> + <flag name="home_panel" value="0x2" /> + </attr> </declare-styleable> <!-- Use <code>trust-agent</code> as the root tag of the XML resource that diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index b879c9794f39..417c6df1e30d 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -238,204 +238,204 @@ <color name="conversation_important_highlight">#F9AB00</color> - <!-- Lightest shade of the accent color used by the system. White. - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent1_0">#ffffff</color> - <!-- Shade of the accent system color at 99% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent1_10">#F9FCFF</color> - <!-- Shade of the accent system color at 95% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent1_50">#E0F3FF</color> - <!-- Shade of the accent system color at 90% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent1_100">#C1E8FF</color> - <!-- Shade of the accent system color at 80% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent1_200">#76D1FF</color> - <!-- Shade of the accent system color at 70% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent1_300">#4BB6E8</color> - <!-- Shade of the accent system color at 60% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent1_400">#219BCC</color> - <!-- Shade of the accent system color at 49.6% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent1_500">#007FAC</color> - <!-- Shade of the accent system color at 40% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent1_600">#00668B</color> - <!-- Shade of the accent system color at 30% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent1_700">#004C69</color> - <!-- Shade of the accent system color at 20% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent1_800">#003549</color> - <!-- Shade of the accent system color at 10% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent1_900">#001E2C</color> - <!-- Darkest shade of the accent color used by the system. Black. - This value can be overlaid at runtime by OverlayManager RROs. --> + <!--Lightest shade of the Primary color used by the system. White. + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent1_0">#FFFFFF</color> + <!--Shade of the Primary system color at 99% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent1_10">#FEFBFF</color> + <!--Shade of the Primary system color at 95% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent1_50">#EEF0FF</color> + <!--Shade of the Primary system color at 90% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent1_100">#D9E2FF</color> + <!--Shade of the Primary system color at 80% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent1_200">#B0C6FF</color> + <!--Shade of the Primary system color at 70% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent1_300">#94AAE4</color> + <!--Shade of the Primary system color at 60% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent1_400">#7A90C8</color> + <!--Shade of the Primary system color at 50% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent1_500">#6076AC</color> + <!--Shade of the Primary system color at 40% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent1_600">#475D92</color> + <!--Shade of the Primary system color at 30% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent1_700">#2F4578</color> + <!--Shade of the Primary system color at 20% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent1_800">#152E60</color> + <!--Shade of the Primary system color at 10% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent1_900">#001945</color> + <!--Darkest shade of the Primary color used by the system. Black. + This value can be overlaid at runtime by OverlayManager RROs.--> <color name="system_accent1_1000">#000000</color> - <!-- Lightest shade of the secondary accent color used by the system. White. - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent2_0">#ffffff</color> - <!-- Shade of the secondary accent system color at 99% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent2_10">#F9FCFF</color> - <!-- Shade of the secondary accent system color at 95% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent2_50">#E0F3FF</color> - <!-- Shade of the secondary accent system color at 90% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent2_100">#D1E5F4</color> - <!-- Shade of the secondary accent system color at 80% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent2_200">#B5CAD7</color> - <!-- Shade of the secondary accent system color at 70% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent2_300">#9AAEBB</color> - <!-- Shade of the secondary accent system color at 60% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent2_400">#8094A0</color> - <!-- Shade of the secondary accent system color at 49.6% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent2_500">#657985</color> - <!-- Shade of the secondary accent system color at 40% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent2_600">#4E616C</color> - <!-- Shade of the secondary accent system color at 30% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent2_700">#374955</color> - <!-- Shade of the secondary accent system color at 20% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent2_800">#20333D</color> - <!-- Shade of the secondary accent system color at 10% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent2_900">#091E28</color> - <!-- Darkest shade of the secondary accent color used by the system. Black. - This value can be overlaid at runtime by OverlayManager RROs. --> + <!--Lightest shade of the Secondary color used by the system. White. + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent2_0">#FFFFFF</color> + <!--Shade of the Secondary system color at 99% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent2_10">#FEFBFF</color> + <!--Shade of the Secondary system color at 95% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent2_50">#EEF0FF</color> + <!--Shade of the Secondary system color at 90% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent2_100">#DCE2F9</color> + <!--Shade of the Secondary system color at 80% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent2_200">#C0C6DC</color> + <!--Shade of the Secondary system color at 70% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent2_300">#A4ABC1</color> + <!--Shade of the Secondary system color at 60% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent2_400">#8A90A5</color> + <!--Shade of the Secondary system color at 50% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent2_500">#70778B</color> + <!--Shade of the Secondary system color at 40% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent2_600">#575E71</color> + <!--Shade of the Secondary system color at 30% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent2_700">#404659</color> + <!--Shade of the Secondary system color at 20% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent2_800">#2A3042</color> + <!--Shade of the Secondary system color at 10% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent2_900">#151B2C</color> + <!--Darkest shade of the Secondary color used by the system. Black. + This value can be overlaid at runtime by OverlayManager RROs.--> <color name="system_accent2_1000">#000000</color> - <!-- Lightest shade of the tertiary accent color used by the system. White. - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent3_0">#ffffff</color> - <!-- Shade of the tertiary accent system color at 99% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> + <!--Lightest shade of the Tertiary color used by the system. White. + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent3_0">#FFFFFF</color> + <!--Shade of the Tertiary system color at 99% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> <color name="system_accent3_10">#FFFBFF</color> - <!-- Shade of the tertiary accent system color at 95% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent3_50">#F5EEFF</color> - <!-- Shade of the tertiary accent system color at 90% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent3_100">#E6DEFF</color> - <!-- Shade of the tertiary accent system color at 80% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent3_200">#CAC1EA</color> - <!-- Shade of the tertiary accent system color at 70% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent3_300">#AEA6CE</color> - <!-- Shade of the tertiary accent system color at 60% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent3_400">#938CB1</color> - <!-- Shade of the tertiary accent system color at 49% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent3_500">#787296</color> - <!-- Shade of the tertiary accent system color at 40% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent3_600">#605A7C</color> - <!-- Shade of the tertiary accent system color at 30% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent3_700">#484264</color> - <!-- Shade of the tertiary accent system color at 20% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent3_800">#322C4C</color> - <!-- Shade of the tertiary accent system color at 10% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_accent3_900">#1D1736</color> - <!-- Darkest shade of the tertiary accent color used by the system. Black. - This value can be overlaid at runtime by OverlayManager RROs. --> + <!--Shade of the Tertiary system color at 95% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent3_50">#FFEBFA</color> + <!--Shade of the Tertiary system color at 90% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent3_100">#FDD7FA</color> + <!--Shade of the Tertiary system color at 80% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent3_200">#E0BBDD</color> + <!--Shade of the Tertiary system color at 70% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent3_300">#C3A0C1</color> + <!--Shade of the Tertiary system color at 60% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent3_400">#A886A6</color> + <!--Shade of the Tertiary system color at 50% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent3_500">#8C6D8C</color> + <!--Shade of the Tertiary system color at 40% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent3_600">#725572</color> + <!--Shade of the Tertiary system color at 30% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent3_700">#593D59</color> + <!--Shade of the Tertiary system color at 20% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent3_800">#412742</color> + <!--Shade of the Tertiary system color at 10% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_accent3_900">#2A122C</color> + <!--Darkest shade of the Tertiary color used by the system. Black. + This value can be overlaid at runtime by OverlayManager RROs.--> <color name="system_accent3_1000">#000000</color> - <!-- Lightest shade of the neutral color used by the system. White. - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral1_0">#ffffff</color> - <!-- Shade of the neutral system color at 99% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral1_10">#FCFCFF</color> - <!-- Shade of the neutral system color at 95% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral1_50">#F0F0F3</color> - <!-- Shade of the neutral system color at 90% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral1_100">#E1E3E5</color> - <!-- Shade of the neutral system color at 80% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral1_200">#C5C7C9</color> - <!-- Shade of the neutral system color at 70% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral1_300">#AAABAE</color> - <!-- Shade of the neutral system color at 60% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral1_400">#8F9193</color> - <!-- Shade of the neutral system color at 49% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral1_500">#747679</color> - <!-- Shade of the neutral system color at 40% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral1_600">#5C5F61</color> - <!-- Shade of the neutral system color at 30% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral1_700">#454749</color> - <!-- Shade of the neutral system color at 20% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral1_800">#2E3133</color> - <!-- Shade of the neutral system color at 10% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral1_900">#191C1E</color> - <!-- Darkest shade of the neutral color used by the system. Black. - This value can be overlaid at runtime by OverlayManager RROs. --> + <!--Lightest shade of the Neutral color used by the system. White. + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral1_0">#FFFFFF</color> + <!--Shade of the Neutral system color at 99% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral1_10">#FEFBFF</color> + <!--Shade of the Neutral system color at 95% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral1_50">#F1F0F7</color> + <!--Shade of the Neutral system color at 90% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral1_100">#E2E2E9</color> + <!--Shade of the Neutral system color at 80% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral1_200">#C6C6CD</color> + <!--Shade of the Neutral system color at 70% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral1_300">#ABABB1</color> + <!--Shade of the Neutral system color at 60% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral1_400">#909097</color> + <!--Shade of the Neutral system color at 50% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral1_500">#76777D</color> + <!--Shade of the Neutral system color at 40% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral1_600">#5D5E64</color> + <!--Shade of the Neutral system color at 30% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral1_700">#45464C</color> + <!--Shade of the Neutral system color at 20% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral1_800">#2F3036</color> + <!--Shade of the Neutral system color at 10% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral1_900">#1A1B20</color> + <!--Darkest shade of the Neutral color used by the system. Black. + This value can be overlaid at runtime by OverlayManager RROs.--> <color name="system_neutral1_1000">#000000</color> - <!-- Lightest shade of the secondary neutral color used by the system. White. - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral2_0">#ffffff</color> - <!-- Shade of the secondary neutral system color at 99% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral2_10">#F9FCFF</color> - <!-- Shade of the secondary neutral system color at 95% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral2_50">#EBF1F8</color> - <!-- Shade of the secondary neutral system color at 90% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral2_100">#DCE3E9</color> - <!-- Shade of the secondary neutral system color at 80% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral2_200">#C0C7CD</color> - <!-- Shade of the secondary neutral system color at 70% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral2_300">#A5ACB2</color> - <!-- Shade of the secondary neutral system color at 60% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral2_400">#8A9297</color> - <!-- Shade of the secondary neutral system color at 49% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral2_500">#70777C</color> - <!-- Shade of the secondary neutral system color at 40% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral2_600">#585F65</color> - <!-- Shade of the secondary neutral system color at 30% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral2_700">#40484D</color> - <!-- Shade of the secondary neutral system color at 20% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral2_800">#2A3136</color> - <!-- Shade of the secondary neutral system color at 10% perceptual luminance (L* in L*a*b* color space). - This value can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_neutral2_900">#161C20</color> - <!-- Darkest shade of the secondary neutral color used by the system. Black. - This value can be overlaid at runtime by OverlayManager RROs. --> + <!--Lightest shade of the Secondary Neutral color used by the system. White. + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral2_0">#FFFFFF</color> + <!--Shade of the Secondary Neutral system color at 99% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral2_10">#FEFBFF</color> + <!--Shade of the Secondary Neutral system color at 95% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral2_50">#F0F0FA</color> + <!--Shade of the Secondary Neutral system color at 90% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral2_100">#E1E2EC</color> + <!--Shade of the Secondary Neutral system color at 80% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral2_200">#C5C6D0</color> + <!--Shade of the Secondary Neutral system color at 70% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral2_300">#A9ABB4</color> + <!--Shade of the Secondary Neutral system color at 60% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral2_400">#8F9099</color> + <!--Shade of the Secondary Neutral system color at 50% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral2_500">#757780</color> + <!--Shade of the Secondary Neutral system color at 40% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral2_600">#5C5E67</color> + <!--Shade of the Secondary Neutral system color at 30% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral2_700">#44464F</color> + <!--Shade of the Secondary Neutral system color at 20% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral2_800">#2E3038</color> + <!--Shade of the Secondary Neutral system color at 10% perceptual luminance (L* in L*a*b* color space). + This value can be overlaid at runtime by OverlayManager RROs.--> + <color name="system_neutral2_900">#191B23</color> + <!--Darkest shade of the Secondary Neutral color used by the system. Black. + This value can be overlaid at runtime by OverlayManager RROs.--> <color name="system_neutral2_1000">#000000</color> <!-- Lightest shade of the error color used by the system. White. @@ -480,106 +480,106 @@ <!-- Colors used in Android system, from design system. These values can be overlaid at runtime by OverlayManager RROs. --> - <color name="system_primary_container_light">#D8E2FF</color> - <color name="system_on_primary_container_light">#001A41</color> - <color name="system_primary_light">#445E91</color> + <color name="system_primary_container_light">#5E73A9</color> + <color name="system_on_primary_container_light">#FFFFFF</color> + <color name="system_primary_light">#2A4174</color> <color name="system_on_primary_light">#FFFFFF</color> - <color name="system_secondary_container_light">#DBE2F9</color> - <color name="system_on_secondary_container_light">#141B2C</color> - <color name="system_secondary_light">#575E71</color> + <color name="system_secondary_container_light">#6E7488</color> + <color name="system_on_secondary_container_light">#FFFFFF</color> + <color name="system_secondary_light">#3C4255</color> <color name="system_on_secondary_light">#FFFFFF</color> - <color name="system_tertiary_container_light">#FBD7FC</color> - <color name="system_on_tertiary_container_light">#29132D</color> - <color name="system_tertiary_light">#715573</color> + <color name="system_tertiary_container_light">#8A6A89</color> + <color name="system_on_tertiary_container_light">#FFFFFF</color> + <color name="system_tertiary_light">#553A55</color> <color name="system_on_tertiary_light">#FFFFFF</color> - <color name="system_background_light">#FAF9FD</color> - <color name="system_on_background_light">#1B1B1F</color> - <color name="system_surface_light">#FAF9FD</color> - <color name="system_on_surface_light">#1B1B1F</color> - <color name="system_surface_container_low_light">#F5F3F7</color> + <color name="system_background_light">#FAF8FF</color> + <color name="system_on_background_light">#1A1B20</color> + <color name="system_surface_light">#FAF8FF</color> + <color name="system_on_surface_light">#1A1B20</color> + <color name="system_surface_container_low_light">#F4F3FA</color> <color name="system_surface_container_lowest_light">#FFFFFF</color> - <color name="system_surface_container_light">#EFEDF1</color> - <color name="system_surface_container_high_light">#E9E7EC</color> - <color name="system_surface_container_highest_light">#E3E2E6</color> - <color name="system_surface_bright_light">#FAF9FD</color> - <color name="system_surface_dim_light">#DBD9DD</color> + <color name="system_surface_container_light">#EEEDF4</color> + <color name="system_surface_container_high_light">#E8E7EF</color> + <color name="system_surface_container_highest_light">#E2E2E9</color> + <color name="system_surface_bright_light">#FAF8FF</color> + <color name="system_surface_dim_light">#DAD9E0</color> <color name="system_surface_variant_light">#E1E2EC</color> - <color name="system_on_surface_variant_light">#44474F</color> - <color name="system_outline_light">#72747D</color> - <color name="system_outline_variant_light">#C4C7C5</color> - <color name="system_error_light">#C00003</color> + <color name="system_on_surface_variant_light">#40434B</color> + <color name="system_outline_light">#5D5F67</color> + <color name="system_outline_variant_light">#797A83</color> + <color name="system_error_light">#8C0009</color> <color name="system_on_error_light">#FFFFFF</color> - <color name="system_error_container_light">#FFDAD5</color> - <color name="system_on_error_container_light">#410000</color> - <color name="system_primary_fixed">#D8E2FF</color> - <color name="system_primary_fixed_dim">#ADC6FF</color> - <color name="system_on_primary_fixed">#001A41</color> - <color name="system_on_primary_fixed_variant">#2B4678</color> - <color name="system_secondary_fixed">#DBE2F9</color> - <color name="system_secondary_fixed_dim">#BFC6DC</color> - <color name="system_on_secondary_fixed">#141B2C</color> - <color name="system_on_secondary_fixed_variant">#3F4759</color> - <color name="system_tertiary_fixed">#FBD7FC</color> - <color name="system_tertiary_fixed_dim">#DEBCDF</color> - <color name="system_on_tertiary_fixed">#29132D</color> - <color name="system_on_tertiary_fixed_variant">#583E5B</color> - <color name="system_control_activated_light">#D8E2FF</color> - <color name="system_control_normal_light">#44474F</color> - <color name="system_control_highlight_light">#1F000000</color> - <color name="system_text_primary_inverse_light">#E3E2E6</color> - <color name="system_text_secondary_and_tertiary_inverse_light">#C4C6D0</color> - <color name="system_text_primary_inverse_disable_only_light">#E3E2E6</color> - <color name="system_text_secondary_and_tertiary_inverse_disabled_light">#E3E2E6</color> - <color name="system_text_hint_inverse_light">#E3E2E6</color> - <color name="system_palette_key_color_primary_light">#5D77AC</color> - <color name="system_palette_key_color_secondary_light">#6C7488</color> - <color name="system_palette_key_color_tertiary_light">#907292</color> - <color name="system_palette_key_color_neutral_light">#838387</color> - <color name="system_palette_key_color_neutral_variant_light">#777982</color> - <color name="system_primary_container_dark">#2B4678</color> - <color name="system_on_primary_container_dark">#D8E2FF</color> - <color name="system_primary_dark">#ADC6FF</color> - <color name="system_on_primary_dark">#102F60</color> - <color name="system_secondary_container_dark">#3F4759</color> - <color name="system_on_secondary_container_dark">#DBE2F9</color> - <color name="system_secondary_dark">#BFC6DC</color> - <color name="system_on_secondary_dark">#293041</color> - <color name="system_tertiary_container_dark">#583E5B</color> - <color name="system_on_tertiary_container_dark">#FBD7FC</color> - <color name="system_tertiary_dark">#DEBCDF</color> - <color name="system_on_tertiary_dark">#402843</color> - <color name="system_background_dark">#121316</color> - <color name="system_on_background_dark">#E3E2E6</color> - <color name="system_surface_dark">#121316</color> - <color name="system_on_surface_dark">#E3E2E6</color> - <color name="system_surface_container_low_dark">#1B1B1F</color> - <color name="system_surface_container_lowest_dark">#0D0E11</color> - <color name="system_surface_container_dark">#1F1F23</color> - <color name="system_surface_container_high_dark">#292A2D</color> - <color name="system_surface_container_highest_dark">#343538</color> - <color name="system_surface_bright_dark">#38393C</color> - <color name="system_surface_dim_dark">#121316</color> - <color name="system_surface_variant_dark">#44474F</color> - <color name="system_on_surface_variant_dark">#C4C6D0</color> - <color name="system_outline_dark">#8E9099</color> - <color name="system_outline_variant_dark">#444746</color> - <color name="system_error_dark">#FFB4A8</color> - <color name="system_on_error_dark">#690001</color> - <color name="system_error_container_dark">#930001</color> - <color name="system_on_error_container_dark">#FFDAD5</color> - <color name="system_control_activated_dark">#2B4678</color> - <color name="system_control_normal_dark">#C4C6D0</color> - <color name="system_control_highlight_dark">#33FFFFFF</color> - <color name="system_text_primary_inverse_dark">#1B1B1F</color> - <color name="system_text_secondary_and_tertiary_inverse_dark">#44474F</color> - <color name="system_text_primary_inverse_disable_only_dark">#1B1B1F</color> - <color name="system_text_secondary_and_tertiary_inverse_disabled_dark">#1B1B1F</color> - <color name="system_text_hint_inverse_dark">#1B1B1F</color> - <color name="system_palette_key_color_primary_dark">#5D77AC</color> - <color name="system_palette_key_color_secondary_dark">#6C7488</color> - <color name="system_palette_key_color_tertiary_dark">#907292</color> - <color name="system_palette_key_color_neutral_dark">#838387</color> - <color name="system_palette_key_color_neutral_variant_dark">#777982</color> + <color name="system_error_container_light">#DA342E</color> + <color name="system_on_error_container_light">#FFFFFF</color> + <color name="system_control_activated_light">#D9E2FF</color> + <color name="system_control_normal_light">#44464F</color> + <color name="system_control_highlight_light">#000000</color> + <color name="system_text_primary_inverse_light">#E2E2E9</color> + <color name="system_text_secondary_and_tertiary_inverse_light">#C5C6D0</color> + <color name="system_text_primary_inverse_disable_only_light">#E2E2E9</color> + <color name="system_text_secondary_and_tertiary_inverse_disabled_light">#E2E2E9</color> + <color name="system_text_hint_inverse_light">#E2E2E9</color> + <color name="system_palette_key_color_primary_light">#6076AC</color> + <color name="system_palette_key_color_secondary_light">#70778B</color> + <color name="system_palette_key_color_tertiary_light">#8C6D8C</color> + <color name="system_palette_key_color_neutral_light">#76777D</color> + <color name="system_palette_key_color_neutral_variant_light">#757780</color> + <color name="system_primary_container_dark">#7A90C8</color> + <color name="system_on_primary_container_dark">#000000</color> + <color name="system_primary_dark">#B7CAFF</color> + <color name="system_on_primary_dark">#00143B</color> + <color name="system_secondary_container_dark">#8A90A5</color> + <color name="system_on_secondary_container_dark">#000000</color> + <color name="system_secondary_dark">#C4CAE1</color> + <color name="system_on_secondary_dark">#0F1626</color> + <color name="system_tertiary_container_dark">#A886A6</color> + <color name="system_on_tertiary_container_dark">#000000</color> + <color name="system_tertiary_dark">#E4BFE2</color> + <color name="system_on_tertiary_dark">#240D26</color> + <color name="system_background_dark">#121318</color> + <color name="system_on_background_dark">#E2E2E9</color> + <color name="system_surface_dark">#121318</color> + <color name="system_on_surface_dark">#FCFAFF</color> + <color name="system_surface_container_low_dark">#1A1B20</color> + <color name="system_surface_container_lowest_dark">#0C0E13</color> + <color name="system_surface_container_dark">#1E1F25</color> + <color name="system_surface_container_high_dark">#282A2F</color> + <color name="system_surface_container_highest_dark">#33343A</color> + <color name="system_surface_bright_dark">#38393F</color> + <color name="system_surface_dim_dark">#121318</color> + <color name="system_surface_variant_dark">#44464F</color> + <color name="system_on_surface_variant_dark">#C9CAD4</color> + <color name="system_outline_dark">#A1A2AC</color> + <color name="system_outline_variant_dark">#81838C</color> + <color name="system_error_dark">#FFBAB1</color> + <color name="system_on_error_dark">#370001</color> + <color name="system_error_container_dark">#FF5449</color> + <color name="system_on_error_container_dark">#000000</color> + <color name="system_control_activated_dark">#2F4578</color> + <color name="system_control_normal_dark">#C5C6D0</color> + <color name="system_control_highlight_dark">#FFFFFF</color> + <color name="system_text_primary_inverse_dark">#1A1B20</color> + <color name="system_text_secondary_and_tertiary_inverse_dark">#44464F</color> + <color name="system_text_primary_inverse_disable_only_dark">#1A1B20</color> + <color name="system_text_secondary_and_tertiary_inverse_disabled_dark">#1A1B20</color> + <color name="system_text_hint_inverse_dark">#1A1B20</color> + <color name="system_palette_key_color_primary_dark">#6076AC</color> + <color name="system_palette_key_color_secondary_dark">#70778B</color> + <color name="system_palette_key_color_tertiary_dark">#8C6D8C</color> + <color name="system_palette_key_color_neutral_dark">#76777D</color> + <color name="system_palette_key_color_neutral_variant_dark">#757780</color> + <color name="system_primary_fixed">#5E73A9</color> + <color name="system_primary_fixed_dim">#455B8F</color> + <color name="system_on_primary_fixed">#FFFFFF</color> + <color name="system_on_primary_fixed_variant">#FFFFFF</color> + <color name="system_secondary_fixed">#6E7488</color> + <color name="system_secondary_fixed_dim">#555C6F</color> + <color name="system_on_secondary_fixed">#FFFFFF</color> + <color name="system_on_secondary_fixed_variant">#FFFFFF</color> + <color name="system_tertiary_fixed">#8A6A89</color> + <color name="system_tertiary_fixed_dim">#705270</color> + <color name="system_on_tertiary_fixed">#FFFFFF</color> + <color name="system_on_tertiary_fixed_variant">#FFFFFF</color> <!-- Accessibility shortcut icon background color --> <color name="accessibility_feature_background">#5F6368</color> <!-- Google grey 700 --> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index f59c0993c34f..e3f1cb619eb5 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -3586,14 +3586,6 @@ <!-- The minimum number of visible recent tasks to be presented to the user through the SystemUI. Can be -1 if there is no minimum limit. --> - <integer name="config_minNumVisibleRecentTasks_grid">-1</integer> - - <!-- The maximum number of visible recent tasks to be presented to the user through the - SystemUI. Can be -1 if there is no maximum limit. --> - <integer name="config_maxNumVisibleRecentTasks_grid">9</integer> - - <!-- The minimum number of visible recent tasks to be presented to the user through the - SystemUI. Can be -1 if there is no minimum limit. --> <integer name="config_minNumVisibleRecentTasks_lowRam">-1</integer> <!-- The maximum number of visible recent tasks to be presented to the user through the @@ -6985,4 +6977,8 @@ <!-- The key containing the branching boolean for legacy Search. --> <string name="config_defaultContextualSearchLegacyEnabled" translatable="false" /> + + <!-- Whether WM DisplayContent supports high performance transitions + (lower-end devices may want to disable) --> + <bool name="config_deviceSupportsHighPerfTransitions">true</bool> </resources> diff --git a/core/res/res/values/public-staging.xml b/core/res/res/values/public-staging.xml index 3303c076c090..4be8c1bb4627 100644 --- a/core/res/res/values/public-staging.xml +++ b/core/res/res/values/public-staging.xml @@ -167,6 +167,8 @@ <public name="shiftDrawingOffsetForStartOverhang" /> <!-- @FlaggedApi("android.view.flags.toolkit_set_frame_rate_read_only") --> <public name="windowIsFrameRatePowerSavingsBalanced"/> + <!-- @FlaggedApi("android.service.controls.flags.Flags.FLAG_HOME_PANEL_DREAM") --> + <public name="dreamCategory"/> </staging-public-group> <staging-public-group type="id" first-id="0x01bc0000"> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index c7e08e2b5b92..f915f038dc0d 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -400,6 +400,9 @@ <string name="scCellularNetworkSecurityTitle">Cellular network security</string> <!-- Summary of the cellular network security safety center source's status. --> <string name="scCellularNetworkSecuritySummary">Review settings</string> + <!-- Link passed to safety center for the Learn More button on notifications --> + <!-- DO NOT TRANSLATE --> + <string name="scCellularNetworkSecurityLearnMore" translatable="false"></string> <!-- Title of the safety center issue and notification when the phone's identifier is shared over the network. --> <string name="scIdentifierDisclosureIssueTitle">Device identifier accessed</string> <!-- Summary of the safety center issue and notification when the phone's identifier is shared over the network. --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index c603fa78b08e..f4b42f6b3fb2 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -392,8 +392,6 @@ <java-symbol type="string" name="config_hdmiCecSetMenuLanguageActivity" /> <java-symbol type="integer" name="config_minNumVisibleRecentTasks_lowRam" /> <java-symbol type="integer" name="config_maxNumVisibleRecentTasks_lowRam" /> - <java-symbol type="integer" name="config_minNumVisibleRecentTasks_grid" /> - <java-symbol type="integer" name="config_maxNumVisibleRecentTasks_grid" /> <java-symbol type="integer" name="config_minNumVisibleRecentTasks" /> <java-symbol type="integer" name="config_maxNumVisibleRecentTasks" /> <java-symbol type="integer" name="config_activeTaskDurationHours" /> @@ -956,6 +954,7 @@ <java-symbol type="string" name="roamingTextSearching" /> <java-symbol type="string" name="scCellularNetworkSecuritySummary" /> <java-symbol type="string" name="scCellularNetworkSecurityTitle" /> + <java-symbol type="string" name="scCellularNetworkSecurityLearnMore" /> <java-symbol type="string" name="scIdentifierDisclosureIssueSummary" /> <java-symbol type="string" name="scIdentifierDisclosureIssueTitle" /> <java-symbol type="string" name="scNullCipherIssueActionLearnMore" /> @@ -5376,4 +5375,7 @@ <java-symbol type="string" name="config_defaultContextualSearchLegacyEnabled" /> <java-symbol type="string" name="unarchival_session_app_label" /> + + <!-- Whether WM DisplayContent supports high performance transitions --> + <java-symbol type="bool" name="config_deviceSupportsHighPerfTransitions" /> </resources> diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java index 2905a5aa8c65..e118c98dd4da 100644 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java +++ b/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java @@ -31,7 +31,6 @@ import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.test.AndroidTestCase; import android.util.Log; -import android.util.Printer; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; @@ -47,15 +46,12 @@ import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Vector; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Phaser; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; @RunWith(AndroidJUnit4.class) @SmallTest @@ -407,138 +403,4 @@ public class SQLiteDatabaseTest { } assertFalse(allowed); } - - /** Dumpsys information about a single database. */ - - /** - * Collect and parse dumpsys output. This is not a full parser. It is only enough to support - * the unit tests. - */ - private static class Dumpsys { - // Regular expressions for parsing the output. Reportedly, regular expressions are - // expensive, so these are created only if a dumpsys object is created. - private static final Object sLock = new Object(); - static Pattern mPool; - static Pattern mConnection; - static Pattern mEntry; - static Pattern mSingleWord; - static Pattern mNone; - - // The raw strings read from dumpsys. Once loaded, this list never changes. - final ArrayList<String> mRaw = new ArrayList<>(); - - // Parsed dumpsys. This contains only the bits that are being tested. - static class Connection { - ArrayList<String> mRecent = new ArrayList<>(); - ArrayList<String> mLong = new ArrayList<>(); - } - static class Database { - String mPath; - ArrayList<Connection> mConnection = new ArrayList<>(); - } - ArrayList<Database> mDatabase; - ArrayList<String> mConcurrent; - - Dumpsys() { - SQLiteDebug.dump( - new Printer() { public void println(String x) { mRaw.add(x); } }, - new String[0]); - parse(); - } - - /** Parse the raw text. Return true if no errors were detected. */ - boolean parse() { - initialize(); - - // Reset the parsed information. This method may be called repeatedly. - mDatabase = new ArrayList<>(); - mConcurrent = new ArrayList<>(); - - Database current = null; - Connection connection = null; - Matcher matcher; - for (int i = 0; i < mRaw.size(); i++) { - final String line = mRaw.get(i); - matcher = mPool.matcher(line); - if (matcher.lookingAt()) { - current = new Database(); - mDatabase.add(current); - current.mPath = matcher.group(1); - continue; - } - matcher = mConnection.matcher(line); - if (matcher.lookingAt()) { - connection = new Connection(); - current.mConnection.add(connection); - continue; - } - - if (line.contains("Most recently executed operations")) { - i += readTable(connection.mRecent, i, mEntry); - continue; - } - - if (line.contains("Operations exceeding 2000ms")) { - i += readTable(connection.mLong, i, mEntry); - continue; - } - if (line.contains("Concurrently opened database files")) { - i += readTable(mConcurrent, i, mSingleWord); - continue; - } - } - return true; - } - - /** - * Read a series of lines following a header. Return the number of lines read. The input - * line number is the number of the header. - */ - private int readTable(List<String> s, int header, Pattern p) { - // Special case: if the first line is "<none>" then there are no more lines to the - // table. - if (lookingAt(header+1, mNone)) return 1; - - int i; - for (i = header + 1; i < mRaw.size() && lookingAt(i, p); i++) { - s.add(mRaw.get(i).trim()); - } - return i - header; - } - - /** Return true if the n'th raw line matches the pattern. */ - boolean lookingAt(int n, Pattern p) { - return p.matcher(mRaw.get(n)).lookingAt(); - } - - /** Compile the regular expressions the first time. */ - private static void initialize() { - synchronized (sLock) { - if (mPool != null) return; - mPool = Pattern.compile("Connection pool for (\\S+):"); - mConnection = Pattern.compile("\\s+Connection #(\\d+):"); - mEntry = Pattern.compile("\\s+(\\d+): "); - mSingleWord = Pattern.compile(" (\\S+)$"); - mNone = Pattern.compile("\\s+<none>$"); - } - } - } - - @Test - public void testDumpsys() throws Exception { - Dumpsys dumpsys = new Dumpsys(); - - assertEquals(1, dumpsys.mDatabase.size()); - // Note: cannot test mConcurrent because that attribute is not hermitic with respect to - // the tests. - - Dumpsys.Database db = dumpsys.mDatabase.get(0); - - // Work with normalized paths. - String wantPath = mDatabaseFile.toPath().toRealPath().toString(); - String realPath = new File(db.mPath).toPath().toRealPath().toString(); - assertEquals(wantPath, realPath); - - assertEquals(1, db.mConnection.size()); - } } diff --git a/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java b/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java index 2bd563191134..93a564208522 100644 --- a/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java +++ b/core/tests/coretests/src/android/os/PerformanceHintManagerTest.java @@ -243,25 +243,25 @@ public class PerformanceHintManagerTest { assumeNotNull(s); s.updateTargetWorkDuration(16); assertThrows(IllegalArgumentException.class, () -> { - s.reportActualWorkDuration(new WorkDuration(-1, 12, 8, 6, 1)); + s.reportActualWorkDuration(new WorkDuration(-1, 12, 8, 6)); }); assertThrows(IllegalArgumentException.class, () -> { - s.reportActualWorkDuration(new WorkDuration(0, 12, 8, 6, 1)); + s.reportActualWorkDuration(new WorkDuration(0, 12, 8, 6)); }); assertThrows(IllegalArgumentException.class, () -> { - s.reportActualWorkDuration(new WorkDuration(1, -1, 8, 6, 1)); + s.reportActualWorkDuration(new WorkDuration(1, -1, 8, 6)); }); assertThrows(IllegalArgumentException.class, () -> { - s.reportActualWorkDuration(new WorkDuration(1, 0, 8, 6, 1)); + s.reportActualWorkDuration(new WorkDuration(1, 0, 8, 6)); }); assertThrows(IllegalArgumentException.class, () -> { - s.reportActualWorkDuration(new WorkDuration(1, 12, -1, 6, 1)); + s.reportActualWorkDuration(new WorkDuration(1, 12, -1, 6)); }); assertThrows(IllegalArgumentException.class, () -> { - s.reportActualWorkDuration(new WorkDuration(1, 12, 0, 0, 1)); + s.reportActualWorkDuration(new WorkDuration(1, 12, 0, 0)); }); assertThrows(IllegalArgumentException.class, () -> { - s.reportActualWorkDuration(new WorkDuration(1, 12, 8, -1, 1)); + s.reportActualWorkDuration(new WorkDuration(1, 12, 8, -1)); }); } } diff --git a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java index fc1fbb5368dc..47b288993d11 100644 --- a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java +++ b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java @@ -28,6 +28,7 @@ import static org.mockito.AdditionalMatchers.and; import static org.mockito.AdditionalMatchers.not; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.notNull; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -140,6 +141,50 @@ public class ImeInsetsSourceConsumerTest { } @Test + public void testImeRequestedVisibleAwaitingLeash() { + // Set null control, then request show. + mController.onControlsChanged(new InsetsSourceControl[] { null }); + + InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { + // Request IME visible before control is available. + final var statsToken = ImeTracker.Token.empty(); + mImeConsumer.onWindowFocusGained(true); + mController.show(WindowInsets.Type.ime(), true /* fromIme */, statsToken); + // Called once through the show flow. + verify(mController).applyAnimation( + eq(WindowInsets.Type.ime()), eq(true) /* show */, eq(true) /* fromIme */, + eq(statsToken)); + // Clear previous invocations to verify this is never called with control without leash. + clearInvocations(mController); + + // set control without leash and verify visibility is not applied. + InsetsSourceControl control = new InsetsSourceControl(ID_IME, + WindowInsets.Type.ime(), null /* leash */, false, new Point(), Insets.NONE); + mController.onControlsChanged(new InsetsSourceControl[] { control }); + // IME show animation should not be triggered when control becomes available, + // as we have no leash. + verify(mController, never()).applyAnimation( + eq(WindowInsets.Type.ime()), eq(true) /* show */, eq(false) /* fromIme */, + and(not(eq(statsToken)), notNull())); + verify(mController, never()).applyAnimation( + eq(WindowInsets.Type.ime()), eq(false) /* show */, eq(false) /* fromIme */, + and(not(eq(statsToken)), notNull())); + + // set control with leash and verify visibility is applied. + InsetsSourceControl controlWithLeash = new InsetsSourceControl(ID_IME, + WindowInsets.Type.ime(), mLeash, false, new Point(), Insets.NONE); + mController.onControlsChanged(new InsetsSourceControl[] { controlWithLeash }); + // IME show animation should be triggered when control with leash becomes available. + verify(mController).applyAnimation( + eq(WindowInsets.Type.ime()), eq(true) /* show */, eq(false) /* fromIme */, + and(not(eq(statsToken)), notNull())); + verify(mController, never()).applyAnimation( + eq(WindowInsets.Type.ime()), eq(false) /* show */, eq(false) /* fromIme */, + and(not(eq(statsToken)), notNull())); + }); + } + + @Test public void testImeGetAndClearSkipAnimationOnce_expectSkip() { // Expect IME animation will skipped when the IME is visible at first place. verifyImeGetAndClearSkipAnimationOnce(true /* hasWindowFocus */, true /* hasViewFocus */, diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index 749f0e12aa03..9c1c700641f1 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -454,7 +454,7 @@ applications that come with the platform <!-- Permissions required for CTS test - android.server.biometrics --> <permission name="android.permission.USE_BIOMETRIC" /> <permission name="android.permission.TEST_BIOMETRIC" /> - <permission name="android.permission.SET_BIOMETRIC_DIALOG_LOGO" /> + <permission name="android.permission.SET_BIOMETRIC_DIALOG_ADVANCED" /> <permission name="android.permission.MANAGE_BIOMETRIC_DIALOG" /> <!-- Permissions required for CTS test - CtsContactsProviderTestCases --> <permission name="android.contacts.permission.MANAGE_SIM_ACCOUNTS" /> diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/DividerPresenter.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/DividerPresenter.java new file mode 100644 index 000000000000..100185b84b77 --- /dev/null +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/DividerPresenter.java @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.window.extensions.embedding; + +import static android.util.TypedValue.COMPLEX_UNIT_DIP; + +import static androidx.window.extensions.embedding.DividerAttributes.RATIO_UNSET; +import static androidx.window.extensions.embedding.DividerAttributes.WIDTH_UNSET; +import static androidx.window.extensions.embedding.SplitPresenter.CONTAINER_POSITION_BOTTOM; +import static androidx.window.extensions.embedding.SplitPresenter.CONTAINER_POSITION_LEFT; +import static androidx.window.extensions.embedding.SplitPresenter.CONTAINER_POSITION_RIGHT; +import static androidx.window.extensions.embedding.SplitPresenter.CONTAINER_POSITION_TOP; + +import android.annotation.Nullable; +import android.app.ActivityThread; +import android.content.Context; +import android.util.TypedValue; + +import androidx.annotation.NonNull; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.window.flags.Flags; + +/** + * Manages the rendering and interaction of the divider. + */ +class DividerPresenter { + // TODO(b/327067596) Update based on UX guidance. + @VisibleForTesting static final float DEFAULT_MIN_RATIO = 0.35f; + @VisibleForTesting static final float DEFAULT_MAX_RATIO = 0.65f; + @VisibleForTesting static final int DEFAULT_DIVIDER_WIDTH_DP = 24; + + static int getDividerWidthPx(@NonNull DividerAttributes dividerAttributes) { + int dividerWidthDp = dividerAttributes.getWidthDp(); + + // TODO(b/329193115) support divider on secondary display + final Context applicationContext = ActivityThread.currentActivityThread().getApplication(); + + return (int) TypedValue.applyDimension( + COMPLEX_UNIT_DIP, + dividerWidthDp, + applicationContext.getResources().getDisplayMetrics()); + } + + /** + * Returns the container bound offset that is a result of the presence of a divider. + * + * The offset is the relative position change for the container edge that is next to the divider + * due to the presence of the divider. The value could be negative or positive depending on the + * container position. Positive values indicate that the edge is shifting towards the right + * (or bottom) and negative values indicate that the edge is shifting towards the left (or top). + * + * @param splitAttributes the {@link SplitAttributes} of the split container that we want to + * compute bounds offset. + * @param position the position of the container in the split that we want to compute + * bounds offset for. + * @return the bounds offset in pixels. + */ + static int getBoundsOffsetForDivider( + @NonNull SplitAttributes splitAttributes, + @SplitPresenter.ContainerPosition int position) { + if (!Flags.activityEmbeddingInteractiveDividerFlag()) { + return 0; + } + final DividerAttributes dividerAttributes = splitAttributes.getDividerAttributes(); + if (dividerAttributes == null) { + return 0; + } + final int dividerWidthPx = getDividerWidthPx(dividerAttributes); + return getBoundsOffsetForDivider( + dividerWidthPx, + splitAttributes.getSplitType(), + position); + } + + @VisibleForTesting + static int getBoundsOffsetForDivider( + int dividerWidthPx, + @NonNull SplitAttributes.SplitType splitType, + @SplitPresenter.ContainerPosition int position) { + if (splitType instanceof SplitAttributes.SplitType.ExpandContainersSplitType) { + // No divider is needed for the ExpandContainersSplitType. + return 0; + } + int primaryOffset; + if (splitType instanceof final SplitAttributes.SplitType.RatioSplitType splitRatio) { + // When a divider is present, both containers shrink by an amount proportional to their + // split ratio and sum to the width of the divider, so that the ending sizing of the + // containers still maintain the same ratio. + primaryOffset = (int) (dividerWidthPx * splitRatio.getRatio()); + } else { + // Hinge split type (and other future split types) will have the divider width equally + // distributed to both containers. + primaryOffset = dividerWidthPx / 2; + } + final int secondaryOffset = dividerWidthPx - primaryOffset; + switch (position) { + case CONTAINER_POSITION_LEFT: + case CONTAINER_POSITION_TOP: + return -primaryOffset; + case CONTAINER_POSITION_RIGHT: + case CONTAINER_POSITION_BOTTOM: + return secondaryOffset; + default: + throw new IllegalArgumentException("Unknown position:" + position); + } + } + + /** + * Sanitizes and sets default values in the {@link DividerAttributes}. + * + * Unset values will be set with system default values. See + * {@link DividerAttributes#WIDTH_UNSET} and {@link DividerAttributes#RATIO_UNSET}. + * + * @param dividerAttributes input {@link DividerAttributes} + * @return a {@link DividerAttributes} that has all values properly set. + */ + @Nullable + static DividerAttributes sanitizeDividerAttributes( + @Nullable DividerAttributes dividerAttributes) { + if (dividerAttributes == null) { + return null; + } + int widthDp = dividerAttributes.getWidthDp(); + if (widthDp == WIDTH_UNSET) { + widthDp = DEFAULT_DIVIDER_WIDTH_DP; + } + + float minRatio = dividerAttributes.getPrimaryMinRatio(); + if (minRatio == RATIO_UNSET) { + minRatio = DEFAULT_MIN_RATIO; + } + + float maxRatio = dividerAttributes.getPrimaryMaxRatio(); + if (maxRatio == RATIO_UNSET) { + maxRatio = DEFAULT_MAX_RATIO; + } + + return new DividerAttributes.Builder(dividerAttributes) + .setWidthDp(widthDp) + .setPrimaryMinRatio(minRatio) + .setPrimaryMaxRatio(maxRatio) + .build(); + } +} diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java index b53b9c519cb6..f680694c3af9 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java @@ -18,6 +18,7 @@ package androidx.window.extensions.embedding; import static android.content.pm.PackageManager.MATCH_ALL; +import static androidx.window.extensions.embedding.DividerPresenter.getBoundsOffsetForDivider; import static androidx.window.extensions.embedding.WindowAttributes.DIM_AREA_ON_TASK; import android.app.Activity; @@ -85,10 +86,10 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { }) private @interface Position {} - private static final int CONTAINER_POSITION_LEFT = 0; - private static final int CONTAINER_POSITION_TOP = 1; - private static final int CONTAINER_POSITION_RIGHT = 2; - private static final int CONTAINER_POSITION_BOTTOM = 3; + static final int CONTAINER_POSITION_LEFT = 0; + static final int CONTAINER_POSITION_TOP = 1; + static final int CONTAINER_POSITION_RIGHT = 2; + static final int CONTAINER_POSITION_BOTTOM = 3; @IntDef(value = { CONTAINER_POSITION_LEFT, @@ -96,7 +97,7 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { CONTAINER_POSITION_RIGHT, CONTAINER_POSITION_BOTTOM, }) - private @interface ContainerPosition {} + @interface ContainerPosition {} /** * Result of {@link #expandSplitContainerIfNeeded(WindowContainerTransaction, SplitContainer, @@ -738,6 +739,15 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { private SplitAttributes sanitizeSplitAttributes(@NonNull TaskProperties taskProperties, @NonNull SplitAttributes splitAttributes, @Nullable Pair<Size, Size> minDimensionsPair) { + // Sanitize the DividerAttributes and set default values. + if (splitAttributes.getDividerAttributes() != null) { + splitAttributes = new SplitAttributes.Builder(splitAttributes) + .setDividerAttributes( + DividerPresenter.sanitizeDividerAttributes( + splitAttributes.getDividerAttributes()) + ).build(); + } + if (minDimensionsPair == null) { return splitAttributes; } @@ -930,18 +940,18 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { */ private static SplitAttributes updateSplitAttributesType( @NonNull SplitAttributes splitAttributes, @NonNull SplitType splitTypeToUpdate) { - return new SplitAttributes.Builder() + return new SplitAttributes.Builder(splitAttributes) .setSplitType(splitTypeToUpdate) - .setLayoutDirection(splitAttributes.getLayoutDirection()) - .setAnimationBackground(splitAttributes.getAnimationBackground()) .build(); } @NonNull private Rect getLeftContainerBounds(@NonNull Configuration taskConfiguration, @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { + final int dividerOffset = getBoundsOffsetForDivider( + splitAttributes, CONTAINER_POSITION_LEFT); final int right = computeBoundaryBetweenContainers(taskConfiguration, splitAttributes, - CONTAINER_POSITION_LEFT, foldingFeature); + CONTAINER_POSITION_LEFT, foldingFeature) + dividerOffset; final Rect taskBounds = taskConfiguration.windowConfiguration.getBounds(); return new Rect(taskBounds.left, taskBounds.top, right, taskBounds.bottom); } @@ -949,8 +959,10 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { @NonNull private Rect getRightContainerBounds(@NonNull Configuration taskConfiguration, @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { + final int dividerOffset = getBoundsOffsetForDivider( + splitAttributes, CONTAINER_POSITION_RIGHT); final int left = computeBoundaryBetweenContainers(taskConfiguration, splitAttributes, - CONTAINER_POSITION_RIGHT, foldingFeature); + CONTAINER_POSITION_RIGHT, foldingFeature) + dividerOffset; final Rect parentBounds = taskConfiguration.windowConfiguration.getBounds(); return new Rect(left, parentBounds.top, parentBounds.right, parentBounds.bottom); } @@ -958,8 +970,10 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { @NonNull private Rect getTopContainerBounds(@NonNull Configuration taskConfiguration, @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { + final int dividerOffset = getBoundsOffsetForDivider( + splitAttributes, CONTAINER_POSITION_TOP); final int bottom = computeBoundaryBetweenContainers(taskConfiguration, splitAttributes, - CONTAINER_POSITION_TOP, foldingFeature); + CONTAINER_POSITION_TOP, foldingFeature) + dividerOffset; final Rect parentBounds = taskConfiguration.windowConfiguration.getBounds(); return new Rect(parentBounds.left, parentBounds.top, parentBounds.right, bottom); } @@ -967,8 +981,10 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { @NonNull private Rect getBottomContainerBounds(@NonNull Configuration taskConfiguration, @NonNull SplitAttributes splitAttributes, @Nullable FoldingFeature foldingFeature) { + final int dividerOffset = getBoundsOffsetForDivider( + splitAttributes, CONTAINER_POSITION_BOTTOM); final int top = computeBoundaryBetweenContainers(taskConfiguration, splitAttributes, - CONTAINER_POSITION_BOTTOM, foldingFeature); + CONTAINER_POSITION_BOTTOM, foldingFeature) + dividerOffset; final Rect parentBounds = taskConfiguration.windowConfiguration.getBounds(); return new Rect(parentBounds.left, top, parentBounds.right, parentBounds.bottom); } diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/DividerPresenterTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/DividerPresenterTest.java new file mode 100644 index 000000000000..2a277f4c9619 --- /dev/null +++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/DividerPresenterTest.java @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package androidx.window.extensions.embedding; + +import static androidx.window.extensions.embedding.DividerPresenter.getBoundsOffsetForDivider; +import static androidx.window.extensions.embedding.SplitPresenter.CONTAINER_POSITION_BOTTOM; +import static androidx.window.extensions.embedding.SplitPresenter.CONTAINER_POSITION_LEFT; +import static androidx.window.extensions.embedding.SplitPresenter.CONTAINER_POSITION_RIGHT; +import static androidx.window.extensions.embedding.SplitPresenter.CONTAINER_POSITION_TOP; + +import static org.junit.Assert.assertEquals; + +import android.platform.test.annotations.Presubmit; + +import androidx.annotation.NonNull; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Test class for {@link DividerPresenter}. + * + * Build/Install/Run: + * atest WMJetpackUnitTests:DividerPresenterTest + */ +@Presubmit +@SmallTest +@RunWith(AndroidJUnit4.class) +public class DividerPresenterTest { + @Test + public void testSanitizeDividerAttributes_setDefaultValues() { + DividerAttributes attributes = + new DividerAttributes.Builder(DividerAttributes.DIVIDER_TYPE_DRAGGABLE).build(); + DividerAttributes sanitized = DividerPresenter.sanitizeDividerAttributes(attributes); + + assertEquals(DividerAttributes.DIVIDER_TYPE_DRAGGABLE, sanitized.getDividerType()); + assertEquals(DividerPresenter.DEFAULT_DIVIDER_WIDTH_DP, sanitized.getWidthDp()); + assertEquals(DividerPresenter.DEFAULT_MIN_RATIO, sanitized.getPrimaryMinRatio(), + 0.0f /* delta */); + assertEquals(DividerPresenter.DEFAULT_MAX_RATIO, sanitized.getPrimaryMaxRatio(), + 0.0f /* delta */); + } + + @Test + public void testSanitizeDividerAttributes_notChangingValidValues() { + DividerAttributes attributes = + new DividerAttributes.Builder(DividerAttributes.DIVIDER_TYPE_DRAGGABLE) + .setWidthDp(10) + .setPrimaryMinRatio(0.3f) + .setPrimaryMaxRatio(0.7f) + .build(); + DividerAttributes sanitized = DividerPresenter.sanitizeDividerAttributes(attributes); + + assertEquals(attributes, sanitized); + } + + @Test + public void testGetBoundsOffsetForDivider_ratioSplitType() { + final int dividerWidthPx = 100; + final float splitRatio = 0.25f; + final SplitAttributes.SplitType splitType = + new SplitAttributes.SplitType.RatioSplitType(splitRatio); + final int expectedTopLeftOffset = 25; + final int expectedBottomRightOffset = 75; + + assertDividerOffsetEquals( + dividerWidthPx, splitType, expectedTopLeftOffset, expectedBottomRightOffset); + } + + @Test + public void testGetBoundsOffsetForDivider_ratioSplitType_withRounding() { + final int dividerWidthPx = 101; + final float splitRatio = 0.25f; + final SplitAttributes.SplitType splitType = + new SplitAttributes.SplitType.RatioSplitType(splitRatio); + final int expectedTopLeftOffset = 25; + final int expectedBottomRightOffset = 76; + + assertDividerOffsetEquals( + dividerWidthPx, splitType, expectedTopLeftOffset, expectedBottomRightOffset); + } + + @Test + public void testGetBoundsOffsetForDivider_hingeSplitType() { + final int dividerWidthPx = 100; + final SplitAttributes.SplitType splitType = + new SplitAttributes.SplitType.HingeSplitType( + new SplitAttributes.SplitType.RatioSplitType(0.5f)); + + final int expectedTopLeftOffset = 50; + final int expectedBottomRightOffset = 50; + + assertDividerOffsetEquals( + dividerWidthPx, splitType, expectedTopLeftOffset, expectedBottomRightOffset); + } + + @Test + public void testGetBoundsOffsetForDivider_expandContainersSplitType() { + final int dividerWidthPx = 100; + final SplitAttributes.SplitType splitType = + new SplitAttributes.SplitType.ExpandContainersSplitType(); + // Always return 0 for ExpandContainersSplitType as divider is not needed. + final int expectedTopLeftOffset = 0; + final int expectedBottomRightOffset = 0; + + assertDividerOffsetEquals( + dividerWidthPx, splitType, expectedTopLeftOffset, expectedBottomRightOffset); + } + + private void assertDividerOffsetEquals( + int dividerWidthPx, + @NonNull SplitAttributes.SplitType splitType, + int expectedTopLeftOffset, + int expectedBottomRightOffset) { + int offset = getBoundsOffsetForDivider( + dividerWidthPx, + splitType, + CONTAINER_POSITION_LEFT + ); + assertEquals(-expectedTopLeftOffset, offset); + + offset = getBoundsOffsetForDivider( + dividerWidthPx, + splitType, + CONTAINER_POSITION_RIGHT + ); + assertEquals(expectedBottomRightOffset, offset); + + offset = getBoundsOffsetForDivider( + dividerWidthPx, + splitType, + CONTAINER_POSITION_TOP + ); + assertEquals(-expectedTopLeftOffset, offset); + + offset = getBoundsOffsetForDivider( + dividerWidthPx, + splitType, + CONTAINER_POSITION_BOTTOM + ); + assertEquals(expectedBottomRightOffset, offset); + } +} diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java index bdeeb7304b12..cdb37acfc0c2 100644 --- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java +++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java @@ -294,7 +294,10 @@ public class SplitControllerTest { doReturn(tf).when(splitContainer).getPrimaryContainer(); doReturn(tf).when(splitContainer).getSecondaryContainer(); doReturn(createTestTaskContainer()).when(splitContainer).getTaskContainer(); - doReturn(createSplitRule(mActivity, mActivity)).when(splitContainer).getSplitRule(); + final SplitRule splitRule = createSplitRule(mActivity, mActivity); + doReturn(splitRule).when(splitContainer).getSplitRule(); + doReturn(splitRule.getDefaultSplitAttributes()) + .when(splitContainer).getDefaultSplitAttributes(); taskContainer = mSplitController.getTaskContainer(TASK_ID); taskContainer.addSplitContainer(splitContainer); // Add a mock SplitContainer on top of splitContainer diff --git a/libs/WindowManager/Shell/res/drawable/bubble_drop_target_background.xml b/libs/WindowManager/Shell/res/drawable/bubble_drop_target_background.xml new file mode 100644 index 000000000000..468b5c2a712f --- /dev/null +++ b/libs/WindowManager/Shell/res/drawable/bubble_drop_target_background.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2024 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<shape android:shape="rectangle" + xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="#bf309fb5" /> + <corners android:radius="@dimen/bubble_bar_expanded_view_corner_radius" /> + <stroke android:width="1dp" android:color="#A00080FF"/> +</shape> diff --git a/libs/WindowManager/Shell/res/layout/bubble_bar_drop_target.xml b/libs/WindowManager/Shell/res/layout/bubble_bar_drop_target.xml new file mode 100644 index 000000000000..9d29f7da8797 --- /dev/null +++ b/libs/WindowManager/Shell/res/layout/bubble_bar_drop_target.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ Copyright (C) 2024 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<View xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/bubble_bar_drop_target" + android:layout_width="0dp" + android:layout_height="0dp" + android:background="@drawable/bubble_drop_target_background" + android:elevation="@dimen/bubble_elevation" + android:importantForAccessibility="no" /> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java index 6a5f785504c0..42de401d9db9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java @@ -24,6 +24,7 @@ import static com.android.wm.shell.animation.Interpolators.ALPHA_OUT; import android.animation.ArgbEvaluator; import android.content.Context; +import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; @@ -74,7 +75,7 @@ public class BubbleFlyoutView extends FrameLayout { private final int mFlyoutElevation; private final int mBubbleElevation; - private final int mFloatingBackgroundColor; + private int mFloatingBackgroundColor; private final float mCornerRadius; private final ViewGroup mFlyoutTextContainer; @@ -107,6 +108,9 @@ public class BubbleFlyoutView extends FrameLayout { /** Color of the 'new' dot that the flyout will transform into. */ private int mDotColor; + /** Keeps last used night mode flags **/ + private int mNightModeFlags; + /** The outline of the triangle, used for elevation shadows. */ private final Outline mTriangleOutline = new Outline(); @@ -176,11 +180,8 @@ public class BubbleFlyoutView extends FrameLayout { mFlyoutElevation = res.getDimensionPixelSize(R.dimen.bubble_flyout_elevation); final TypedArray ta = mContext.obtainStyledAttributes( - new int[] { - com.android.internal.R.attr.materialColorSurfaceContainer, - android.R.attr.dialogCornerRadius}); - mFloatingBackgroundColor = ta.getColor(0, Color.WHITE); - mCornerRadius = ta.getDimensionPixelSize(1, 0); + new int[] {android.R.attr.dialogCornerRadius}); + mCornerRadius = ta.getDimensionPixelSize(0, 0); ta.recycle(); // Add padding for the pointer on either side, onDraw will draw it in this space. @@ -198,19 +199,17 @@ public class BubbleFlyoutView extends FrameLayout { // Use locale direction so the text is aligned correctly. setLayoutDirection(LAYOUT_DIRECTION_LOCALE); - mBgPaint.setColor(mFloatingBackgroundColor); - mLeftTriangleShape = new ShapeDrawable(TriangleShape.createHorizontal( mPointerSize, mPointerSize, true /* isPointingLeft */)); mLeftTriangleShape.setBounds(0, 0, mPointerSize, mPointerSize); - mLeftTriangleShape.getPaint().setColor(mFloatingBackgroundColor); mRightTriangleShape = new ShapeDrawable(TriangleShape.createHorizontal( mPointerSize, mPointerSize, false /* isPointingLeft */)); mRightTriangleShape.setBounds(0, 0, mPointerSize, mPointerSize); - mRightTriangleShape.getPaint().setColor(mFloatingBackgroundColor); + + applyConfigurationColors(getResources().getConfiguration()); } @Override @@ -244,6 +243,13 @@ public class BubbleFlyoutView extends FrameLayout { fade(false /* in */, stackPos, hideDot, afterFadeOut); } + @Override + protected void onConfigurationChanged(Configuration newConfig) { + if (applyColorsAccordingToConfiguration(newConfig)) { + invalidate(); + } + } + /* * Fade-out above or fade-in from below. */ @@ -424,6 +430,42 @@ public class BubbleFlyoutView extends FrameLayout { } /** + * Resolving and applying colors according to the ui mode, remembering most recent mode. + * + * @return {@code true} if night mode setting has changed since the last invocation, + * {@code false} otherwise + */ + boolean applyColorsAccordingToConfiguration(Configuration configuration) { + int nightModeFlags = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK; + boolean flagsChanged = nightModeFlags != mNightModeFlags; + if (flagsChanged) { + mNightModeFlags = nightModeFlags; + applyConfigurationColors(configuration); + } + return flagsChanged; + } + + private void applyConfigurationColors(Configuration configuration) { + int nightModeFlags = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK; + boolean isNightModeOn = nightModeFlags == Configuration.UI_MODE_NIGHT_YES; + try (TypedArray ta = mContext.obtainStyledAttributes( + new int[]{ + com.android.internal.R.attr.materialColorSurfaceContainer, + com.android.internal.R.attr.materialColorOnSurface, + com.android.internal.R.attr.materialColorOnSurfaceVariant})) { + mFloatingBackgroundColor = ta.getColor(0, + isNightModeOn ? Color.BLACK : Color.WHITE); + mSenderText.setTextColor(ta.getColor(1, + isNightModeOn ? Color.WHITE : Color.BLACK)); + mMessageText.setTextColor(ta.getColor(2, + isNightModeOn ? Color.WHITE : Color.BLACK)); + mBgPaint.setColor(mFloatingBackgroundColor); + mLeftTriangleShape.getPaint().setColor(mFloatingBackgroundColor); + mRightTriangleShape.getPaint().setColor(mFloatingBackgroundColor); + } + } + + /** * Renders the background, which is either the rounded 'chat bubble' flyout, or some state * between that and the 'new' dot over the bubbles. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java index b215b616dcce..f4a401c64a31 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePositioner.java @@ -855,4 +855,24 @@ public class BubblePositioner { public int getBubbleBarExpandedViewPadding() { return mExpandedViewPadding; } + + /** + * Get bubble bar expanded view bounds on screen + */ + public void getBubbleBarExpandedViewBounds(boolean onLeft, boolean isOverflowExpanded, + Rect out) { + final int padding = getBubbleBarExpandedViewPadding(); + final int width = getExpandedViewWidthForBubbleBar(isOverflowExpanded); + final int height = getExpandedViewHeightForBubbleBar(isOverflowExpanded); + + out.set(0, 0, width, height); + int left; + if (onLeft) { + left = getInsets().left + padding; + } else { + left = getAvailableRect().width() - width - padding; + } + int top = getExpandedViewBottomForBubbleBar() - height; + out.offsetTo(left, top); + } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java index 6524c96fb21a..690868208b91 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java @@ -1025,6 +1025,7 @@ public class BubbleStackView extends FrameLayout WindowManager.class))); onDisplaySizeChanged(); mExpandedAnimationController.updateResources(); + mExpandedAnimationController.onOrientationChanged(); mStackAnimationController.updateResources(); mBubbleOverflow.updateResources(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java index 7798aa753aa2..512c9d133d08 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/ExpandedAnimationController.java @@ -614,6 +614,14 @@ public class ExpandedAnimationController } } + /** + * Call to update the bubble positions after an orientation change. + */ + public void onOrientationChanged() { + if (mLayout == null) return; + updateBubblePositions(); + } + private void updateBubblePositions() { if (mAnimatingExpand || mAnimatingCollapse) { return; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/PhysicsAnimationLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/PhysicsAnimationLayout.java index ed00da848a14..bfddff0f72e3 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/PhysicsAnimationLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/animation/PhysicsAnimationLayout.java @@ -378,6 +378,8 @@ public class PhysicsAnimationLayout extends FrameLayout { } final int oldIndex = indexOfChild(view); + if (oldIndex == index) return; + super.removeView(view); if (view.getParent() != null) { // View still has a parent. This could have been added as a transient view. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetController.kt new file mode 100644 index 000000000000..55ec6cdfe007 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarDropTargetController.kt @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.wm.shell.bubbles.bar + +import android.content.Context +import android.graphics.Rect +import android.view.LayoutInflater +import android.view.View +import android.widget.FrameLayout +import android.widget.FrameLayout.LayoutParams +import com.android.wm.shell.R +import com.android.wm.shell.bubbles.BubblePositioner +import com.android.wm.shell.common.bubbles.BubbleBarLocation + +/** Controller to show/hide drop target when bubble bar expanded view is being dragged */ +class BubbleBarDropTargetController( + val context: Context, + val container: FrameLayout, + val positioner: BubblePositioner +) { + + private var dropTargetView: View? = null + private val tempRect: Rect by lazy(LazyThreadSafetyMode.NONE) { Rect() } + + /** + * Show drop target at [location] with animation. + * + * If the drop target is currently visible, animates it out first, before showing it at the + * supplied location. + */ + fun show(location: BubbleBarLocation) { + val targetView = dropTargetView ?: createView().also { dropTargetView = it } + if (targetView.alpha > 0) { + targetView.animateOut { + targetView.updateBounds(location) + targetView.animateIn() + } + } else { + targetView.updateBounds(location) + targetView.animateIn() + } + } + + /** + * Set the view hidden or not + * + * Requires the drop target to be first shown by calling [show]. Otherwise does not do anything. + */ + fun setHidden(hidden: Boolean) { + val targetView = dropTargetView ?: return + if (hidden) { + targetView.animateOut() + } else { + targetView.animateIn() + } + } + + /** Remove the drop target if it is was shown. */ + fun dismiss() { + dropTargetView?.animateOut { + dropTargetView?.let { container.removeView(it) } + dropTargetView = null + } + } + + private fun createView(): View { + return LayoutInflater.from(context) + .inflate(R.layout.bubble_bar_drop_target, container, false /* attachToRoot */) + .also { view: View -> + view.alpha = 0f + // Add at index 0 to ensure it does not cover the bubble + container.addView(view, 0) + } + } + + private fun getBounds(onLeft: Boolean, out: Rect) { + positioner.getBubbleBarExpandedViewBounds(onLeft, false /* isOverflowExpanded */, out) + val centerX = out.centerX() + val centerY = out.centerY() + out.scale(DROP_TARGET_SCALE) + // Move rect center back to the same position as before scale + out.offset(centerX - out.centerX(), centerY - out.centerY()) + } + + private fun View.updateBounds(location: BubbleBarLocation) { + getBounds(location.isOnLeft(isLayoutRtl), tempRect) + val lp = layoutParams as LayoutParams + lp.width = tempRect.width() + lp.height = tempRect.height() + layoutParams = lp + x = tempRect.left.toFloat() + y = tempRect.top.toFloat() + } + + private fun View.animateIn() { + animate().alpha(1f).setDuration(DROP_TARGET_ALPHA_IN_DURATION).start() + } + + private fun View.animateOut(endAction: Runnable? = null) { + animate() + .alpha(0f) + .setDuration(DROP_TARGET_ALPHA_OUT_DURATION) + .withEndAction(endAction) + .start() + } + + companion object { + private const val DROP_TARGET_ALPHA_IN_DURATION = 150L + private const val DROP_TARGET_ALPHA_OUT_DURATION = 100L + private const val DROP_TARGET_SCALE = 0.9f + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt index b5b8a81c8886..ad97a2411ae0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewDragController.kt @@ -90,15 +90,26 @@ class BubbleBarExpandedViewDragController( /** * Bubble bar [BubbleBarLocation] has changed as a result of dragging the expanded view. * - * Triggered when drag gesture passes the middle of the screen and before touch up. - * Can be triggered multiple times per gesture. + * Triggered when drag gesture passes the middle of the screen and before touch up. Can be + * triggered multiple times per gesture. * * @param location new location of the bubble bar as a result of the ongoing drag operation */ fun onLocationChanged(location: BubbleBarLocation) - /** Expanded view has been released in the dismiss target */ - fun onReleasedInDismiss() + /** + * Called when bubble bar is moved into or out of the dismiss target + * + * @param isStuck `true` if view is dragged inside dismiss target + */ + fun onStuckToDismissChanged(isStuck: Boolean) + + /** + * Bubble bar was released + * + * @param inDismiss `true` if view was release in dismiss target + */ + fun onReleased(inDismiss: Boolean) } private inner class HandleDragListener : RelativeTouchListener() { @@ -177,6 +188,7 @@ class BubbleBarExpandedViewDragController( private fun finishDrag() { if (!isStuckToDismiss) { animationHelper.animateToRestPosition() + dragListener.onReleased(inDismiss = false) dismissView.hide() } isMoving = false @@ -189,6 +201,7 @@ class BubbleBarExpandedViewDragController( draggedObject: MagnetizedObject<*> ) { isStuckToDismiss = true + dragListener.onStuckToDismissChanged(isStuck = true) } override fun onUnstuckFromTarget( @@ -200,13 +213,14 @@ class BubbleBarExpandedViewDragController( ) { isStuckToDismiss = false animationHelper.animateUnstuckFromDismissView(target) + dragListener.onStuckToDismissChanged(isStuck = false) } override fun onReleasedInTarget( target: MagnetizedObject.MagneticTarget, draggedObject: MagnetizedObject<*> ) { - dragListener.onReleasedInDismiss() + dragListener.onReleased(inDismiss = true) dismissView.hide() } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java index 3fb9f63c0506..88ccc9267c41 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java @@ -35,7 +35,6 @@ import android.widget.FrameLayout; import androidx.annotation.NonNull; -import com.android.wm.shell.R; import com.android.wm.shell.bubbles.Bubble; import com.android.wm.shell.bubbles.BubbleController; import com.android.wm.shell.bubbles.BubbleData; @@ -72,6 +71,7 @@ public class BubbleBarLayerView extends FrameLayout private final BubbleBarAnimationHelper mAnimationHelper; private final BubbleEducationViewController mEducationViewController; private final View mScrimView; + private final BubbleBarDropTargetController mDropTargetController; @Nullable private BubbleViewProvider mExpandedBubble; @@ -116,6 +116,8 @@ public class BubbleBarLayerView extends FrameLayout setUpDismissView(); + mDropTargetController = new BubbleBarDropTargetController(context, this, mPositioner); + setOnClickListener(view -> hideMenuOrCollapse()); } @@ -205,17 +207,7 @@ public class BubbleBarLayerView extends FrameLayout } }); - DragListener dragListener = new DragListener() { - @Override - public void onLocationChanged(@NonNull BubbleBarLocation location) { - mBubbleController.setBubbleBarLocation(location); - } - - @Override - public void onReleasedInDismiss() { - mBubbleController.dismissBubble(mExpandedBubble.getKey(), DISMISS_USER_GESTURE); - } - }; + DragListener dragListener = createDragListener(); mDragController = new BubbleBarExpandedViewDragController( mExpandedView, mDismissView, @@ -330,10 +322,7 @@ public class BubbleBarLayerView extends FrameLayout } mDismissView = new DismissView(getContext()); DismissViewUtils.setup(mDismissView); - int elevation = getResources().getDimensionPixelSize(R.dimen.bubble_elevation); - addView(mDismissView); - mDismissView.setElevation(elevation); } /** Hides the current modal education/menu view, expanded view or collapses the bubble stack */ @@ -349,21 +338,16 @@ public class BubbleBarLayerView extends FrameLayout /** Updates the expanded view size and position. */ private void updateExpandedView() { - if (mExpandedView == null) return; + if (mExpandedView == null || mExpandedBubble == null) return; boolean isOverflowExpanded = mExpandedBubble.getKey().equals(BubbleOverflow.KEY); - final int padding = mPositioner.getBubbleBarExpandedViewPadding(); - final int width = mPositioner.getExpandedViewWidthForBubbleBar(isOverflowExpanded); - final int height = mPositioner.getExpandedViewHeightForBubbleBar(isOverflowExpanded); + mPositioner.getBubbleBarExpandedViewBounds(mPositioner.isBubbleBarOnLeft(), + isOverflowExpanded, mTempRect); FrameLayout.LayoutParams lp = (LayoutParams) mExpandedView.getLayoutParams(); - lp.width = width; - lp.height = height; + lp.width = mTempRect.width(); + lp.height = mTempRect.height(); mExpandedView.setLayoutParams(lp); - if (mPositioner.isBubbleBarOnLeft()) { - mExpandedView.setX(mPositioner.getInsets().left + padding); - } else { - mExpandedView.setX(mPositioner.getAvailableRect().width() - width - padding); - } - mExpandedView.setY(mPositioner.getExpandedViewBottomForBubbleBar() - height); + mExpandedView.setX(mTempRect.left); + mExpandedView.setY(mTempRect.top); mExpandedView.updateLocation(); } @@ -392,4 +376,27 @@ public class BubbleBarLayerView extends FrameLayout outRegion.op(mTempRect, Region.Op.UNION); } } + + private DragListener createDragListener() { + return new DragListener() { + @Override + public void onLocationChanged(@NonNull BubbleBarLocation location) { + mBubbleController.setBubbleBarLocation(location); + mDropTargetController.show(location); + } + + @Override + public void onStuckToDismissChanged(boolean isStuck) { + mDropTargetController.setHidden(isStuck); + } + + @Override + public void onReleased(boolean inDismiss) { + mDropTargetController.dismiss(); + if (inDismiss && mExpandedBubble != null) { + mBubbleController.dismissBubble(mExpandedBubble.getKey(), DISMISS_USER_GESTURE); + } + } + }; + } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/GlobalDragListener.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/GlobalDragListener.kt index 8826141fb406..31214eba8dd0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/GlobalDragListener.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/GlobalDragListener.kt @@ -17,6 +17,8 @@ package com.android.wm.shell.draganddrop import android.app.ActivityManager import android.os.RemoteException +import android.os.Trace +import android.os.Trace.TRACE_TAG_WINDOW_MANAGER import android.util.Log import android.view.DragEvent import android.view.IWindowManager @@ -27,6 +29,7 @@ import com.android.internal.protolog.common.ProtoLog import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.protolog.ShellProtoLogGroup import java.util.function.Consumer +import kotlin.random.Random /** * Manages the listener and callbacks for unhandled global drags. @@ -101,10 +104,15 @@ class GlobalDragListener( @VisibleForTesting fun onUnhandledDrop(dragEvent: DragEvent, wmCallback: IUnhandledDragCallback) { + val traceCookie = Random.nextInt() + Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER, "GlobalDragListener.onUnhandledDrop", + traceCookie); ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DRAG_AND_DROP, "onUnhandledDrop: %s", dragEvent) if (callback == null) { wmCallback.notifyUnhandledDropComplete(false) + Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER, "GlobalDragListener.onUnhandledDrop", + traceCookie); return } @@ -112,6 +120,8 @@ class GlobalDragListener( ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DRAG_AND_DROP, "Notifying onUnhandledDrop complete: %b", it) wmCallback.notifyUnhandledDropComplete(it) + Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER, "GlobalDragListener.onUnhandledDrop", + traceCookie); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java index b99e94399046..2b433e9c4227 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java @@ -64,9 +64,7 @@ public interface SplitScreen { default void onSplitVisibilityChanged(boolean visible) {} } - /** - * Callback interface for listening to requests to enter split select. Used for desktop -> split - */ + /** Callback interface for listening to requests to enter split select */ interface SplitSelectListener { default boolean onRequestEnterSplitSelect(ActivityManager.RunningTaskInfo taskInfo, int splitPosition, Rect taskBounds) { @@ -74,15 +72,6 @@ public interface SplitScreen { } } - interface SplitInvocationListener { - /** - * Called whenever shell starts or stops the split screen animation - * @param animationRunning if {@code true} the animation has begun, if {@code false} the - * animation has finished - */ - default void onSplitAnimationInvoked(boolean animationRunning) { } - } - /** Registers listener that gets split screen callback. */ void registerSplitScreenListener(@NonNull SplitScreenListener listener, @NonNull Executor executor); @@ -90,15 +79,6 @@ public interface SplitScreen { /** Unregisters listener that gets split screen callback. */ void unregisterSplitScreenListener(@NonNull SplitScreenListener listener); - /** - * Registers a {@link SplitInvocationListener} to notify when the animation to enter split - * screen has started and stopped - * - * @param executor callbacks to the listener will be executed on this executor - */ - void registerSplitAnimationListener(@NonNull SplitInvocationListener listener, - @NonNull Executor executor); - /** Called when device waking up finished. */ void onFinishedWakingUp(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 5fbb15216eea..3e34c303e161 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -1144,12 +1144,6 @@ public class SplitScreenController implements DragAndDropPolicy.Starter, } @Override - public void registerSplitAnimationListener(@NonNull SplitInvocationListener listener, - @NonNull Executor executor) { - mStageCoordinator.registerSplitAnimationListener(listener, executor); - } - - @Override public void onFinishedWakingUp() { mMainExecutor.execute(SplitScreenController.this::onFinishedWakingUp); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java index e69ff70e5273..1a53a1d10dd2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenTransitions.java @@ -55,7 +55,6 @@ import com.android.wm.shell.transition.OneShotRemoteHandler; import com.android.wm.shell.transition.Transitions; import java.util.ArrayList; -import java.util.concurrent.Executor; /** Manages transition animations for split-screen. */ class SplitScreenTransitions { @@ -80,8 +79,6 @@ class SplitScreenTransitions { private Transitions.TransitionFinishCallback mFinishCallback = null; private SurfaceControl.Transaction mFinishTransaction; - private SplitScreen.SplitInvocationListener mSplitInvocationListener; - private Executor mSplitInvocationListenerExecutor; SplitScreenTransitions(@NonNull TransactionPool pool, @NonNull Transitions transitions, @NonNull Runnable onFinishCallback, StageCoordinator stageCoordinator) { @@ -356,10 +353,6 @@ class SplitScreenTransitions { + " skip to start enter split transition since it already exist. "); return null; } - if (mSplitInvocationListenerExecutor != null && mSplitInvocationListener != null) { - mSplitInvocationListenerExecutor.execute(() -> mSplitInvocationListener - .onSplitAnimationInvoked(true /*animationRunning*/)); - } final IBinder transition = mTransitions.startTransition(transitType, wct, handler); setEnterTransition(transition, remoteTransition, extraTransitType, resizeAnim); return transition; @@ -536,12 +529,6 @@ class SplitScreenTransitions { mTransitions.getAnimExecutor().execute(va::start); } - public void registerSplitAnimListener(@NonNull SplitScreen.SplitInvocationListener listener, - @NonNull Executor executor) { - mSplitInvocationListener = listener; - mSplitInvocationListenerExecutor = executor; - } - /** Calls when the transition got consumed. */ interface TransitionConsumedCallback { void onConsumed(boolean aborted); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 661faf5b4f28..41890df9a4ee 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -156,7 +156,6 @@ import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; -import java.util.concurrent.Executor; /** * Coordinates the staging (visibility, sizing, ...) of the split-screen {@link MainStage} and @@ -237,9 +236,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, private DefaultMixedHandler mMixedHandler; private final Toast mSplitUnsupportedToast; private SplitRequest mSplitRequest; - /** Used to notify others of when shell is animating into split screen */ - private SplitScreen.SplitInvocationListener mSplitInvocationListener; - private Executor mSplitInvocationListenerExecutor; /** * Since StageCoordinator only coordinates MainStage and SideStage, it shouldn't support @@ -250,14 +246,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return false; } - /** NOTE: Will overwrite any previously set {@link #mSplitInvocationListener} */ - public void registerSplitAnimationListener( - @NonNull SplitScreen.SplitInvocationListener listener, @NonNull Executor executor) { - mSplitInvocationListener = listener; - mSplitInvocationListenerExecutor = executor; - mSplitTransitions.registerSplitAnimListener(listener, executor); - } - class SplitRequest { @SplitPosition int mActivatePosition; @@ -541,7 +529,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, null /* childrenToTop */, EXIT_REASON_UNKNOWN)); Log.w(TAG, splitFailureMessage("startShortcut", "side stage was not populated")); - handleUnsupportedSplitStart(); + mSplitUnsupportedToast.show(); } if (finishedCallback != null) { @@ -672,7 +660,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, null /* childrenToTop */, EXIT_REASON_UNKNOWN)); Log.w(TAG, splitFailureMessage("startIntentLegacy", "side stage was not populated")); - handleUnsupportedSplitStart(); + mSplitUnsupportedToast.show(); } if (apps != null) { @@ -1225,7 +1213,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, ? mSideStage : mMainStage, EXIT_REASON_UNKNOWN)); Log.w(TAG, splitFailureMessage("onRemoteAnimationFinishedOrCancelled", "main or side stage was not populated.")); - handleUnsupportedSplitStart(); + mSplitUnsupportedToast.show(); } else { mSyncQueue.queue(evictWct); mSyncQueue.runInSync(t -> { @@ -1246,7 +1234,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, ? mSideStage : mMainStage, EXIT_REASON_UNKNOWN)); Log.w(TAG, splitFailureMessage("onRemoteAnimationFinished", "main or side stage was not populated")); - handleUnsupportedSplitStart(); + mSplitUnsupportedToast.show(); return; } @@ -2818,7 +2806,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (hasEnteringPip) { mMixedHandler.animatePendingEnterPipFromSplit(transition, info, startTransaction, finishTransaction, finishCallback); - notifySplitAnimationFinished(); return true; } @@ -2853,7 +2840,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, // the transition, or synchronize task-org callbacks. } // Use normal animations. - notifySplitAnimationFinished(); return false; } else if (mMixedHandler != null && TransitionUtil.hasDisplayChange(info)) { // A display-change has been un-expectedly inserted into the transition. Redirect @@ -2867,7 +2853,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mSplitLayout.update(startTransaction, true /* resetImePosition */); startTransaction.apply(); } - notifySplitAnimationFinished(); return true; } } @@ -3041,7 +3026,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, pendingEnter.mRemoteHandler.onTransitionConsumed(transition, false /*aborted*/, finishT); } - handleUnsupportedSplitStart(); + mSplitUnsupportedToast.show(); return true; } } @@ -3070,7 +3055,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, final TransitionInfo.Change finalMainChild = mainChild; final TransitionInfo.Change finalSideChild = sideChild; enterTransition.setFinishedCallback((callbackWct, callbackT) -> { - notifySplitAnimationFinished(); if (finalMainChild != null) { if (!mainNotContainOpenTask) { mMainStage.evictOtherChildren(callbackWct, finalMainChild.getTaskInfo().taskId); @@ -3487,19 +3471,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, mSplitLayout.isLeftRightSplit()); } - private void handleUnsupportedSplitStart() { - mSplitUnsupportedToast.show(); - notifySplitAnimationFinished(); - } - - private void notifySplitAnimationFinished() { - if (mSplitInvocationListener == null || mSplitInvocationListenerExecutor == null) { - return; - } - mSplitInvocationListenerExecutor.execute(() -> - mSplitInvocationListener.onSplitAnimationInvoked(false /*animationRunning*/)); - } - /** * Logs the exit of splitscreen to a specific stage. This must be called before the exit is * executed. @@ -3562,7 +3533,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (!ENABLE_SHELL_TRANSITIONS) { StageCoordinator.this.exitSplitScreen(isMainStage ? mMainStage : mSideStage, EXIT_REASON_APP_DOES_NOT_SUPPORT_MULTIWINDOW); - handleUnsupportedSplitStart(); + mSplitUnsupportedToast.show(); return; } @@ -3582,7 +3553,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, "app package " + taskInfo.baseActivity.getPackageName() + " does not support splitscreen, or is a controlled activity type")); if (splitScreenVisible) { - handleUnsupportedSplitStart(); + mSplitUnsupportedToast.show(); } } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java index 34b2eebb15a1..befc702b01aa 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/SplitTransitionTests.java @@ -39,13 +39,10 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; import android.annotation.NonNull; import android.app.ActivityManager; @@ -66,7 +63,6 @@ import com.android.wm.shell.RootTaskDisplayAreaOrganizer; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.TestRunningTaskInfoBuilder; -import com.android.wm.shell.TestShellExecutor; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayImeController; import com.android.wm.shell.common.DisplayInsetsController; @@ -109,8 +105,6 @@ public class SplitTransitionTests extends ShellTestCase { @Mock private ShellExecutor mMainExecutor; @Mock private LaunchAdjacentController mLaunchAdjacentController; @Mock private DefaultMixedHandler mMixedHandler; - @Mock private SplitScreen.SplitInvocationListener mInvocationListener; - private final TestShellExecutor mTestShellExecutor = new TestShellExecutor(); private SplitLayout mSplitLayout; private MainStage mMainStage; private SideStage mSideStage; @@ -153,7 +147,6 @@ public class SplitTransitionTests extends ShellTestCase { .setParentTaskId(mSideStage.mRootTaskInfo.taskId).build(); doReturn(mock(SplitDecorManager.class)).when(mMainStage).getSplitDecorManager(); doReturn(mock(SplitDecorManager.class)).when(mSideStage).getSplitDecorManager(); - mStageCoordinator.registerSplitAnimationListener(mInvocationListener, mTestShellExecutor); } @Test @@ -459,15 +452,6 @@ public class SplitTransitionTests extends ShellTestCase { mMainStage.activate(new WindowContainerTransaction(), true /* includingTopTask */); } - @Test - @UiThreadTest - public void testSplitInvocationCallback() { - enterSplit(); - mTestShellExecutor.flushAll(); - verify(mInvocationListener, times(1)) - .onSplitAnimationInvoked(eq(true)); - } - private boolean containsSplitEnter(@NonNull WindowContainerTransaction wct) { for (int i = 0; i < wct.getHierarchyOps().size(); ++i) { WindowContainerTransaction.HierarchyOp op = wct.getHierarchyOps().get(i); diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp index 33830f154835..014b8413bb10 100644 --- a/libs/hwui/Android.bp +++ b/libs/hwui/Android.bp @@ -547,6 +547,7 @@ cc_defaults { "hwui/MinikinUtils.cpp", "hwui/PaintImpl.cpp", "hwui/Typeface.cpp", + "thread/CommonPool.cpp", "utils/Blur.cpp", "utils/Color.cpp", "utils/LinearAllocator.cpp", @@ -623,7 +624,6 @@ cc_defaults { "renderthread/RenderThread.cpp", "renderthread/HintSessionWrapper.cpp", "service/GraphicsStatsService.cpp", - "thread/CommonPool.cpp", "utils/GLUtils.cpp", "utils/NdkUtils.cpp", "AutoBackendTextureRelease.cpp", diff --git a/libs/hwui/WebViewFunctorManager.cpp b/libs/hwui/WebViewFunctorManager.cpp index 6fc251dc815c..5b4ab5f2d3b1 100644 --- a/libs/hwui/WebViewFunctorManager.cpp +++ b/libs/hwui/WebViewFunctorManager.cpp @@ -86,6 +86,10 @@ void WebViewFunctor_release(int functor) { WebViewFunctorManager::instance().releaseFunctor(functor); } +void WebViewFunctor_reportRenderingThreads(int functor, const int32_t* thread_ids, size_t size) { + WebViewFunctorManager::instance().reportRenderingThreads(functor, thread_ids, size); +} + static std::atomic_int sNextId{1}; WebViewFunctor::WebViewFunctor(void* data, const WebViewFunctorCallbacks& callbacks, @@ -260,6 +264,10 @@ void WebViewFunctor::reparentSurfaceControl(ASurfaceControl* parent) { funcs.transactionDeleteFunc(transaction); } +void WebViewFunctor::reportRenderingThreads(const int32_t* thread_ids, size_t size) { + // TODO(b/329219352): Pass the threads to HWUI and update the ADPF session. +} + WebViewFunctorManager& WebViewFunctorManager::instance() { static WebViewFunctorManager sInstance; return sInstance; @@ -346,6 +354,17 @@ void WebViewFunctorManager::destroyFunctor(int functor) { } } +void WebViewFunctorManager::reportRenderingThreads(int functor, const int32_t* thread_ids, + size_t size) { + std::lock_guard _lock{mLock}; + for (auto& iter : mFunctors) { + if (iter->id() == functor) { + iter->reportRenderingThreads(thread_ids, size); + break; + } + } +} + sp<WebViewFunctor::Handle> WebViewFunctorManager::handleFor(int functor) { std::lock_guard _lock{mLock}; for (auto& iter : mActiveFunctors) { diff --git a/libs/hwui/WebViewFunctorManager.h b/libs/hwui/WebViewFunctorManager.h index 0a02f2d4b720..1bf2c1f9c4ef 100644 --- a/libs/hwui/WebViewFunctorManager.h +++ b/libs/hwui/WebViewFunctorManager.h @@ -81,6 +81,8 @@ public: ASurfaceControl* getSurfaceControl(); void mergeTransaction(ASurfaceTransaction* transaction); + void reportRenderingThreads(const int32_t* thread_ids, size_t size); + sp<Handle> createHandle() { LOG_ALWAYS_FATAL_IF(mCreatedHandle); mCreatedHandle = true; @@ -110,6 +112,7 @@ public: void releaseFunctor(int functor); void onContextDestroyed(); void destroyFunctor(int functor); + void reportRenderingThreads(int functor, const int32_t* thread_ids, size_t size); sp<WebViewFunctor::Handle> handleFor(int functor); diff --git a/libs/hwui/platform/android/thread/CommonPoolBase.h b/libs/hwui/platform/android/thread/CommonPoolBase.h new file mode 100644 index 000000000000..8f836b612440 --- /dev/null +++ b/libs/hwui/platform/android/thread/CommonPoolBase.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FRAMEWORKS_BASE_COMMONPOOLBASE_H +#define FRAMEWORKS_BASE_COMMONPOOLBASE_H + +#include <sys/resource.h> + +#include "renderthread/RenderThread.h" + +namespace android { +namespace uirenderer { + +class CommonPoolBase { + PREVENT_COPY_AND_ASSIGN(CommonPoolBase); + +protected: + CommonPoolBase() {} + + void setupThread(int i, std::mutex& mLock, std::vector<int>& tids, + std::vector<std::condition_variable>& tidConditionVars) { + std::array<char, 20> name{"hwuiTask"}; + snprintf(name.data(), name.size(), "hwuiTask%d", i); + auto self = pthread_self(); + pthread_setname_np(self, name.data()); + { + std::unique_lock lock(mLock); + tids[i] = pthread_gettid_np(self); + tidConditionVars[i].notify_one(); + } + setpriority(PRIO_PROCESS, 0, PRIORITY_FOREGROUND); + auto startHook = renderthread::RenderThread::getOnStartHook(); + if (startHook) { + startHook(name.data()); + } + } + + bool supportsTid() { return true; } +}; + +} // namespace uirenderer +} // namespace android + +#endif // FRAMEWORKS_BASE_COMMONPOOLBASE_H diff --git a/libs/hwui/platform/host/thread/CommonPoolBase.h b/libs/hwui/platform/host/thread/CommonPoolBase.h new file mode 100644 index 000000000000..cd091013ce0c --- /dev/null +++ b/libs/hwui/platform/host/thread/CommonPoolBase.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FRAMEWORKS_BASE_COMMONPOOLBASE_H +#define FRAMEWORKS_BASE_COMMONPOOLBASE_H + +#include <condition_variable> +#include <mutex> +#include <vector> + +#include "renderthread/RenderThread.h" + +namespace android { +namespace uirenderer { + +class CommonPoolBase { + PREVENT_COPY_AND_ASSIGN(CommonPoolBase); + +protected: + CommonPoolBase() {} + + void setupThread(int i, std::mutex& mLock, std::vector<int>& tids, + std::vector<std::condition_variable>& tidConditionVars) { + std::array<char, 20> name{"hwuiTask"}; + snprintf(name.data(), name.size(), "hwuiTask%d", i); + { + std::unique_lock lock(mLock); + tids[i] = -1; + tidConditionVars[i].notify_one(); + } + auto startHook = renderthread::RenderThread::getOnStartHook(); + if (startHook) { + startHook(name.data()); + } + } + + bool supportsTid() { return false; } +}; + +} // namespace uirenderer +} // namespace android + +#endif // FRAMEWORKS_BASE_COMMONPOOLBASE_H diff --git a/libs/hwui/private/hwui/WebViewFunctor.h b/libs/hwui/private/hwui/WebViewFunctor.h index 493c943079ab..dbd8a16dfcfc 100644 --- a/libs/hwui/private/hwui/WebViewFunctor.h +++ b/libs/hwui/private/hwui/WebViewFunctor.h @@ -106,6 +106,11 @@ ANDROID_API int WebViewFunctor_create(void* data, const WebViewFunctorCallbacks& // and it should be considered alive & active until that point. ANDROID_API void WebViewFunctor_release(int functor); +// Reports the list of threads critical for frame production for the given +// functor. Must be called on render thread. +ANDROID_API void WebViewFunctor_reportRenderingThreads(int functor, const int32_t* thread_ids, + size_t size); + } // namespace android::uirenderer #endif // FRAMEWORKS_BASE_WEBVIEWFUNCTOR_H diff --git a/libs/hwui/thread/CommonPool.cpp b/libs/hwui/thread/CommonPool.cpp index dc92f9f0d39a..6c0c30f95955 100644 --- a/libs/hwui/thread/CommonPool.cpp +++ b/libs/hwui/thread/CommonPool.cpp @@ -16,16 +16,14 @@ #include "CommonPool.h" -#include <sys/resource.h> #include <utils/Trace.h> -#include "renderthread/RenderThread.h" #include <array> namespace android { namespace uirenderer { -CommonPool::CommonPool() { +CommonPool::CommonPool() : CommonPoolBase() { ATRACE_CALL(); CommonPool* pool = this; @@ -36,22 +34,7 @@ CommonPool::CommonPool() { // Create 2 workers for (int i = 0; i < THREAD_COUNT; i++) { std::thread worker([pool, i, &mLock, &tids, &tidConditionVars] { - { - std::array<char, 20> name{"hwuiTask"}; - snprintf(name.data(), name.size(), "hwuiTask%d", i); - auto self = pthread_self(); - pthread_setname_np(self, name.data()); - { - std::unique_lock lock(mLock); - tids[i] = pthread_gettid_np(self); - tidConditionVars[i].notify_one(); - } - setpriority(PRIO_PROCESS, 0, PRIORITY_FOREGROUND); - auto startHook = renderthread::RenderThread::getOnStartHook(); - if (startHook) { - startHook(name.data()); - } - } + pool->setupThread(i, mLock, tids, tidConditionVars); pool->workerLoop(); }); worker.detach(); @@ -64,7 +47,9 @@ CommonPool::CommonPool() { } } } - mWorkerThreadIds = std::move(tids); + if (pool->supportsTid()) { + mWorkerThreadIds = std::move(tids); + } } CommonPool& CommonPool::instance() { @@ -95,7 +80,7 @@ void CommonPool::enqueue(Task&& task) { void CommonPool::workerLoop() { std::unique_lock lock(mLock); - while (true) { + while (!mIsStopping) { if (!mWorkQueue.hasWork()) { mWaitingThreads++; mCondition.wait(lock); diff --git a/libs/hwui/thread/CommonPool.h b/libs/hwui/thread/CommonPool.h index 74f852bd1413..0c025b4f0ee7 100644 --- a/libs/hwui/thread/CommonPool.h +++ b/libs/hwui/thread/CommonPool.h @@ -17,8 +17,6 @@ #ifndef FRAMEWORKS_BASE_COMMONPOOL_H #define FRAMEWORKS_BASE_COMMONPOOL_H -#include "utils/Macros.h" - #include <log/log.h> #include <condition_variable> @@ -27,6 +25,9 @@ #include <mutex> #include <vector> +#include "thread/CommonPoolBase.h" +#include "utils/Macros.h" + namespace android { namespace uirenderer { @@ -73,7 +74,7 @@ private: int mTail = 0; }; -class CommonPool { +class CommonPool : private CommonPoolBase { PREVENT_COPY_AND_ASSIGN(CommonPool); public: @@ -107,7 +108,10 @@ private: static CommonPool& instance(); CommonPool(); - ~CommonPool() {} + ~CommonPool() { + mIsStopping = true; + mCondition.notify_all(); + } void enqueue(Task&&); void doWaitForIdle(); @@ -120,6 +124,7 @@ private: std::condition_variable mCondition; int mWaitingThreads = 0; ArrayQueue<Task, QUEUE_SIZE> mWorkQueue; + std::atomic_bool mIsStopping = false; }; } // namespace uirenderer diff --git a/media/java/android/media/IMediaRouter2Manager.aidl b/media/java/android/media/IMediaRouter2Manager.aidl index bb31859dabdb..21908b2ca2e0 100644 --- a/media/java/android/media/IMediaRouter2Manager.aidl +++ b/media/java/android/media/IMediaRouter2Manager.aidl @@ -35,4 +35,5 @@ oneway interface IMediaRouter2Manager { in @nullable RouteListingPreference routeListingPreference); void notifyRoutesUpdated(in List<MediaRoute2Info> routes); void notifyRequestFailed(int requestId, int reason); + void invalidateInstance(); } diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index f5dc6ead374a..1905fa8ce612 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -5101,7 +5101,7 @@ final public class MediaCodec { * size is larger than 16x16, then the qpOffset information of all 16x16 blocks that * encompass the coding unit is combined and used. The QP of target block will be calculated * as 'frameQP + offsetQP'. If the result exceeds minQP or maxQP configured then the value - * may be clamped. Negative offset results in blocks encoded at lower QP than frame QP and + * will be clamped. Negative offset results in blocks encoded at lower QP than frame QP and * positive offsets will result in encoding blocks at higher QP than frame QP. If the areas * of negative QP and positive QP are chosen wisely, the overall viewing experience can be * improved. @@ -5128,7 +5128,7 @@ final public class MediaCodec { * quantization parameter (QP) offset of the blocks in the bounding box. The bounding box * will get stretched outwards to align to LCU boundaries during encoding. The Qp Offset is * integral and shall be in the range [-128, 127]. The QP of target block will be calculated - * as frameQP + offsetQP. If the result exceeds minQP or maxQP configured then the value may + * as frameQP + offsetQP. If the result exceeds minQP or maxQP configured then the value will * be clamped. Negative offset results in blocks encoded at lower QP than frame QP and * positive offsets will result in blocks encoded at higher QP than frame QP. If the areas of * negative QP and positive QP are chosen wisely, the overall viewing experience can be diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index 1e7bc4764dd7..abad46046890 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -2651,11 +2651,10 @@ public final class MediaCodecInfo { mBlockAspectRatioRange = POSITIVE_RATIONALS; mAspectRatioRange = POSITIVE_RATIONALS; - // YUV 4:2:0 requires 2:2 alignment - mWidthAlignment = 2; - mHeightAlignment = 2; - mBlockWidth = 2; - mBlockHeight = 2; + mWidthAlignment = 1; + mHeightAlignment = 1; + mBlockWidth = 1; + mBlockHeight = 1; mSmallerDimensionUpperLimit = getSizeRange().getUpper(); } diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java index 7b83842a9fb2..cd0654ceb348 100644 --- a/media/java/android/media/MediaFormat.java +++ b/media/java/android/media/MediaFormat.java @@ -17,6 +17,7 @@ package android.media; import static android.media.codec.Flags.FLAG_IN_PROCESS_SW_AUDIO_CODEC; +import static android.media.codec.Flags.FLAG_REGION_OF_INTEREST; import static com.android.media.codec.flags.Flags.FLAG_CODEC_IMPORTANCE; import static com.android.media.codec.flags.Flags.FLAG_LARGE_AUDIO_FRAME; @@ -26,6 +27,8 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; +import android.graphics.Rect; +import android.text.TextUtils; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -34,6 +37,7 @@ import java.nio.ByteOrder; import java.util.AbstractSet; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -1769,6 +1773,67 @@ public final class MediaFormat { @FlaggedApi(FLAG_IN_PROCESS_SW_AUDIO_CODEC) public static final String KEY_SECURITY_MODEL = "security-model"; + /** + * QpOffsetRect constitutes the metadata required for encoding a region of interest in an + * image or a video frame. The region of interest is represented by a rectangle. The four + * integer coordinates of the rectangle are stored in fields left, top, right, bottom. + * Note that the right and bottom coordinates are exclusive. + * This is paired with a suggestive qp offset information that is to be used during encoding + * of the blocks belonging to the to the box. + */ + @FlaggedApi(FLAG_REGION_OF_INTEREST) + public static final class QpOffsetRect { + private Rect mContour; + private int mQpOffset; + + /** + * Create a new region of interest with the specified coordinates and qpOffset. Note: no + * range checking is performed, so the caller must ensure that left >= 0, left <= right, + * top >= 0 and top <= bottom. Note that the right and bottom coordinates are exclusive. + * + * @param contour Rectangle specifying the region of interest + * @param qpOffset qpOffset to be used for the blocks in the specified rectangle + */ + public QpOffsetRect(@NonNull Rect contour, int qpOffset) { + mContour = contour; + mQpOffset = qpOffset; + } + + /** + * Update the region of interest information with the specified coordinates and qpOffset + * + * @param contour Rectangle specifying the region of interest + * @param qpOffset qpOffset to be used for the blocks in the specified rectangle + */ + public void set(@NonNull Rect contour, int qpOffset) { + mContour = contour; + mQpOffset = qpOffset; + } + + /** + * @return Return a string representation of qpOffsetRect in a compact form. + * Helper function to insert key {@link #PARAMETER_KEY_QP_OFFSET_RECTS} in MediaFormat + */ + @NonNull + public String flattenToString() { + return TextUtils.formatSimple("%d,%d-%d,%d=%d;", mContour.top, mContour.left, + mContour.bottom, mContour.right, mQpOffset); + } + + /** + * @return Return a string representation of qpOffsetRect in a compact form. + * Helper function to insert key {@link #PARAMETER_KEY_QP_OFFSET_RECTS} in MediaFormat + */ + @NonNull + public static String flattenToString(@NonNull List<QpOffsetRect> qpOffsetRects) { + StringBuilder builder = new StringBuilder(); + for (QpOffsetRect qpOffsetRect : qpOffsetRects) { + builder.append(qpOffsetRect.flattenToString()); + } + return builder.toString(); + } + } + /* package private */ MediaFormat(@NonNull Map<String, Object> map) { mMap = map; } diff --git a/media/java/android/media/MediaRouter2.java b/media/java/android/media/MediaRouter2.java index 4d5a33d99b64..e0258ba4f61d 100644 --- a/media/java/android/media/MediaRouter2.java +++ b/media/java/android/media/MediaRouter2.java @@ -18,7 +18,6 @@ package android.media; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import static com.android.media.flags.Flags.FLAG_ENABLE_BUILT_IN_SPEAKER_ROUTE_SUITABILITY_STATUSES; -import static com.android.media.flags.Flags.FLAG_ENABLE_CROSS_USER_ROUTING_IN_MEDIA_ROUTER2; import static com.android.media.flags.Flags.FLAG_ENABLE_GET_TRANSFERABLE_ROUTES; import static com.android.media.flags.Flags.FLAG_ENABLE_PRIVILEGED_ROUTING_FOR_MEDIA_ROUTING_CONTROL; import static com.android.media.flags.Flags.FLAG_ENABLE_RLP_CALLBACKS_IN_MEDIA_ROUTER2; @@ -33,7 +32,9 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.TestApi; +import android.app.AppOpsManager; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -134,6 +135,8 @@ public final class MediaRouter2 { private record PackageNameUserHandlePair(String packageName, UserHandle user) {} + private record InstanceInvalidatedCallbackRecord(Executor executor, Runnable runnable) {} + @GuardedBy("sSystemRouterLock") private static final Map<PackageNameUserHandlePair, MediaRouter2> sAppToProxyRouterMap = new ArrayMap<>(); @@ -247,22 +250,34 @@ public final class MediaRouter2 { * <p>Calls to {@link #setOnGetControllerHintsListener} are ignored. * </ul> * + * <p>Callers that only hold the revocable form of {@link + * Manifest.permission#MEDIA_ROUTING_CONTROL} must use {@link #getInstance(Context, String, + * Executor, Runnable)} instead of this method. + * * @param clientPackageName the package name of the app to control * @return a proxy MediaRouter2 instance if {@code clientPackageName} exists or {@code null}. + * @throws IllegalStateException if the caller only holds a revocable version of {@link + * Manifest.permission#MEDIA_ROUTING_CONTROL}. + * @hide */ - @FlaggedApi(FLAG_ENABLE_CROSS_USER_ROUTING_IN_MEDIA_ROUTER2) + @SuppressWarnings("RequiresPermission") @RequiresPermission( anyOf = { Manifest.permission.MEDIA_CONTENT_CONTROL, Manifest.permission.MEDIA_ROUTING_CONTROL }) + @SystemApi @Nullable public static MediaRouter2 getInstance( @NonNull Context context, @NonNull String clientPackageName) { // Capturing the IAE here to not break nullability. try { return findOrCreateProxyInstanceForCallingUser( - context, clientPackageName, context.getUser()); + context, + clientPackageName, + context.getUser(), + /* executor */ null, + /* onInstanceInvalidatedListener */ null); } catch (IllegalArgumentException ex) { Log.e(TAG, "Package " + clientPackageName + " not found. Ignoring."); return null; @@ -271,6 +286,72 @@ public final class MediaRouter2 { /** * Returns a proxy MediaRouter2 instance that allows you to control the routing of an app + * specified by {@code clientPackageName}. Returns {@code null} if the specified package name + * does not exist. + * + * <p>Proxy MediaRouter2 instances operate differently than regular MediaRouter2 instances: + * + * <ul> + * <li> + * <p>{@link #registerRouteCallback} ignores any {@link RouteDiscoveryPreference discovery + * preference} passed by a proxy router. Use {@link RouteDiscoveryPreference#EMPTY} when + * setting a route callback. + * <li> + * <p>Methods returning non-system {@link RoutingController controllers} always return new + * instances with the latest data. Do not attempt to compare or store them. Instead, use + * {@link #getController(String)} or {@link #getControllers()} to query the most + * up-to-date state. + * <li> + * <p>Calls to {@link #setOnGetControllerHintsListener} are ignored. + * </ul> + * + * <p>Use this method when you only hold a revocable version of {@link + * Manifest.permission#MEDIA_ROUTING_CONTROL} (e.g. acquired via the {@link AppOpsManager}). + * Otherwise, use {@link #getInstance(Context, String)}. + * + * <p>{@code onInstanceInvalidatedListener} is called when the instance is invalidated because + * the calling app has lost {@link Manifest.permission#MEDIA_ROUTING_CONTROL} and does not hold + * {@link Manifest.permission#MEDIA_CONTENT_CONTROL}. Do not use the invalidated instance after + * receiving this callback, as the system will ignore all operations. Call {@link + * #getInstance(Context, String, Executor, Runnable)} again after reacquiring the relevant + * permissions. + * + * @param context The {@link Context} of the caller. + * @param clientPackageName The package name of the app you want to control the routing of. + * @param executor The {@link Executor} on which to invoke {@code + * onInstanceInvalidatedListener}. + * @param onInstanceInvalidatedListener Callback for when the {@link MediaRouter2} instance is + * invalidated due to lost permissions. + * @throws IllegalArgumentException if {@code clientPackageName} does not exist in the calling + * user. + */ + @SuppressWarnings("RequiresPermission") + @FlaggedApi(FLAG_ENABLE_PRIVILEGED_ROUTING_FOR_MEDIA_ROUTING_CONTROL) + @RequiresPermission( + anyOf = { + Manifest.permission.MEDIA_CONTENT_CONTROL, + Manifest.permission.MEDIA_ROUTING_CONTROL + }) + @NonNull + public static MediaRouter2 getInstance( + @NonNull Context context, + @NonNull String clientPackageName, + @NonNull Executor executor, + @NonNull Runnable onInstanceInvalidatedListener) { + Objects.requireNonNull(executor, "Executor must not be null"); + Objects.requireNonNull( + onInstanceInvalidatedListener, "onInstanceInvalidatedListener must not be null."); + + return findOrCreateProxyInstanceForCallingUser( + context, + clientPackageName, + context.getUser(), + executor, + onInstanceInvalidatedListener); + } + + /** + * Returns a proxy MediaRouter2 instance that allows you to control the routing of an app * specified by {@code clientPackageName} and {@code user}. * * <p>Proxy MediaRouter2 instances operate differently than regular MediaRouter2 instances: @@ -308,7 +389,12 @@ public final class MediaRouter2 { @NonNull public static MediaRouter2 getInstance( @NonNull Context context, @NonNull String clientPackageName, @NonNull UserHandle user) { - return findOrCreateProxyInstanceForCallingUser(context, clientPackageName, user); + return findOrCreateProxyInstanceForCallingUser( + context, + clientPackageName, + user, + /* executor */ null, + /* onInstanceInvalidatedListener */ null); } /** @@ -320,7 +406,11 @@ public final class MediaRouter2 { */ @NonNull private static MediaRouter2 findOrCreateProxyInstanceForCallingUser( - Context context, String clientPackageName, UserHandle user) { + Context context, + String clientPackageName, + UserHandle user, + @Nullable Executor executor, + @Nullable Runnable onInstanceInvalidatedListener) { Objects.requireNonNull(context, "context must not be null"); Objects.requireNonNull(user, "user must not be null"); @@ -328,6 +418,14 @@ public final class MediaRouter2 { throw new IllegalArgumentException("clientPackageName must not be null or empty"); } + if (executor == null || onInstanceInvalidatedListener == null) { + if (checkCallerHasOnlyRevocablePermissions(context)) { + throw new IllegalStateException( + "Use getInstance(Context, String, Executor, Runnable) to obtain a proxy" + + " MediaRouter2 instance."); + } + } + PackageNameUserHandlePair key = new PackageNameUserHandlePair(clientPackageName, user); synchronized (sSystemRouterLock) { @@ -339,10 +437,32 @@ public final class MediaRouter2 { ((ProxyMediaRouter2Impl) instance.mImpl).registerProxyRouter(); sAppToProxyRouterMap.put(key, instance); } + ((ProxyMediaRouter2Impl) instance.mImpl) + .registerInstanceInvalidatedCallback(executor, onInstanceInvalidatedListener); return instance; } } + private static boolean checkCallerHasOnlyRevocablePermissions(@NonNull Context context) { + boolean hasMediaContentControl = + context.checkSelfPermission(Manifest.permission.MEDIA_CONTENT_CONTROL) + == PackageManager.PERMISSION_GRANTED; + boolean hasRegularMediaRoutingControl = + context.checkSelfPermission(Manifest.permission.MEDIA_ROUTING_CONTROL) + == PackageManager.PERMISSION_GRANTED; + AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class); + boolean hasAppOpMediaRoutingControl = + appOpsManager.unsafeCheckOp( + AppOpsManager.OPSTR_MEDIA_ROUTING_CONTROL, + context.getApplicationInfo().uid, + context.getOpPackageName()) + == AppOpsManager.MODE_ALLOWED; + + return !hasMediaContentControl + && !hasRegularMediaRoutingControl + && hasAppOpMediaRoutingControl; + } + /** * Starts scanning remote routes. * @@ -2425,6 +2545,10 @@ public final class MediaRouter2 { @NonNull private final UserHandle mClientUser; private final AtomicBoolean mIsScanning = new AtomicBoolean(/* initialValue= */ false); + @GuardedBy("mLock") + private final List<InstanceInvalidatedCallbackRecord> mInstanceInvalidatedCallbackRecords = + new ArrayList<>(); + ProxyMediaRouter2Impl( @NonNull Context context, @NonNull String clientPackageName, @@ -2447,6 +2571,21 @@ public final class MediaRouter2 { } } + public void registerInstanceInvalidatedCallback( + @Nullable Executor executor, @Nullable Runnable onInstanceInvalidatedListener) { + if (executor == null || onInstanceInvalidatedListener == null) { + return; + } + + InstanceInvalidatedCallbackRecord record = + new InstanceInvalidatedCallbackRecord(executor, onInstanceInvalidatedListener); + synchronized (mLock) { + if (!mInstanceInvalidatedCallbackRecords.contains(record)) { + mInstanceInvalidatedCallbackRecords.add(record); + } + } + } + @Override public void updateScanningState(int scanningState) throws RemoteException { mMediaRouterService.updateScanningState(mClient, scanningState); @@ -3176,6 +3315,30 @@ public final class MediaRouter2 { } } + private void onInvalidateInstanceOnHandler() { + Log.w( + TAG, + "MEDIA_ROUTING_CONTROL has been revoked for this package. Invalidating" + + " instance."); + // After this block, all following getInstance() calls should throw a SecurityException, + // so no new onInstanceInvalidatedListeners can be registered to this instance. + synchronized (sSystemRouterLock) { + PackageNameUserHandlePair key = + new PackageNameUserHandlePair(mClientPackageName, mClientUser); + sAppToProxyRouterMap.remove(key); + } + + synchronized (mLock) { + for (InstanceInvalidatedCallbackRecord record : + mInstanceInvalidatedCallbackRecords) { + record.executor.execute(record.runnable); + } + } + mRouteCallbackRecords.clear(); + mControllerCallbackRecords.clear(); + mTransferCallbackRecords.clear(); + } + private class Client extends IMediaRouter2Manager.Stub { @Override @@ -3244,6 +3407,14 @@ public final class MediaRouter2 { requestId, reason)); } + + @Override + public void invalidateInstance() { + mHandler.sendMessage( + obtainMessage( + ProxyMediaRouter2Impl::onInvalidateInstanceOnHandler, + ProxyMediaRouter2Impl.this)); + } } } diff --git a/media/java/android/media/MediaRouter2Manager.java b/media/java/android/media/MediaRouter2Manager.java index 488d54486561..7756d93a5c38 100644 --- a/media/java/android/media/MediaRouter2Manager.java +++ b/media/java/android/media/MediaRouter2Manager.java @@ -1150,5 +1150,11 @@ public final class MediaRouter2Manager { MediaRouter2Manager.this, routes)); } + + @Override + public void invalidateInstance() { + // Should never happen since MediaRouter2Manager should only be used with + // MEDIA_CONTENT_CONTROL, which cannot be revoked. + } } } diff --git a/native/android/Android.bp b/native/android/Android.bp index 481268516b51..001b8a573354 100644 --- a/native/android/Android.bp +++ b/native/android/Android.bp @@ -84,6 +84,7 @@ cc_library_shared { "libinput", "libutils", "libbinder", + "libbinder_ndk", "libui", "libgui", "libharfbuzz_ng", // Only for including hb.h via minikin @@ -101,6 +102,7 @@ cc_library_shared { "android.hardware.configstore-utils", "android.os.flags-aconfig-cc", "libnativedisplay", + "libfmq", ], static_libs: [ diff --git a/native/android/performance_hint.cpp b/native/android/performance_hint.cpp index 279f9d682b9f..8227bdbd14a7 100644 --- a/native/android/performance_hint.cpp +++ b/native/android/performance_hint.cpp @@ -18,15 +18,15 @@ #include <aidl/android/hardware/power/SessionHint.h> #include <aidl/android/hardware/power/SessionMode.h> +#include <aidl/android/hardware/power/SessionTag.h> +#include <aidl/android/hardware/power/WorkDuration.h> +#include <aidl/android/os/IHintManager.h> +#include <aidl/android/os/IHintSession.h> #include <android-base/stringprintf.h> -#include <android/WorkDuration.h> -#include <android/os/IHintManager.h> -#include <android/os/IHintSession.h> +#include <android/binder_manager.h> +#include <android/binder_status.h> #include <android/performance_hint.h> #include <android/trace.h> -#include <binder/Binder.h> -#include <binder/IBinder.h> -#include <binder/IServiceManager.h> #include <inttypes.h> #include <performance_hint_private.h> #include <utils/SystemClock.h> @@ -37,22 +37,25 @@ #include <vector> using namespace android; -using namespace android::os; +using namespace aidl::android::os; using namespace std::chrono_literals; -using AidlSessionHint = aidl::android::hardware::power::SessionHint; -using AidlSessionMode = aidl::android::hardware::power::SessionMode; +using HalSessionHint = aidl::android::hardware::power::SessionHint; +using HalSessionMode = aidl::android::hardware::power::SessionMode; +using HalWorkDuration = aidl::android::hardware::power::WorkDuration; + using android::base::StringPrintf; struct APerformanceHintSession; constexpr int64_t SEND_HINT_TIMEOUT = std::chrono::nanoseconds(100ms).count(); +struct AWorkDuration : public HalWorkDuration {}; struct APerformanceHintManager { public: static APerformanceHintManager* getInstance(); - APerformanceHintManager(sp<IHintManager> service, int64_t preferredRateNanos); + APerformanceHintManager(std::shared_ptr<IHintManager> service, int64_t preferredRateNanos); APerformanceHintManager() = delete; ~APerformanceHintManager() = default; @@ -61,17 +64,28 @@ public: int64_t getPreferredRateNanos() const; private: - static APerformanceHintManager* create(sp<IHintManager> iHintManager); + // Necessary to create an empty binder object + static void* tokenStubOnCreate(void*) { + return nullptr; + } + static void tokenStubOnDestroy(void*) {} + static binder_status_t tokenStubOnTransact(AIBinder*, transaction_code_t, const AParcel*, + AParcel*) { + return STATUS_OK; + } + + static APerformanceHintManager* create(std::shared_ptr<IHintManager> iHintManager); - sp<IHintManager> mHintManager; - const sp<IBinder> mToken = sp<BBinder>::make(); + std::shared_ptr<IHintManager> mHintManager; + ndk::SpAIBinder mToken; const int64_t mPreferredRateNanos; }; struct APerformanceHintSession { public: - APerformanceHintSession(sp<IHintManager> hintManager, sp<IHintSession> session, - int64_t preferredRateNanos, int64_t targetDurationNanos); + APerformanceHintSession(std::shared_ptr<IHintManager> hintManager, + std::shared_ptr<IHintSession> session, int64_t preferredRateNanos, + int64_t targetDurationNanos); APerformanceHintSession() = delete; ~APerformanceHintSession(); @@ -86,10 +100,10 @@ public: private: friend struct APerformanceHintManager; - int reportActualWorkDurationInternal(WorkDuration* workDuration); + int reportActualWorkDurationInternal(AWorkDuration* workDuration); - sp<IHintManager> mHintManager; - sp<IHintSession> mHintSession; + std::shared_ptr<IHintManager> mHintManager; + std::shared_ptr<IHintSession> mHintSession; // HAL preferred update rate const int64_t mPreferredRateNanos; // Target duration for choosing update rate @@ -101,7 +115,7 @@ private: // Last hint reported from sendHint indexed by hint value std::vector<int64_t> mLastHintSentTimestamp; // Cached samples - std::vector<WorkDuration> mActualWorkDurations; + std::vector<HalWorkDuration> mActualWorkDurations; std::string mSessionName; static int32_t sIDCounter; // The most recent set of thread IDs @@ -114,19 +128,24 @@ private: void traceTargetDuration(int64_t targetDuration); }; -static IHintManager* gIHintManagerForTesting = nullptr; +static std::shared_ptr<IHintManager>* gIHintManagerForTesting = nullptr; static APerformanceHintManager* gHintManagerForTesting = nullptr; int32_t APerformanceHintSession::sIDCounter = 0; // ===================================== APerformanceHintManager implementation -APerformanceHintManager::APerformanceHintManager(sp<IHintManager> manager, +APerformanceHintManager::APerformanceHintManager(std::shared_ptr<IHintManager> manager, int64_t preferredRateNanos) - : mHintManager(std::move(manager)), mPreferredRateNanos(preferredRateNanos) {} + : mHintManager(std::move(manager)), mPreferredRateNanos(preferredRateNanos) { + static AIBinder_Class* tokenBinderClass = + AIBinder_Class_define("phm_token", tokenStubOnCreate, tokenStubOnDestroy, + tokenStubOnTransact); + mToken = ndk::SpAIBinder(AIBinder_new(tokenBinderClass, nullptr)); +} APerformanceHintManager* APerformanceHintManager::getInstance() { if (gHintManagerForTesting) return gHintManagerForTesting; if (gIHintManagerForTesting) { - APerformanceHintManager* manager = create(gIHintManagerForTesting); + APerformanceHintManager* manager = create(*gIHintManagerForTesting); gIHintManagerForTesting = nullptr; return manager; } @@ -134,20 +153,19 @@ APerformanceHintManager* APerformanceHintManager::getInstance() { return instance; } -APerformanceHintManager* APerformanceHintManager::create(sp<IHintManager> manager) { +APerformanceHintManager* APerformanceHintManager::create(std::shared_ptr<IHintManager> manager) { if (!manager) { - manager = interface_cast<IHintManager>( - defaultServiceManager()->checkService(String16("performance_hint"))); + manager = IHintManager::fromBinder( + ndk::SpAIBinder(AServiceManager_waitForService("performance_hint"))); } if (manager == nullptr) { ALOGE("%s: PerformanceHint service is not ready ", __FUNCTION__); return nullptr; } int64_t preferredRateNanos = -1L; - binder::Status ret = manager->getHintSessionPreferredRate(&preferredRateNanos); + ndk::ScopedAStatus ret = manager->getHintSessionPreferredRate(&preferredRateNanos); if (!ret.isOk()) { - ALOGE("%s: PerformanceHint cannot get preferred rate. %s", __FUNCTION__, - ret.exceptionMessage().c_str()); + ALOGE("%s: PerformanceHint cannot get preferred rate. %s", __FUNCTION__, ret.getMessage()); return nullptr; } if (preferredRateNanos <= 0) { @@ -159,8 +177,8 @@ APerformanceHintManager* APerformanceHintManager::create(sp<IHintManager> manage APerformanceHintSession* APerformanceHintManager::createSession( const int32_t* threadIds, size_t size, int64_t initialTargetWorkDurationNanos) { std::vector<int32_t> tids(threadIds, threadIds + size); - sp<IHintSession> session; - binder::Status ret = + std::shared_ptr<IHintSession> session; + ndk::ScopedAStatus ret = mHintManager->createHintSession(mToken, tids, initialTargetWorkDurationNanos, &session); if (!ret.isOk() || !session) { return nullptr; @@ -179,8 +197,8 @@ int64_t APerformanceHintManager::getPreferredRateNanos() const { // ===================================== APerformanceHintSession implementation -APerformanceHintSession::APerformanceHintSession(sp<IHintManager> hintManager, - sp<IHintSession> session, +APerformanceHintSession::APerformanceHintSession(std::shared_ptr<IHintManager> hintManager, + std::shared_ptr<IHintSession> session, int64_t preferredRateNanos, int64_t targetDurationNanos) : mHintManager(hintManager), @@ -189,17 +207,17 @@ APerformanceHintSession::APerformanceHintSession(sp<IHintManager> hintManager, mTargetDurationNanos(targetDurationNanos), mFirstTargetMetTimestamp(0), mLastTargetMetTimestamp(0) { - const std::vector<AidlSessionHint> sessionHintRange{ndk::enum_range<AidlSessionHint>().begin(), - ndk::enum_range<AidlSessionHint>().end()}; + const std::vector<HalSessionHint> sessionHintRange{ndk::enum_range<HalSessionHint>().begin(), + ndk::enum_range<HalSessionHint>().end()}; mLastHintSentTimestamp = std::vector<int64_t>(sessionHintRange.size(), 0); mSessionName = android::base::StringPrintf("ADPF Session %" PRId32, ++sIDCounter); } APerformanceHintSession::~APerformanceHintSession() { - binder::Status ret = mHintSession->close(); + ndk::ScopedAStatus ret = mHintSession->close(); if (!ret.isOk()) { - ALOGE("%s: HintSession close failed: %s", __FUNCTION__, ret.exceptionMessage().c_str()); + ALOGE("%s: HintSession close failed: %s", __FUNCTION__, ret.getMessage()); } } @@ -208,10 +226,10 @@ int APerformanceHintSession::updateTargetWorkDuration(int64_t targetDurationNano ALOGE("%s: targetDurationNanos must be positive", __FUNCTION__); return EINVAL; } - binder::Status ret = mHintSession->updateTargetWorkDuration(targetDurationNanos); + ndk::ScopedAStatus ret = mHintSession->updateTargetWorkDuration(targetDurationNanos); if (!ret.isOk()) { ALOGE("%s: HintSession updateTargetWorkDuration failed: %s", __FUNCTION__, - ret.exceptionMessage().c_str()); + ret.getMessage()); return EPIPE; } mTargetDurationNanos = targetDurationNanos; @@ -228,9 +246,12 @@ int APerformanceHintSession::updateTargetWorkDuration(int64_t targetDurationNano } int APerformanceHintSession::reportActualWorkDuration(int64_t actualDurationNanos) { - WorkDuration workDuration(0, actualDurationNanos, actualDurationNanos, 0); + HalWorkDuration workDuration{.durationNanos = actualDurationNanos, + .workPeriodStartTimestampNanos = 0, + .cpuDurationNanos = actualDurationNanos, + .gpuDurationNanos = 0}; - return reportActualWorkDurationInternal(&workDuration); + return reportActualWorkDurationInternal(static_cast<AWorkDuration*>(&workDuration)); } int APerformanceHintSession::sendHint(SessionHint hint) { @@ -238,17 +259,17 @@ int APerformanceHintSession::sendHint(SessionHint hint) { ALOGE("%s: invalid session hint %d", __FUNCTION__, hint); return EINVAL; } - int64_t now = elapsedRealtimeNano(); + int64_t now = uptimeNanos(); // Limit sendHint to a pre-detemined rate for safety if (now < (mLastHintSentTimestamp[hint] + SEND_HINT_TIMEOUT)) { return 0; } - binder::Status ret = mHintSession->sendHint(hint); + ndk::ScopedAStatus ret = mHintSession->sendHint(hint); if (!ret.isOk()) { - ALOGE("%s: HintSession sendHint failed: %s", __FUNCTION__, ret.exceptionMessage().c_str()); + ALOGE("%s: HintSession sendHint failed: %s", __FUNCTION__, ret.getMessage()); return EPIPE; } mLastHintSentTimestamp[hint] = now; @@ -261,12 +282,12 @@ int APerformanceHintSession::setThreads(const int32_t* threadIds, size_t size) { return EINVAL; } std::vector<int32_t> tids(threadIds, threadIds + size); - binder::Status ret = mHintManager->setHintSessionThreads(mHintSession, tids); + ndk::ScopedAStatus ret = mHintManager->setHintSessionThreads(mHintSession, tids); if (!ret.isOk()) { - ALOGE("%s: failed: %s", __FUNCTION__, ret.exceptionMessage().c_str()); - if (ret.exceptionCode() == binder::Status::Exception::EX_ILLEGAL_ARGUMENT) { + ALOGE("%s: failed: %s", __FUNCTION__, ret.getMessage()); + if (ret.getExceptionCode() == EX_ILLEGAL_ARGUMENT) { return EINVAL; - } else if (ret.exceptionCode() == binder::Status::Exception::EX_SECURITY) { + } else if (ret.getExceptionCode() == EX_SECURITY) { return EPERM; } return EPIPE; @@ -279,9 +300,9 @@ int APerformanceHintSession::setThreads(const int32_t* threadIds, size_t size) { int APerformanceHintSession::getThreadIds(int32_t* const threadIds, size_t* size) { std::vector<int32_t> tids; - binder::Status ret = mHintManager->getHintSessionThreadIds(mHintSession, &tids); + ndk::ScopedAStatus ret = mHintManager->getHintSessionThreadIds(mHintSession, &tids); if (!ret.isOk()) { - ALOGE("%s: failed: %s", __FUNCTION__, ret.exceptionMessage().c_str()); + ALOGE("%s: failed: %s", __FUNCTION__, ret.getMessage()); return EPIPE; } @@ -301,28 +322,27 @@ int APerformanceHintSession::getThreadIds(int32_t* const threadIds, size_t* size } int APerformanceHintSession::setPreferPowerEfficiency(bool enabled) { - binder::Status ret = - mHintSession->setMode(static_cast<int32_t>(AidlSessionMode::POWER_EFFICIENCY), enabled); + ndk::ScopedAStatus ret = + mHintSession->setMode(static_cast<int32_t>(HalSessionMode::POWER_EFFICIENCY), enabled); if (!ret.isOk()) { ALOGE("%s: HintSession setPreferPowerEfficiency failed: %s", __FUNCTION__, - ret.exceptionMessage().c_str()); + ret.getMessage()); return EPIPE; } tracePowerEfficient(enabled); return OK; } -int APerformanceHintSession::reportActualWorkDuration(AWorkDuration* aWorkDuration) { - WorkDuration* workDuration = static_cast<WorkDuration*>(aWorkDuration); +int APerformanceHintSession::reportActualWorkDuration(AWorkDuration* workDuration) { return reportActualWorkDurationInternal(workDuration); } -int APerformanceHintSession::reportActualWorkDurationInternal(WorkDuration* workDuration) { - int64_t actualTotalDurationNanos = workDuration->actualTotalDurationNanos; +int APerformanceHintSession::reportActualWorkDurationInternal(AWorkDuration* workDuration) { + int64_t actualTotalDurationNanos = workDuration->durationNanos; int64_t now = uptimeNanos(); - workDuration->timestampNanos = now; - traceActualDuration(workDuration->actualTotalDurationNanos); + workDuration->timeStampNanos = now; + traceActualDuration(workDuration->durationNanos); mActualWorkDurations.push_back(std::move(*workDuration)); if (actualTotalDurationNanos >= mTargetDurationNanos) { @@ -346,14 +366,14 @@ int APerformanceHintSession::reportActualWorkDurationInternal(WorkDuration* work mLastTargetMetTimestamp = now; } - binder::Status ret = mHintSession->reportActualWorkDuration2(mActualWorkDurations); + ndk::ScopedAStatus ret = mHintSession->reportActualWorkDuration2(mActualWorkDurations); if (!ret.isOk()) { ALOGE("%s: HintSession reportActualWorkDuration failed: %s", __FUNCTION__, - ret.exceptionMessage().c_str()); + ret.getMessage()); mFirstTargetMetTimestamp = 0; mLastTargetMetTimestamp = 0; traceBatchSize(mActualWorkDurations.size()); - return ret.exceptionCode() == binder::Status::EX_ILLEGAL_ARGUMENT ? EINVAL : EPIPE; + return ret.getExceptionCode() == EX_ILLEGAL_ARGUMENT ? EINVAL : EPIPE; } mActualWorkDurations.clear(); traceBatchSize(0); @@ -481,18 +501,16 @@ int APerformanceHint_reportActualWorkDuration2(APerformanceHintSession* session, AWorkDuration* workDurationPtr) { VALIDATE_PTR(session) VALIDATE_PTR(workDurationPtr) - WorkDuration& workDuration = *static_cast<WorkDuration*>(workDurationPtr); - VALIDATE_INT(workDuration.workPeriodStartTimestampNanos, > 0) - VALIDATE_INT(workDuration.actualTotalDurationNanos, > 0) - VALIDATE_INT(workDuration.actualCpuDurationNanos, >= 0) - VALIDATE_INT(workDuration.actualGpuDurationNanos, >= 0) - VALIDATE_INT(workDuration.actualGpuDurationNanos + workDuration.actualCpuDurationNanos, > 0) + VALIDATE_INT(workDurationPtr->durationNanos, > 0) + VALIDATE_INT(workDurationPtr->workPeriodStartTimestampNanos, > 0) + VALIDATE_INT(workDurationPtr->cpuDurationNanos, >= 0) + VALIDATE_INT(workDurationPtr->gpuDurationNanos, >= 0) + VALIDATE_INT(workDurationPtr->gpuDurationNanos + workDurationPtr->cpuDurationNanos, > 0) return session->reportActualWorkDuration(workDurationPtr); } AWorkDuration* AWorkDuration_create() { - WorkDuration* workDuration = new WorkDuration(); - return static_cast<AWorkDuration*>(workDuration); + return new AWorkDuration(); } void AWorkDuration_release(AWorkDuration* aWorkDuration) { @@ -500,37 +518,36 @@ void AWorkDuration_release(AWorkDuration* aWorkDuration) { delete aWorkDuration; } -void AWorkDuration_setWorkPeriodStartTimestampNanos(AWorkDuration* aWorkDuration, - int64_t workPeriodStartTimestampNanos) { - VALIDATE_PTR(aWorkDuration) - WARN_INT(workPeriodStartTimestampNanos, > 0) - static_cast<WorkDuration*>(aWorkDuration)->workPeriodStartTimestampNanos = - workPeriodStartTimestampNanos; -} - void AWorkDuration_setActualTotalDurationNanos(AWorkDuration* aWorkDuration, int64_t actualTotalDurationNanos) { VALIDATE_PTR(aWorkDuration) WARN_INT(actualTotalDurationNanos, > 0) - static_cast<WorkDuration*>(aWorkDuration)->actualTotalDurationNanos = actualTotalDurationNanos; + aWorkDuration->durationNanos = actualTotalDurationNanos; +} + +void AWorkDuration_setWorkPeriodStartTimestampNanos(AWorkDuration* aWorkDuration, + int64_t workPeriodStartTimestampNanos) { + VALIDATE_PTR(aWorkDuration) + WARN_INT(workPeriodStartTimestampNanos, > 0) + aWorkDuration->workPeriodStartTimestampNanos = workPeriodStartTimestampNanos; } void AWorkDuration_setActualCpuDurationNanos(AWorkDuration* aWorkDuration, int64_t actualCpuDurationNanos) { VALIDATE_PTR(aWorkDuration) WARN_INT(actualCpuDurationNanos, >= 0) - static_cast<WorkDuration*>(aWorkDuration)->actualCpuDurationNanos = actualCpuDurationNanos; + aWorkDuration->cpuDurationNanos = actualCpuDurationNanos; } void AWorkDuration_setActualGpuDurationNanos(AWorkDuration* aWorkDuration, int64_t actualGpuDurationNanos) { VALIDATE_PTR(aWorkDuration) WARN_INT(actualGpuDurationNanos, >= 0) - static_cast<WorkDuration*>(aWorkDuration)->actualGpuDurationNanos = actualGpuDurationNanos; + aWorkDuration->gpuDurationNanos = actualGpuDurationNanos; } void APerformanceHint_setIHintManagerForTesting(void* iManager) { delete gHintManagerForTesting; gHintManagerForTesting = nullptr; - gIHintManagerForTesting = static_cast<IHintManager*>(iManager); + gIHintManagerForTesting = static_cast<std::shared_ptr<IHintManager>*>(iManager); } diff --git a/native/android/tests/performance_hint/Android.bp b/native/android/tests/performance_hint/Android.bp index fdc1bc6a20d8..608d5d8a923a 100644 --- a/native/android/tests/performance_hint/Android.bp +++ b/native/android/tests/performance_hint/Android.bp @@ -39,6 +39,7 @@ cc_test { "libandroid", "liblog", "libbinder", + "libbinder_ndk", "libpowermanager", "libutils", ], diff --git a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp index 4553b4919d2d..bfbe34e7a8a1 100644 --- a/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp +++ b/native/android/tests/performance_hint/PerformanceHintNativeTest.cpp @@ -16,11 +16,11 @@ #define LOG_TAG "PerformanceHintNativeTest" -#include <android/WorkDuration.h> -#include <android/os/IHintManager.h> -#include <android/os/IHintSession.h> +#include <aidl/android/hardware/power/WorkDuration.h> +#include <aidl/android/os/IHintManager.h> +#include <android/binder_manager.h> +#include <android/binder_status.h> #include <android/performance_hint.h> -#include <binder/IBinder.h> #include <gmock/gmock.h> #include <gtest/gtest.h> #include <performance_hint_private.h> @@ -28,48 +28,54 @@ #include <memory> #include <vector> -using android::binder::Status; -using android::os::IHintManager; -using android::os::IHintSession; +using aidl::android::hardware::power::WorkDuration; +using aidl::android::os::IHintManager; +using aidl::android::os::IHintSession; +using ndk::ScopedAStatus; +using ndk::SpAIBinder; using namespace android; using namespace testing; class MockIHintManager : public IHintManager { public: - MOCK_METHOD(Status, createHintSession, - (const sp<IBinder>& token, const ::std::vector<int32_t>& tids, - int64_t durationNanos, ::android::sp<IHintSession>* _aidl_return), + MOCK_METHOD(ScopedAStatus, createHintSession, + (const SpAIBinder& token, const ::std::vector<int32_t>& tids, int64_t durationNanos, + std::shared_ptr<IHintSession>* _aidl_return), (override)); - MOCK_METHOD(Status, getHintSessionPreferredRate, (int64_t * _aidl_return), (override)); - MOCK_METHOD(Status, setHintSessionThreads, - (const sp<IHintSession>& hintSession, const ::std::vector<int32_t>& tids), + MOCK_METHOD(ScopedAStatus, getHintSessionPreferredRate, (int64_t * _aidl_return), (override)); + MOCK_METHOD(ScopedAStatus, setHintSessionThreads, + (const std::shared_ptr<IHintSession>& hintSession, + const ::std::vector<int32_t>& tids), (override)); - MOCK_METHOD(Status, getHintSessionThreadIds, - (const sp<IHintSession>& hintSession, ::std::vector<int32_t>* tids), (override)); - MOCK_METHOD(IBinder*, onAsBinder, (), (override)); + MOCK_METHOD(ScopedAStatus, getHintSessionThreadIds, + (const std::shared_ptr<IHintSession>& hintSession, ::std::vector<int32_t>* tids), + (override)); + MOCK_METHOD(SpAIBinder, asBinder, (), (override)); + MOCK_METHOD(bool, isRemote, (), (override)); }; class MockIHintSession : public IHintSession { public: - MOCK_METHOD(Status, updateTargetWorkDuration, (int64_t targetDurationNanos), (override)); - MOCK_METHOD(Status, reportActualWorkDuration, + MOCK_METHOD(ScopedAStatus, updateTargetWorkDuration, (int64_t targetDurationNanos), (override)); + MOCK_METHOD(ScopedAStatus, reportActualWorkDuration, (const ::std::vector<int64_t>& actualDurationNanos, const ::std::vector<int64_t>& timeStampNanos), (override)); - MOCK_METHOD(Status, sendHint, (int32_t hint), (override)); - MOCK_METHOD(Status, setMode, (int32_t mode, bool enabled), (override)); - MOCK_METHOD(Status, close, (), (override)); - MOCK_METHOD(IBinder*, onAsBinder, (), (override)); - MOCK_METHOD(Status, reportActualWorkDuration2, - (const ::std::vector<android::os::WorkDuration>& workDurations), (override)); + MOCK_METHOD(ScopedAStatus, sendHint, (int32_t hint), (override)); + MOCK_METHOD(ScopedAStatus, setMode, (int32_t mode, bool enabled), (override)); + MOCK_METHOD(ScopedAStatus, close, (), (override)); + MOCK_METHOD(ScopedAStatus, reportActualWorkDuration2, + (const ::std::vector<WorkDuration>& workDurations), (override)); + MOCK_METHOD(SpAIBinder, asBinder, (), (override)); + MOCK_METHOD(bool, isRemote, (), (override)); }; class PerformanceHintTest : public Test { public: void SetUp() override { - mMockIHintManager = new StrictMock<MockIHintManager>(); - APerformanceHint_setIHintManagerForTesting(mMockIHintManager); + mMockIHintManager = ndk::SharedRefBase::make<NiceMock<MockIHintManager>>(); + APerformanceHint_setIHintManagerForTesting(&mMockIHintManager); } void TearDown() override { @@ -79,15 +85,50 @@ public: } APerformanceHintManager* createManager() { - EXPECT_CALL(*mMockIHintManager, getHintSessionPreferredRate(_)) - .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(123L), Return(Status()))); + ON_CALL(*mMockIHintManager, getHintSessionPreferredRate(_)) + .WillByDefault(DoAll(SetArgPointee<0>(123L), [] { return ScopedAStatus::ok(); })); return APerformanceHint_getManager(); } + APerformanceHintSession* createSession(APerformanceHintManager* manager, + int64_t targetDuration = 56789L) { + mMockSession = ndk::SharedRefBase::make<NiceMock<MockIHintSession>>(); + + std::vector<int32_t> tids; + tids.push_back(1); + tids.push_back(2); + + ON_CALL(*mMockIHintManager, createHintSession(_, Eq(tids), Eq(targetDuration), _)) + .WillByDefault(DoAll(SetArgPointee<3>(std::shared_ptr<IHintSession>(mMockSession)), + [] { return ScopedAStatus::ok(); })); + ON_CALL(*mMockIHintManager, setHintSessionThreads(_, _)).WillByDefault([] { + return ScopedAStatus::ok(); + }); + ON_CALL(*mMockSession, sendHint(_)).WillByDefault([] { return ScopedAStatus::ok(); }); + ON_CALL(*mMockSession, setMode(_, _)).WillByDefault([] { return ScopedAStatus::ok(); }); + ON_CALL(*mMockSession, close()).WillByDefault([] { return ScopedAStatus::ok(); }); + ON_CALL(*mMockSession, updateTargetWorkDuration(_)).WillByDefault([] { + return ScopedAStatus::ok(); + }); + ON_CALL(*mMockSession, reportActualWorkDuration(_, _)).WillByDefault([] { + return ScopedAStatus::ok(); + }); + ON_CALL(*mMockSession, reportActualWorkDuration2(_)).WillByDefault([] { + return ScopedAStatus::ok(); + }); + + return APerformanceHint_createSession(manager, tids.data(), tids.size(), targetDuration); + } - StrictMock<MockIHintManager>* mMockIHintManager = nullptr; + std::shared_ptr<NiceMock<MockIHintManager>> mMockIHintManager = nullptr; + std::shared_ptr<NiceMock<MockIHintSession>> mMockSession = nullptr; }; +bool equalsWithoutTimestamp(WorkDuration lhs, WorkDuration rhs) { + return lhs.workPeriodStartTimestampNanos == rhs.workPeriodStartTimestampNanos && + lhs.cpuDurationNanos == rhs.cpuDurationNanos && + lhs.gpuDurationNanos == rhs.gpuDurationNanos && lhs.durationNanos == rhs.durationNanos; +} + TEST_F(PerformanceHintTest, TestGetPreferredUpdateRateNanos) { APerformanceHintManager* manager = createManager(); int64_t preferredUpdateRateNanos = APerformanceHint_getPreferredUpdateRateNanos(manager); @@ -96,25 +137,11 @@ TEST_F(PerformanceHintTest, TestGetPreferredUpdateRateNanos) { TEST_F(PerformanceHintTest, TestSession) { APerformanceHintManager* manager = createManager(); - - std::vector<int32_t> tids; - tids.push_back(1); - tids.push_back(2); - int64_t targetDuration = 56789L; - - StrictMock<MockIHintSession>* iSession = new StrictMock<MockIHintSession>(); - sp<IHintSession> session_sp(iSession); - - EXPECT_CALL(*mMockIHintManager, createHintSession(_, Eq(tids), Eq(targetDuration), _)) - .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<3>(std::move(session_sp)), Return(Status()))); - - APerformanceHintSession* session = - APerformanceHint_createSession(manager, tids.data(), tids.size(), targetDuration); + APerformanceHintSession* session = createSession(manager); ASSERT_TRUE(session); int64_t targetDurationNanos = 10; - EXPECT_CALL(*iSession, updateTargetWorkDuration(Eq(targetDurationNanos))).Times(Exactly(1)); + EXPECT_CALL(*mMockSession, updateTargetWorkDuration(Eq(targetDurationNanos))).Times(Exactly(1)); int result = APerformanceHint_updateTargetWorkDuration(session, targetDurationNanos); EXPECT_EQ(0, result); @@ -122,8 +149,7 @@ TEST_F(PerformanceHintTest, TestSession) { int64_t actualDurationNanos = 20; std::vector<int64_t> actualDurations; actualDurations.push_back(20); - EXPECT_CALL(*iSession, reportActualWorkDuration(Eq(actualDurations), _)).Times(Exactly(1)); - EXPECT_CALL(*iSession, reportActualWorkDuration2(_)).Times(Exactly(1)); + EXPECT_CALL(*mMockSession, reportActualWorkDuration2(_)).Times(Exactly(1)); result = APerformanceHint_reportActualWorkDuration(session, actualDurationNanos); EXPECT_EQ(0, result); @@ -133,114 +159,70 @@ TEST_F(PerformanceHintTest, TestSession) { EXPECT_EQ(EINVAL, result); SessionHint hintId = SessionHint::CPU_LOAD_RESET; - EXPECT_CALL(*iSession, sendHint(Eq(hintId))).Times(Exactly(1)); + EXPECT_CALL(*mMockSession, sendHint(Eq(hintId))).Times(Exactly(1)); result = APerformanceHint_sendHint(session, hintId); EXPECT_EQ(0, result); usleep(110000); // Sleep for longer than the update timeout. - EXPECT_CALL(*iSession, sendHint(Eq(hintId))).Times(Exactly(1)); + EXPECT_CALL(*mMockSession, sendHint(Eq(hintId))).Times(Exactly(1)); result = APerformanceHint_sendHint(session, hintId); EXPECT_EQ(0, result); // Expect to get rate limited if we try to send faster than the limiter allows - EXPECT_CALL(*iSession, sendHint(Eq(hintId))).Times(Exactly(0)); + EXPECT_CALL(*mMockSession, sendHint(Eq(hintId))).Times(Exactly(0)); result = APerformanceHint_sendHint(session, hintId); EXPECT_EQ(0, result); result = APerformanceHint_sendHint(session, static_cast<SessionHint>(-1)); EXPECT_EQ(EINVAL, result); - EXPECT_CALL(*iSession, close()).Times(Exactly(1)); + EXPECT_CALL(*mMockSession, close()).Times(Exactly(1)); APerformanceHint_closeSession(session); } TEST_F(PerformanceHintTest, SetThreads) { APerformanceHintManager* manager = createManager(); - std::vector<int32_t> tids; - tids.push_back(1); - tids.push_back(2); - int64_t targetDuration = 56789L; - - StrictMock<MockIHintSession>* iSession = new StrictMock<MockIHintSession>(); - sp<IHintSession> session_sp(iSession); - - EXPECT_CALL(*mMockIHintManager, createHintSession(_, Eq(tids), Eq(targetDuration), _)) - .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<3>(std::move(session_sp)), Return(Status()))); - - APerformanceHintSession* session = - APerformanceHint_createSession(manager, tids.data(), tids.size(), targetDuration); + APerformanceHintSession* session = createSession(manager); ASSERT_TRUE(session); - std::vector<int32_t> emptyTids; - int result = APerformanceHint_setThreads(session, emptyTids.data(), emptyTids.size()); + int32_t emptyTids[2]; + int result = APerformanceHint_setThreads(session, emptyTids, 0); EXPECT_EQ(EINVAL, result); std::vector<int32_t> newTids; newTids.push_back(1); newTids.push_back(3); - EXPECT_CALL(*mMockIHintManager, setHintSessionThreads(_, Eq(newTids))) - .Times(Exactly(1)) - .WillOnce(Return(Status())); + EXPECT_CALL(*mMockIHintManager, setHintSessionThreads(_, Eq(newTids))).Times(Exactly(1)); result = APerformanceHint_setThreads(session, newTids.data(), newTids.size()); EXPECT_EQ(0, result); - testing::Mock::VerifyAndClearExpectations(mMockIHintManager); + testing::Mock::VerifyAndClearExpectations(mMockIHintManager.get()); std::vector<int32_t> invalidTids; - auto status = Status::fromExceptionCode(binder::Status::Exception::EX_SECURITY); invalidTids.push_back(4); invalidTids.push_back(6); EXPECT_CALL(*mMockIHintManager, setHintSessionThreads(_, Eq(invalidTids))) .Times(Exactly(1)) - .WillOnce(Return(status)); + .WillOnce(Return(ByMove(ScopedAStatus::fromExceptionCode(EX_SECURITY)))); result = APerformanceHint_setThreads(session, invalidTids.data(), invalidTids.size()); EXPECT_EQ(EPERM, result); } TEST_F(PerformanceHintTest, SetPowerEfficient) { APerformanceHintManager* manager = createManager(); - - std::vector<int32_t> tids; - tids.push_back(1); - tids.push_back(2); - int64_t targetDuration = 56789L; - - StrictMock<MockIHintSession>* iSession = new StrictMock<MockIHintSession>(); - sp<IHintSession> session_sp(iSession); - - EXPECT_CALL(*mMockIHintManager, createHintSession(_, Eq(tids), Eq(targetDuration), _)) - .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<3>(std::move(session_sp)), Return(Status()))); - - APerformanceHintSession* session = - APerformanceHint_createSession(manager, tids.data(), tids.size(), targetDuration); + APerformanceHintSession* session = createSession(manager); ASSERT_TRUE(session); - EXPECT_CALL(*iSession, setMode(_, Eq(true))).Times(Exactly(1)); + EXPECT_CALL(*mMockSession, setMode(_, Eq(true))).Times(Exactly(1)); int result = APerformanceHint_setPreferPowerEfficiency(session, true); EXPECT_EQ(0, result); - EXPECT_CALL(*iSession, setMode(_, Eq(false))).Times(Exactly(1)); + EXPECT_CALL(*mMockSession, setMode(_, Eq(false))).Times(Exactly(1)); result = APerformanceHint_setPreferPowerEfficiency(session, false); EXPECT_EQ(0, result); } TEST_F(PerformanceHintTest, CreateZeroTargetDurationSession) { APerformanceHintManager* manager = createManager(); - - std::vector<int32_t> tids; - tids.push_back(1); - tids.push_back(2); - int64_t targetDuration = 0; - - StrictMock<MockIHintSession>* iSession = new StrictMock<MockIHintSession>(); - sp<IHintSession> session_sp(iSession); - - EXPECT_CALL(*mMockIHintManager, createHintSession(_, Eq(tids), Eq(targetDuration), _)) - .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<3>(std::move(session_sp)), Return(Status()))); - - APerformanceHintSession* session = - APerformanceHint_createSession(manager, tids.data(), tids.size(), targetDuration); + APerformanceHintSession* session = createSession(manager, 0); ASSERT_TRUE(session); } @@ -251,12 +233,12 @@ MATCHER_P(WorkDurationEq, expected, "") { return false; } for (int i = 0; i < expected.size(); ++i) { - android::os::WorkDuration expectedWorkDuration = expected[i]; - android::os::WorkDuration actualWorkDuration = arg[i]; - if (!expectedWorkDuration.equalsWithoutTimestamp(actualWorkDuration)) { + WorkDuration expectedWorkDuration = expected[i]; + WorkDuration actualWorkDuration = arg[i]; + if (!equalsWithoutTimestamp(expectedWorkDuration, actualWorkDuration)) { *result_listener << "WorkDuration at [" << i << "] is different: " - << "Expected: " << expectedWorkDuration - << ", Actual: " << actualWorkDuration; + << "Expected: " << expectedWorkDuration.toString() + << ", Actual: " << actualWorkDuration.toString(); return false; } } @@ -265,92 +247,37 @@ MATCHER_P(WorkDurationEq, expected, "") { TEST_F(PerformanceHintTest, TestAPerformanceHint_reportActualWorkDuration2) { APerformanceHintManager* manager = createManager(); - - std::vector<int32_t> tids; - tids.push_back(1); - tids.push_back(2); - int64_t targetDuration = 56789L; - - StrictMock<MockIHintSession>* iSession = new StrictMock<MockIHintSession>(); - sp<IHintSession> session_sp(iSession); - - EXPECT_CALL(*mMockIHintManager, createHintSession(_, Eq(tids), Eq(targetDuration), _)) - .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<3>(std::move(session_sp)), Return(Status()))); - - APerformanceHintSession* session = - APerformanceHint_createSession(manager, tids.data(), tids.size(), targetDuration); + APerformanceHintSession* session = createSession(manager); ASSERT_TRUE(session); int64_t targetDurationNanos = 10; - EXPECT_CALL(*iSession, updateTargetWorkDuration(Eq(targetDurationNanos))).Times(Exactly(1)); + EXPECT_CALL(*mMockSession, updateTargetWorkDuration(Eq(targetDurationNanos))).Times(Exactly(1)); int result = APerformanceHint_updateTargetWorkDuration(session, targetDurationNanos); EXPECT_EQ(0, result); usleep(2); // Sleep for longer than preferredUpdateRateNanos. - { - std::vector<android::os::WorkDuration> actualWorkDurations; - android::os::WorkDuration workDuration(1, 20, 13, 8); - actualWorkDurations.push_back(workDuration); - - EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations))) - .Times(Exactly(1)); - result = APerformanceHint_reportActualWorkDuration2(session, - static_cast<AWorkDuration*>( - &workDuration)); - EXPECT_EQ(0, result); - } - - { - std::vector<android::os::WorkDuration> actualWorkDurations; - android::os::WorkDuration workDuration(-1, 20, 13, 8); - actualWorkDurations.push_back(workDuration); - - EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations))) - .Times(Exactly(1)); - result = APerformanceHint_reportActualWorkDuration2(session, - static_cast<AWorkDuration*>( - &workDuration)); - EXPECT_EQ(22, result); - } - { - std::vector<android::os::WorkDuration> actualWorkDurations; - android::os::WorkDuration workDuration(1, -20, 13, 8); - actualWorkDurations.push_back(workDuration); - - EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations))) - .Times(Exactly(1)); - result = APerformanceHint_reportActualWorkDuration2(session, - static_cast<AWorkDuration*>( - &workDuration)); - EXPECT_EQ(22, result); - } - { - std::vector<android::os::WorkDuration> actualWorkDurations; - android::os::WorkDuration workDuration(1, 20, -13, 8); - actualWorkDurations.push_back(workDuration); - - EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations))) - .Times(Exactly(1)); - result = APerformanceHint_reportActualWorkDuration2(session, - static_cast<AWorkDuration*>( - &workDuration)); - EXPECT_EQ(EINVAL, result); - } - { - std::vector<android::os::WorkDuration> actualWorkDurations; - android::os::WorkDuration workDuration(1, 20, 13, -8); - actualWorkDurations.push_back(workDuration); - - EXPECT_CALL(*iSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations))) + struct TestPair { + WorkDuration duration; + int expectedResult; + }; + std::vector<TestPair> testPairs{ + {{1, 20, 1, 13, 8}, OK}, {{1, -20, 1, 13, 8}, EINVAL}, + {{1, 20, -1, 13, 8}, EINVAL}, {{1, -20, 1, -13, 8}, EINVAL}, + {{1, -20, 1, 13, -8}, EINVAL}, + }; + for (auto&& pair : testPairs) { + std::vector<WorkDuration> actualWorkDurations; + actualWorkDurations.push_back(pair.duration); + + EXPECT_CALL(*mMockSession, reportActualWorkDuration2(WorkDurationEq(actualWorkDurations))) .Times(Exactly(1)); result = APerformanceHint_reportActualWorkDuration2(session, - static_cast<AWorkDuration*>( - &workDuration)); - EXPECT_EQ(EINVAL, result); + reinterpret_cast<AWorkDuration*>( + &pair.duration)); + EXPECT_EQ(pair.expectedResult, result); } - EXPECT_CALL(*iSession, close()).Times(Exactly(1)); + EXPECT_CALL(*mMockSession, close()).Times(Exactly(1)); APerformanceHint_closeSession(session); } diff --git a/native/webview/plat_support/draw_fn.h b/native/webview/plat_support/draw_fn.h index 44fe56fcaf4b..b865d0ebeb1f 100644 --- a/native/webview/plat_support/draw_fn.h +++ b/native/webview/plat_support/draw_fn.h @@ -23,7 +23,8 @@ extern "C" { // 1 is Android Q. This matches kAwDrawGLInfoVersion version 3. // 2 Adds transfer_function_* and color_space_toXYZD50 to AwDrawFn_DrawGLParams. // 3 Adds SurfaceControl related functions. -static const int kAwDrawFnVersion = 3; +// 4 Adds AwDrawFn_ReportRenderingThreads to AwDrawFnFunctionTable. +static const int kAwDrawFnVersion = 4; // Returns parent ASurfaceControl for WebView overlays. It will be have same // geometry as the surface we draw into and positioned below it (underlay). @@ -268,6 +269,10 @@ typedef int AwDrawFn_CreateFunctor_v3( // released, and it should be considered alive & active until that point. typedef void AwDrawFn_ReleaseFunctor(int functor); +// Report the list of threads critical for frame production for the given +// functor. Must be called on render thread. +typedef void AwDrawFn_ReportRenderingThreads(int functor, const int32_t* thread_ids, size_t size); + struct AwDrawFnFunctionTable { int version; AwDrawFn_QueryRenderMode* query_render_mode; @@ -276,6 +281,8 @@ struct AwDrawFnFunctionTable { AwDrawFn_ReleaseFunctor* release_functor; // Added in version 3. AwDrawFn_CreateFunctor_v3* create_functor_v3; + // Added in version 4. + AwDrawFn_ReportRenderingThreads* report_rendering_threads; }; #ifdef __cplusplus diff --git a/native/webview/plat_support/draw_functor.cpp b/native/webview/plat_support/draw_functor.cpp index 1584350bb6f1..5d3e24c382bf 100644 --- a/native/webview/plat_support/draw_functor.cpp +++ b/native/webview/plat_support/draw_functor.cpp @@ -290,15 +290,20 @@ AwDrawFnRenderMode QueryRenderMode(void) { } } +void ReportRenderingThreads(int functor, const int32_t* thread_ids, size_t size) { + uirenderer::WebViewFunctor_reportRenderingThreads(functor, thread_ids, size); +} + jlong GetDrawFnFunctionTable() { - static AwDrawFnFunctionTable function_table = { - .version = kAwDrawFnVersion, - .query_render_mode = &QueryRenderMode, - .create_functor = &CreateFunctor, - .release_functor = &ReleaseFunctor, - .create_functor_v3 = &CreateFunctor_v3, - }; - return reinterpret_cast<intptr_t>(&function_table); + static AwDrawFnFunctionTable function_table = { + .version = kAwDrawFnVersion, + .query_render_mode = &QueryRenderMode, + .create_functor = &CreateFunctor, + .release_functor = &ReleaseFunctor, + .create_functor_v3 = &CreateFunctor_v3, + .report_rendering_threads = &ReportRenderingThreads, + }; + return reinterpret_cast<intptr_t>(&function_table); } const char kClassName[] = "com/android/webview/chromium/DrawFunctor"; diff --git a/nfc/api/current.txt b/nfc/api/current.txt index 9e0bb86f46a5..da292a818396 100644 --- a/nfc/api/current.txt +++ b/nfc/api/current.txt @@ -205,7 +205,10 @@ package android.nfc.cardemulation { method public boolean isDefaultServiceForCategory(android.content.ComponentName, String); method public boolean registerAidsForService(android.content.ComponentName, String, java.util.List<java.lang.String>); method @FlaggedApi("android.nfc.nfc_read_polling_loop") public boolean registerPollingLoopFilterForService(@NonNull android.content.ComponentName, @NonNull String, boolean); + method @FlaggedApi("android.nfc.nfc_read_polling_loop") public boolean registerPollingLoopPatternFilterForService(@NonNull android.content.ComponentName, @NonNull String, boolean); method public boolean removeAidsForService(android.content.ComponentName, String); + method @FlaggedApi("android.nfc.nfc_read_polling_loop") public boolean removePollingLoopFilterForService(@NonNull android.content.ComponentName, @NonNull String); + method @FlaggedApi("android.nfc.nfc_read_polling_loop") public boolean removePollingLoopPatternFilterForService(@NonNull android.content.ComponentName, @NonNull String); method @NonNull @RequiresPermission(android.Manifest.permission.NFC) public boolean setOffHostForService(@NonNull android.content.ComponentName, @NonNull String); method public boolean setPreferredService(android.app.Activity, android.content.ComponentName); method @FlaggedApi("android.nfc.nfc_observe_mode") public boolean setShouldDefaultToObserveModeForService(@NonNull android.content.ComponentName, boolean); diff --git a/nfc/java/android/nfc/INfcCardEmulation.aidl b/nfc/java/android/nfc/INfcCardEmulation.aidl index 85a07b74871b..cb97f23e813c 100644 --- a/nfc/java/android/nfc/INfcCardEmulation.aidl +++ b/nfc/java/android/nfc/INfcCardEmulation.aidl @@ -33,10 +33,13 @@ interface INfcCardEmulation boolean setShouldDefaultToObserveModeForService(int userId, in android.content.ComponentName service, boolean enable); boolean registerAidGroupForService(int userHandle, in ComponentName service, in AidGroup aidGroup); boolean registerPollingLoopFilterForService(int userHandle, in ComponentName service, in String pollingLoopFilter, boolean autoTransact); + boolean registerPollingLoopPatternFilterForService(int userHandle, in ComponentName service, in String pollingLoopPatternFilter, boolean autoTransact); boolean setOffHostForService(int userHandle, in ComponentName service, in String offHostSecureElement); boolean unsetOffHostForService(int userHandle, in ComponentName service); AidGroup getAidGroupForService(int userHandle, in ComponentName service, String category); boolean removeAidGroupForService(int userHandle, in ComponentName service, String category); + boolean removePollingLoopFilterForService(int userHandle, in ComponentName service, in String pollingLoopFilter); + boolean removePollingLoopPatternFilterForService(int userHandle, in ComponentName service, in String pollingLoopPatternFilter); List<ApduServiceInfo> getServices(int userHandle, in String category); boolean setPreferredService(in ComponentName service); boolean unsetPreferredService(); diff --git a/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java b/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java index 2c7d61eea777..be3c24806c5b 100644 --- a/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java +++ b/nfc/java/android/nfc/cardemulation/ApduServiceInfo.java @@ -108,6 +108,8 @@ public final class ApduServiceInfo implements Parcelable { private final Map<String, Boolean> mAutoTransact; + private final Map<Pattern, Boolean> mAutoTransactPatterns; + /** * Whether this service should only be started when the device is unlocked. */ @@ -179,7 +181,7 @@ public final class ApduServiceInfo implements Parcelable { this(info, onHost, description, staticAidGroups, dynamicAidGroups, requiresUnlock, requiresScreenOn, bannerResource, uid, settingsActivityName, offHost, staticOffHost, isEnabled, - new HashMap<String, Boolean>()); + new HashMap<String, Boolean>(), new HashMap<Pattern, Boolean>()); } /** @@ -189,12 +191,13 @@ public final class ApduServiceInfo implements Parcelable { List<AidGroup> staticAidGroups, List<AidGroup> dynamicAidGroups, boolean requiresUnlock, boolean requiresScreenOn, int bannerResource, int uid, String settingsActivityName, String offHost, String staticOffHost, boolean isEnabled, - HashMap<String, Boolean> autoTransact) { + Map<String, Boolean> autoTransact, Map<Pattern, Boolean> autoTransactPatterns) { this.mService = info; this.mDescription = description; this.mStaticAidGroups = new HashMap<String, AidGroup>(); this.mDynamicAidGroups = new HashMap<String, AidGroup>(); this.mAutoTransact = autoTransact; + this.mAutoTransactPatterns = autoTransactPatterns; this.mOffHostName = offHost; this.mStaticOffHostName = staticOffHost; this.mOnHost = onHost; @@ -314,6 +317,7 @@ public final class ApduServiceInfo implements Parcelable { mStaticAidGroups = new HashMap<String, AidGroup>(); mDynamicAidGroups = new HashMap<String, AidGroup>(); mAutoTransact = new HashMap<String, Boolean>(); + mAutoTransactPatterns = new HashMap<Pattern, Boolean>(); mOnHost = onHost; final int depth = parser.getDepth(); @@ -408,6 +412,18 @@ public final class ApduServiceInfo implements Parcelable { false); mAutoTransact.put(plf, autoTransact); a.recycle(); + } else if (eventType == XmlPullParser.START_TAG + && "polling-loop-pattern-filter".equals(tagName) && currentGroup == null) { + final TypedArray a = res.obtainAttributes(attrs, + com.android.internal.R.styleable.PollingLoopPatternFilter); + String plf = a.getString( + com.android.internal.R.styleable.PollingLoopPatternFilter_name) + .toUpperCase(Locale.ROOT); + boolean autoTransact = a.getBoolean( + com.android.internal.R.styleable.PollingLoopFilter_autoTransact, + false); + mAutoTransactPatterns.put(Pattern.compile(plf), autoTransact); + a.recycle(); } } } catch (NameNotFoundException e) { @@ -481,7 +497,30 @@ public final class ApduServiceInfo implements Parcelable { */ @FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP) public boolean getShouldAutoTransact(@NonNull String plf) { - return mAutoTransact.getOrDefault(plf.toUpperCase(Locale.ROOT), false); + if (mAutoTransact.getOrDefault(plf.toUpperCase(Locale.ROOT), false)) { + return true; + } + List<Pattern> patternMatches = mAutoTransactPatterns.keySet().stream() + .filter(p -> p.matcher(plf).matches()).toList(); + if (patternMatches == null || patternMatches.size() == 0) { + return false; + } + for (Pattern patternMatch : patternMatches) { + if (mAutoTransactPatterns.get(patternMatch)) { + return true; + } + } + return false; + } + + /** + * Returns the current polling loop pattern filters for this service. + * @return List of polling loop pattern filters. + */ + @FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP) + @NonNull + public List<Pattern> getPollingLoopPatternFilters() { + return new ArrayList<>(mAutoTransactPatterns.keySet()); } /** @@ -683,7 +722,7 @@ public final class ApduServiceInfo implements Parcelable { * Add a Polling Loop Filter. Custom NFC polling frames that match this filter will be * delivered to {@link HostApduService#processPollingFrames(List)}. Adding a key with this * multiple times will cause the value to be overwritten each time. - * @param pollingLoopFilter the polling loop filter to add, must be a valide hexadecimal string + * @param pollingLoopFilter the polling loop filter to add, must be a valid hexadecimal string */ @FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP) public void addPollingLoopFilter(@NonNull String pollingLoopFilter, @@ -703,6 +742,31 @@ public final class ApduServiceInfo implements Parcelable { } /** + * Add a Polling Loop Pattern Filter. Custom NFC polling frames that match this filter will be + * delivered to {@link HostApduService#processPollingFrames(List)}. Adding a key with this + * multiple times will cause the value to be overwritten each time. + * @param pollingLoopPatternFilter the polling loop pattern filter to add, must be a valid + * regex to match a hexadecimal string + */ + @FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP) + public void addPollingLoopPatternFilter(@NonNull String pollingLoopPatternFilter, + boolean autoTransact) { + mAutoTransactPatterns.put(Pattern.compile(pollingLoopPatternFilter), autoTransact); + + } + + /** + * Remove a Polling Loop Pattern Filter. Custom NFC polling frames that match this filter will + * no longer be delivered to {@link HostApduService#processPollingFrames(List)}. + * @param pollingLoopPatternFilter this polling loop filter to add. + */ + @FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP) + public void removePollingLoopPatternFilter(@NonNull String pollingLoopPatternFilter) { + mAutoTransactPatterns.remove( + Pattern.compile(pollingLoopPatternFilter.toUpperCase(Locale.ROOT))); + } + + /** * Sets the off host Secure Element. * @param offHost Secure Element to set. Only accept strings with prefix SIM or prefix eSE. * Ref: GSMA TS.26 - NFC Handset Requirements @@ -856,6 +920,8 @@ public final class ApduServiceInfo implements Parcelable { dest.writeInt(mCategoryOtherServiceEnabled ? 1 : 0); dest.writeInt(mAutoTransact.size()); dest.writeMap(mAutoTransact); + dest.writeInt(mAutoTransactPatterns.size()); + dest.writeMap(mAutoTransactPatterns); }; @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @@ -889,10 +955,15 @@ public final class ApduServiceInfo implements Parcelable { new HashMap<String, Boolean>(autoTransactSize); source.readMap(autoTransact, getClass().getClassLoader(), String.class, Boolean.class); + int autoTransactPatternSize = source.readInt(); + HashMap<Pattern, Boolean> autoTransactPatterns = + new HashMap<Pattern, Boolean>(autoTransactSize); + source.readMap(autoTransactPatterns, getClass().getClassLoader(), + Pattern.class, Boolean.class); return new ApduServiceInfo(info, onHost, description, staticAidGroups, dynamicAidGroups, requiresUnlock, requiresScreenOn, bannerResource, uid, settingsActivityName, offHostName, staticOffHostName, - isEnabled, autoTransact); + isEnabled, autoTransact, autoTransactPatterns); } @Override diff --git a/nfc/java/android/nfc/cardemulation/CardEmulation.java b/nfc/java/android/nfc/cardemulation/CardEmulation.java index e55f5403ed83..67697a429a32 100644 --- a/nfc/java/android/nfc/cardemulation/CardEmulation.java +++ b/nfc/java/android/nfc/cardemulation/CardEmulation.java @@ -45,6 +45,7 @@ import android.util.Log; import java.util.HashMap; import java.util.HexFormat; import java.util.List; +import java.util.Locale; import java.util.regex.Pattern; /** @@ -61,6 +62,7 @@ import java.util.regex.Pattern; */ public final class CardEmulation { private static final Pattern AID_PATTERN = Pattern.compile("[0-9A-Fa-f]{10,32}\\*?\\#?"); + private static final Pattern PLPF_PATTERN = Pattern.compile("[0-9A-Fa-f,\\?,\\*\\.]*"); static final String TAG = "CardEmulation"; @@ -379,9 +381,9 @@ public final class CardEmulation { * auto-transact or not. The PLF can be sequence of an * even number of at least 2 hexadecimal numbers (0-9, A-F or a-f), representing a series of * bytes. When non-standard polling loop frame matches this sequence exactly, it may be - * delivered to {@link HostApduService#processPollingFrames(List)}. If auto-transact is set to - * true, then observe mode will also be disabled. if this service is currently preferred or - * there are no other services registered for this filter. + * delivered to {@link HostApduService#processPollingFrames(List)}. If auto-transact + * is set to true and this service is currently preferred or there are no other services + * registered for this filter then observe mode will also be disabled. * @param service The HostApduService to register the filter for * @param pollingLoopFilter The filter to register * @param autoTransact true to have the NFC stack automatically disable observe mode and allow @@ -416,6 +418,128 @@ public final class CardEmulation { } /** + * Unregister a polling loop filter (PLF) for a HostApduService. If the PLF had previously been + * registered via {@link #registerPollingLoopFilterForService(ComponentName, String, boolean)} + * for this service it will be removed. + * @param service The HostApduService to unregister the filter for + * @param pollingLoopFilter The filter to unregister + * @return true if the filter was removed, false otherwise + * @throws IllegalArgumentException if the passed in string doesn't parse to at least one byte + */ + @FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP) + public boolean removePollingLoopFilterForService(@NonNull ComponentName service, + @NonNull String pollingLoopFilter) { + pollingLoopFilter = validatePollingLoopFilter(pollingLoopFilter); + + try { + return sService.removePollingLoopFilterForService(mContext.getUser().getIdentifier(), + service, pollingLoopFilter); + } catch (RemoteException e) { + // Try one more time + recoverService(); + if (sService == null) { + Log.e(TAG, "Failed to recover CardEmulationService."); + return false; + } + try { + return sService.removePollingLoopFilterForService( + mContext.getUser().getIdentifier(), service, + pollingLoopFilter); + } catch (RemoteException ee) { + Log.e(TAG, "Failed to reach CardEmulationService."); + return false; + } + } + } + + + /** + * Register a polling loop pattern filter (PLPF) for a HostApduService and indicate whether it + * should auto-transact or not. The pattern may include the characters 0-9 and A-F as well as + * the regular expression operators `.`, `?` and `*`. When the beginning of anon-standard + * polling loop frame matches this sequence exactly, it may be delivered to + * {@link HostApduService#processPollingFrames(List)}. If auto-transact is set to true and this + * service is currently preferred or there are no other services registered for this filter + * then observe mode will also be disabled. + * @param service The HostApduService to register the filter for + * @param pollingLoopPatternFilter The pattern filter to register, must to be compatible with + * {@link java.util.regex.Pattern#compile(String)} and only contain hexadecimal numbers + * and `.`, `?` and `*` operators + * @param autoTransact true to have the NFC stack automatically disable observe mode and allow + * transactions to proceed when this filter matches, false otherwise + * @return true if the filter was registered, false otherwise + * @throws IllegalArgumentException if the filter containst elements other than hexadecimal + * numbers and `.`, `?` and `*` operators + * @throws java.util.regex.PatternSyntaxException if the regex syntax is invalid + */ + @FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP) + public boolean registerPollingLoopPatternFilterForService(@NonNull ComponentName service, + @NonNull String pollingLoopPatternFilter, boolean autoTransact) { + pollingLoopPatternFilter = validatePollingLoopPatternFilter(pollingLoopPatternFilter); + + try { + return sService.registerPollingLoopPatternFilterForService( + mContext.getUser().getIdentifier(), + service, pollingLoopPatternFilter, autoTransact); + } catch (RemoteException e) { + // Try one more time + recoverService(); + if (sService == null) { + Log.e(TAG, "Failed to recover CardEmulationService."); + return false; + } + try { + return sService.registerPollingLoopPatternFilterForService( + mContext.getUser().getIdentifier(), service, + pollingLoopPatternFilter, autoTransact); + } catch (RemoteException ee) { + Log.e(TAG, "Failed to reach CardEmulationService."); + return false; + } + } + } + + /** + * Unregister a polling loop pattern filter (PLPF) for a HostApduService. If the PLF had + * previously been registered via + * {@link #registerPollingLoopFilterForService(ComponentName, String, boolean)} for this + * service it will be removed. + * @param service The HostApduService to unregister the filter for + * @param pollingLoopPatternFilter The filter to unregister, must to be compatible with + * {@link java.util.regex.Pattern#compile(String)} and only contain hexadecimal numbers + * and`.`, `?` and `*` operators + * @return true if the filter was removed, false otherwise + * @throws IllegalArgumentException if the filter containst elements other than hexadecimal + * numbers and `.`, `?` and `*` operators + * @throws java.util.regex.PatternSyntaxException if the regex syntax is invalid + */ + @FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP) + public boolean removePollingLoopPatternFilterForService(@NonNull ComponentName service, + @NonNull String pollingLoopPatternFilter) { + pollingLoopPatternFilter = validatePollingLoopPatternFilter(pollingLoopPatternFilter); + + try { + return sService.removePollingLoopPatternFilterForService( + mContext.getUser().getIdentifier(), service, pollingLoopPatternFilter); + } catch (RemoteException e) { + // Try one more time + recoverService(); + if (sService == null) { + Log.e(TAG, "Failed to recover CardEmulationService."); + return false; + } + try { + return sService.removePollingLoopPatternFilterForService( + mContext.getUser().getIdentifier(), service, + pollingLoopPatternFilter); + } catch (RemoteException ee) { + Log.e(TAG, "Failed to reach CardEmulationService."); + return false; + } + } + } + + /** * Registers a list of AIDs for a specific category for the * specified service. * @@ -1027,6 +1151,23 @@ public final class CardEmulation { } /** + * Tests the validity of the polling loop pattern filter. + * @param pollingLoopPatternFilter The polling loop filter to test. + * + * @hide + */ + @FlaggedApi(Flags.FLAG_NFC_READ_POLLING_LOOP) + public static @NonNull String validatePollingLoopPatternFilter( + @NonNull String pollingLoopPatternFilter) { + // Verify hex characters + if (!PLPF_PATTERN.matcher(pollingLoopPatternFilter).matches()) { + throw new IllegalArgumentException( + "Polling loop pattern filters may only contain hexadecimal numbers, ?s and *s"); + } + return Pattern.compile(pollingLoopPatternFilter.toUpperCase(Locale.ROOT)).toString(); + } + + /** * A valid AID according to ISO/IEC 7816-4: * <ul> * <li>Has >= 5 bytes and <=16 bytes (>=10 hex chars and <= 32 hex chars) diff --git a/packages/CompanionDeviceManager/res/values-af/strings.xml b/packages/CompanionDeviceManager/res/values-af/strings.xml index 1f39509d4aad..94d9aaa67f20 100644 --- a/packages/CompanionDeviceManager/res/values-af/strings.xml +++ b/packages/CompanionDeviceManager/res/values-af/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"toestel"</string> <string name="summary_glasses" msgid="2872254734959842579">"Hierdie app sal toegang tot hierdie toestemmings op jou <xliff:g id="DEVICE_NAME">%1$s</xliff:g> hê"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Gee <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> toegang tot hierdie inligting op jou foon"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Oorkruistoestel-dienste"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> versoek tans namens jou <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> toestemming om apps tussen jou toestelle te stroom"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Gee <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> toegang tot hierdie inligting op jou foon"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Dienste"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> versoek tans namens jou <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> toegang tot jou foon se foto’s, media en kennisgewings"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Laat <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> toe om hierdie handeling uit te voer?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> versoek tans namens jou <xliff:g id="DEVICE_NAME">%2$s</xliff:g> toestemming om apps en ander stelselkenmerke na toestelle in die omtrek te stroom"</string> <string name="profile_name_generic" msgid="6851028682723034988">"toestel"</string> <string name="summary_generic" msgid="1761976003668044801">"Hierdie app sal inligting kan sinkroniseer, soos die naam van iemand wat bel, tussen jou foon en die gekose toestel"</string> diff --git a/packages/CompanionDeviceManager/res/values-am/strings.xml b/packages/CompanionDeviceManager/res/values-am/strings.xml index 007173cb8fad..b53ac7467367 100644 --- a/packages/CompanionDeviceManager/res/values-am/strings.xml +++ b/packages/CompanionDeviceManager/res/values-am/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"መሣሪያ"</string> <string name="summary_glasses" msgid="2872254734959842579">"ይህ መተግበሪያ በእርስዎ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ላይ እነዚህን ፈቃዶች እንዲደርስ ይፈቀድለታል"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ይህን መረጃ ከስልክዎ እንዲደርስበት ይፍቀዱለት"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"መሣሪያ ተሻጋሪ አገልግሎቶች"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> በእርስዎ መሣሪያዎች መካከል መተግበሪያዎችን በዥረት ለመልቀቅ የእርስዎን <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ወክሎ ፈቃድ እየጠየቀ ነው"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ይህን መረጃ ከስልክዎ ላይ እንዲደርስ ይፍቀዱለት"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"የGoogle Play አገልግሎቶች"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> የስልክዎን ፎቶዎች፣ ሚዲያ እና ማሳወቂያዎች ለመድረስ የእርስዎን <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ወክሎ ፈቃድ እየጠየቀ ነው"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> ይህን እርምጃ እንዲወስድ ፈቃድ ይሰጠው?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> የእርስዎን <xliff:g id="DEVICE_NAME">%2$s</xliff:g> በመወከል በአቅራቢያ ላሉ መሣሪያዎች መተግበሪያዎች እና ሌሎች የስርዓት ባህሪያትን በዥረት ለመልቀቅ ፈቃድ እየጠየቀ ነው"</string> <string name="profile_name_generic" msgid="6851028682723034988">"መሣሪያ"</string> <string name="summary_generic" msgid="1761976003668044801">"ይህ መተግበሪያ እንደ የሚደውል ሰው ስም ያለ መረጃን በስልክዎ እና በተመረጠው መሣሪያ መካከል ማስመር ይችላል"</string> diff --git a/packages/CompanionDeviceManager/res/values-ar/strings.xml b/packages/CompanionDeviceManager/res/values-ar/strings.xml index 961c63bd2b11..a1e09b26afd0 100644 --- a/packages/CompanionDeviceManager/res/values-ar/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ar/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"جهاز"</string> <string name="summary_glasses" msgid="2872254734959842579">"سيتم السماح لهذا التطبيق بالوصول إلى هذه الأذونات على \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\"."</string> <string name="title_app_streaming" msgid="2270331024626446950">"السماح لتطبيق <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> بالوصول إلى هذه المعلومات من هاتفك"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"الخدمات التي تعمل بين الأجهزة"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"يطلب تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن \"<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>\" لبثّ محتوى التطبيقات بين أجهزتك."</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"السماح لتطبيق <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> بالوصول إلى هذه المعلومات من هاتفك"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"خدمات Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"يطلب تطبيق \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن \"<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>\" للوصول إلى الصور والوسائط والإشعارات في هاتفك."</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"هل تريد السماح للتطبيق <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> باتّخاذ هذا الإجراء؟"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"يطلب \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" الحصول على إذن نيابةً عن \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" لبثّ التطبيقات وميزات النظام الأخرى إلى أجهزتك المجاورة."</string> <string name="profile_name_generic" msgid="6851028682723034988">"جهاز"</string> <string name="summary_generic" msgid="1761976003668044801">"سيتمكّن هذا التطبيق من مزامنة المعلومات، مثل اسم المتصل، بين هاتفك والجهاز المحدّد."</string> diff --git a/packages/CompanionDeviceManager/res/values-as/strings.xml b/packages/CompanionDeviceManager/res/values-as/strings.xml index 623b2121e39a..481ce24879ca 100644 --- a/packages/CompanionDeviceManager/res/values-as/strings.xml +++ b/packages/CompanionDeviceManager/res/values-as/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"ডিভাইচ"</string> <string name="summary_glasses" msgid="2872254734959842579">"এই এপ্টোক আপোনাৰ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ত এই অনুমতিসমূহ এক্সেছ কৰিবলৈ অনুমতি দিয়া হ’ব"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>ক আপোনাৰ ফ’নৰ পৰা এই তথ্যখিনি এক্সেছ কৰাৰ অনুমতি দিয়ক"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"ক্ৰছ-ডিভাইচ সেৱাসমূহ"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>ৰ হৈ আপোনাৰ ডিভাইচসমূহৰ মাজত এপ্ ষ্ট্ৰীম কৰাৰ বাবে অনুৰোধ জনাইছে"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>ক আপোনাৰ ফ’নৰ পৰা এই তথ্যখিনি এক্সেছ কৰাৰ অনুমতি দিয়ক"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play সেৱা"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>ৰ হৈ আপোনাৰ ফ’নৰ ফট’, মিডিয়া আৰু জাননী এক্সেছ কৰাৰ বাবে অনুৰোধ জনাইছে"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong>ক এই কাৰ্যটো সম্পাদন কৰিবলৈ দিবনে?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="DEVICE_NAME">%2$s</xliff:g>ৰ হৈ নিকটৱৰ্তী ডিভাইচত এপ্ আৰু ছিষ্টেমৰ অন্য সুবিধাসমূহ ষ্ট্ৰীম কৰাৰ অনুমতি দিবলৈ অনুৰোধ জনাইছে"</string> <string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইচ"</string> <string name="summary_generic" msgid="1761976003668044801">"এই এপ্টোৱে আপোনাৰ ফ’ন আৰু বাছনি কৰা ডিভাইচটোৰ মাজত কল কৰোঁতাৰ নামৰ দৰে তথ্য ছিংক কৰিব পাৰিব"</string> diff --git a/packages/CompanionDeviceManager/res/values-az/strings.xml b/packages/CompanionDeviceManager/res/values-az/strings.xml index 65f3a62cdb57..4e71b8c58f0c 100644 --- a/packages/CompanionDeviceManager/res/values-az/strings.xml +++ b/packages/CompanionDeviceManager/res/values-az/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"cihazda"</string> <string name="summary_glasses" msgid="2872254734959842579">"Bu tətbiq <xliff:g id="DEVICE_NAME">%1$s</xliff:g> bu icazələrə daxil ola biləcək"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> tətbiqinə telefonunuzdan bu məlumata giriş icazəsi verin"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cihazlararası xidmətlər"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> adından cihazlar arasında tətbiqləri yayımlamaq icazəsi istəyir"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> tətbiqinə telefonunuzdan bu məlumata giriş icazəsi verin"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play xidmətləri"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> adından telefonun foto, media və bildirişlərinə giriş icazəsi istəyir"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> cihazına bu əməliyyatı yerinə yetirmək icazəsi verilsin?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%2$s</xliff:g> adından tətbiq və digər sistem funksiyalarını yaxınlıqdakı cihazlara yayımlamaq icazəsi sitəyir"</string> <string name="profile_name_generic" msgid="6851028682723034988">"cihaz"</string> <string name="summary_generic" msgid="1761976003668044801">"Tətbiq zəng edənin adı kimi məlumatları telefon ilə seçilmiş cihaz arasında sinxronlaşdıracaq"</string> diff --git a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml index 314d9ffe43b4..6504ab424e20 100644 --- a/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml +++ b/packages/CompanionDeviceManager/res/values-b+sr+Latn/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"uređaj"</string> <string name="summary_glasses" msgid="2872254734959842579">"Ovoj aplikaciji će biti dozvoljeno da pristupa ovim dozvolama na vašem uređaju (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Dozvolite da <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> pristupa ovim informacijama sa telefona"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Usluge na više uređaja"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> zahteva dozvolu u ime uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> za strimovanje aplikacija između uređaja"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Dozvolite da <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> pristupa ovim informacijama sa telefona"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play usluge"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> zahteva dozvolu u ime uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> za pristup slikama, medijskom sadržaju i obaveštenjima sa telefona"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Želite li da dozvolite da <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> obavi ovu radnju?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahteva dozvolu u ime uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> da strimuje aplikacije i druge sistemske funkcije na uređaje u blizini"</string> <string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string> <string name="summary_generic" msgid="1761976003668044801">"Ova aplikacija će moći da sinhronizuje podatke, poput imena osobe koja upućuje poziv, između telefona i odabranog uređaja"</string> diff --git a/packages/CompanionDeviceManager/res/values-be/strings.xml b/packages/CompanionDeviceManager/res/values-be/strings.xml index fc17899768c9..fcc587a5787b 100644 --- a/packages/CompanionDeviceManager/res/values-be/strings.xml +++ b/packages/CompanionDeviceManager/res/values-be/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"прылада"</string> <string name="summary_glasses" msgid="2872254734959842579">"Гэтая праграма будзе мець на вашай прыладзе \"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>\" наступныя дазволы"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Дазвольце праграме <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> мець доступ да гэтай інфармацыі з вашага тэлефона"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Сэрвісы для некалькіх прылад"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае дазвол ад імя вашай прылады \"<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>\" на трансляцыю праграм паміж вашымі прыладамі"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Дазвольце праграме <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> мець доступ да гэтай інфармацыі з вашага тэлефона"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Сэрвісы Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае дазвол ад імя вашай прылады \"<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>\" на доступ да фота, медыяфайлаў і апавяшчэнняў на вашым тэлефоне"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Дазволіць прыладзе <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> выканаць гэта дзеянне?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запытвае дазвол ад імя вашай прылады \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" на перадачу плынню змесціва праграм і іншых функцый сістэмы на прылады паблізу"</string> <string name="profile_name_generic" msgid="6851028682723034988">"прылада"</string> <string name="summary_generic" msgid="1761976003668044801">"Гэта праграма зможа сінхранізаваць інфармацыю (напрыклад, імя таго, хто звоніць) паміж тэлефонам і выбранай прыладай"</string> diff --git a/packages/CompanionDeviceManager/res/values-bg/strings.xml b/packages/CompanionDeviceManager/res/values-bg/strings.xml index c9f85dd2ec6b..4fb9ceed1c6c 100644 --- a/packages/CompanionDeviceManager/res/values-bg/strings.xml +++ b/packages/CompanionDeviceManager/res/values-bg/strings.xml @@ -26,8 +26,11 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"устройство"</string> <string name="summary_glasses" msgid="2872254734959842579">"Това приложение ще има достъп до следните разрешения за вашето <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Разрешете на <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да осъществява достъп до тази информация от телефона ви"</string> + <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Да се разреши ли на <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да предава поточно приложенията на телефона ви?"</string> + <string name="summary_app_streaming" msgid="295548145144086753">"%1$s ще има достъп до всичко, което се показва или възпроизвежда на телефона, включително аудиосъдържание, снимки, пароли и съобщения.<br/><br/>%1$s ще може да предава поточно приложения, докато не премахнете това разрешение."</string> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Услуги за различни устройства"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> иска разрешение от името на <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> да предава поточно приложения между устройствата ви"</string> + <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> иска разрешение от името на <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> да показва и да предава поточно приложения между устройствата ви"</string> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Разрешете на <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да осъществява достъп до тази информация от телефона ви"</string> @@ -35,6 +38,8 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Услуги за Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> иска разрешение от името на <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> за достъп до снимките, мултимедията и известията на телефона ви"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Разрешавате ли на <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> да предприема това действие?"</string> + <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Да се разреши ли на <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> да предава поточно приложенията и системните функции на телефона ви?"</string> + <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s ще има достъп до всичко, което се показва или възпроизвежда на телефона, включително аудиосъдържание, снимки, данни за плащане, пароли и съобщения.<br/><br/>%1$s ще може да предава поточно приложения и системни функции, докато не премахнете това разрешение."</string> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> иска разрешение от името на <xliff:g id="DEVICE_NAME">%2$s</xliff:g> да предава поточно приложения и други системни функции към устройства в близост"</string> <string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string> <string name="summary_generic" msgid="1761976003668044801">"Това приложение ще може да синхронизира различна информация, като например името на обаждащия се, между телефона ви и избраното устройство"</string> diff --git a/packages/CompanionDeviceManager/res/values-bn/strings.xml b/packages/CompanionDeviceManager/res/values-bn/strings.xml index c3ceda07b211..30447cef4bdb 100644 --- a/packages/CompanionDeviceManager/res/values-bn/strings.xml +++ b/packages/CompanionDeviceManager/res/values-bn/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"ডিভাইস"</string> <string name="summary_glasses" msgid="2872254734959842579">"এই অ্যাপ আপনার <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-এ এইসব অনুমতি অ্যাক্সেস করতে পারবে"</string> <string name="title_app_streaming" msgid="2270331024626446950">"আপনার ফোন থেকে <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> অ্যাপকে এই তথ্য অ্যাক্সেস করার অনুমতি দিন"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"ক্রস-ডিভাইস পরিষেবা"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"আপনার ডিভাইসগুলির মধ্যে অ্যাপ স্ট্রিম করার জন্য <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-এর হয়ে অনুমতি চাইছে"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"আপনার ফোন থেকে <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>-কে এই তথ্য অ্যাক্সেস করার অনুমতি দিন"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play পরিষেবা"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"আপনার ফোনের ফটো, মিডিয়া এবং তথ্য অ্যাক্সেস করার জন্য <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-এর হয়ে অনুমতি চাইছে"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong>-কে এই কাজটি করতে দেবেন?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"আশেপাশের ডিভাইসে অ্যাপ ও অন্যান্য সিস্টেম ফিচার স্ট্রিম করার জন্য আপনার <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-এর হয়ে <xliff:g id="APP_NAME">%1$s</xliff:g> অনুমতি চেয়ে অনুরোধ করছে"</string> <string name="profile_name_generic" msgid="6851028682723034988">"ডিভাইস"</string> <string name="summary_generic" msgid="1761976003668044801">"এই অ্যাপ, আপনার ফোন এবং বেছে নেওয়া ডিভাইসের মধ্যে তথ্য সিঙ্ক করতে পারবে, যেমন কোনও কলারের নাম"</string> diff --git a/packages/CompanionDeviceManager/res/values-bs/strings.xml b/packages/CompanionDeviceManager/res/values-bs/strings.xml index 259a06a245d7..87c5349bb01c 100644 --- a/packages/CompanionDeviceManager/res/values-bs/strings.xml +++ b/packages/CompanionDeviceManager/res/values-bs/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"uređaj"</string> <string name="summary_glasses" msgid="2872254734959842579">"Aplikaciji će biti dozvoljen pristup ovim odobrenjima na uređaju <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Dozvolite da aplikacija <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> pristupa ovim informacijama s telefona"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Usluga na više uređaja"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> u ime uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> zahtijeva odobrenje da prenosi aplikacije između vaših uređaja"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Dozvolite aplikaciji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> da pristupa ovim informacijama s vašeg telefona"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play usluge"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> u ime uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> zahtijeva odobrenje da pristupi fotografijama, medijima i obavještenjima na telefonu"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Dozvoliti uređaju <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> da poduzme ovu radnju?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> u ime uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> traži odobrenje da prenosi aplikacije i druge funkcije sistema na uređajima u blizini"</string> <string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string> <string name="summary_generic" msgid="1761976003668044801">"Ova aplikacija će moći sinhronizirati informacije, kao što je ime osobe koja upućuje poziv, između vašeg telefona i odabranog uređaja"</string> diff --git a/packages/CompanionDeviceManager/res/values-ca/strings.xml b/packages/CompanionDeviceManager/res/values-ca/strings.xml index 62fe858559b0..40c6aac7daf5 100644 --- a/packages/CompanionDeviceManager/res/values-ca/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ca/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"dispositiu"</string> <string name="summary_glasses" msgid="2872254734959842579">"Aquesta aplicació podrà accedir a aquests permisos del dispositiu (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Permet que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> accedeixi a aquesta informació del telèfon"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Serveis multidispositiu"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> demana permís en nom del teu dispositiu (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) per reproduir en continu aplicacions entre els dispositius"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Permet que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> accedeixi a aquesta informació del telèfon"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Serveis de Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> demana permís en nom del teu dispositiu (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) per accedir a les fotos, el contingut multimèdia i les notificacions del telèfon"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vols permetre que <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> dugui a terme aquesta acció?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> sol·licita permís en nom del teu dispositiu (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) per reproduir en continu aplicacions i altres funcions del sistema en dispositius propers"</string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositiu"</string> <string name="summary_generic" msgid="1761976003668044801">"Aquesta aplicació podrà sincronitzar informació, com ara el nom d\'algú que truca, entre el teu telèfon i el dispositiu triat"</string> diff --git a/packages/CompanionDeviceManager/res/values-cs/strings.xml b/packages/CompanionDeviceManager/res/values-cs/strings.xml index 76c0a4a774e7..7d7d74f73eb5 100644 --- a/packages/CompanionDeviceManager/res/values-cs/strings.xml +++ b/packages/CompanionDeviceManager/res/values-cs/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"zařízení"</string> <string name="summary_glasses" msgid="2872254734959842579">"Tato aplikace bude mít ve vašem <xliff:g id="DEVICE_NAME">%1$s</xliff:g> povolený přístup k těmto oprávněním"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Povolte aplikaci <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> přístup k těmto informacím z vašeho telefonu"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Služby pro více zařízení"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> požaduje za vaše zařízení <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> oprávnění ke streamování aplikací mezi zařízeními"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Povolte aplikaci <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> přístup k těmto informacím z vašeho telefonu"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Služby Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> požaduje za vaše zařízení <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> oprávnění k přístupu k fotkám, médiím a oznámením v telefonu"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Povolit zařízení <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> podniknout tuto akci?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> žádá jménem vašeho zařízení <xliff:g id="DEVICE_NAME">%2$s</xliff:g> o oprávnění streamovat aplikace a další systémové funkce do zařízení v okolí"</string> <string name="profile_name_generic" msgid="6851028682723034988">"zařízení"</string> <string name="summary_generic" msgid="1761976003668044801">"Tato aplikace bude moci synchronizovat údaje, jako je jméno volajícího, mezi vaším telefonem a vybraným zařízením"</string> diff --git a/packages/CompanionDeviceManager/res/values-da/strings.xml b/packages/CompanionDeviceManager/res/values-da/strings.xml index f765c83b28ff..c4fa73a9392d 100644 --- a/packages/CompanionDeviceManager/res/values-da/strings.xml +++ b/packages/CompanionDeviceManager/res/values-da/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"enhed"</string> <string name="summary_glasses" msgid="2872254734959842579">"Denne app får adgang til disse tilladelser på din <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Giv <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> adgang til disse oplysninger fra din telefon"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Tjenester, som kan tilsluttes en anden enhed"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder om tilladelse på vegne af din <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> til at streame apps mellem dine enheder"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Tillad, at <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> får adgang til disse oplysninger fra din telefon"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play-tjenester"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder om tilladelse på vegne af din <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> til at få adgang til din telefons billeder, medier og notifikationer"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vil du tillade, at <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> foretager denne handling?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> anmoder om tilladelse på vegne af din <xliff:g id="DEVICE_NAME">%2$s</xliff:g> til at streame apps og andre systemfunktioner til enheder i nærheden"</string> <string name="profile_name_generic" msgid="6851028682723034988">"enhed"</string> <string name="summary_generic" msgid="1761976003668044801">"Denne app vil kunne synkronisere oplysninger som f.eks. navnet på en person, der ringer, mellem din telefon og den valgte enhed"</string> diff --git a/packages/CompanionDeviceManager/res/values-de/strings.xml b/packages/CompanionDeviceManager/res/values-de/strings.xml index 61c9b64071e1..d435829d59bb 100644 --- a/packages/CompanionDeviceManager/res/values-de/strings.xml +++ b/packages/CompanionDeviceManager/res/values-de/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"Gerät"</string> <string name="summary_glasses" msgid="2872254734959842579">"Diese App darf dann auf diese Berechtigungen auf deinem <xliff:g id="DEVICE_NAME">%1$s</xliff:g> zugreifen:"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> Zugriff auf diese Informationen von deinem Smartphone gewähren"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Geräteübergreifende Dienste"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> bittet für dein <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> um die Berechtigung zum Streamen von Apps zwischen deinen Geräten"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> Zugriff auf diese Informationen von deinem Smartphone gewähren"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play-Dienste"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> bittet im Namen deines <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> um die Berechtigung zum Zugriff auf die Fotos, Medien und Benachrichtigungen deines Smartphones"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Darf das Gerät <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> diese Aktion ausführen?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> bittet für dein Gerät (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) um die Berechtigung, Apps und andere Systemfunktionen auf Geräte in der Nähe zu streamen"</string> <string name="profile_name_generic" msgid="6851028682723034988">"Gerät"</string> <string name="summary_generic" msgid="1761976003668044801">"Diese App kann dann Daten wie den Namen eines Anrufers zwischen deinem Smartphone und dem ausgewählten Gerät synchronisieren"</string> diff --git a/packages/CompanionDeviceManager/res/values-el/strings.xml b/packages/CompanionDeviceManager/res/values-el/strings.xml index a95d06351427..2fbe35376732 100644 --- a/packages/CompanionDeviceManager/res/values-el/strings.xml +++ b/packages/CompanionDeviceManager/res/values-el/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"συσκευή"</string> <string name="summary_glasses" msgid="2872254734959842579">"Αυτή η εφαρμογή θα μπορεί να έχει πρόσβαση σε αυτές τις άδειες στη συσκευή <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Να επιτρέπεται στο <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> η πρόσβαση σε αυτές τις πληροφορίες από το τηλέφωνό σας."</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Υπηρεσίες πολλών συσκευών"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά εκ μέρους της συσκευής σας <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> άδεια για ροή εφαρμογών μεταξύ των συσκευών σας"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Επιτρέψτε στην εφαρμογή <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> να έχει πρόσβαση σε αυτές τις πληροφορίες από το τηλέφωνό σας"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Υπηρεσίες Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά εκ μέρους της συσκευής σας <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> άδεια για πρόσβαση στις φωτογραφίες, τα αρχεία μέσων και τις ειδοποιήσεις του τηλεφώνου σας"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Να επιτρέπεται στη συσκευή <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> να εκτελεί αυτή την ενέργεια;"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> ζητά άδεια εκ μέρους της συσκευής σας <xliff:g id="DEVICE_NAME">%2$s</xliff:g> για ροή εφαρμογών και άλλων λειτουργιών του συστήματος σε συσκευές σε κοντινή απόσταση"</string> <string name="profile_name_generic" msgid="6851028682723034988">"συσκευή"</string> <string name="summary_generic" msgid="1761976003668044801">"Αυτή η εφαρμογή θα μπορεί να συγχρονίζει πληροφορίες μεταξύ του τηλεφώνου και της επιλεγμένης συσκευής σας, όπως το όνομα ενός ατόμου που σας καλεί."</string> diff --git a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml index 8b506ed20963..ee8eca0e24e3 100644 --- a/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml +++ b/packages/CompanionDeviceManager/res/values-en-rAU/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string> <string name="summary_glasses" msgid="2872254734959842579">"This app will be allowed to access these permissions on your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to access this information from your phone"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to stream apps between your devices"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to access this information from your phone"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to access your phone’s photos, media and notifications"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Allow <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> to take this action?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features to nearby devices"</string> <string name="profile_name_generic" msgid="6851028682723034988">"device"</string> <string name="summary_generic" msgid="1761976003668044801">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device"</string> diff --git a/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml index 4f463f692c37..0160609b3b44 100644 --- a/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml +++ b/packages/CompanionDeviceManager/res/values-en-rCA/strings.xml @@ -26,8 +26,11 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string> <string name="summary_glasses" msgid="2872254734959842579">"This app will be allowed to access these permissions on your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to access this information from your phone"</string> + <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to stream your phone’s apps?"</string> + <string name="summary_app_streaming" msgid="295548145144086753">"%1$s will have access to anything that’s visible or played on the phone, including audio, photos, passwords, and messages.<br/><br/>%1$s will be able to stream apps until you remove access to this permission."</string> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to stream apps between your devices"</string> + <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to display and stream apps between your devices"</string> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to access this information from your phone"</string> @@ -35,6 +38,8 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to access your phone’s photos, media, and notifications"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Allow <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> to take this action?"</string> + <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Allow <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> to stream your phone’s apps and system features?"</string> + <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s will have access to anything that’s visible or played on your phone, including audio, photos, payment info, passwords, and messages.<br/><br/>%1$s will be able to stream apps and system features until you remove access to this permission."</string> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features to nearby devices"</string> <string name="profile_name_generic" msgid="6851028682723034988">"device"</string> <string name="summary_generic" msgid="1761976003668044801">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device"</string> diff --git a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml index 8b506ed20963..ee8eca0e24e3 100644 --- a/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml +++ b/packages/CompanionDeviceManager/res/values-en-rGB/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string> <string name="summary_glasses" msgid="2872254734959842579">"This app will be allowed to access these permissions on your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to access this information from your phone"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to stream apps between your devices"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to access this information from your phone"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to access your phone’s photos, media and notifications"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Allow <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> to take this action?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features to nearby devices"</string> <string name="profile_name_generic" msgid="6851028682723034988">"device"</string> <string name="summary_generic" msgid="1761976003668044801">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device"</string> diff --git a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml index 8b506ed20963..ee8eca0e24e3 100644 --- a/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml +++ b/packages/CompanionDeviceManager/res/values-en-rIN/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string> <string name="summary_glasses" msgid="2872254734959842579">"This app will be allowed to access these permissions on your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to access this information from your phone"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to stream apps between your devices"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to access this information from your phone"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to access your phone’s photos, media and notifications"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Allow <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> to take this action?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features to nearby devices"</string> <string name="profile_name_generic" msgid="6851028682723034988">"device"</string> <string name="summary_generic" msgid="1761976003668044801">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device"</string> diff --git a/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml b/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml index c3ae8a692361..a601926a381a 100644 --- a/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml +++ b/packages/CompanionDeviceManager/res/values-en-rXC/strings.xml @@ -26,8 +26,11 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string> <string name="summary_glasses" msgid="2872254734959842579">"This app will be allowed to access these permissions on your <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to access this information from your phone"</string> + <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to stream your phone’s apps?"</string> + <string name="summary_app_streaming" msgid="295548145144086753">"%1$s will have access to anything that’s visible or played on the phone, including audio, photos, passwords, and messages.<br/><br/>%1$s will be able to stream apps until you remove access to this permission."</string> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to stream apps between your devices"</string> + <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to display and stream apps between your devices"</string> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Allow <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> to access this information from your phone"</string> @@ -35,6 +38,8 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> to access your phone’s photos, media, and notifications"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Allow <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> to take this action?"</string> + <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Allow <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> to stream your phone’s apps and system features?"</string> + <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s will have access to anything that’s visible or played on your phone, including audio, photos, payment info, passwords, and messages.<br/><br/>%1$s will be able to stream apps and system features until you remove access to this permission."</string> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> is requesting permission on behalf of your <xliff:g id="DEVICE_NAME">%2$s</xliff:g> to stream apps and other system features to nearby devices"</string> <string name="profile_name_generic" msgid="6851028682723034988">"device"</string> <string name="summary_generic" msgid="1761976003668044801">"This app will be able to sync info, like the name of someone calling, between your phone and the chosen device"</string> diff --git a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml index 75cd49ca1237..51f187480905 100644 --- a/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml +++ b/packages/CompanionDeviceManager/res/values-es-rUS/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string> <string name="summary_glasses" msgid="2872254734959842579">"Esta app podrá acceder a los siguientes permisos en tu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Permite que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> acceda a esta información de tu teléfono"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servicios multidispositivo"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicita tu permiso en nombre de <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para transmitir apps entre dispositivos"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Permite que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> acceda a esta información de tu teléfono"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Servicios de Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicita tu permiso en nombre de <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para acceder a las fotos, el contenido multimedia y las notificaciones de tu teléfono"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"¿Permites que <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> realice esta acción?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nombre de tu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para transmitir apps y otras funciones del sistema a dispositivos cercanos"</string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> <string name="summary_generic" msgid="1761976003668044801">"Esta app podrá sincronizar información, como el nombre de la persona que llama, entre el teléfono y el dispositivo elegido"</string> diff --git a/packages/CompanionDeviceManager/res/values-es/strings.xml b/packages/CompanionDeviceManager/res/values-es/strings.xml index ba6045bdba67..3e157f039df7 100644 --- a/packages/CompanionDeviceManager/res/values-es/strings.xml +++ b/packages/CompanionDeviceManager/res/values-es/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string> <string name="summary_glasses" msgid="2872254734959842579">"Esta aplicación podrá acceder a estos permisos de tu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Permitir que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> acceda a esta información de tu teléfono"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servicios multidispositivo"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pidiendo permiso en nombre de tu <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para emitir aplicaciones en otros dispositivos tuyos"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Permitir que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> acceda a esta información de tu teléfono"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Servicios de Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pidiendo permiso en nombre de tu <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para acceder a las fotos, los archivos multimedia y las notificaciones de tu teléfono"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"¿Permitir que <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> realice esta acción?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pidiendo permiso en nombre de tu <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para emitir aplicaciones y otras funciones del sistema en dispositivos cercanos"</string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> <string name="summary_generic" msgid="1761976003668044801">"Esta aplicación podrá sincronizar información (por ejemplo, el nombre de la persona que te llama) entre tu teléfono y el dispositivo que elijas"</string> diff --git a/packages/CompanionDeviceManager/res/values-et/strings.xml b/packages/CompanionDeviceManager/res/values-et/strings.xml index dc8d9920030b..28e8b0d194a6 100644 --- a/packages/CompanionDeviceManager/res/values-et/strings.xml +++ b/packages/CompanionDeviceManager/res/values-et/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"seade"</string> <string name="summary_glasses" msgid="2872254734959842579">"Sellele rakendusele antakse need load teie seadmes <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Lubage rakendusel <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> pääseda teie telefonis juurde sellele teabele"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Seadmeülesed teenused"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nimel luba teie seadmete vahel rakendusi voogesitada"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Lubage rakendusel <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> pääseda teie telefonis juurde sellele teabele"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play teenused"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nimel luba pääseda juurde telefoni fotodele, meediale ja märguannetele"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Kas lubada seadmel <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> teha seda toimingut?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> taotleb teie seadme <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nimel luba voogesitada rakendusi ja muid süsteemi funktsioone läheduses olevatesse seadmetesse"</string> <string name="profile_name_generic" msgid="6851028682723034988">"seade"</string> <string name="summary_generic" msgid="1761976003668044801">"See rakendus saab sünkroonida teavet, näiteks helistaja nime, teie telefoni ja valitud seadme vahel"</string> diff --git a/packages/CompanionDeviceManager/res/values-eu/strings.xml b/packages/CompanionDeviceManager/res/values-eu/strings.xml index 8cd4fdefad97..1884e04bdb1a 100644 --- a/packages/CompanionDeviceManager/res/values-eu/strings.xml +++ b/packages/CompanionDeviceManager/res/values-eu/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"gailua"</string> <string name="summary_glasses" msgid="2872254734959842579">"Baimen hauek erabili ahalko ditu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>n aplikazioak:"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Eman informazioa telefonotik hartzeko baimena <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> aplikazioari"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Gailuarteko zerbitzuak"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Gailu batetik bestera aplikazioak igortzeko baimena eskatzen ari da <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> gailuaren izenean"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Eman telefonoko informazio hau erabiltzeko baimena <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> aplikazioari"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Telefonoko argazkiak, multimedia-edukia eta jakinarazpenak erabiltzeko baimena eskatzen ari da <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> gailuaren izenean"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Ekintza hau gauzatzeko baimena eman nahi diozu <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> aplikazioari?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikazioak eta sistemaren beste eginbide batzuk inguruko gailuetara igortzeko baimena eskatzen ari da <xliff:g id="APP_NAME">%1$s</xliff:g>, <xliff:g id="DEVICE_NAME">%2$s</xliff:g> gailuaren izenean"</string> <string name="profile_name_generic" msgid="6851028682723034988">"gailua"</string> <string name="summary_generic" msgid="1761976003668044801">"Telefonoaren eta hautatutako gailuaren artean informazioa sinkronizatzeko gai izango da aplikazioa (esate baterako, deitzaileen izenak)"</string> diff --git a/packages/CompanionDeviceManager/res/values-fa/strings.xml b/packages/CompanionDeviceManager/res/values-fa/strings.xml index 83628cb4a360..9c5807bc5008 100644 --- a/packages/CompanionDeviceManager/res/values-fa/strings.xml +++ b/packages/CompanionDeviceManager/res/values-fa/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"دستگاه"</string> <string name="summary_glasses" msgid="2872254734959842579">"این برنامه مجاز میشود به این اجازهها در <xliff:g id="DEVICE_NAME">%1$s</xliff:g> شما دسترسی پیدا کند"</string> <string name="title_app_streaming" msgid="2270331024626446950">"اجازه دادن به <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> برای دسترسی به اطلاعات تلفن"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"سرویسهای بیندستگاهی"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ازطرف <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> اجازه میخواهد برنامهها را بین دستگاههای شما جاریسازی کند"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"به <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> اجازه دسترسی به این اطلاعات در دستگاهتان داده شود"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"خدمات Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ازطرف <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> اجازه میخواهد به عکسها، رسانهها، و اعلانهای تلفن شما دسترسی پیدا کند"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"به <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> اجازه داده شود این اقدام را انجام دهد؟"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ازطرف <xliff:g id="DEVICE_NAME">%2$s</xliff:g> اجازه میخواهد تا برنامهها و دیگر ویژگیهای سیستم را در دستگاههای اطراف جاریسازی کند."</string> <string name="profile_name_generic" msgid="6851028682723034988">"دستگاه"</string> <string name="summary_generic" msgid="1761976003668044801">"این برنامه مجاز میشود اطلاعتی مثل نام شخصی را که تماس میگیرد بین تلفن شما و دستگاه انتخابشده همگامسازی کند"</string> diff --git a/packages/CompanionDeviceManager/res/values-fi/strings.xml b/packages/CompanionDeviceManager/res/values-fi/strings.xml index 86e79041357b..ecde94926658 100644 --- a/packages/CompanionDeviceManager/res/values-fi/strings.xml +++ b/packages/CompanionDeviceManager/res/values-fi/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"laite"</string> <string name="summary_glasses" msgid="2872254734959842579">"Tämä sovellus saa käyttää näitä lupia laitteella (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Salli, että <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> saa pääsyn näihin puhelimesi tietoihin"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Laitteidenväliset palvelut"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> pyytää laitteesi (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) puolesta lupaa striimata sovelluksia laitteidesi välillä"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Salli pääsy tähän tietoon puhelimellasi: <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Palvelut"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> pyytää laitteesi (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) puolesta lupaa päästä puhelimesi kuviin, mediaan ja ilmoituksiin"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Sallitko, että <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> voi suorittaa tämän toiminnon?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> pyytää laitteesi (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) puolesta lupaa striimata sovelluksia ja muita järjestelmän ominaisuuksia lähellä oleviin laitteisiin."</string> <string name="profile_name_generic" msgid="6851028682723034988">"laite"</string> <string name="summary_generic" msgid="1761976003668044801">"Sovellus voi synkronoida tietoja (esimerkiksi soittajan nimen) puhelimesi ja valitun laitteen välillä"</string> diff --git a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml index b74c8ee5d68a..5debbf3bf6e1 100644 --- a/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml +++ b/packages/CompanionDeviceManager/res/values-fr-rCA/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"appareil"</string> <string name="summary_glasses" msgid="2872254734959842579">"Cette application pourra accéder à ces autorisations sur votre <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Autorisez <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> à accéder à ces informations à partir de votre téléphone"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Services multiappareils"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> pour diffuser des applications entre vos appareils"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Autorisez <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> à accéder à ces informations à partir de votre téléphone"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Services Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> pour accéder aux photos, aux fichiers multimédias et aux notifications de votre téléphone"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Autoriser <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> à effectuer cette action?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation, au nom de votre <xliff:g id="DEVICE_NAME">%2$s</xliff:g>, de diffuser des applications et d\'autres fonctionnalités du système sur des appareils à proximité"</string> <string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string> <string name="summary_generic" msgid="1761976003668044801">"Cette application pourra synchroniser des informations, comme le nom de l\'appelant, entre votre téléphone et l\'appareil sélectionné"</string> diff --git a/packages/CompanionDeviceManager/res/values-fr/strings.xml b/packages/CompanionDeviceManager/res/values-fr/strings.xml index 30b0c9af5f0b..0403a4d69f72 100644 --- a/packages/CompanionDeviceManager/res/values-fr/strings.xml +++ b/packages/CompanionDeviceManager/res/values-fr/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"appareil"</string> <string name="summary_glasses" msgid="2872254734959842579">"Cette appli sera autorisée à accéder à ces autorisations sur votre <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Autoriser <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> à accéder à ces informations depuis votre téléphone"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Services inter-appareils"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> pour caster des applis d\'un appareil à l\'autre"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Autoriser <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> à accéder à ces informations depuis votre téléphone"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Services Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> pour accéder aux photos, contenus multimédias et notifications de votre téléphone"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Autoriser <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> à effectuer cette action ?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> demande l\'autorisation au nom de votre <xliff:g id="DEVICE_NAME">%2$s</xliff:g> de diffuser des applis et d\'autres fonctionnalités système en streaming sur des appareils à proximité"</string> <string name="profile_name_generic" msgid="6851028682723034988">"appareil"</string> <string name="summary_generic" msgid="1761976003668044801">"Cette appli pourra synchroniser des infos, comme le nom de l\'appelant, entre votre téléphone et l\'appareil choisi"</string> diff --git a/packages/CompanionDeviceManager/res/values-gl/strings.xml b/packages/CompanionDeviceManager/res/values-gl/strings.xml index 1b8b8d4d9078..5d9d7ee915d5 100644 --- a/packages/CompanionDeviceManager/res/values-gl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-gl/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string> <string name="summary_glasses" msgid="2872254734959842579">"Esta aplicación poderá acceder a estes permisos do dispositivo (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Permitir que a aplicación <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> acceda a esta información desde o teu teléfono"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servizos multidispositivo"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nome do teu dispositivo (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) para emitir contido de aplicacións entre os teus aparellos"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Permitir que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> acceda a esta información do teu teléfono"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Servizos de Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nome do teu dispositivo (<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>) para acceder ás fotos, ao contido multimedia e ás notificacións do teléfono"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Queres permitir que <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> leve a cabo esta acción?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está solicitando permiso en nome do teu dispositivo (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) para emitir o contido das aplicacións e doutras funcións do sistema en dispositivos próximos"</string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> <string name="summary_generic" msgid="1761976003668044801">"Esta aplicación poderá sincronizar información (por exemplo, o nome de quen chama) entre o teléfono e o dispositivo escollido"</string> diff --git a/packages/CompanionDeviceManager/res/values-gu/strings.xml b/packages/CompanionDeviceManager/res/values-gu/strings.xml index 474960cd7394..e645f187b3f1 100644 --- a/packages/CompanionDeviceManager/res/values-gu/strings.xml +++ b/packages/CompanionDeviceManager/res/values-gu/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"ડિવાઇસ"</string> <string name="summary_glasses" msgid="2872254734959842579">"આ ઍપને તમારા <xliff:g id="DEVICE_NAME">%1$s</xliff:g> પર આ પરવાનગીઓ ઍક્સેસ કરવાની મંજૂરી મળશે"</string> <string name="title_app_streaming" msgid="2270331024626446950">"તમારા ફોનમાંથી આ માહિતી ઍક્સેસ કરવા માટે, <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>ને મંજૂરી આપો"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"ક્રોસ-ડિવાઇસ સેવાઓ"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> તમારા <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> વતી તમારા ડિવાઇસ વચ્ચે ઍપ સ્ટ્રીમ કરવાની પરવાનગીની વિનંતી કરી રહી છે"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"તમારા ફોનમાંથી આ માહિતી ઍક્સેસ કરવા માટે, <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>ને મંજૂરી આપો"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play સેવાઓ"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> તમારા <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> વતી તમારા ફોનના ફોટા, મીડિયા અને નોટિફિકેશન ઍક્સેસ કરવાની પરવાનગીની વિનંતી કરી રહી છે"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong>ને આ પગલું ભરવાની મંજૂરી આપીએ?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> નજીકના ડિવાઇસ પર ઍપ અને સિસ્ટમની અન્ય સુવિધાઓ સ્ટ્રીમ કરવા તમારા <xliff:g id="DEVICE_NAME">%2$s</xliff:g> વતી પરવાનગીની વિનંતી કરી રહી છે"</string> <string name="profile_name_generic" msgid="6851028682723034988">"ડિવાઇસ"</string> <string name="summary_generic" msgid="1761976003668044801">"આ ઍપ તમારા ફોન અને પસંદ કરેલા ડિવાઇસ વચ્ચે, કૉલ કરનાર કોઈ વ્યક્તિનું નામ જેવી માહિતી સિંક કરી શકશે"</string> diff --git a/packages/CompanionDeviceManager/res/values-hi/strings.xml b/packages/CompanionDeviceManager/res/values-hi/strings.xml index 8a0e2d7f3017..f524b97f1222 100644 --- a/packages/CompanionDeviceManager/res/values-hi/strings.xml +++ b/packages/CompanionDeviceManager/res/values-hi/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"डिवाइस"</string> <string name="summary_glasses" msgid="2872254734959842579">"यह ऐप्लिकेशन, आपके <xliff:g id="DEVICE_NAME">%1$s</xliff:g> पर इन अनुमतियों को ऐक्सेस कर पाएगा"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> को अपने फ़ोन से यह जानकारी ऐक्सेस करने की अनुमति दें"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"क्रॉस-डिवाइस से जुड़ी सेवाएं"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> आपके <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> की ओर से, आपके डिवाइसों के बीच ऐप्लिकेशन स्ट्रीम करने की अनुमति मांग रहा है"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> को अपने फ़ोन से यह जानकारी ऐक्सेस करने की अनुमति दें"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> आपके <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> की ओर से, आपने फ़ोन में मौजूद फ़ोटो, मीडिया, और सूचनाओं को ऐक्सेस करने की अनुमति मांग रहा है"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"क्या <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> को यह कार्रवाई करने की अनुमति देनी है?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> आपके <xliff:g id="DEVICE_NAME">%2$s</xliff:g> की ओर से, ऐप्लिकेशन और दूसरे सिस्टम की सुविधाओं को आस-पास मौजूद डिवाइसों पर स्ट्रीम करने की अनुमति मांग रहा है"</string> <string name="profile_name_generic" msgid="6851028682723034988">"डिवाइस"</string> <string name="summary_generic" msgid="1761976003668044801">"यह ऐप्लिकेशन, आपके फ़ोन और चुने हुए डिवाइस के बीच जानकारी सिंक करेगा. जैसे, कॉल करने वाले व्यक्ति का नाम"</string> diff --git a/packages/CompanionDeviceManager/res/values-hr/strings.xml b/packages/CompanionDeviceManager/res/values-hr/strings.xml index 6dc59ea0ceb0..5ed3eb278a50 100644 --- a/packages/CompanionDeviceManager/res/values-hr/strings.xml +++ b/packages/CompanionDeviceManager/res/values-hr/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"uređaj"</string> <string name="summary_glasses" msgid="2872254734959842579">"Aplikacija će moći pristupati ovim dopuštenjima na vašem uređaju <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Omogućite aplikaciji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> da pristupa informacijama s vašeg telefona"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Usluge na različitim uređajima"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahtijeva dopuštenje u ime vašeg uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> za stream aplikacija s jednog uređaja na drugi"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Omogućite aplikaciji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> da pristupa informacijama s vašeg telefona"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Usluge za Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahtijeva dopuštenje u ime vašeg uređaja <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> za pristup fotografijama, medijskim sadržajima i obavijestima na telefonu"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Želite li uređaju <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> dopustiti da izvrši tu radnju?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> zahtijeva dopuštenje u ime vašeg uređaja <xliff:g id="DEVICE_NAME">%2$s</xliff:g> za emitiranje aplikacija i drugih značajki sustava na uređajima u blizini"</string> <string name="profile_name_generic" msgid="6851028682723034988">"uređaj"</string> <string name="summary_generic" msgid="1761976003668044801">"Ta će aplikacija moći sinkronizirati podatke između vašeg telefona i odabranog uređaja, primjerice ime pozivatelja"</string> diff --git a/packages/CompanionDeviceManager/res/values-hu/strings.xml b/packages/CompanionDeviceManager/res/values-hu/strings.xml index 4b1a6f7b98a7..8082bb5f4a71 100644 --- a/packages/CompanionDeviceManager/res/values-hu/strings.xml +++ b/packages/CompanionDeviceManager/res/values-hu/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"eszköz"</string> <string name="summary_glasses" msgid="2872254734959842579">"Az alkalmazás hozzáférhet majd ezekhez az engedélyekhez az Ön <xliff:g id="DEVICE_NAME">%1$s</xliff:g> eszközén"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Engedélyezi a(z) „<xliff:g id="APP_NAME">%1$s</xliff:g>” alkalmazás számára az információhoz való hozzáférést a telefonról"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Többeszközös szolgáltatások"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> engedélyt kér a(z) <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nevében az alkalmazások eszközök közötti streameléséhez"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Engedélyezi a(z) „<xliff:g id="APP_NAME">%1$s</xliff:g>” alkalmazás számára az információhoz való hozzáférést a telefonról"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play-szolgáltatások"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> engedélyt kér a(z) <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nevében a telefonon tárolt fotókhoz, médiatartalmakhoz és értesítésekhez való hozzáféréshez"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Engedélyezi a(z) <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> számára ennek a műveletnek a végrehajtását?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> engedélyt kér a(z) <xliff:g id="DEVICE_NAME">%2$s</xliff:g> nevében az alkalmazások és más rendszerfunkciók közeli eszközökre történő streamelésére"</string> <string name="profile_name_generic" msgid="6851028682723034988">"eszköz"</string> <string name="summary_generic" msgid="1761976003668044801">"Ez az alkalmazás képes lesz szinkronizálni az olyan információkat a telefon és a kiválasztott eszköz között, mint például a hívó fél neve."</string> diff --git a/packages/CompanionDeviceManager/res/values-hy/strings.xml b/packages/CompanionDeviceManager/res/values-hy/strings.xml index 405a98387e33..fc8adee138ab 100644 --- a/packages/CompanionDeviceManager/res/values-hy/strings.xml +++ b/packages/CompanionDeviceManager/res/values-hy/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"սարք"</string> <string name="summary_glasses" msgid="2872254734959842579">"Այս հավելվածը կստանա հետևյալ թույլտվությունները ձեր <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ում"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Թույլատրեք <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> հավելվածին օգտագործել այս տեղեկությունները ձեր հեռախոսից"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Միջսարքային ծառայություններ"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը ձեր <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> սարքի անունից թույլտվություն է խնդրում՝ ձեր սարքերի միջև հավելվածներ հեռարձակելու համար"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Թույլատրեք <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> հավելվածին օգտագործել այս տեղեկությունները ձեր հեռախոսից"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play ծառայություններ"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը ձեր <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> սարքի անունից թույլտվություն է խնդրում՝ ձեր հեռախոսի լուսանկարները, մեդիաֆայլերն ու ծանուցումները տեսնելու համար"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Թույլատրե՞լ <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> հավելվածին կատարել այս գործողությունը"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը ձեր <xliff:g id="DEVICE_NAME">%2$s</xliff:g> սարքի անունից թույլտվություն է խնդրում՝ մոտակա սարքերին հավելվածներ և համակարգի այլ գործառույթներ հեռարձակելու համար"</string> <string name="profile_name_generic" msgid="6851028682723034988">"սարք"</string> <string name="summary_generic" msgid="1761976003668044801">"Այս հավելվածը կկարողանա համաժամացնել ձեր հեռախոսի և ընտրված սարքի տվյալները, օր․՝ զանգողի անունը"</string> diff --git a/packages/CompanionDeviceManager/res/values-in/strings.xml b/packages/CompanionDeviceManager/res/values-in/strings.xml index 02cc573315cc..c2814552b919 100644 --- a/packages/CompanionDeviceManager/res/values-in/strings.xml +++ b/packages/CompanionDeviceManager/res/values-in/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"perangkat"</string> <string name="summary_glasses" msgid="2872254734959842579">"Aplikasi ini akan diizinkan mengakses izin ini di <xliff:g id="DEVICE_NAME">%1$s</xliff:g> Anda"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Izinkan <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> untuk mengakses informasi ini dari ponsel Anda"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Layanan lintas perangkat"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta izin atas nama <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> untuk menstreaming aplikasi di antara perangkat Anda"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Izinkan <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> mengakses informasi ini dari ponsel Anda"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Layanan Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta izin atas nama <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> untuk mengakses foto, media, dan notifikasi ponsel Anda"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Izinkan <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> melakukan tindakan ini?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> meminta izin atas nama <xliff:g id="DEVICE_NAME">%2$s</xliff:g> untuk menstreaming aplikasi dan fitur sistem lainnya ke perangkat di sekitar"</string> <string name="profile_name_generic" msgid="6851028682723034988">"perangkat"</string> <string name="summary_generic" msgid="1761976003668044801">"Aplikasi ini akan dapat menyinkronkan info, seperti nama penelepon, antara ponsel dan perangkat yang dipilih"</string> diff --git a/packages/CompanionDeviceManager/res/values-is/strings.xml b/packages/CompanionDeviceManager/res/values-is/strings.xml index baad2cf4676e..42ca7da70b94 100644 --- a/packages/CompanionDeviceManager/res/values-is/strings.xml +++ b/packages/CompanionDeviceManager/res/values-is/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"tæki"</string> <string name="summary_glasses" msgid="2872254734959842579">"Þetta forrit fær aðgang að eftirfarandi heimildum í <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Veita <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> aðgang að þessum upplýsingum úr símanum þínum"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Þjónustur á milli tækja"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> biður um heimild fyrir <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> til að streyma forritum á milli tækjanna þinna"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Veita <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> aðgang að þessum upplýsingum úr símanum þínum"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Þjónusta Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> sendir beiðni um aðgang að myndum, margmiðlunarefni og tilkynningum símans þíns fyrir hönd <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Leyfa <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> að framkvæma þessa aðgerð?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> biður um heimild fyrir <xliff:g id="DEVICE_NAME">%2$s</xliff:g> til að streyma forritum og öðrum kerfiseiginleikum í nálægum tækjum"</string> <string name="profile_name_generic" msgid="6851028682723034988">"tæki"</string> <string name="summary_generic" msgid="1761976003668044801">"Þetta forrit mun geta samstillt upplýsingar, t.d. nafn þess sem hringir, á milli símans og valins tækis"</string> diff --git a/packages/CompanionDeviceManager/res/values-it/strings.xml b/packages/CompanionDeviceManager/res/values-it/strings.xml index 81f5d62cb7fb..06d58b694695 100644 --- a/packages/CompanionDeviceManager/res/values-it/strings.xml +++ b/packages/CompanionDeviceManager/res/values-it/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string> <string name="summary_glasses" msgid="2872254734959842579">"Questa app potrà accedere alle seguenti autorizzazioni su <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Consenti a <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> di accedere a queste informazioni dal tuo telefono"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servizi cross-device"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede per conto del tuo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> l\'autorizzazione a trasmettere app in streaming tra i dispositivi"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Consenti a <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> di accedere a questa informazione dal tuo telefono"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede per conto del tuo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> l\'autorizzazione ad accedere a foto, contenuti multimediali e notifiche del telefono"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vuoi consentire a <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> di compiere questa azione?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> richiede per conto di <xliff:g id="DEVICE_NAME">%2$s</xliff:g> l\'autorizzazione a trasmettere in streaming app e altre funzionalità di sistema ai dispositivi nelle vicinanze"</string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> <string name="summary_generic" msgid="1761976003668044801">"Questa app potrà sincronizzare informazioni, ad esempio il nome di un chiamante, tra il telefono e il dispositivo scelto"</string> diff --git a/packages/CompanionDeviceManager/res/values-iw/strings.xml b/packages/CompanionDeviceManager/res/values-iw/strings.xml index f4367c0acea5..49d1f9e3b7e7 100644 --- a/packages/CompanionDeviceManager/res/values-iw/strings.xml +++ b/packages/CompanionDeviceManager/res/values-iw/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"מכשיר"</string> <string name="summary_glasses" msgid="2872254734959842579">"האפליקציה הזו תוכל לגשת להרשאות האלה ב<xliff:g id="DEVICE_NAME">%1$s</xliff:g> שלך"</string> <string name="title_app_streaming" msgid="2270331024626446950">"מתן אישור לאפליקציה <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> לגשת למידע הזה מהטלפון שלך"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"שירותים למספר מכשירים"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת הרשאה עבור המכשיר <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> כדי לשדר אפליקציות בין המכשירים שלך"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"מתן אישור לאפליקציה <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> לגשת למידע הזה מהטלפון שלך"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת הרשאה עבור המכשיר <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> כדי לגשת לתמונות, למדיה ולהתראות בטלפון שלך"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"לתת הרשאה למכשיר <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> לבצע את הפעולה הזו?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> מבקשת הרשאה עבור <xliff:g id="DEVICE_NAME">%2$s</xliff:g> כדי להעביר אפליקציות ותכונות מערכת אחרות בסטרימינג למכשירים בקרבת מקום"</string> <string name="profile_name_generic" msgid="6851028682723034988">"מכשיר"</string> <string name="summary_generic" msgid="1761976003668044801">"האפליקציה הזו תוכל לסנכרן מידע, כמו השם של מישהו שמתקשר, מהטלפון שלך למכשיר שבחרת"</string> diff --git a/packages/CompanionDeviceManager/res/values-ja/strings.xml b/packages/CompanionDeviceManager/res/values-ja/strings.xml index 2dfb4d1f6354..0f163947774f 100644 --- a/packages/CompanionDeviceManager/res/values-ja/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ja/strings.xml @@ -26,8 +26,11 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"デバイス"</string> <string name="summary_glasses" msgid="2872254734959842579">"このアプリは、<xliff:g id="DEVICE_NAME">%1$s</xliff:g>の以下の権限にアクセスできるようになります"</string> <string name="title_app_streaming" msgid="2270331024626446950">"スマートフォンのこの情報へのアクセスを <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> に許可"</string> + <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> にスマートフォンのアプリをストリーミングすることを許可しますか?"</string> + <string name="summary_app_streaming" msgid="295548145144086753">"%1$s は、音声、写真、パスワード、メッセージを含め、スマートフォンで表示、再生されるすべてのコンテンツにアクセスできるようになります。<br/><br/>この権限へのアクセス権を削除するまで、%1$s はアプリをストリーミングできます。"</string> <string name="helper_title_app_streaming" msgid="4151687003439969765">"クロスデバイス サービス"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> が <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> に代わってデバイス間でアプリをストリーミングする権限をリクエストしています"</string> + <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> が <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> に代わってデバイス間でアプリを表示およびストリーミングする権限をリクエストしています"</string> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"スマートフォンのこの情報へのアクセスを <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> に許可"</string> @@ -35,6 +38,8 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play 開発者サービス"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> が <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> に代わってスマートフォンの写真、メディア、通知にアクセスする権限をリクエストしています"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> にこの操作の実行を許可しますか?"</string> + <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> にスマートフォンのアプリとシステム機能をストリーミングすることを許可しますか?"</string> + <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s は、音声、写真、お支払い情報、パスワード、メッセージを含め、スマートフォンで表示、再生されるすべてのコンテンツにアクセスできるようになります。<br/><br/>この権限へのアクセス権を削除するまで、%1$s はアプリとシステム機能をストリーミングできます。"</string> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> が <xliff:g id="DEVICE_NAME">%2$s</xliff:g> に代わって、アプリやその他のシステム機能を付近のデバイスにストリーミングする権限をリクエストしています"</string> <string name="profile_name_generic" msgid="6851028682723034988">"デバイス"</string> <string name="summary_generic" msgid="1761976003668044801">"このアプリは、あなたのスマートフォンと選択したデバイスとの間で、通話相手の名前などの情報を同期できるようになります"</string> diff --git a/packages/CompanionDeviceManager/res/values-ka/strings.xml b/packages/CompanionDeviceManager/res/values-ka/strings.xml index f4dcaea08230..3ad80badfa91 100644 --- a/packages/CompanionDeviceManager/res/values-ka/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ka/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"მოწყობილობა"</string> <string name="summary_glasses" msgid="2872254734959842579">"ეს აპი შეძლებს ამ ნებართვებზე წვდომას თქვენს <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ში"</string> <string name="title_app_streaming" msgid="2270331024626446950">"ნება დართეთ, რომ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> აპს ჰქონდეს ამ ინფორმაციაზე წვდომა თქვენი ტელეფონიდან"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"მოწყობილობათშორისი სერვისები"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს უფლებას თქვენი <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-ის სახელით, რომ მოწყობილობებს შორის სტრიმინგი შეძლოს"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"ნება დართეთ, რომ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> აპს ჰქონდეს ამ ინფორმაციაზე წვდომა თქვენი ტელეფონიდან"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს უფლებას თქვენი <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-ის სახელით, რომ წვდომა ჰქონდეს თქვენი ტელეფონის ფოტოებზე, მედიასა და შეტყობინებებზე"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"გსურთ ნება მისცეთ <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ს</strong> ამ მოქმედების შესასრულებლად?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ითხოვს თქვენი <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-ის სახელით აპების და სისტემის სხვა ფუნქციების ახლომახლო მოწყობილობებზე სტრიმინგის ნებართვას"</string> <string name="profile_name_generic" msgid="6851028682723034988">"მოწყობილობა"</string> <string name="summary_generic" msgid="1761976003668044801">"ეს აპი შეძლებს ინფორმაციის სინქრონიზებას თქვენს ტელეფონსა და თქვენ მიერ არჩეულ მოწყობილობას შორის, მაგალითად, იმ ადამიანის სახელის, რომელიც გირეკავთ"</string> diff --git a/packages/CompanionDeviceManager/res/values-kk/strings.xml b/packages/CompanionDeviceManager/res/values-kk/strings.xml index 122e2e60f7ba..4e4986ecf2ff 100644 --- a/packages/CompanionDeviceManager/res/values-kk/strings.xml +++ b/packages/CompanionDeviceManager/res/values-kk/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"құрылғы"</string> <string name="summary_glasses" msgid="2872254734959842579">"Бұл қолданба <xliff:g id="DEVICE_NAME">%1$s</xliff:g> құрылғысында осы рұқсаттарды пайдалана алады."</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> қолданбасына телефоныңыздағы осы ақпаратты пайдалануға рұқсат беріңіз."</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Аралық құрылғы қызметтері"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> атынан құрылғылар арасында қолданбалар трансляциялау үшін рұқсат сұрайды."</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> қолданбасына телефоныңыздағы осы ақпаратты пайдалануға рұқсат беріңіз."</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play қызметтері"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> атынан телефондағы фотосуреттерді, медиафайлдар мен хабарландыруларды пайдалану үшін рұқсат сұрайды."</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> құрылғысына бұл әрекетті орындауға рұқсат беру керек пе?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы <xliff:g id="DEVICE_NAME">%2$s</xliff:g> атынан қолданбалар мен басқа да жүйе функцияларын маңайдағы құрылғыларға трансляциялау рұқсатын сұрап тұр."</string> <string name="profile_name_generic" msgid="6851028682723034988">"құрылғы"</string> <string name="summary_generic" msgid="1761976003668044801">"Бұл қолданба телефон мен таңдалған құрылғы арасында деректі (мысалы, қоңырау шалушының атын) синхрондай алады."</string> diff --git a/packages/CompanionDeviceManager/res/values-km/strings.xml b/packages/CompanionDeviceManager/res/values-km/strings.xml index d6f303737ef3..4646e11887e2 100644 --- a/packages/CompanionDeviceManager/res/values-km/strings.xml +++ b/packages/CompanionDeviceManager/res/values-km/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"ឧបករណ៍"</string> <string name="summary_glasses" msgid="2872254734959842579">"កម្មវិធីនេះនឹងត្រូវបានអនុញ្ញាតឱ្យចូលប្រើប្រាស់ការអនុញ្ញាតទាំងនេះនៅលើ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> របស់អ្នក"</string> <string name="title_app_streaming" msgid="2270331024626446950">"អនុញ្ញាតឱ្យ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ចូលប្រើព័ត៌មាននេះពីទូរសព្ទរបស់អ្នក"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"សេវាកម្មឆ្លងកាត់ឧបករណ៍"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំការអនុញ្ញាតជំនួសឱ្យ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> របស់អ្នក ដើម្បីបញ្ចាំងកម្មវិធីរវាងឧបករណ៍របស់អ្នក"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"អនុញ្ញាតឱ្យ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ចូលមើលព័ត៌មាននេះពីទូរសព្ទរបស់អ្នក"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"សេវាកម្ម Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំការអនុញ្ញាតជំនួសឱ្យ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> របស់អ្នក ដើម្បីចូលប្រើរូបថត មេឌៀ និងការជូនដំណឹងរបស់ទូរសព្ទអ្នក"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"អនុញ្ញាតឱ្យ <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> ធ្វើសកម្មភាពនេះឬ?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> កំពុងស្នើសុំការអនុញ្ញាតជំនួសឱ្យ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> របស់អ្នក ដើម្បីចាក់ផ្សាយកម្មវិធី និងមុខងារប្រព័ន្ធផ្សេងទៀតទៅកាន់ឧបករណ៍នៅជិត"</string> <string name="profile_name_generic" msgid="6851028682723034988">"ឧបករណ៍"</string> <string name="summary_generic" msgid="1761976003668044801">"កម្មវិធីនេះនឹងអាចធ្វើសមកាលកម្មព័ត៌មាន ដូចជាឈ្មោះមនុស្សដែលហៅទូរសព្ទជាដើម រវាងឧបករណ៍ដែលបានជ្រើសរើស និងទូរសព្ទរបស់អ្នក"</string> diff --git a/packages/CompanionDeviceManager/res/values-kn/strings.xml b/packages/CompanionDeviceManager/res/values-kn/strings.xml index 661d344e2e6a..4f2bdd2d0732 100644 --- a/packages/CompanionDeviceManager/res/values-kn/strings.xml +++ b/packages/CompanionDeviceManager/res/values-kn/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"ಸಾಧನ"</string> <string name="summary_glasses" msgid="2872254734959842579">"ನಿಮ್ಮ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ನಲ್ಲಿ ಈ ಅನುಮತಿಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಈ ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸಲಾಗುತ್ತದೆ"</string> <string name="title_app_streaming" msgid="2270331024626446950">"ನಿಮ್ಮ ಫೋನ್ ಮೂಲಕ ಈ ಮಾಹಿತಿಯನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ಗೆ ಅನುಮತಿಸಿ"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"ಕ್ರಾಸ್-ಡಿವೈಸ್ ಸೇವೆಗಳು"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"ನಿಮ್ಮ ಸಾಧನಗಳ ನಡುವೆ ಆ್ಯಪ್ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ನಿಮ್ಮ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ನ ಪರವಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಿಕೊಳ್ಳುತ್ತಿದೆ"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"ನಿಮ್ಮ ಫೋನ್ ಮೂಲಕ ಈ ಮಾಹಿತಿಯನ್ನು ಪ್ರವೇಶಿಸಲು <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ಗೆ ಅನುಮತಿಸಿ"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play ಸೇವೆಗಳು"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"ನಿಮ್ಮ ಫೋನ್ನ ಫೋಟೋಗಳು, ಮೀಡಿಯಾ ಮತ್ತು ಅಧಿಸೂಚನೆಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ನಿಮ್ಮ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ನ ಪರವಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಿಕೊಳ್ಳುತ್ತಿದೆ"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ಈ ಆ್ಯಕ್ಷನ್ ಅನ್ನು ತೆಗೆದುಕೊಳ್ಳಲು <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> ಅನುಮತಿಸಬೇಕೇ?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"ಸಮೀಪದಲ್ಲಿರುವ ಸಾಧನಗಳಿಗೆ ಆ್ಯಪ್ಗಳು ಮತ್ತು ಇತರ ಸಿಸ್ಟಂ ಫೀಚರ್ಗಳನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಲು ನಿಮ್ಮ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ರ ಪರವಾಗಿ <xliff:g id="APP_NAME">%1$s</xliff:g> ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸುತ್ತಿದೆ"</string> <string name="profile_name_generic" msgid="6851028682723034988">"ಸಾಧನ"</string> <string name="summary_generic" msgid="1761976003668044801">"ಮೊಬೈಲ್ ಫೋನ್ ಮತ್ತು ಆಯ್ಕೆಮಾಡಿದ ಸಾಧನದ ನಡುವೆ, ಕರೆ ಮಾಡುವವರ ಹೆಸರಿನಂತಹ ಮಾಹಿತಿಯನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಈ ಆ್ಯಪ್ಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ"</string> diff --git a/packages/CompanionDeviceManager/res/values-ko/strings.xml b/packages/CompanionDeviceManager/res/values-ko/strings.xml index 4ae5abdb4933..9aa49d57b89a 100644 --- a/packages/CompanionDeviceManager/res/values-ko/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ko/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"기기"</string> <string name="summary_glasses" msgid="2872254734959842579">"앱이 <xliff:g id="DEVICE_NAME">%1$s</xliff:g>에서 이러한 권한에 액세스할 수 있게 됩니다."</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>이 휴대전화의 이 정보에 액세스하도록 허용합니다."</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"교차 기기 서비스"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> 대신 기기 간에 앱을 스트리밍할 수 있는 권한을 요청하고 있습니다."</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>이 휴대전화에서 이 정보에 액세스하도록 허용"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play 서비스"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> 대신 휴대전화의 사진, 미디어, 알림에 액세스할 수 있는 권한을 요청하고 있습니다."</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> 기기가 이 작업을 수행하도록 허용하시겠습니까?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 <xliff:g id="DEVICE_NAME">%2$s</xliff:g> 대신 근처 기기로 앱 및 기타 시스템 기능을 스트리밍할 권한을 요청하고 있습니다."</string> <string name="profile_name_generic" msgid="6851028682723034988">"기기"</string> <string name="summary_generic" msgid="1761976003668044801">"이 앱에서 휴대전화와 선택한 기기 간에 정보(예: 발신자 이름)를 동기화할 수 있게 됩니다."</string> diff --git a/packages/CompanionDeviceManager/res/values-ky/strings.xml b/packages/CompanionDeviceManager/res/values-ky/strings.xml index 099b5c5b74e1..bb1e1aa76958 100644 --- a/packages/CompanionDeviceManager/res/values-ky/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ky/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"түзмөк"</string> <string name="summary_glasses" msgid="2872254734959842579">"Бул колдонмого <xliff:g id="DEVICE_NAME">%1$s</xliff:g> түзмөгүңүздө төмөнкүлөрдү аткарууга уруксат берилет"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> колдонмосуна телефонуңуздагы ушул маалыматты көрүүгө уруксат бериңиз"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Түзмөктөр аралык кызматтар"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> түзмөгүңүздүн атынан түзмөктөрүңүздүн ортосунда колдонмолорду алып ойнотууга уруксат сурап жатат"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> колдонмосуна телефонуңуздагы ушул маалыматты көрүүгө уруксат бериңиз"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play кызматтары"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосу <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> түзмөгүңүздүн атынан телефондогу сүрөттөрдү, медиа файлдарды жана билдирмелерди колдонууга уруксат сурап жатат"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> түзмөгүнө бул аракетти аткарууга уруксат бересизби?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="DEVICE_NAME">%2$s</xliff:g> түзмөгүңүздүн атынан жакын жердеги түзмөктөрдө колдонмолорду жана системанын башка функцияларын алып ойнотууга уруксат сурап жатат"</string> <string name="profile_name_generic" msgid="6851028682723034988">"түзмөк"</string> <string name="summary_generic" msgid="1761976003668044801">"Бул колдонмо маалыматты шайкештире алат, мисалы, чалып жаткан кишинин атын телефон жана тандалган түзмөк менен шайкештирет"</string> diff --git a/packages/CompanionDeviceManager/res/values-lo/strings.xml b/packages/CompanionDeviceManager/res/values-lo/strings.xml index fa378ca0640f..9a45460f3c5f 100644 --- a/packages/CompanionDeviceManager/res/values-lo/strings.xml +++ b/packages/CompanionDeviceManager/res/values-lo/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"ອຸປະກອນ"</string> <string name="summary_glasses" msgid="2872254734959842579">"ແອັບນີ້ຈະໄດ້ຮັບສິດເຂົ້າເຖິງການອະນຸຍາດເຫຼົ່ານີ້ຢູ່ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ຂອງທ່ານ"</string> <string name="title_app_streaming" msgid="2270331024626446950">"ອະນຸຍາດ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ໃຫ້ເຂົ້າເຖິງຂໍ້ມູນນີ້ຈາກໂທລະສັບຂອງທ່ານໄດ້"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"ບໍລິການຂ້າມອຸປະກອນ"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມຂອງ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ເພື່ອສະຕຣີມແອັບລະຫວ່າງອຸປະກອນຕ່າງໆຂອງທ່ານ"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"ອະນຸຍາດ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ໃຫ້ເຂົ້າເຖິງຂໍ້ມູນນີ້ຈາກໂທລະສັບຂອງທ່ານໄດ້"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"ບໍລິການ Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມຂອງ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ເພື່ອເຂົ້າເຖິງຮູບພາບ, ສື່ ແລະ ການແຈ້ງເຕືອນໃນໂທລະສັບຂອງທ່ານ"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ອະນຸຍາດ <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> ເພື່ອດຳເນີນຄຳສັ່ງນີ້ບໍ?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກໍາລັງຮ້ອງຂໍການອະນຸຍາດໃນນາມ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ຂອງທ່ານເພື່ອສະຕຣີມແອັບ ແລະ ຄຸນສົມບັດລະບົບອື່ນໆໄປຫາອຸປະກອນທີ່ຢູ່ໃກ້ຄຽງ"</string> <string name="profile_name_generic" msgid="6851028682723034988">"ອຸປະກອນ"</string> <string name="summary_generic" msgid="1761976003668044801">"ແອັບນີ້ຈະສາມາດຊິ້ງຂໍ້ມູນ ເຊັ່ນ: ຊື່ຂອງຄົນທີ່ໂທເຂົ້າ, ລະຫວ່າງໂທລະສັບຂອງທ່ານ ແລະ ອຸປະກອນທີ່ເລືອກໄວ້ໄດ້"</string> diff --git a/packages/CompanionDeviceManager/res/values-lt/strings.xml b/packages/CompanionDeviceManager/res/values-lt/strings.xml index 54f840863f22..58a9db91bf3e 100644 --- a/packages/CompanionDeviceManager/res/values-lt/strings.xml +++ b/packages/CompanionDeviceManager/res/values-lt/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"įrenginio"</string> <string name="summary_glasses" msgid="2872254734959842579">"Šiai programai bus leidžiama pasiekti toliau nurodytus <xliff:g id="DEVICE_NAME">%1$s</xliff:g> leidimus."</string> <string name="title_app_streaming" msgid="2270331024626446950">"Leisti <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> pasiekti šią informaciją iš jūsų telefono"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Pasl. keliuose įrenginiuose"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ prašo leidimo jūsų „<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>“ vardu, kad galėtų srautu perduoti programas iš vieno įrenginio į kitą"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Leisti <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> pasiekti šią informaciją iš jūsų telefono"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"„Google Play“ paslaugos"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ prašo leidimo jūsų „<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>“ vardu, kad galėtų pasiekti telefono nuotraukas, mediją ir pranešimus"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Leisti <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> atlikti šį veiksmą?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ prašo leidimo jūsų „<xliff:g id="DEVICE_NAME">%2$s</xliff:g>“ vardu, kad galėtų srautu perduoti programas ir kitas sistemos funkcijas įrenginiams netoliese"</string> <string name="profile_name_generic" msgid="6851028682723034988">"įrenginys"</string> <string name="summary_generic" msgid="1761976003668044801">"Ši programa galės sinchronizuoti tam tikrą informaciją, pvz., skambinančio asmens vardą, su jūsų telefonu ir pasirinktu įrenginiu"</string> diff --git a/packages/CompanionDeviceManager/res/values-lv/strings.xml b/packages/CompanionDeviceManager/res/values-lv/strings.xml index 390d54428de2..36908e418e35 100644 --- a/packages/CompanionDeviceManager/res/values-lv/strings.xml +++ b/packages/CompanionDeviceManager/res/values-lv/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"ierīce"</string> <string name="summary_glasses" msgid="2872254734959842579">"Šai lietotnei tiks sniegta piekļuve norādītajām atļaujām jūsu ierīcē (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)."</string> <string name="title_app_streaming" msgid="2270331024626446950">"Atļaut lietotnei <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> piekļūt šai informācijai no jūsu tālruņa"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Vairāku ierīču pakalpojumi"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa atļauju straumēt lietotnes starp jūsu ierīcēm šīs ierīces vārdā: <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>."</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Atļaut lietotnei <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> piekļūt šai informācijai no jūsu tālruņa"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play pakalpojumi"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Lietotne <xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa atļauju piekļūt jūsu tālruņa fotoattēliem, multivides saturam un paziņojumiem šīs ierīces vārdā: <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>."</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vai atļaut ierīcei <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> veikt šo darbību?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> pieprasa atļauju tuvumā esošās ierīcēs straumēt lietotnes un citas sistēmas funkcijas šīs ierīces vārdā: <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string> <string name="profile_name_generic" msgid="6851028682723034988">"ierīce"</string> <string name="summary_generic" msgid="1761976003668044801">"Šī lietotne varēs sinhronizēt informāciju (piemēram, zvanītāja vārdu) starp jūsu tālruni un izvēlēto ierīci"</string> diff --git a/packages/CompanionDeviceManager/res/values-mk/strings.xml b/packages/CompanionDeviceManager/res/values-mk/strings.xml index dc15899c328c..b361ae2eaed0 100644 --- a/packages/CompanionDeviceManager/res/values-mk/strings.xml +++ b/packages/CompanionDeviceManager/res/values-mk/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"уред"</string> <string name="summary_glasses" msgid="2872254734959842579">"Апликацијава ќе може да пристапува до овие дозволи на <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Овозможете <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да пристапува до овие податоци на телефонот"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Повеќенаменски услуги"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара дозвола во име на вашиот <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> за да стримува апликации помеѓу вашите уреди"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Дозволете <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> да пристапува до овие податоци на телефонот"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Услуги на Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара дозвола во име на вашиот <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> за да пристапува до фотографиите, аудиовизуелните содржини и известувањата на телефонот"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Ќе дозволите <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> да го преземе ова дејство?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> бара дозвола во име на вашиот <xliff:g id="DEVICE_NAME">%2$s</xliff:g> за да стримува апликации и други системски функции на уредите во близина"</string> <string name="profile_name_generic" msgid="6851028682723034988">"уред"</string> <string name="summary_generic" msgid="1761976003668044801">"Оваа апликација ќе може да ги синхронизира податоците како што се имињата на јавувачите помеѓу вашиот телефон и избраниот уред"</string> diff --git a/packages/CompanionDeviceManager/res/values-ml/strings.xml b/packages/CompanionDeviceManager/res/values-ml/strings.xml index 6c09e6383e44..485dc98626e8 100644 --- a/packages/CompanionDeviceManager/res/values-ml/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ml/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"ഉപകരണം"</string> <string name="summary_glasses" msgid="2872254734959842579">"നിങ്ങളുടെ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> എന്നതിൽ ഇനിപ്പറയുന്ന അനുമതികൾ ആക്സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കും"</string> <string name="title_app_streaming" msgid="2270331024626446950">"നിങ്ങളുടെ ഫോണിൽ നിന്ന് ഈ വിവരങ്ങൾ ആക്സസ് ചെയ്യാൻ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ആപ്പിനെ അനുവദിക്കുക"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"ക്രോസ്-ഉപകരണ സേവനങ്ങൾ"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"നിങ്ങളുടെ ഉപകരണങ്ങളിൽ ഒന്നിൽ നിന്ന് അടുത്തതിലേക്ക് ആപ്പുകൾ സ്ട്രീം ചെയ്യാൻ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> എന്ന ഉപകരണത്തിന് വേണ്ടി <xliff:g id="APP_NAME">%1$s</xliff:g> എന്നത് അനുമതി അഭ്യർത്ഥിക്കുന്നു"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"നിങ്ങളുടെ ഫോണിൽ നിന്ന് ഈ വിവരങ്ങൾ ആക്സസ് ചെയ്യാൻ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ആപ്പിനെ അനുവദിക്കുക"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play സേവനങ്ങൾ"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"നിങ്ങളുടെ ഫോണിലെ ഫോട്ടോകൾ, മീഡിയ, അറിയിപ്പുകൾ എന്നിവ ആക്സസ് ചെയ്യാൻ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> എന്ന ഉപകരണത്തിന് വേണ്ടി <xliff:g id="APP_NAME">%1$s</xliff:g> അനുമതി അഭ്യർത്ഥിക്കുന്നു"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ഈ പ്രവർത്തനം നടത്താൻ <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> എന്നതിനെ അനുവദിക്കണോ?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"സമീപമുള്ള ഉപകരണങ്ങളിൽ ആപ്പുകളും മറ്റ് സിസ്റ്റം ഫീച്ചറുകളും സ്ട്രീം ചെയ്യാൻ നിങ്ങളുടെ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> എന്നതിന് വേണ്ടി <xliff:g id="APP_NAME">%1$s</xliff:g> അനുമതി അഭ്യർത്ഥിക്കുന്നു"</string> <string name="profile_name_generic" msgid="6851028682723034988">"ഉപകരണം"</string> <string name="summary_generic" msgid="1761976003668044801">"വിളിക്കുന്നയാളുടെ പേര് പോലുള്ള വിവരങ്ങൾ നിങ്ങളുടെ ഫോണിനും തിരഞ്ഞെടുത്ത ഉപകരണത്തിനും ഇടയിൽ സമന്വയിപ്പിക്കുന്നതിന് ഈ ആപ്പിന് കഴിയും"</string> diff --git a/packages/CompanionDeviceManager/res/values-mn/strings.xml b/packages/CompanionDeviceManager/res/values-mn/strings.xml index 4cbccb48cae4..13d52d6b222e 100644 --- a/packages/CompanionDeviceManager/res/values-mn/strings.xml +++ b/packages/CompanionDeviceManager/res/values-mn/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"төхөөрөмж"</string> <string name="summary_glasses" msgid="2872254734959842579">"Энэ апп таны <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-н эдгээр зөвшөөрөлд хандах эрхтэй байх болно"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>-д таны утаснаас энэ мэдээлэлд хандахыг зөвшөөрнө үү"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Төхөөрөмж хоорондын үйлчилгээ"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Таны төхөөрөмжүүд хооронд апп дамжуулахын тулд <xliff:g id="APP_NAME">%1$s</xliff:g> таны <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-н өмнөөс зөвшөөрөл хүсэж байна"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>-д таны утаснаас энэ мэдээлэлд хандахыг зөвшөөрнө үү"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play үйлчилгээ"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Таны утасны зураг, медиа болон мэдэгдэлд хандахын тулд <xliff:g id="APP_NAME">%1$s</xliff:g> таны <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>-н өмнөөс зөвшөөрөл хүсэж байна"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong>-д энэ үйлдлийг хийхийг зөвшөөрөх үү?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> таны <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-н өмнөөс аппууд болон системийн бусад онцлогийг ойролцоох төхөөрөмжүүд рүү дамжуулах зөвшөөрөл хүсэж байна"</string> <string name="profile_name_generic" msgid="6851028682723034988">"төхөөрөмж"</string> <string name="summary_generic" msgid="1761976003668044801">"Энэ апп залгаж буй хүний нэр зэрэг мэдээллийг таны утас болон сонгосон төхөөрөмжийн хооронд синк хийх боломжтой болно"</string> diff --git a/packages/CompanionDeviceManager/res/values-mr/strings.xml b/packages/CompanionDeviceManager/res/values-mr/strings.xml index a01759b4511d..7f77303846de 100644 --- a/packages/CompanionDeviceManager/res/values-mr/strings.xml +++ b/packages/CompanionDeviceManager/res/values-mr/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"डिव्हाइस"</string> <string name="summary_glasses" msgid="2872254734959842579">"या अॅपला तुमच्या <xliff:g id="DEVICE_NAME">%1$s</xliff:g> वर या परवानग्या अॅक्सेस करण्याची अनुमती असेल"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ला ही माहिती तुमच्या फोनवरून अॅक्सेस करण्यासाठी अनुमती द्या"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"क्रॉस-डिव्हाइस सेवा"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"तुमच्या डिव्हाइसदरम्यान ॲप्स स्ट्रीम करण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> हे तुमच्या <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> च्या वतीने परवानगीची विनंती करत आहे"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ला ही माहिती तुमच्या फोनवरून अॅक्सेस करण्यासाठी अनुमती द्या"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play सेवा"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"तुमच्या फोनमधील फोटो, मीडिया आणि सूचना ॲक्सेस करण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> हे तुमच्या <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> च्या वतीने परवानगीची विनंती करत आहे"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> ला ही कृती करण्याची अनुमती द्यायची आहे का?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे जवळपासच्या डिव्हाइसवर अॅप्स आणि इतर सिस्टीम वैशिष्ट्ये स्ट्रीम करण्यासाठी तुमच्या <xliff:g id="DEVICE_NAME">%2$s</xliff:g> च्या वतीने परवानगीची विनंती करा"</string> <string name="profile_name_generic" msgid="6851028682723034988">"डिव्हाइस"</string> <string name="summary_generic" msgid="1761976003668044801">"हे ॲप तुमचा फोन आणि निवडलेल्या डिव्हाइसदरम्यान कॉल करत असलेल्या एखाद्या व्यक्तीचे नाव यासारखी माहिती सिंक करू शकेल"</string> diff --git a/packages/CompanionDeviceManager/res/values-ms/strings.xml b/packages/CompanionDeviceManager/res/values-ms/strings.xml index 008535b7711d..66f8caf42882 100644 --- a/packages/CompanionDeviceManager/res/values-ms/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ms/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"peranti"</string> <string name="summary_glasses" msgid="2872254734959842579">"Apl ini akan dibenarkan untuk mengakses kebenaran yang berikut pada <xliff:g id="DEVICE_NAME">%1$s</xliff:g> anda"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Benarkan <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> mengakses maklumat ini daripada telefon anda"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Perkhidmatan silang peranti"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang meminta kebenaran bagi pihak <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> anda untuk menstrim apl antara peranti anda"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Benarkan <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> untuk mengakses maklumat ini daripada telefon anda"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Perkhidmatan Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang meminta kebenaran bagi pihak <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> anda untuk mengakses foto, media dan pemberitahuan telefon anda"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Benarkan <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> mengambil tindakan ini?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> sedang meminta kebenaran bagi pihak <xliff:g id="DEVICE_NAME">%2$s</xliff:g> anda untuk menstrim apl dan ciri sistem yang lain pada peranti berdekatan"</string> <string name="profile_name_generic" msgid="6851028682723034988">"peranti"</string> <string name="summary_generic" msgid="1761976003668044801">"Apl ini akan dapat menyegerakkan maklumat seperti nama individu yang memanggil, antara telefon anda dengan peranti yang dipilih"</string> diff --git a/packages/CompanionDeviceManager/res/values-my/strings.xml b/packages/CompanionDeviceManager/res/values-my/strings.xml index 05a3e88fcf98..2192efab84ec 100644 --- a/packages/CompanionDeviceManager/res/values-my/strings.xml +++ b/packages/CompanionDeviceManager/res/values-my/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"စက်"</string> <string name="summary_glasses" msgid="2872254734959842579">"သင့် <xliff:g id="DEVICE_NAME">%1$s</xliff:g> တွင် ၎င်းခွင့်ပြုချက်များရယူရန် ဤအက်ပ်ကိုခွင့်ပြုမည်"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ကို သင့်ဖုန်းမှ ဤအချက်အလက် သုံးခွင့်ပြုမည်"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"စက်များကြားသုံး ဝန်ဆောင်မှုများ"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင်၏စက်များအကြား အက်ပ်များတိုက်ရိုက်လွှင့်ရန် <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ကိုယ်စား ခွင့်ပြုချက်တောင်းနေသည်"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> အား သင့်ဖုန်းမှ ဤအချက်အလက် သုံးခွင့်ပြုခြင်း"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play ဝန်ဆောင်မှုများ"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် သင့်ဖုန်း၏ ဓာတ်ပုံ၊ မီဒီယာနှင့် အကြောင်းကြားချက်များသုံးရန် <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ကိုယ်စား ခွင့်ပြုချက်တောင်းနေသည်"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> ကို ဤသို့လုပ်ဆောင်ခွင့်ပြုမလား။"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> သည် အနီးတစ်ဝိုက်ရှိ အက်ပ်များနှင့် အခြားစနစ်အင်္ဂါရပ်များကို တိုက်ရိုက်ဖွင့်ရန် သင့် <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ကိုယ်စား ခွင့်ပြုချက်တောင်းနေသည်"</string> <string name="profile_name_generic" msgid="6851028682723034988">"စက်"</string> <string name="summary_generic" msgid="1761976003668044801">"ဤအက်ပ်သည် သင့်ဖုန်းနှင့် ရွေးထားသောစက်အကြား ခေါ်ဆိုသူ၏အမည်ကဲ့သို့ အချက်အလက်ကို စင့်ခ်လုပ်နိုင်ပါမည်"</string> diff --git a/packages/CompanionDeviceManager/res/values-nb/strings.xml b/packages/CompanionDeviceManager/res/values-nb/strings.xml index d910f2fc9904..2ad0f32cd225 100644 --- a/packages/CompanionDeviceManager/res/values-nb/strings.xml +++ b/packages/CompanionDeviceManager/res/values-nb/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"enheten"</string> <string name="summary_glasses" msgid="2872254734959842579">"Denne appen får disse tillatelsene på <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Gi <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> tilgang til denne informasjonen fra telefonen din"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Tjenester på flere enheter"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ber om tillatelse til å strømme apper mellom enhetene dine, på vegne av <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Gi <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> tilgang til denne informasjonen fra telefonen din"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play-tjenester"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ber om tillatelse til å få tilgang til bilder, medier og varsler på telefonen din, på vegne av <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vil du la <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> gjøre dette?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ber om tillatelse på vegne av <xliff:g id="DEVICE_NAME">%2$s</xliff:g> til å strømme apper og andre systemfunksjoner til enheter i nærheten"</string> <string name="profile_name_generic" msgid="6851028682723034988">"enhet"</string> <string name="summary_generic" msgid="1761976003668044801">"Denne appen kan synkronisere informasjon som navnet til noen som ringer, mellom telefonen og den valgte enheten"</string> diff --git a/packages/CompanionDeviceManager/res/values-ne/strings.xml b/packages/CompanionDeviceManager/res/values-ne/strings.xml index 2001af20dd6d..0d5cad878f8c 100644 --- a/packages/CompanionDeviceManager/res/values-ne/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ne/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"डिभाइस"</string> <string name="summary_glasses" msgid="2872254734959842579">"तपाईंको <xliff:g id="DEVICE_NAME">%1$s</xliff:g> मा यो एपलाई निम्न अनुमति दिइने छ:"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> लाई तपाईंको फोनमा भएको यो जानकारी हेर्ने तथा प्रयोग गर्ने अनुमति दिनुहोस्"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"क्रस-डिभाइस सेवाहरू"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइस <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> को तर्फबाट तपाईंका कुनै एउटा डिभाइसबाट अर्को डिभाइसमा एप स्ट्रिम गर्ने अनुमति माग्दै छ"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> लाई तपाईंको फोनमा भएको यो जानकारी हेर्ने तथा प्रयोग गर्ने अनुमति दिनुहोस्"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइस <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> को तर्फबाट तपाईंको फोनमा भएका फोटो, मिडिया र सूचनाहरू हेर्ने तथा प्रयोग गर्ने अनुमति माग्दै छ"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> लाई यो कार्य गर्ने अनुमति दिने हो?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> तपाईंको डिभाइस <xliff:g id="DEVICE_NAME">%2$s</xliff:g> को तर्फबाट नजिकैका डिभाइसहरूमा एप र सिस्टमका अन्य सुविधाहरू स्ट्रिम गर्ने अनुमति माग्दै छ"</string> <string name="profile_name_generic" msgid="6851028682723034988">"यन्त्र"</string> <string name="summary_generic" msgid="1761976003668044801">"यो एपले तपाईंको फोन र तपाईंले छनौट गर्ने डिभाइसका बिचमा कल गर्ने व्यक्तिको नाम जस्ता जानकारी सिंक गर्न सक्ने छ।"</string> diff --git a/packages/CompanionDeviceManager/res/values-nl/strings.xml b/packages/CompanionDeviceManager/res/values-nl/strings.xml index e8ccb58e0361..b2c2818592a8 100644 --- a/packages/CompanionDeviceManager/res/values-nl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-nl/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"apparaat"</string> <string name="summary_glasses" msgid="2872254734959842579">"Deze app krijgt toegang tot deze rechten op je <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> toegang geven tot deze informatie op je telefoon"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device-services"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens jouw <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> toestemming om apps te streamen tussen je apparaten"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> toegang geven tot deze informatie op je telefoon"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play-services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens jouw <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> toegang tot de foto\'s, media en meldingen van je telefoon"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Toestaan dat <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> deze actie uitvoert?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> vraagt namens je <xliff:g id="DEVICE_NAME">%2$s</xliff:g> toestemming om apps en andere systeemfuncties naar apparaten in de buurt te streamen"</string> <string name="profile_name_generic" msgid="6851028682723034988">"apparaat"</string> <string name="summary_generic" msgid="1761976003668044801">"Deze app kan informatie, zoals de naam van iemand die belt, synchroniseren tussen je telefoon en het gekozen apparaat"</string> diff --git a/packages/CompanionDeviceManager/res/values-or/strings.xml b/packages/CompanionDeviceManager/res/values-or/strings.xml index 0bb47b8b249d..d5e9d85a609f 100644 --- a/packages/CompanionDeviceManager/res/values-or/strings.xml +++ b/packages/CompanionDeviceManager/res/values-or/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"ଡିଭାଇସ"</string> <string name="summary_glasses" msgid="2872254734959842579">"ଆପଣଙ୍କ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ରେ ଏହି ଅନୁମତିଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପକୁ ଅନୁମତି ଦିଆଯିବ"</string> <string name="title_app_streaming" msgid="2270331024626446950">"ଆପଣଙ୍କ ଫୋନରୁ ଏହି ସୂଚନାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"କ୍ରସ-ଡିଭାଇସ ସେବାଗୁଡ଼ିକ"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"ଆପଣଙ୍କ ଡିଭାଇସଗୁଡ଼ିକ ମଧ୍ୟରେ ଆପ୍ସକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କର <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ତରଫରୁ ଅନୁମତି ପାଇଁ ଅନୁରୋଧ କରୁଛି"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"ଆପଣଙ୍କ ଫୋନରୁ ଏହି ସୂଚନାକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong>କୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play ସେବାଗୁଡ଼ିକ"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"ଆପଣଙ୍କ ଫୋନର ଫଟୋ, ମିଡିଆ ଏବଂ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କର <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ତରଫରୁ ଅନୁମତି ପାଇଁ ଅନୁରୋଧ କରୁଛି"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ଏହି ପଦକ୍ଷେପ ନେବା ପାଇଁ <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong>କୁ ଅନୁମତି ଦେବେ?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"ଆଖପାଖର ଡିଭାଇସଗୁଡ଼ିକରେ ଆପ୍ସ ଏବଂ ଅନ୍ୟ ସିଷ୍ଟମ ଫିଚରଗୁଡ଼ିକୁ ଷ୍ଟ୍ରିମ କରିବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଆପଣଙ୍କ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ତରଫରୁ ଅନୁମତି ପାଇଁ ଅନୁରୋଧ କରୁଛି"</string> <string name="profile_name_generic" msgid="6851028682723034988">"ଡିଭାଇସ୍"</string> <string name="summary_generic" msgid="1761976003668044801">"ଆପଣଙ୍କ ଫୋନ ଏବଂ ବଛାଯାଇଥିବା ଡିଭାଇସ ମଧ୍ୟରେ, କଲ କରୁଥିବା ଯେ କୌଣସି ବ୍ୟକ୍ତିଙ୍କ ନାମ ପରି ସୂଚନା ସିଙ୍କ କରିବାକୁ ଏହି ଆପ ସକ୍ଷମ ହେବ"</string> diff --git a/packages/CompanionDeviceManager/res/values-pa/strings.xml b/packages/CompanionDeviceManager/res/values-pa/strings.xml index 445afa363e5d..8a89f06ebc2a 100644 --- a/packages/CompanionDeviceManager/res/values-pa/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pa/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"ਡੀਵਾਈਸ"</string> <string name="summary_glasses" msgid="2872254734959842579">"ਇਸ ਐਪ ਨੂੰ ਤੁਹਾਡੇ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> \'ਤੇ ਇਨ੍ਹਾਂ ਇਜਾਜ਼ਤਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਹੋਵੇਗੀ"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਤੋਂ ਇਸ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"ਕ੍ਰਾਸ-ਡੀਵਾਈਸ ਸੇਵਾਵਾਂ"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ਦੀ ਤਰਫ਼ੋਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸਾਂ ਵਿਚਕਾਰ ਐਪਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮੰਗ ਰਹੀ ਹੈ"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਤੋਂ ਇਸ ਜਾਣਕਾਰੀ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play ਸੇਵਾਵਾਂ"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> ਦੀ ਤਰਫ਼ੋਂ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦੀਆਂ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਸੂਚਨਾਵਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮੰਗ ਰਹੀ ਹੈ"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ਕੀ <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> ਨੂੰ ਇਹ ਕਾਰਵਾਈ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> ਦੀ ਤਰਫ਼ੋਂ ਨਜ਼ਦੀਕੀ ਡੀਵਾਈਸਾਂ \'ਤੇ ਐਪਾਂ ਅਤੇ ਹੋਰ ਸਿਸਟਮ ਸੰਬੰਧੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਸਟ੍ਰੀਮ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਮੰਗ ਰਹੀ ਹੈ"</string> <string name="profile_name_generic" msgid="6851028682723034988">"ਡੀਵਾਈਸ"</string> <string name="summary_generic" msgid="1761976003668044801">"ਇਹ ਐਪ ਤੁਹਾਡੇ ਫ਼ੋਨ ਅਤੇ ਚੁਣੇ ਗਏ ਡੀਵਾਈਸ ਵਿਚਕਾਰ ਕਾਲਰ ਦੇ ਨਾਮ ਵਰਗੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਿੰਕ ਕਰ ਸਕੇਗੀ"</string> diff --git a/packages/CompanionDeviceManager/res/values-pl/strings.xml b/packages/CompanionDeviceManager/res/values-pl/strings.xml index aec7b68504ff..945f8491597f 100644 --- a/packages/CompanionDeviceManager/res/values-pl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pl/strings.xml @@ -26,8 +26,11 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"urządzenie"</string> <string name="summary_glasses" msgid="2872254734959842579">"Aplikacja będzie miała dostęp do tych uprawnień na Twoim urządzeniu (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Zezwól urządzeniu <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> na dostęp do tych informacji na Twoim telefonie"</string> + <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Zezwolić aplikacji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> na strumieniowanie aplikacji z telefonu?"</string> + <string name="summary_app_streaming" msgid="295548145144086753">"%1$s będzie mieć dostęp do wszystkiego, co jest widoczne i odtwarzane na telefonie, w tym do dźwięku, zdjęć, haseł i wiadomości.<br/><br/>%1$s będzie w stanie strumieniować aplikacje, dopóki nie usuniesz dostępu do tego uprawnienia."</string> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Usługi na innym urządzeniu"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> prosi w imieniu urządzenia <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> o uprawnienia dotyczące strumieniowego odtwarzania treści z aplikacji na innym urządzeniu"</string> + <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"<xliff:g id="APP_NAME">%1$s</xliff:g> prosi w imieniu urządzenia <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> o pozwolenie na wyświetlanie i strumieniowanie aplikacji między Twoimi urządzeniami"</string> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Zezwól aplikacji <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> na dostęp do tych informacji na Twoim telefonie"</string> @@ -35,6 +38,8 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Usługi Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> prosi w imieniu urządzenia <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> o uprawnienia dotyczące dostępu do zdjęć, multimediów i powiadomień na telefonie"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Zezwolić urządzeniu <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> na wykonanie tego działania?"</string> + <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Zezwolić urządzeniu <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> na strumieniowanie aplikacji i funkcji systemowych z telefonu?"</string> + <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"%1$s będzie mieć dostęp do wszystkiego, co jest widoczne i odtwarzane na telefonie, w tym do dźwięku, zdjęć, danych do płatności, haseł i wiadomości.<br/><br/>%1$s będzie w stanie strumieniować aplikacje i funkcje systemowe, dopóki nie usuniesz dostępu do tego uprawnienia."</string> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> prosi w imieniu urządzenia <xliff:g id="DEVICE_NAME">%2$s</xliff:g> o uprawnienia do strumieniowego odtwarzania treści i innych funkcji systemowych na urządzeniach w pobliżu"</string> <string name="profile_name_generic" msgid="6851028682723034988">"urządzenie"</string> <string name="summary_generic" msgid="1761976003668044801">"Ta aplikacja może synchronizować informacje takie jak imię i nazwisko osoby dzwoniącej między Twoim telefonem i wybranym urządzeniem"</string> diff --git a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml index ef1d6cdd2bb5..41029b120b8f 100644 --- a/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pt-rBR/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string> <string name="summary_glasses" msgid="2872254734959842579">"O app poderá acessar estas permissões no seu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Permitir que o app <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> acesse estas informações do smartphone"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Serviços entre dispositivos"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para fazer streaming de apps entre seus dispositivos"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Autorizar que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> acesse estas informações do smartphone"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para acessar fotos, mídia e notificações do smartphone"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Permitir que o dispositivo <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> realize esta ação?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para fazer streaming de apps e de outros recursos do sistema para dispositivos por perto"</string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> <string name="summary_generic" msgid="1761976003668044801">"O app poderá sincronizar informações, como o nome de quem está ligando, entre seu smartphone e o dispositivo escolhido"</string> diff --git a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml index 1d96c0d45fd9..60a625ce13f5 100644 --- a/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pt-rPT/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string> <string name="summary_glasses" msgid="2872254734959842579">"Esta app vai poder aceder a estas autorizações no seu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Permita que a app <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> aceda a estas informações do seu telemóvel"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Serviços entre dispositivos"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir autorização em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para fazer stream de apps entre os seus dispositivos"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Permita que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> aceda a estas informações do seu telemóvel"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Serviços do Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir autorização em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para aceder às fotos, ao conteúdo multimédia e às notificações do seu telemóvel"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Permitir que o dispositivo <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> faça esta ação?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a pedir autorização em nome do dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para fazer stream de apps e outras funcionalidades do sistema para dispositivos próximos"</string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> <string name="summary_generic" msgid="1761976003668044801">"Esta app vai poder sincronizar informações, como o nome do autor de uma chamada, entre o telemóvel e o dispositivo escolhido"</string> diff --git a/packages/CompanionDeviceManager/res/values-pt/strings.xml b/packages/CompanionDeviceManager/res/values-pt/strings.xml index ef1d6cdd2bb5..41029b120b8f 100644 --- a/packages/CompanionDeviceManager/res/values-pt/strings.xml +++ b/packages/CompanionDeviceManager/res/values-pt/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"dispositivo"</string> <string name="summary_glasses" msgid="2872254734959842579">"O app poderá acessar estas permissões no seu <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Permitir que o app <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> acesse estas informações do smartphone"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Serviços entre dispositivos"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para fazer streaming de apps entre seus dispositivos"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Autorizar que <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> acesse estas informações do smartphone"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Services"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para acessar fotos, mídia e notificações do smartphone"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Permitir que o dispositivo <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> realize esta ação?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> está pedindo permissão em nome do seu dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para fazer streaming de apps e de outros recursos do sistema para dispositivos por perto"</string> <string name="profile_name_generic" msgid="6851028682723034988">"dispositivo"</string> <string name="summary_generic" msgid="1761976003668044801">"O app poderá sincronizar informações, como o nome de quem está ligando, entre seu smartphone e o dispositivo escolhido"</string> diff --git a/packages/CompanionDeviceManager/res/values-ro/strings.xml b/packages/CompanionDeviceManager/res/values-ro/strings.xml index d2c3099ee2b7..70fc09082b9c 100644 --- a/packages/CompanionDeviceManager/res/values-ro/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ro/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"dispozitiv"</string> <string name="summary_glasses" msgid="2872254734959842579">"Aplicația va putea să acceseze următoarele permisiuni pe <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Permite ca <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> să acceseze aceste informații de pe telefon"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Servicii pe mai multe dispozitive"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită permisiunea pentru <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> de a reda în stream aplicații între dispozitivele tale"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Permite ca <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> să acceseze aceste informații de pe telefon"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Servicii Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită permisiunea pentru <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> de a accesa fotografiile, conținutul media și notificările de pe telefon"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Permiți ca <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> să realizeze această acțiune?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> solicită permisiunea pentru <xliff:g id="DEVICE_NAME">%2$s</xliff:g> de a reda în stream conținut din aplicații și alte funcții de sistem pe dispozitivele din apropiere"</string> <string name="profile_name_generic" msgid="6851028682723034988">"dispozitiv"</string> <string name="summary_generic" msgid="1761976003668044801">"Aplicația va putea să sincronizeze informații, cum ar fi numele unui apelant, între telefonul tău și dispozitivul ales"</string> diff --git a/packages/CompanionDeviceManager/res/values-ru/strings.xml b/packages/CompanionDeviceManager/res/values-ru/strings.xml index 77a2c46503d0..2072f90fa152 100644 --- a/packages/CompanionDeviceManager/res/values-ru/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ru/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"устройстве"</string> <string name="summary_glasses" msgid="2872254734959842579">"Это приложение получит указанные разрешения на <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> <string name="title_app_streaming" msgid="2270331024626446950">"Разрешите приложению <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> получать эту информацию с вашего телефона"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Сервисы стриминга приложений"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запрашивает разрешение от имени вашего устройства <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>, чтобы транслировать приложения между устройствами."</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Разрешите приложению <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> получать эту информацию с вашего телефона"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Сервисы Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" запрашивает разрешение от имени вашего устройства <xliff:g id="DISPLAY_NAME">%2$s</xliff:g>, чтобы получить доступ к фотографиям, медиаконтенту и уведомлениям на телефоне."</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Разрешить приложению <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> выполнять это действие?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" от имени вашего устройства \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\" запрашивает разрешение транслировать приложения и системные функции на устройства поблизости."</string> <string name="profile_name_generic" msgid="6851028682723034988">"устройство"</string> <string name="summary_generic" msgid="1761976003668044801">"Приложение сможет синхронизировать информацию между телефоном и выбранным устройством, например данные из журнала звонков."</string> diff --git a/packages/CompanionDeviceManager/res/values-si/strings.xml b/packages/CompanionDeviceManager/res/values-si/strings.xml index 1ba83fdff6ba..6d252603010e 100644 --- a/packages/CompanionDeviceManager/res/values-si/strings.xml +++ b/packages/CompanionDeviceManager/res/values-si/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"උපාංගය"</string> <string name="summary_glasses" msgid="2872254734959842579">"මෙම යෙදුමට ඔබේ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> මත මෙම අවසර වෙත ප්රවේශ වීමට ඉඩ දෙනු ලැබේ"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> හට ඔබගේ දුරකථනයෙන් මෙම තොරතුරුවලට ප්රවේශ වීමට ඉඩ දෙන්න"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"හරස්-උපාංග සේවා"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ඔබේ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> වෙනුවෙන් ඔබේ උපාංග අතර යෙදුම් ප්රවාහ කිරීමට අවසරය ඉල්ලමින් සිටියි"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> හට ඔබගේ දුරකථනයෙන් මෙම තොරතුරුවලට ප්රවේශ වීමට ඉඩ දෙන්න"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play සේවා"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ඔබේ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> වෙනුවෙන් ඔබේ දුරකථනයේ ඡායාරූප, මාධ්ය, සහ දැනුම්දීම් වෙත ප්රවේශ වීමට අවසරය ඉල්ලමින් සිටියි"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"මෙම ක්රියාව කිරීමට <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> හට ඉඩ දෙන්න ද?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ඔබේ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> වෙනුවෙන් යෙදුම් සහ අනෙකුත් පද්ධති විශේෂාංග අවට උපාංග වෙත ප්රවාහ කිරීමට අවසර ඉල්ලයි"</string> <string name="profile_name_generic" msgid="6851028682723034988">"උපාංගය"</string> <string name="summary_generic" msgid="1761976003668044801">"මෙම යෙදුමට ඔබේ දුරකථනය සහ තෝරා ගත් උපාංගය අතර, අමතන කෙනෙකුගේ නම වැනි, තතු සමමුහුර්ත කිරීමට හැකි වනු ඇත"</string> diff --git a/packages/CompanionDeviceManager/res/values-sk/strings.xml b/packages/CompanionDeviceManager/res/values-sk/strings.xml index 637a24018759..b1653310141d 100644 --- a/packages/CompanionDeviceManager/res/values-sk/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sk/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"zariadenie"</string> <string name="summary_glasses" msgid="2872254734959842579">"Táto aplikácia bude mať prístup k týmto povoleniam v zariadení <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Povoľte aplikácii <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> prístup k týmto informáciám z vášho telefónu"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Služby pre viacero zariadení"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje pre zariadenie <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> povolenie streamovať aplikácie medzi vašimi zariadeniami."</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Povoľte aplikácii <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> prístup k týmto informáciám z vášho telefónu"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Služby Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje pre zariadenie <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> povolenie na prístup k fotkám, médiám a upozorneniam vášho telefónu"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Chcete povoliť zariadeniu <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> vykonať túto akciu?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> vyžaduje pre zariadenie <xliff:g id="DEVICE_NAME">%2$s</xliff:g> povolenie streamovať aplikácie a ďalšie systémové funkcie do zariadení v okolí"</string> <string name="profile_name_generic" msgid="6851028682723034988">"zariadenie"</string> <string name="summary_generic" msgid="1761976003668044801">"Táto aplikácia bude môcť synchronizovať informácie, napríklad meno volajúceho, medzi telefónom a vybraným zariadením"</string> diff --git a/packages/CompanionDeviceManager/res/values-sl/strings.xml b/packages/CompanionDeviceManager/res/values-sl/strings.xml index b03c27a9849f..6972fb405500 100644 --- a/packages/CompanionDeviceManager/res/values-sl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sl/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"naprava"</string> <string name="summary_glasses" msgid="2872254734959842579">"Ta aplikacija bo lahko dostopala do teh dovoljenj v napravi »<xliff:g id="DEVICE_NAME">%1$s</xliff:g>«."</string> <string name="title_app_streaming" msgid="2270331024626446950">"Dovolite, da <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> dostopa do teh podatkov v vašem telefonu"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Storitve za zunanje naprave"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave »<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>« zahteva dovoljenje za pretočno predvajanje aplikacij v vaših napravah."</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Dovolite, da <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> dostopa do teh podatkov v vašem telefonu"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Storitve Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave »<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>« zahteva dovoljenje za dostop do fotografij, predstavnosti in obvestil v telefonu."</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Ali napravi <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> dovolite izvedbo tega dejanja?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> v imenu naprave »<xliff:g id="DEVICE_NAME">%2$s</xliff:g>« zahteva dovoljenje za pretočno predvajanje aplikacij in drugih sistemskih funkcij v napravah v bližini."</string> <string name="profile_name_generic" msgid="6851028682723034988">"naprava"</string> <string name="summary_generic" msgid="1761976003668044801">"Ta aplikacija bo lahko sinhronizirala podatke, na primer ime klicatelja, v telefonu in izbrani napravi."</string> diff --git a/packages/CompanionDeviceManager/res/values-sq/strings.xml b/packages/CompanionDeviceManager/res/values-sq/strings.xml index 5eeeeb81ddf5..635e5c870842 100644 --- a/packages/CompanionDeviceManager/res/values-sq/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sq/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"pajisje"</string> <string name="summary_glasses" msgid="2872254734959842579">"Këtij aplikacioni do t\'i lejohet qasja te këto leje në <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Lejo që <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> të ketë qasje në këtë informacion nga telefoni yt"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Shërbimet mes pajisjeve"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon leje në emër të <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> për të transmetuar aplikacione ndërmjet pajisjeve të tua"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Lejo që <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> të ketë qasje në këtë informacion nga telefoni yt"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Shërbimet e Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon leje në emër të <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> për të marrë qasje te fotografitë, media dhe njoftimet e telefonit tënd"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Të lejohet që <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> të ndërmarrë këtë veprim?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> po kërkon leje në emër të (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) tënde për të transmetuar aplikacione dhe veçori të tjera të sistemit te pajisjet në afërsi"</string> <string name="profile_name_generic" msgid="6851028682723034988">"pajisja"</string> <string name="summary_generic" msgid="1761976003668044801">"Ky aplikacion do të mund të sinkronizojë informacione, si p.sh emrin e dikujt që po telefonon, mes telefonit tënd dhe pajisjes së zgjedhur."</string> diff --git a/packages/CompanionDeviceManager/res/values-sr/strings.xml b/packages/CompanionDeviceManager/res/values-sr/strings.xml index 2271092fc804..af9e1945aa4c 100644 --- a/packages/CompanionDeviceManager/res/values-sr/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sr/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"уређај"</string> <string name="summary_glasses" msgid="2872254734959842579">"Овој апликацији ће бити дозвољено да приступа овим дозволама на вашем уређају (<xliff:g id="DEVICE_NAME">%1$s</xliff:g>)"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Дозволите да <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> приступа овим информацијама са телефона"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Услуге на више уређаја"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> захтева дозволу у име уређаја <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> за стримовање апликација између уређаја"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Дозволите да <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> приступа овим информацијама са телефона"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play услуге"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> захтева дозволу у име уређаја <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> за приступ сликама, медијском садржају и обавештењима са телефона"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Желите ли да дозволите да <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> обави ову радњу?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> захтева дозволу у име уређаја <xliff:g id="DEVICE_NAME">%2$s</xliff:g> да стримује апликације и друге системске функције на уређаје у близини"</string> <string name="profile_name_generic" msgid="6851028682723034988">"уређај"</string> <string name="summary_generic" msgid="1761976003668044801">"Ова апликација ће моћи да синхронизује податке, попут имена особе која упућује позив, између телефона и одабраног уређаја"</string> diff --git a/packages/CompanionDeviceManager/res/values-sv/strings.xml b/packages/CompanionDeviceManager/res/values-sv/strings.xml index a8934768d1fb..fdde926e961c 100644 --- a/packages/CompanionDeviceManager/res/values-sv/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sv/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"enhet"</string> <string name="summary_glasses" msgid="2872254734959842579">"Appen får tillåtelse att använda dessa behörigheter på din <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Ge <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> åtkomstbehörighet till denna information på telefonen"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Tjänster för flera enheter"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet att låta <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> streama appar mellan enheter"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Ge <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> åtkomstbehörighet till denna information på telefonen"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play-tjänster"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet att ge <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> åtkomst till foton, mediefiler och aviseringar på telefonen"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vill du tillåta att <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> utför denna åtgärd?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> begär behörighet att streama appar och andra systemfunktioner till enheter i närheten för din <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string> <string name="profile_name_generic" msgid="6851028682723034988">"enhet"</string> <string name="summary_generic" msgid="1761976003668044801">"Den här appen kommer att kunna synkronisera information mellan telefonen och den valda enheten, till exempel namnet på någon som ringer"</string> diff --git a/packages/CompanionDeviceManager/res/values-sw/strings.xml b/packages/CompanionDeviceManager/res/values-sw/strings.xml index c35c407fcbd2..2fb4677564b0 100644 --- a/packages/CompanionDeviceManager/res/values-sw/strings.xml +++ b/packages/CompanionDeviceManager/res/values-sw/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"kifaa"</string> <string name="summary_glasses" msgid="2872254734959842579">"Programu hii itaruhusiwa kufikia ruhusa hizi kwenye <xliff:g id="DEVICE_NAME">%1$s</xliff:g> yako"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Ruhusu <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ifikie maelezo haya kutoka kwenye simu yako"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Huduma za kifaa kilichounganishwa kwingine"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa kwa niaba ya <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> yako ili itiririshe programu kati ya vifaa vyako"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Ruhusu <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ifikie maelezo haya kutoka kwenye simu yako"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Huduma za Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Programu ya <xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa kwa niaba ya <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> yako ili ifikie picha, maudhui na arifa za simu yako"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Ungependa kuruhusu <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> itekeleze kitendo hiki?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> inaomba ruhusa kwa niaba ya <xliff:g id="DEVICE_NAME">%2$s</xliff:g> chako ili itiririshe programu na vipengele vingine vya mfumo kwenye vifaa vilivyo karibu"</string> <string name="profile_name_generic" msgid="6851028682723034988">"kifaa"</string> <string name="summary_generic" msgid="1761976003668044801">"Programu hii itaweza kusawazisha maelezo, kama vile jina la mtu anayepiga simu, kati ya simu yako na kifaa ulichochagua"</string> diff --git a/packages/CompanionDeviceManager/res/values-ta/strings.xml b/packages/CompanionDeviceManager/res/values-ta/strings.xml index 1efdca48be81..62a9c332124b 100644 --- a/packages/CompanionDeviceManager/res/values-ta/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ta/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"சாதனம்"</string> <string name="summary_glasses" msgid="2872254734959842579">"உங்கள் <xliff:g id="DEVICE_NAME">%1$s</xliff:g> சாதனத்தில் இந்த அனுமதிகளை அணுக இந்த ஆப்ஸ் அனுமதிக்கப்படும்"</string> <string name="title_app_streaming" msgid="2270331024626446950">"மொபைலில் உள்ள இந்தத் தகவல்களை அணுக, <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ஆப்ஸை அனுமதிக்கவும்"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"பன்முக சாதன சேவைகள்"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"உங்கள் சாதனங்களுக்கு இடையே ஆப்ஸை ஸ்ட்ரீம் செய்ய உங்கள் <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> சார்பாக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் அனுமதியைக் கோருகிறது"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"உங்கள் மொபைலிலிருந்து இந்தத் தகவலை அணுக <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ஆப்ஸை அனுமதியுங்கள்"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play சேவைகள்"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"உங்கள் மொபைலில் உள்ள படங்கள், மீடியா, அறிவிப்புகள் ஆகியவற்றை அணுக உங்கள் <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> சார்பாக <xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸ் அனுமதியைக் கோருகிறது"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"இந்தச் செயலைச் செய்ய <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> ஐ அனுமதிக்கவா?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"அருகிலுள்ள சாதனங்களுக்கு ஆப்ஸையும் பிற சிஸ்டம் அம்சங்களையும் ஸ்ட்ரீம் செய்ய உங்கள் <xliff:g id="DEVICE_NAME">%2$s</xliff:g> சார்பாக <xliff:g id="APP_NAME">%1$s</xliff:g> அனுமதி கோருகிறது"</string> <string name="profile_name_generic" msgid="6851028682723034988">"சாதனம்"</string> <string name="summary_generic" msgid="1761976003668044801">"அழைப்பவரின் பெயர் போன்ற தகவலை உங்கள் மொபைல் மற்றும் தேர்வுசெய்த சாதனத்திற்கு இடையில் இந்த ஆப்ஸால் ஒத்திசைக்க முடியும்"</string> diff --git a/packages/CompanionDeviceManager/res/values-te/strings.xml b/packages/CompanionDeviceManager/res/values-te/strings.xml index 3dd183e6acfc..4e26141922de 100644 --- a/packages/CompanionDeviceManager/res/values-te/strings.xml +++ b/packages/CompanionDeviceManager/res/values-te/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"పరికరం"</string> <string name="summary_glasses" msgid="2872254734959842579">"మీ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>లో ఈ అనుమతులను యాక్సెస్ చేయడానికి ఈ యాప్ అనుమతించబడుతుంది"</string> <string name="title_app_streaming" msgid="2270331024626446950">"మీ ఫోన్ నుండి ఈ సమాచారాన్ని యాక్సెస్ చేయడానికి <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> యాప్ను అనుమతించండి"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cross-device services"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"మీ పరికరాల మధ్య యాప్లను స్ట్రీమ్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g> మీ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> తరఫున అనుమతిని రిక్వెస్ట్ చేస్తోంది"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"మీ ఫోన్ నుండి ఈ సమాచారాన్ని యాక్సెస్ చేయడానికి <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> యాప్ను అనుమతించండి"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play సర్వీసులు"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> మీ ఫోన్లోని ఫోటోలను, మీడియాను, ఇంకా నోటిఫికేషన్లను యాక్సెస్ చేయడానికి మీ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> తరఫున అనుమతిని రిక్వెస్ట్ చేస్తోంది"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"ఈ చర్యను అమలు చేయడానికి <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong>ను అనుమతించాలా?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"సమీపంలోని పరికరాలకు యాప్లను, ఇతర సిస్టమ్ ఫీచర్లను స్ట్రీమ్ చేయడానికి <xliff:g id="APP_NAME">%1$s</xliff:g> మీ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> తరఫున అనుమతిని రిక్వెస్ట్ చేస్తోంది"</string> <string name="profile_name_generic" msgid="6851028682723034988">"పరికరం"</string> <string name="summary_generic" msgid="1761976003668044801">"కాల్ చేస్తున్న వారి పేరు వంటి సమాచారాన్ని ఈ యాప్ మీ ఫోన్ కు, ఎంచుకున్న పరికరానికీ మధ్య సింక్ చేయగలుగుతుంది"</string> diff --git a/packages/CompanionDeviceManager/res/values-th/strings.xml b/packages/CompanionDeviceManager/res/values-th/strings.xml index 1ed5abf60da5..8be8b3437b34 100644 --- a/packages/CompanionDeviceManager/res/values-th/strings.xml +++ b/packages/CompanionDeviceManager/res/values-th/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"อุปกรณ์"</string> <string name="summary_glasses" msgid="2872254734959842579">"แอปนี้จะได้รับสิทธิ์ดังต่อไปนี้ใน<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ของคุณ"</string> <string name="title_app_streaming" msgid="2270331024626446950">"อนุญาตให้ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> เข้าถึงข้อมูลนี้จากโทรศัพท์ของคุณ"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"บริการข้ามอุปกรณ์"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> เพื่อสตรีมแอประหว่างอุปกรณ์ต่างๆ ของคุณ"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"อนุญาตให้ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> เข้าถึงข้อมูลนี้จากโทรศัพท์ของคุณ"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"บริการ Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> เพื่อเข้าถึงรูปภาพ สื่อ และการแจ้งเตือนในโทรศัพท์ของคุณ"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"อนุญาตให้ <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> ทำงานนี้ไหม"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DEVICE_NAME">%2$s</xliff:g> เพื่อสตรีมแอปและฟีเจอร์อื่นๆ ของระบบไปยังอุปกรณ์ที่อยู่ใกล้เคียง"</string> <string name="profile_name_generic" msgid="6851028682723034988">"อุปกรณ์"</string> <string name="summary_generic" msgid="1761976003668044801">"แอปนี้จะสามารถซิงค์ข้อมูล เช่น ชื่อของบุคคลที่โทรเข้ามา ระหว่างโทรศัพท์ของคุณและอุปกรณ์ที่เลือกไว้ได้"</string> diff --git a/packages/CompanionDeviceManager/res/values-tl/strings.xml b/packages/CompanionDeviceManager/res/values-tl/strings.xml index 1b82d91836ea..45bc01d98d76 100644 --- a/packages/CompanionDeviceManager/res/values-tl/strings.xml +++ b/packages/CompanionDeviceManager/res/values-tl/strings.xml @@ -26,8 +26,11 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"device"</string> <string name="summary_glasses" msgid="2872254734959842579">"Papayagan ang app na ito na i-access ang mga pahintulot na ito sa iyong <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Payagan ang <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> na i-access ang impormasyong ito sa iyong telepono"</string> + <string name="title_app_streaming_with_mirroring" msgid="3364582597581570658">"Payagan ang <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> na i-stream ang mga app ng iyong telepono?"</string> + <string name="summary_app_streaming" msgid="295548145144086753">"Magkakaroon ng access ang %1$s sa kahit anong nakikita o nape-play sa telepono, kasama ang audio, mga larawan, mga password, at mga mensahe.<br/><br/>Makakapag-stream ng mga app ang %1$s hanggang sa alisin mo ang access sa pahintulot na ito."</string> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Mga cross-device na serbisyo"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Ang <xliff:g id="APP_NAME">%1$s</xliff:g> ay humihiling ng pahintulot sa ngalan ng iyong <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para mag-stream ng mga app sa pagitan ng mga device mo"</string> + <string name="helper_summary_app_streaming_with_mirroring" msgid="6138581029144467467">"Humihiling ng pahintulot ang <xliff:g id="APP_NAME">%1$s</xliff:g> para sa iyong <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> na makapagpakita at makapag-stream ng mga app sa mga device mo"</string> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Payagan ang <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> na i-access ang impormasyon sa iyong telepono"</string> @@ -35,6 +38,8 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Mga serbisyo ng Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Ang <xliff:g id="APP_NAME">%1$s</xliff:g> ay humihiling ng pahintulot sa ngalan ng iyong <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> para i-access ang mga larawan, media, at notification ng telepono mo"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Payagan ang <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> na gawin ang pagkilos na ito?"</string> + <string name="title_nearby_device_streaming_with_mirroring" msgid="242855799919611657">"Payagan ang <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> na i-stream ang mga app at feature ng system ng iyong telepono?"</string> + <string name="summary_nearby_device_streaming" msgid="4039565463149145573">"Magkakaroon ng access ang %1$s sa kahit anong nakikita o nape-play sa iyong telepono, kasama ang audio, mga larawan, impormasyon sa pagbabayad, mga password, at mga mensahe.<br/><br/>Makakapag-stream ng mga app at feature ng system ang %1$s hanggang sa alisin mo ang access sa pahintulot na ito."</string> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Humihiling ang <xliff:g id="APP_NAME">%1$s</xliff:g> ng pahintulot sa ngalan ng iyong <xliff:g id="DEVICE_NAME">%2$s</xliff:g> para mag-stream ng mga app at iba pang feature ng system sa mga kalapit na device"</string> <string name="profile_name_generic" msgid="6851028682723034988">"device"</string> <string name="summary_generic" msgid="1761976003668044801">"Magagawa ng app na ito na mag-sync ng impormasyon, tulad ng pangalan ng isang taong tumatawag, sa pagitan ng iyong telepono at ng napiling device"</string> diff --git a/packages/CompanionDeviceManager/res/values-tr/strings.xml b/packages/CompanionDeviceManager/res/values-tr/strings.xml index 392e1585a6ac..d5c51e8b7446 100644 --- a/packages/CompanionDeviceManager/res/values-tr/strings.xml +++ b/packages/CompanionDeviceManager/res/values-tr/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"Cihaz"</string> <string name="summary_glasses" msgid="2872254734959842579">"Bu uygulamanın <xliff:g id="DEVICE_NAME">%1$s</xliff:g> cihazınızda şu izinlere erişmesine izin verilecek:"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> uygulamasının, telefonunuzdaki bu bilgilere erişmesine izin verin"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Cihazlar arası hizmetler"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g>, cihazlarınız arasında uygulama akışı gerçekleştirmek için <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> cihazınız adına izin istiyor"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> uygulamasının, telefonunuzdaki bu bilgilere erişmesine izin verin"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play Hizmetleri"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g>, telefonunuzdaki fotoğraf, medya ve bildirimlere erişmek için <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> cihazınız adına izin istiyor"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> cihazının bu işlemi yapmasına izin verilsin mi?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulaması <xliff:g id="DEVICE_NAME">%2$s</xliff:g> cihazınız adına uygulamaları ve diğer sistem özelliklerini yakındaki cihazlara aktarmak için izin istiyor"</string> <string name="profile_name_generic" msgid="6851028682723034988">"cihaz"</string> <string name="summary_generic" msgid="1761976003668044801">"Bu uygulama, arayan kişinin adı gibi bilgileri telefonunuz ve seçili cihaz arasında senkronize edebilir"</string> diff --git a/packages/CompanionDeviceManager/res/values-uk/strings.xml b/packages/CompanionDeviceManager/res/values-uk/strings.xml index 9f88d9f3f852..97a3dbc17993 100644 --- a/packages/CompanionDeviceManager/res/values-uk/strings.xml +++ b/packages/CompanionDeviceManager/res/values-uk/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"пристрій"</string> <string name="summary_glasses" msgid="2872254734959842579">"Цей додаток матиме доступ до перелічених нижче дозволів на вашому <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Надайте додатку <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> доступ до цієї інформації з телефона"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Сервіси для кількох пристроїв"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> від імені вашого пристрою \"<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>\" запитує дозвіл на трансляцію додатків між вашими пристроями"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Надайте пристрою <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> доступ до цієї інформації з телефона"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Сервіси Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> від імені вашого пристрою \"<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>\" запитує дозвіл на доступ до фотографій, медіафайлів і сповіщень вашого телефона"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Дозволити додатку <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> виконувати цю дію?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> від імені вашого пристрою (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) запитує дозвіл на трансляцію додатків та інших системних функцій на пристрої поблизу"</string> <string name="profile_name_generic" msgid="6851028682723034988">"пристрій"</string> <string name="summary_generic" msgid="1761976003668044801">"Цей додаток зможе синхронізувати інформацію (наприклад, ім’я абонента, який викликає) між телефоном і вибраним пристроєм"</string> diff --git a/packages/CompanionDeviceManager/res/values-ur/strings.xml b/packages/CompanionDeviceManager/res/values-ur/strings.xml index 36f8b4f8b5f1..52826b30e7b7 100644 --- a/packages/CompanionDeviceManager/res/values-ur/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ur/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"آلہ"</string> <string name="summary_glasses" msgid="2872254734959842579">"اس ایپ کو آپ کے <xliff:g id="DEVICE_NAME">%1$s</xliff:g> پر ان اجازتوں تک رسائی کی اجازت ہوگی"</string> <string name="title_app_streaming" msgid="2270331024626446950">"اپنے فون سے ان معلومات تک رسائی حاصل کرنے کی <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> کو اجازت دیں"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"کراس ڈیوائس سروسز"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> ایپ آپ کے <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> کی جانب سے آپ کے آلات کے درمیان ایپس کی سلسلہ بندی کرنے کی اجازت کی درخواست کر رہی ہے"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"اپنے فون سے اس معلومات تک رسائی حاصل کرنے کی <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> کو اجازت دیں"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play سروسز"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> ایپ آپ کے <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> کی جانب سے آپ کے فون کی تصاویر، میڈیا اور اطلاعات تک رسائی کی اجازت کی درخواست کر رہی ہے"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> کو یہ کارروائی انجام دینے کی اجازت دیں؟"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> آپ کے <xliff:g id="DEVICE_NAME">%2$s</xliff:g> کی جانب سے ایپس اور سسٹم کی دیگر خصوصیات کی سلسلہ بندی قریبی آلات پر کرنے کی اجازت طلب کر رہی ہے"</string> <string name="profile_name_generic" msgid="6851028682723034988">"آلہ"</string> <string name="summary_generic" msgid="1761976003668044801">"یہ ایپ آپ کے فون اور منتخب کردہ آلے کے درمیان معلومات، جیسے کسی کال کرنے والے کے نام، کی مطابقت پذیری کر سکے گی"</string> diff --git a/packages/CompanionDeviceManager/res/values-uz/strings.xml b/packages/CompanionDeviceManager/res/values-uz/strings.xml index 8defcbc82e53..b2c81e185ea4 100644 --- a/packages/CompanionDeviceManager/res/values-uz/strings.xml +++ b/packages/CompanionDeviceManager/res/values-uz/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"qurilma"</string> <string name="summary_glasses" msgid="2872254734959842579">"Bu ilova <xliff:g id="DEVICE_NAME">%1$s</xliff:g> qurilmasida quyidagi ruxsatlarni oladi"</string> <string name="title_app_streaming" msgid="2270331024626446950">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ilovasiga telefondagi ushbu maʼlumot uchun ruxsat bering"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Qurilmalararo xizmatlar"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"Qurilamalararo ilovalar strimingi uchun <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nomidan ruxsat soʻramoqda"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ilovasiga telefondagi ushbu maʼlumot uchun ruxsat bering"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play xizmatlari"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"Telefoningizdagi rasm, media va bildirishnomalarga kirish uchun <xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> nomidan ruxsat soʻramoqda"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> ilovasiga bu amalni bajarish uchun ruxsat berilsinmi?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasi <xliff:g id="DEVICE_NAME">%2$s</xliff:g> qurilmangizdan nomidan atrofdagi qurilmalarga ilova va boshqa tizim funksiyalarini uzatish uchun ruxsat olmoqchi"</string> <string name="profile_name_generic" msgid="6851028682723034988">"qurilma"</string> <string name="summary_generic" msgid="1761976003668044801">"Bu ilova telefoningiz va tanlangan qurilmada chaqiruvchining ismi kabi maʼlumotlarni sinxronlay oladi"</string> diff --git a/packages/CompanionDeviceManager/res/values-vi/strings.xml b/packages/CompanionDeviceManager/res/values-vi/strings.xml index 779700824fbf..ae6fc7fefa9b 100644 --- a/packages/CompanionDeviceManager/res/values-vi/strings.xml +++ b/packages/CompanionDeviceManager/res/values-vi/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"thiết bị"</string> <string name="summary_glasses" msgid="2872254734959842579">"Ứng dụng này sẽ được phép dùng những quyền sau trên <xliff:g id="DEVICE_NAME">%1$s</xliff:g> của bạn"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Cho phép <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> truy cập vào thông tin này trên điện thoại của bạn"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Dịch vụ trên nhiều thiết bị"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang yêu cầu quyền thay cho <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> để truyền trực tuyến ứng dụng giữa các thiết bị của bạn"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Cho phép <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> truy cập vào thông tin này trên điện thoại của bạn"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Dịch vụ Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang yêu cầu quyền thay cho <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> để truy cập vào ảnh, nội dung nghe nhìn và thông báo trên điện thoại của bạn"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Cho phép <strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong> thực hiện hành động này?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"<xliff:g id="APP_NAME">%1$s</xliff:g> đang thay <xliff:g id="DEVICE_NAME">%2$s</xliff:g> yêu cầu quyền truyền trực tuyến ứng dụng và các tính năng khác của hệ thống đến các thiết bị ở gần"</string> <string name="profile_name_generic" msgid="6851028682723034988">"thiết bị"</string> <string name="summary_generic" msgid="1761976003668044801">"Ứng dụng này sẽ đồng bộ hoá thông tin (ví dụ: tên người gọi) giữa điện thoại của bạn và thiết bị bạn chọn"</string> diff --git a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml index 11e3332f2758..8bc828738590 100644 --- a/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml +++ b/packages/CompanionDeviceManager/res/values-zh-rCN/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"设备"</string> <string name="summary_glasses" msgid="2872254734959842579">"该应用将可以获得您<xliff:g id="DEVICE_NAME">%1$s</xliff:g>上的以下权限"</string> <string name="title_app_streaming" msgid="2270331024626446950">"允许“<xliff:g id="APP_NAME">%1$s</xliff:g>”<strong></strong>访问您手机中的这项信息"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"跨设备服务"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正代表您的<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>请求在您的设备之间流式传输应用内容"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"允许 <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> 访问您手机中的这项信息"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play 服务"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正代表您的<xliff:g id="DISPLAY_NAME">%2$s</xliff:g>请求访问您手机上的照片、媒体内容和通知"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"允许<strong><xliff:g id="DEVICE_NAME">%1$s</xliff:g></strong>进行此操作?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"“<xliff:g id="APP_NAME">%1$s</xliff:g>”正代表您的<xliff:g id="DEVICE_NAME">%2$s</xliff:g>请求将应用和其他系统功能流式传输到附近的设备"</string> <string name="profile_name_generic" msgid="6851028682723034988">"设备"</string> <string name="summary_generic" msgid="1761976003668044801">"此应用将能在您的手机和所选设备之间同步信息,例如来电者的姓名"</string> diff --git a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml index e340d5a91c13..a085893e8b28 100644 --- a/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml +++ b/packages/CompanionDeviceManager/res/values-zh-rHK/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"裝置"</string> <string name="summary_glasses" msgid="2872254734959842579">"此應用程式將可在<xliff:g id="DEVICE_NAME">%1$s</xliff:g>上取得以下權限"</string> <string name="title_app_streaming" msgid="2270331024626446950">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<strong></strong>存取你手機中的這項資料"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"跨裝置服務"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表 <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> 要求權限,以便在裝置間串流應用程式的內容"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<strong></strong>存取你手機中的這項資料"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play 服務"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表 <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> 要求權限,以便存取手機上的相片、媒體和通知"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"要允許「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」<strong></strong>執行此操作嗎?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」要求權限,才能在附近的裝置上串流播放應用程式和其他系統功能"</string> <string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string> <string name="summary_generic" msgid="1761976003668044801">"此應用程式將可同步手機和所選裝置的資訊,例如來電者的名稱"</string> diff --git a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml index 82ad021a082b..a93034ff96a0 100644 --- a/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml +++ b/packages/CompanionDeviceManager/res/values-zh-rTW/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"裝置"</string> <string name="summary_glasses" msgid="2872254734959842579">"這個應用程式將可取得<xliff:g id="DEVICE_NAME">%1$s</xliff:g>上的這些權限"</string> <string name="title_app_streaming" msgid="2270331024626446950">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<strong></strong>存取手機中的這項資訊"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"跨裝置服務"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"為了在裝置間串流傳輸應用程式內容,「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表 <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> 要求相關權限"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」<strong></strong>存取你手機中的這項資訊"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Google Play 服務"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"為了存取手機上的相片、媒體和通知,「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表 <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> 要求相關權限"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"要允許「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」<strong></strong>執行這項操作嗎?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」正在代表「<xliff:g id="DEVICE_NAME">%2$s</xliff:g>」要求必要權限,才能在鄰近裝置上串流播放應用程式和其他系統功能"</string> <string name="profile_name_generic" msgid="6851028682723034988">"裝置"</string> <string name="summary_generic" msgid="1761976003668044801">"這個應用程式將可在手機和指定裝置間同步資訊,例如來電者名稱"</string> diff --git a/packages/CompanionDeviceManager/res/values-zu/strings.xml b/packages/CompanionDeviceManager/res/values-zu/strings.xml index c35ff6aaa3bf..ddda3e35d29e 100644 --- a/packages/CompanionDeviceManager/res/values-zu/strings.xml +++ b/packages/CompanionDeviceManager/res/values-zu/strings.xml @@ -26,8 +26,14 @@ <string name="profile_name_glasses" msgid="3506504967216601277">"idivayisi"</string> <string name="summary_glasses" msgid="2872254734959842579">"Le-app izovunyelwa ukufinyelela lezi zimvume ku-<xliff:g id="DEVICE_NAME">%1$s</xliff:g> yakho"</string> <string name="title_app_streaming" msgid="2270331024626446950">"Vumela i-<strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ifinyelele lolu lwazi kusukela efonini yakho"</string> + <!-- no translation found for title_app_streaming_with_mirroring (3364582597581570658) --> + <skip /> + <!-- no translation found for summary_app_streaming (295548145144086753) --> + <skip /> <string name="helper_title_app_streaming" msgid="4151687003439969765">"Amasevisi amadivayisi amaningi"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela imvume esikhundleni se-<xliff:g id="DISPLAY_NAME">%2$s</xliff:g> yakho ukuze isakaze-bukhoma ama-app phakathi kwamadivayisi akho"</string> + <!-- no translation found for helper_summary_app_streaming_with_mirroring (6138581029144467467) --> + <skip /> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> <string name="title_computer" msgid="4693714143506569253">"Vumela <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> ukufinyelela lolu lwazi kusuka efonini yakho"</string> @@ -35,6 +41,10 @@ <string name="helper_title_computer" msgid="4671071173916176037">"Amasevisi we-Google Play"</string> <string name="helper_summary_computer" msgid="8774832742608187072">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela imvume esikhundleni se-<xliff:g id="DISPLAY_NAME">%2$s</xliff:g> yakho ukuze ifinyelele izithombe zefoni yakho, imidiya nezaziso"</string> <string name="title_nearby_device_streaming" msgid="7269956847378799794">"Vumela i-<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ukwenza lesi senzo?"</string> + <!-- no translation found for title_nearby_device_streaming_with_mirroring (242855799919611657) --> + <skip /> + <!-- no translation found for summary_nearby_device_streaming (4039565463149145573) --> + <skip /> <string name="helper_summary_nearby_device_streaming" msgid="2063965070936844876">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> icela imvume esikhundleni se-<xliff:g id="DEVICE_NAME">%2$s</xliff:g> ukusakaza ama-app nezinye izakhi zesistimu kumadivayisi aseduze"</string> <string name="profile_name_generic" msgid="6851028682723034988">"idivayisi"</string> <string name="summary_generic" msgid="1761976003668044801">"Le app izokwazi ukuvumelanisa ulwazi, njengegama lomuntu othile ofonayo, phakathi kwefoni yakho nedivayisi ekhethiwe"</string> diff --git a/packages/CrashRecovery/services/java/com/android/server/RescueParty.java b/packages/CrashRecovery/services/java/com/android/server/RescueParty.java index d0fee44f791f..7bdc1a0e3ac7 100644 --- a/packages/CrashRecovery/services/java/com/android/server/RescueParty.java +++ b/packages/CrashRecovery/services/java/com/android/server/RescueParty.java @@ -163,10 +163,8 @@ public class RescueParty { * Check if we're currently attempting to reboot for a factory reset. This method must * return true if RescueParty tries to reboot early during a boot loop, since the device * will not be fully booted at this time. - * - * TODO(gavincorkery): Rename method since its scope has expanded. */ - public static boolean isAttemptingFactoryReset() { + public static boolean isRecoveryTriggeredReboot() { return isFactoryResetPropertySet() || isRebootPropertySet(); } diff --git a/packages/CredentialManager/res/values-uz/strings.xml b/packages/CredentialManager/res/values-uz/strings.xml index 4e27d3e71fd9..8b9cecd6f6f6 100644 --- a/packages/CredentialManager/res/values-uz/strings.xml +++ b/packages/CredentialManager/res/values-uz/strings.xml @@ -61,7 +61,7 @@ <string name="more_options_usage_passwords" msgid="1632047277723187813">"<xliff:g id="PASSWORDSNUMBER">%1$s</xliff:g> ta parol"</string> <string name="more_options_usage_passkeys" msgid="5390320437243042237">"<xliff:g id="PASSKEYSNUMBER">%1$s</xliff:g> ta kalit"</string> <string name="more_options_usage_credentials" msgid="1785697001787193984">"<xliff:g id="TOTALCREDENTIALSNUMBER">%1$s</xliff:g> hisobi maʼlumotlari"</string> - <string name="passkey_before_subtitle" msgid="2448119456208647444">"Kod"</string> + <string name="passkey_before_subtitle" msgid="2448119456208647444">"Kirish kaliti"</string> <string name="another_device" msgid="5147276802037801217">"Boshqa qurilma"</string> <string name="other_password_manager" msgid="565790221427004141">"Boshqa parol menejerlari"</string> <string name="close_sheet" msgid="1393792015338908262">"Varaqni yopish"</string> diff --git a/packages/SettingsLib/SearchWidget/res/values-fr-rCA/strings.xml b/packages/SettingsLib/SearchWidget/res/values-fr-rCA/strings.xml index 9977138f2079..1b22e9e3af8a 100644 --- a/packages/SettingsLib/SearchWidget/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/SearchWidget/res/values-fr-rCA/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">"Rechercher dans les paramètres"</string> + <string name="search_menu" msgid="1914043873178389845">"Recherchez dans les paramètres"</string> </resources> diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index cc23f6eedf9a..530198522c98 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Kon nie \'n nuwe gebruiker skep nie"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Kon nie ’n nuwe gas skep nie"</string> <string name="user_nickname" msgid="262624187455825083">"Bynaam"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Jou naam en prent sal sigbaar wees vir enigiemand wat hierdie toestel gebruik."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Voeg gebruiker by"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Voeg gas by"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Verwyder gas"</string> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 0ecd376626c4..c5c5cdd0b899 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"አዲስ ተጠቃሚን መፍጠር አልተሳካም"</string> <string name="add_guest_failed" msgid="8074548434469843443">"አዲስ እንግዳ መፍጠር አልተሳካም"</string> <string name="user_nickname" msgid="262624187455825083">"ቅጽል ስም"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"ይህን መሳሪያ ለሚጠቀም ማንኛውም ሰው ስምዎ እና ምስልዎ ይታያል።"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"ተጠቃሚን አክል"</string> <string name="guest_new_guest" msgid="3482026122932643557">"እንግዳን አክል"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"እንግዳን አስወግድ"</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 1f313aef239c..4fda845defb2 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"تعذّر إنشاء مستخدم جديد."</string> <string name="add_guest_failed" msgid="8074548434469843443">"تعذّر إنشاء جلسة ضيف جديدة."</string> <string name="user_nickname" msgid="262624187455825083">"اللقب"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"سيكون اسمك وصورتك مرئيَين لأي شخص يستخدم هذا الجهاز."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"إضافة مستخدم"</string> <string name="guest_new_guest" msgid="3482026122932643557">"إضافة ضيف"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"إزالة جلسة الضيف"</string> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index a4be8e997311..2d14a8265c89 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"নতুন ব্যৱহাৰকাৰী সৃষ্টি কৰিব পৰা নগ’ল"</string> <string name="add_guest_failed" msgid="8074548434469843443">"নতুন অতিথি সৃষ্টি কৰিব পৰা নগ’ল"</string> <string name="user_nickname" msgid="262624187455825083">"উপনাম"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"এই ডিভাইচটো ব্যৱহাৰ কৰা যিকোনো লোকে আপোনাৰ নাম আৰু চিত্ৰ দেখা পাব।"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"ব্যৱহাৰকাৰী যোগ দিয়ক"</string> <string name="guest_new_guest" msgid="3482026122932643557">"অতিথি যোগ দিয়ক"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"অতিথি আঁতৰাওক"</string> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index df6dad208bd8..0e3e99aa8b24 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Yeni istifadəçi yaratmaq alınmadı"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Yeni qonaq yaratmaq alınmadı"</string> <string name="user_nickname" msgid="262624187455825083">"Ləqəb"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Ad və şəklinizi bu cihazdan istifadə edən hər kəs görəcək."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"İstifadəçi əlavə edin"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Qonaq əlavə edin"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Qonağı silin"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 8bb8c838ed39..c674a445e171 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Pravljenje novog korisnika nije uspelo"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Pravljenje novog gosta nije uspelo"</string> <string name="user_nickname" msgid="262624187455825083">"Nadimak"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Ime i slika će biti vidljivi svakom ko koristi ovaj uređaj."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Dodaj korisnika"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gosta"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Ukloni gosta"</string> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 433c2430a40d..9fe0680fbc74 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Не ўдалося стварыць новага карыстальніка"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Не ўдалося стварыць новага госця"</string> <string name="user_nickname" msgid="262624187455825083">"Псеўданім"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Ваша імя і відарыс профілю будуць бачныя ўсім, хто выкарыстоўвае гэту прыладу."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Дадаць карыстальніка"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Дадаць госця"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Выдаліць госця"</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 27e27bef4f3a..b79c0e946a29 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Неуспешно създаване на нов потребител"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Създаването на нов гост не бе успешно"</string> <string name="user_nickname" msgid="262624187455825083">"Псевдоним"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Вашето име и снимка няма да бъдат видими за нито един потребител, който използва това устройство."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Добавяне на потребител"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Добавяне на гост"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Премахване на госта"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 2cf055654f3b..31f693b813fa 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"নতুন ব্যবহারকারী যোগ করা যায়নি"</string> <string name="add_guest_failed" msgid="8074548434469843443">"নতুন অতিথি তৈরি করা যায়নি"</string> <string name="user_nickname" msgid="262624187455825083">"বিশেষ নাম"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"এই ডিভাইস ব্যবহার করেন এমন যেকেউ আপনার নাম ও ছবি দেখতে পাবেন।"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"ব্যবহারকারীর অ্যাকাউন্ট যোগ করুন"</string> <string name="guest_new_guest" msgid="3482026122932643557">"অতিথি যোগ করুন"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"অতিথি সরান"</string> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index 64ccf98c3aa8..db203d6e8ef9 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Kreiranje novog korisnika nije uspjelo"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Kreiranje novog gosta nije uspjelo"</string> <string name="user_nickname" msgid="262624187455825083">"Nadimak"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Vaše ime i slika će biti vidljivi svakom ko koristi ovaj uređaj."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Dodavanje korisnika"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Dodavanje gosta"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Ukloni gosta"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 81f9e97a2203..262adba02e1b 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"No s\'ha pogut crear l\'usuari"</string> <string name="add_guest_failed" msgid="8074548434469843443">"No s\'ha pogut crear un convidat"</string> <string name="user_nickname" msgid="262624187455825083">"Àlies"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"El teu nom i la teva foto seran visibles per a qualsevol persona que utilitzi aquest dispositiu."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Afegeix un usuari"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Afegeix un convidat"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Suprimeix el convidat"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index cb8c36b55580..3845e98b9a62 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Nového uživatele se nepodařilo vytvořit"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Vytvoření nového hosta se nezdařilo"</string> <string name="user_nickname" msgid="262624187455825083">"Přezdívka"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Vaše jméno a fotku uvidí kdokoli, kdo toto zařízení použije."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Přidat uživatele"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Přidat hosta"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Odstranit hosta"</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 625f05b57ac8..97676ad26757 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Der kunne ikke oprettes en ny bruger"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Der kunne ikke oprettes en ny gæst"</string> <string name="user_nickname" msgid="262624187455825083">"Kaldenavn"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Dit navn og profilbillede vil være synligt for alle, der bruger denne enhed."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Tilføj bruger"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Tilføj gæst"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Fjern gæsten"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index f622f61505f5..02fd0e0f786e 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Nutzer konnte nicht erstellt werden"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Fehler beim Erstellen eines neuen Gasts"</string> <string name="user_nickname" msgid="262624187455825083">"Alias"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Dein Name und Bild sind für alle Nutzer dieses Geräts sichtbar."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Nutzer hinzufügen"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Gast hinzufügen"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Gast entfernen"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 861f4722edfb..ce81fb74645d 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Η δημιουργία νέου χρήστη απέτυχε"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Αποτυχία δημιουργίας νέου επισκέπτη"</string> <string name="user_nickname" msgid="262624187455825083">"Ψευδώνυμο"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Το όνομα και η εικόνα σας θα είναι ορατά σε όλους τους χρήστες που χρησιμοποιούν αυτή τη συσκευή."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Προσθήκη χρήστη"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Προσθήκη επισκέπτη"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Κατάργηση επισκέπτη"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index e6923de1af8c..78e5b616e683 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Failed to create a new guest"</string> <string name="user_nickname" msgid="262624187455825083">"Nickname"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Your name and picture will be visible to anyone that uses this device."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Add user"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 36dfd2fb0c28..920f7b1a4efa 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Failed to create a new guest"</string> <string name="user_nickname" msgid="262624187455825083">"Nickname"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Your name and picture will be visible to anyone that uses this device."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Add user"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index e6923de1af8c..78e5b616e683 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Failed to create a new guest"</string> <string name="user_nickname" msgid="262624187455825083">"Nickname"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Your name and picture will be visible to anyone that uses this device."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Add user"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index e6923de1af8c..78e5b616e683 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Failed to create a new guest"</string> <string name="user_nickname" msgid="262624187455825083">"Nickname"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Your name and picture will be visible to anyone that uses this device."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Add user"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string> diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml index 8b05e12f2ee4..dd83259d1733 100644 --- a/packages/SettingsLib/res/values-en-rXC/strings.xml +++ b/packages/SettingsLib/res/values-en-rXC/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Failed to create a new user"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Failed to create a new guest"</string> <string name="user_nickname" msgid="262624187455825083">"Nickname"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Your name and picture will be visible to anyone that uses this device."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Add user"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Add guest"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remove guest"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index a6fdf569954c..a221d114968a 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"No se pudo crear el usuario nuevo"</string> <string name="add_guest_failed" msgid="8074548434469843443">"No se pudo crear un nuevo invitado"</string> <string name="user_nickname" msgid="262624187455825083">"Sobrenombre"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Todas las personas que usen este dispositivo podrán ver tu nombre y foto."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Agregar usuario"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Agregar invitado"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Quitar invitado"</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index d57a33a305c6..f6beab9b3980 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"No se ha podido crear el usuario"</string> <string name="add_guest_failed" msgid="8074548434469843443">"No se ha podido crear un nuevo invitado"</string> <string name="user_nickname" msgid="262624187455825083">"Apodo"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Cualquiera que use este dispositivo podrá ver tu nombre y tu imagen"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Añadir usuario"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Añadir invitado"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Quitar invitado"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index dfe78d8f3557..b6b9132f8002 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Uue kasutaja loomine ebaõnnestus"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Uue külalise loomine ei õnnestunud"</string> <string name="user_nickname" msgid="262624187455825083">"Hüüdnimi"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Teie nimi ja pilt on nähtav kõigile selle seadme kasutajatele."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Lisa kasutaja"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Lisa külaline"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Eemalda külaline"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index 3c6309dad77f..b61388da515f 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Ezin izan da sortu erabiltzailea"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Ezin izan da sortu beste gonbidatu bat"</string> <string name="user_nickname" msgid="262624187455825083">"Goitizena"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Gailu hau darabilen edonork ikusi ahal izango ditu zure izena eta argazkia."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Gehitu erabiltzaile bat"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Gehitu gonbidatu bat"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Kendu gonbidatua"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 2cb1873e5fbe..7938bc64c4ee 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"کاربر جدید ایجاد نشد"</string> <string name="add_guest_failed" msgid="8074548434469843443">"مهمان جدید ایجاد نشد"</string> <string name="user_nickname" msgid="262624187455825083">"نام مستعار"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"افرادی که از این دستگاه استفاده میکنند میتوانند نام و عکس شما را ببینند."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"افزودن کاربر"</string> <string name="guest_new_guest" msgid="3482026122932643557">"افزودن مهمان"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"حذف مهمان"</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 29459ca5ee1f..3ee7dc1b017d 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Uuden käyttäjän luominen epäonnistui"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Uutta vierasta ei voitu luoda"</string> <string name="user_nickname" msgid="262624187455825083">"Lempinimi"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Nimesi ja kuvasi ovat näkyvillä kaikille tätä laitetta käyttäville henkilöille."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Lisää käyttäjä"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Lisää vieras"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Poista vieras"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index f97b36ea895d..95a4e62486ba 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Impossible de créer un utilisateur"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Impossible de créer un nouvel invité"</string> <string name="user_nickname" msgid="262624187455825083">"Pseudo"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Votre nom et votre photo seront visibles à toute personne utilisant cet appareil."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Ajouter un utilisateur"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Ajouter un invité"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Supprimer l\'invité"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 7f7ba637b47d..e26e8b045d17 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Échec de la création d\'un utilisateur"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Impossible de créer un profil invité"</string> <string name="user_nickname" msgid="262624187455825083">"Pseudo"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Votre nom et votre photo seront visibles par quiconque utilise cet appareil."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Ajouter un utilisateur"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Ajouter un invité"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Supprimer l\'invité"</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index 179d946c23da..53332bf4c825 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Non se puido crear un novo usuario"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Produciuse un erro ao crear o convidado"</string> <string name="user_nickname" msgid="262624187455825083">"Alcume"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Calquera que use este dispositivo poderá ver o teu nome e imaxe."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Engadir usuario"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Engadir convidado"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Quitar convidado"</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index cafe86c26b77..e792e9fb79c3 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"નવો વપરાશકર્તા બનાવવામાં નિષ્ફળ"</string> <string name="add_guest_failed" msgid="8074548434469843443">"નવી અતિથિ બનાવવામાં નિષ્ફળ રહ્યાં"</string> <string name="user_nickname" msgid="262624187455825083">"ઉપનામ"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"તમારું નામ અને ફોટો આ ડિવાઇસનો ઉપયોગ કરનાર કોઈપણ વ્યક્તિને દેખાશે."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"વપરાશકર્તા ઉમેરો"</string> <string name="guest_new_guest" msgid="3482026122932643557">"અતિથિ ઉમેરો"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"અતિથિને કાઢી નાખો"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 53cf7247b996..ae9e29a4a2a5 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"नया उपयोगकर्ता जोड़ा नहीं जा सका"</string> <string name="add_guest_failed" msgid="8074548434469843443">"नया मेहमान खाता नहीं बनाया जा सका"</string> <string name="user_nickname" msgid="262624187455825083">"प्रचलित नाम"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"इस डिवाइस का इस्तेमाल करने वाले लोगों को आपका नाम और तस्वीर दिखेगी."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"उपयोगकर्ता जोड़ें"</string> <string name="guest_new_guest" msgid="3482026122932643557">"मेहमान जोड़ें"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"मेहमान को हटाएं"</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index f06baad6ea6c..1e12d969558a 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Izrada novog korisnika nije uspjela"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Izrada novog gosta nije uspjela"</string> <string name="user_nickname" msgid="262624187455825083">"Nadimak"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Vaše ime i slika bit će vidljivi svima koji upotrebljavaju taj uređaj."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Dodajte korisnika"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Dodajte gosta"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Ukloni gosta"</string> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 39d905f0bf46..0e5b1deb56ba 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Az új felhasználó létrehozása sikertelen"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Az új vendég létrehozása nem sikerült"</string> <string name="user_nickname" msgid="262624187455825083">"Becenév"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Neve és képe mindenki számára látható lesz, aki ezt az eszközt használja."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Felhasználó hozzáadása"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Vendég hozzáadása"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Vendég munkamenet eltávolítása"</string> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 55f09e297f2a..6e0dd495fb4d 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Չհաջողվեց ստեղծել նոր օգտատեր"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Չհաջողվեց նոր հյուր ստեղծել"</string> <string name="user_nickname" msgid="262624187455825083">"Կեղծանուն"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Ձեր անունն ու նկարը տեսանելի կլինեն այս սարքն օգտագործող բոլոր մարդկանց։"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Ավելացնել օգտատեր"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Ավելացնել հյուր"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Հեռացնել հյուրին"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 885729da1b66..8afffaab0cd7 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Gagal membuat pengguna baru"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Gagal membuat tamu baru"</string> <string name="user_nickname" msgid="262624187455825083">"Nama panggilan"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Nama dan foto Anda akan dapat dilihat oleh siapa saja yang menggunakan perangkat ini."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Tambahkan pengguna"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Tambahkan tamu"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Hapus tamu"</string> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index 020191b55e7c..b32266573638 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Ekki tókst að stofna nýjan notanda"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Ekki tókst að búa til nýjan gest"</string> <string name="user_nickname" msgid="262624187455825083">"Gælunafn"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Allir sem nota þetta tæki geta séð nafnið þitt og myndina."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Bæta notanda við"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Bæta gesti við"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Fjarlægja gest"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 37a20675abe7..43aded08ad3a 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Creazione nuovo utente non riuscita"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Impossibile creare un nuovo ospite"</string> <string name="user_nickname" msgid="262624187455825083">"Nickname"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Il tuo nome e la tua foto saranno visibili a chiunque usi questo dispositivo."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Aggiungi utente"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Aggiungi ospite"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Rimuovi ospite"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 3353374f7b40..990d9ac88ec0 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"לא ניתן היה ליצור משתמש חדש"</string> <string name="add_guest_failed" msgid="8074548434469843443">"יצירת אורח חדש נכשלה"</string> <string name="user_nickname" msgid="262624187455825083">"כינוי"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"השם והתמונה שלך יהיו גלויים לכל מי שמשתמש במכשיר הזה."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"הוספת משתמש"</string> <string name="guest_new_guest" msgid="3482026122932643557">"הוספת אורח"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"הסרת אורח"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index d87d0f8dafbc..7029f8c27112 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"新しいユーザーを作成できませんでした"</string> <string name="add_guest_failed" msgid="8074548434469843443">"新しいゲストを作成できませんでした"</string> <string name="user_nickname" msgid="262624187455825083">"ニックネーム"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"このデバイスを使用するすべてのユーザーに、あなたの名前と写真が表示されます。"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"ユーザーを追加"</string> <string name="guest_new_guest" msgid="3482026122932643557">"ゲストを追加"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ゲストを削除"</string> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 7812f0b21601..461f211c46f4 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"ახალი მომხმარებლის შექმნა ვერ მოხერხდა"</string> <string name="add_guest_failed" msgid="8074548434469843443">"ახალი სტუმრის შექმნა ვერ მოხერხდა"</string> <string name="user_nickname" msgid="262624187455825083">"მეტსახელი"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"თქვენი სახელი და სურათი ხილვადი იქნება ყველასთვის, ვინც ამ მოწყობილობას იყენებს."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"მომხმარებლის დამატება"</string> <string name="guest_new_guest" msgid="3482026122932643557">"სტუმრის დამატება"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"სტუმრის ამოშლა"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 300d4e517013..77d9f8b39448 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Жаңа пайдаланушы жасалмады."</string> <string name="add_guest_failed" msgid="8074548434469843443">"Жаңа қонақ профилі жасалмады."</string> <string name="user_nickname" msgid="262624187455825083">"Лақап ат"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Атыңыз бен суретіңіз осы құрылғыны пайдаланатын барлық адамға көрінеді."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Пайдаланушы қосу"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Қонақ қосу"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Қонақты жою"</string> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index 373cfc656789..7e57b15b3177 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"មិនអាចបង្កើតអ្នកប្រើប្រាស់ថ្មីបានទេ"</string> <string name="add_guest_failed" msgid="8074548434469843443">"មិនអាចបង្កើតភ្ញៀវថ្មីបានទេ"</string> <string name="user_nickname" msgid="262624187455825083">"ឈ្មោះហៅក្រៅ"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"គ្រប់គ្នាដែលប្រើឧបករណ៍នេះនឹងអាចមើលឃើញឈ្មោះ និងរូបភាពរបស់អ្នក។"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"បញ្ចូលអ្នកប្រើប្រាស់"</string> <string name="guest_new_guest" msgid="3482026122932643557">"បញ្ចូលភ្ញៀវ"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ដកភ្ញៀវចេញ"</string> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index bf84cc48aa39..6737cdc403c5 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ರಚಿಸಲು ವಿಫಲವಾಗಿದೆ"</string> <string name="add_guest_failed" msgid="8074548434469843443">"ಹೊಸ ಅತಿಥಿಯನ್ನು ರಚಿಸಲು ವಿಫಲವಾಗಿದೆ"</string> <string name="user_nickname" msgid="262624187455825083">"ಅಡ್ಡ ಹೆಸರು"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"ಈ ಸಾಧನವನ್ನು ಬಳಸುವ ಯಾರಿಗಾದರೂ ನಿಮ್ಮ ಹೆಸರು ಮತ್ತು ಚಿತ್ರವು ಗೋಚರಿಸುತ್ತದೆ."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"</string> <string name="guest_new_guest" msgid="3482026122932643557">"ಅತಿಥಿಯನ್ನು ಸೇರಿಸಿ"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ಅತಿಥಿಯನ್ನು ತೆಗೆದುಹಾಕಿ"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index b184ef43e5b7..be472a1474f8 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"새 사용자를 만들지 못함"</string> <string name="add_guest_failed" msgid="8074548434469843443">"새 게스트 생성 실패"</string> <string name="user_nickname" msgid="262624187455825083">"닉네임"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"이 기기를 사용하는 모든 사람에게 내 이름과 사진이 공개됩니다."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"사용자 추가"</string> <string name="guest_new_guest" msgid="3482026122932643557">"게스트 추가"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"게스트 삭제"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index e565e444536c..94c0fd1113f8 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Жаңы колдонуучу түзүлбөй калды"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Жаңы конок түзүлгөн жок"</string> <string name="user_nickname" msgid="262624187455825083">"Ылакап аты"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Аты-жөнүңүз менен сүрөтүңүз ушул түзмөктү колдонгондордун баарына көрүнөт."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Колдонуучу кошуу"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Конок кошуу"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Конокту өчүрүү"</string> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index 6caaf952b364..036889899f25 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"ສ້າງຜູ້ໃຊ້ໃໝ່ບໍ່ສຳເລັດ"</string> <string name="add_guest_failed" msgid="8074548434469843443">"ສ້າງແຂກໃໝ່ບໍ່ສຳເລັດ"</string> <string name="user_nickname" msgid="262624187455825083">"ຊື່ຫຼິ້ນ"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"ຊື່ ແລະ ຮູບຂອງທ່ານຈະເຫັນໄດ້ໂດຍທຸກຄົນທີ່ໃຊ້ອຸປະກອນນີ້."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"ເພີ່ມຜູ້ໃຊ້"</string> <string name="guest_new_guest" msgid="3482026122932643557">"ເພີ່ມແຂກ"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ລຶບແຂກອອກ"</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index bc66a806375f..de0add8e3511 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Nepavyko sukurti naujo naudotojo"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Nepavyko sukurti naujo gesto"</string> <string name="user_nickname" msgid="262624187455825083">"Slapyvardis"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Jūsų vardas ir nuotrauka bus rodomi visiems šio įrenginio naudotojams."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Pridėti naudotoją"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Pridėti svečią"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Pašalinti svečią"</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index c5409454d384..1d627f372663 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Neizdevās izveidot jaunu lietotāju"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Neizdevās izveidot jaunu viesa profilu"</string> <string name="user_nickname" msgid="262624187455825083">"Segvārds"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Jūsu vārds un attēls būs redzams jebkuram šīs ierīces lietotājam."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Pievienot lietotāju"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Pievienot viesi"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Noņemt viesi"</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index 70bcc2100ddd..3bcabd68ea2a 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Не успеа да создаде нов корисник"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Не успеа создавањето нов гостин"</string> <string name="user_nickname" msgid="262624187455825083">"Прекар"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Вашите име и слика ќе бидат видливи за секој што го користи уредов."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Додајте корисник"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Додајте гостин"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Отстрани гостин"</string> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index 9a297e5fb4d8..b21d3cf8e0f1 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"പുതിയ ഉപയോക്താവിനെ സൃഷ്ടിക്കാനായില്ല"</string> <string name="add_guest_failed" msgid="8074548434469843443">"പുതിയ അതിഥിയെ സൃഷ്ടിക്കാനായില്ല"</string> <string name="user_nickname" msgid="262624187455825083">"വിളിപ്പേര്"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"നിങ്ങളുടെ പേരും ചിത്രവും ഈ ഉപകരണം ഉപയോഗിക്കുന്ന എല്ലാവർക്കും ദൃശ്യമാകും."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"ഉപയോക്താവിനെ ചേർക്കുക"</string> <string name="guest_new_guest" msgid="3482026122932643557">"അതിഥിയെ ചേർക്കുക"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"അതിഥിയെ നീക്കം ചെയ്യുക"</string> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 000e306afef3..dbdb694f71d5 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Шинэ хэрэглэгч үүсгэж чадсангүй"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Шинэ зочин үүсгэж чадсангүй"</string> <string name="user_nickname" msgid="262624187455825083">"Хоч"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Таны нэр болон зураг энэ төхөөрөмжийг ашигладаг дурын хүнд харагдана."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Хэрэглэгч нэмэх"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Зочин нэмэх"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Зочин хасах"</string> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index 6af0fbdc0ac8..b270f417adbe 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"नवीन वापरकर्ता तयार करता आला नाही"</string> <string name="add_guest_failed" msgid="8074548434469843443">"नवीन अतिथी तयार करता आला नाही"</string> <string name="user_nickname" msgid="262624187455825083">"टोपणनाव"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"हे डिव्हाइस वापरणाऱ्या कोणत्याही व्यक्तीला तुमचे नाव आणि फोटो दिसेल."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"वापरकर्ता जोडा"</string> <string name="guest_new_guest" msgid="3482026122932643557">"अतिथी जोडा"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"अतिथी काढून टाका"</string> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 621b4694026b..1bc0f20ba2ef 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Gagal membuat pengguna baharu"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Gagal membuat tetamu baharu"</string> <string name="user_nickname" msgid="262624187455825083">"Nama panggilan"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Nama dan gambar anda akan kelihatan kepada sesiapa yang menggunakan peranti ini."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Tambah pengguna"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Tambah tetamu"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Alih keluar tetamu"</string> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 60161c344ebb..2b9ae6daa784 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"အသုံးပြုသူအသစ် ပြုလုပ်၍မရပါ"</string> <string name="add_guest_failed" msgid="8074548434469843443">"ဧည့်သည်သစ် ပြုလုပ်၍မရပါ"</string> <string name="user_nickname" msgid="262624187455825083">"နာမည်ပြောင်"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"သင့်အမည်နှင့် ဓာတ်ပုံကို ဤစက်သုံးသူတိုင်း မြင်ရပါမည်။"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"အသုံးပြုသူ ထည့်ရန်"</string> <string name="guest_new_guest" msgid="3482026122932643557">"ဧည့်သည် ထည့်ရန်"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ဧည့်သည်ကို ဖယ်ရှားရန်"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 22162bbc79a3..4a3363fcd918 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Kunne ikke opprette noen ny bruker"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Kunne ikke opprette en ny gjest"</string> <string name="user_nickname" msgid="262624187455825083">"Kallenavn"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Navnet og bildet ditt blir synlige for alle som bruker denne enheten."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Legg til bruker"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Legg til gjest"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Fjern gjesten"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index fdd965a6e52a..7ba6ca0d1e43 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"नयाँ प्रयोगकर्ता सिर्जना गर्न सकिएन"</string> <string name="add_guest_failed" msgid="8074548434469843443">"नयाँ अतिथि बनाउन सकिएन"</string> <string name="user_nickname" msgid="262624187455825083">"उपनाम"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"यो डिभाइस प्रयोग गर्ने सबै जना मान्छे तपाईंको नाम र फोटो देख्ने छन्।"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"प्रयोगकर्ता कनेक्ट गर्नुहोस्"</string> <string name="guest_new_guest" msgid="3482026122932643557">"अतिथि कनेक्ट गर्नुहोस्"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"गेस्ट मोडबाट बाहिर निस्कियोस्"</string> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 72e57af602e8..79d918a21e10 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Kan geen nieuwe gebruiker maken"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Kan geen nieuwe gast maken"</string> <string name="user_nickname" msgid="262624187455825083">"Bijnaam"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Je naam en foto zijn zichtbaar voor iedereen die dit apparaat gebruikt."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Gebruiker toevoegen"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Gast toevoegen"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Gast verwijderen"</string> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 723af105f8ea..9ab80d0e4003 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"ନୂଆ ଉପଯୋଗକର୍ତ୍ତା ତିଆରି କରିବାକୁ ବିଫଳ ହେଲା"</string> <string name="add_guest_failed" msgid="8074548434469843443">"ଜଣେ ନୂଆ ଅତିଥି ତିଆରି କରିବାରେ ବିଫଳ ହୋଇଛି"</string> <string name="user_nickname" msgid="262624187455825083">"ଡାକନାମ"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"ଏହି ଡିଭାଇସ ବ୍ୟବହାର କରୁଥିବା ଯେ କୌଣସି ବ୍ୟକ୍ତିଙ୍କୁ ଆପଣଙ୍କ ନାମ ଏବଂ ଛବି ଦେଖାଯିବ।"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"ୟୁଜର ଯୋଗ କରନ୍ତୁ"</string> <string name="guest_new_guest" msgid="3482026122932643557">"ଅତିଥି ଯୋଗ କରନ୍ତୁ"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ଅତିଥିଙ୍କୁ କାଢ଼ି ଦିଅନ୍ତୁ"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 8a77c12f6c0c..293233822cd1 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"ਨਵਾਂ ਵਰਤੋਂਕਾਰ ਬਣਾਉਣਾ ਅਸਫਲ ਰਿਹਾ"</string> <string name="add_guest_failed" msgid="8074548434469843443">"ਨਵਾਂ ਮਹਿਮਾਨ ਪ੍ਰੋਫਾਈਲ ਬਣਾਉਣਾ ਅਸਫਲ ਰਿਹਾ"</string> <string name="user_nickname" msgid="262624187455825083">"ਉਪਨਾਮ"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"ਤੁਹਾਡਾ ਨਾਮ ਅਤੇ ਤਸਵੀਰ ਇਸ ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ ਕਰਨ ਵਾਲੇ ਕਿਸੇ ਵੀ ਵਿਅਕਤੀ ਦਿਖਾਈ ਦੇਵੇਗੀ।"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"ਵਰਤੋਂਕਾਰ ਨੂੰ ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="guest_new_guest" msgid="3482026122932643557">"ਮਹਿਮਾਨ ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"ਮਹਿਮਾਨ ਹਟਾਓ"</string> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 375a35f6edef..a7d59cfef236 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Nie udało się utworzyć nowego użytkownika"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Nie udało się utworzyć nowego gościa"</string> <string name="user_nickname" msgid="262624187455825083">"Pseudonim"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Twoja nazwa użytkownika oraz zdjęcie będą widoczne dla każdego, kto korzysta z tego urządzenia."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Dodaj użytkownika"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gościa"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Usuń gościa"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 55b9db509200..bb83c2bcc631 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Falha ao criar um novo usuário"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Falha ao criar um novo convidado"</string> <string name="user_nickname" msgid="262624187455825083">"Apelido"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Seu nome e foto vão ficar visíveis para qualquer pessoa que use este dispositivo."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Adicionar usuário"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Adicionar visitante"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remover visitante"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index ca704e7bbb87..4554f85f7ec8 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Falha ao criar um novo utilizador"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Falha ao criar um novo convidado"</string> <string name="user_nickname" msgid="262624187455825083">"Alcunha"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"O seu nome e imagem vão ser visíveis para qualquer pessoa que use este dispositivo."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Adicionar utilizador"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Adicionar convidado"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 55b9db509200..bb83c2bcc631 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Falha ao criar um novo usuário"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Falha ao criar um novo convidado"</string> <string name="user_nickname" msgid="262624187455825083">"Apelido"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Seu nome e foto vão ficar visíveis para qualquer pessoa que use este dispositivo."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Adicionar usuário"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Adicionar visitante"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remover visitante"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index fa89c1a4c3d8..1482ee541d16 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Nu s-a creat noul utilizator"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Nu s-a putut crea un invitat nou"</string> <string name="user_nickname" msgid="262624187455825083">"Pseudonim"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Numele și fotografia ta vor fi vizibile pentru orice persoană care folosește acest dispozitiv."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Adaugă un utilizator"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Adaugă un invitat"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Șterge invitatul"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index d85307098a35..7fa3f1823022 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Не удалось создать пользователя"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Не удалось создать гостя."</string> <string name="user_nickname" msgid="262624187455825083">"Псевдоним"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Ваше имя и фото профиля будут видны всем пользователям этого устройства."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Добавить пользователя"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Добавить гостя"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Удалить аккаунт гостя"</string> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index 093f216afccc..ec4092637bec 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"නව පරිශීලකයෙකු තැනීමට අසමත් විය"</string> <string name="add_guest_failed" msgid="8074548434469843443">"නව අමුත්තකු තැනීම අසාර්ථක විය"</string> <string name="user_nickname" msgid="262624187455825083">"අපනාමය"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"මෙම උපාංගය භාවිත කරන ඕනෑම කෙනෙකුට ඔබේ නම සහ පින්තූරය දැකිය හැකි වෙයි."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"පරිශීලකයා එක් කරන්න"</string> <string name="guest_new_guest" msgid="3482026122932643557">"අමුත්තා එක් කරන්න"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"අමුත්තා ඉවත් කරන්න"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 1c8293312871..4b90a9193273 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Nového použív. sa nepodarilo vytvoriť"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Nového hosťa sa nepodarilo vytvoriť"</string> <string name="user_nickname" msgid="262624187455825083">"Prezývka"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Vaše meno a fotku uvidia všetci používatelia tohto zariadenia."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Pridať používateľa"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Pridať hosťa"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Odobrať hosťa"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index f97dd78f8179..f04e83942836 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Ustvarjanje novega uporabnika ni uspelo."</string> <string name="add_guest_failed" msgid="8074548434469843443">"Ustvarjanje novega gosta ni uspelo."</string> <string name="user_nickname" msgid="262624187455825083">"Vzdevek"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Vaša ime in fotografija bosta vidna vsem uporabnikom te naprave."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Dodaj uporabnika"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Dodaj gosta"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Odstrani gosta"</string> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index a802f115da4a..6721987e86c5 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Krijimi i një përdoruesi të ri dështoi"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Profili i vizitorit të ri nuk u krijua"</string> <string name="user_nickname" msgid="262624187455825083">"Pseudonimi"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Emri dhe fotografia jote do të jenë të dukshme për çdo person që e përdor këtë pajisje."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Shto përdorues"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Shto vizitor"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Hiq vizitorin"</string> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index df2215911673..5497c6e15b43 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Прављење новог корисника није успело"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Прављење новог госта није успело"</string> <string name="user_nickname" msgid="262624187455825083">"Надимак"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Име и слика ће бити видљиви сваком ко користи овај уређај."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Додај корисника"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Додај госта"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Уклони госта"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 79b8399527a0..a331bc601f60 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Det gick inte att skapa en ny användare"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Det gick inte att skapa en ny gäst"</string> <string name="user_nickname" msgid="262624187455825083">"Smeknamn"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Ditt namn och din bild visas för alla som använder den här enheten."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Lägg till användare"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Lägg till gäst"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Ta bort gäst"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index c0ace5805e63..53481a2297a6 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Imeshindwa kuweka mtumiaji mpya"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Imeshindwa kuunda wasifu mpya wa mgeni"</string> <string name="user_nickname" msgid="262624187455825083">"Jina wakilishi"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Mtu yeyote anayetumia kifaa hiki ataona jina na picha yako."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Ongeza mtumiaji"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Ongeza mgeni"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Ondoa mgeni"</string> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index ebca26dc3063..204da0cb5344 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"புதிய பயனரை உருவாக்க முடியவில்லை"</string> <string name="add_guest_failed" msgid="8074548434469843443">"புதிய விருந்தினரை உருவாக்க முடியவில்லை"</string> <string name="user_nickname" msgid="262624187455825083">"புனைப்பெயர்"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"இந்தச் சாதனத்தைப் பயன்படுத்தும் அனைவருக்கும் உங்கள் பெயரும் படமும் காட்டப்படும்."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"பயனரைச் சேர்"</string> <string name="guest_new_guest" msgid="3482026122932643557">"கெஸ்ட்டைச் சேர்"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"கெஸ்ட்டை அகற்று"</string> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index cf3c08acc54c..f576c8d2eee9 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"కొత్త యూజర్ను క్రియేట్ చేయడం విఫలమైంది"</string> <string name="add_guest_failed" msgid="8074548434469843443">"కొత్త అతిథిని క్రియేట్ చేయడం విఫలమైంది"</string> <string name="user_nickname" msgid="262624187455825083">"మారుపేరు"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"ఈ పరికరాన్ని ఉపయోగించే ప్రతి ఒక్కరికి మీ పేరు, ఫోటో కనిపిస్తుంది."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"యూజర్ను జోడించండి"</string> <string name="guest_new_guest" msgid="3482026122932643557">"గెస్ట్ను జోడించండి"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"గెస్ట్ను తీసివేయండి"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index a74265ee3e9a..42e6c0567800 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"สร้างผู้ใช้ใหม่ไม่ได้"</string> <string name="add_guest_failed" msgid="8074548434469843443">"สร้างผู้เข้าร่วมใหม่ไม่สำเร็จ"</string> <string name="user_nickname" msgid="262624187455825083">"ชื่อเล่น"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"ชื่อและภาพของคุณจะปรากฏแก่ทุกคนที่ใช้อุปกรณ์นี้"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"เพิ่มผู้ใช้"</string> <string name="guest_new_guest" msgid="3482026122932643557">"เพิ่มผู้ใช้ชั่วคราว"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"นำผู้ใช้ชั่วคราวออก"</string> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 18d3d3b626fa..73db0c567024 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Hindi nakagawa ng bagong user"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Hindi nakagawa ng bagong guest"</string> <string name="user_nickname" msgid="262624187455825083">"Nickname"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Makikita ng sinumang gumagamit ng device na ito ang iyong pangalan at larawan."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Magdagdag ng user"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Magdagdag ng bisita"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Alisin ang bisita"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index c4241150ad12..98cfe35635f8 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Yeni kullanıcı oluşturulamadı"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Yeni misafir oluşturulamadı"</string> <string name="user_nickname" msgid="262624187455825083">"Takma ad"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Adınızı ve resminizi, bu cihazı kullanan herkes görebilir."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Kullanıcı ekle"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Misafir ekle"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Misafir oturumunu kaldır"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 97592f970b67..3321c780ab6e 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Не вдалося створити користувача"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Не вдалося створити гостя"</string> <string name="user_nickname" msgid="262624187455825083">"Псевдонім"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Ваше ім’я і зображення бачитимуть усі користувачі цього пристрою."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Додати користувача"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Додати гостя"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Видалити гостя"</string> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index 9d3405234e5b..dadb9bc45f93 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"نیا صارف بنانے میں ناکام"</string> <string name="add_guest_failed" msgid="8074548434469843443">"نیا مہمان بنانے میں ناکام"</string> <string name="user_nickname" msgid="262624187455825083">"عرفی نام"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"آپ کا نام اور تصویر ہر اس شخص کو نظر آئے گی جو اس آلہ کو استعمال کرتا ہے۔"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"صارف کو شامل کریں"</string> <string name="guest_new_guest" msgid="3482026122932643557">"مہمان کو شامل کریں"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"مہمان کو ہٹائیں"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index bd38bb44df6e..2254132195e3 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Yangi foydalanuvchi yaratilmadi"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Yangi mehmon yaratilmadi"</string> <string name="user_nickname" msgid="262624187455825083">"Nik"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Ismingiz va rasmingiz ushbu qurilmadan foydalanadigan har bir kishiga koʻrinadi."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Foydalanuvchi kiritish"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Mehmon kiritish"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Mehmonni olib tashlash"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 5b91df3e44a2..c98dcecbad9c 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Không tạo được người dùng mới"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Không tạo được khách mới"</string> <string name="user_nickname" msgid="262624187455825083">"Biệt hiệu"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Bất kỳ ai dùng thiết bị này đều có thể thấy tên và hình ảnh của bạn."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Thêm người dùng"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Thêm khách"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Xóa khách"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 594922a4050d..136586dce68d 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"无法创建新用户"</string> <string name="add_guest_failed" msgid="8074548434469843443">"未能创建新的访客"</string> <string name="user_nickname" msgid="262624187455825083">"昵称"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"所有使用此设备的用户都将可以看到您的姓名和照片。"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"添加用户"</string> <string name="guest_new_guest" msgid="3482026122932643557">"添加访客"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"移除访客"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index b3aafae4a3c6..a32e51edb9a1 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"無法建立新使用者"</string> <string name="add_guest_failed" msgid="8074548434469843443">"無法建立新訪客"</string> <string name="user_nickname" msgid="262624187455825083">"暱稱"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"此裝置的使用者都會看到你的名稱和相片。"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"新增使用者"</string> <string name="guest_new_guest" msgid="3482026122932643557">"新增訪客"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"移除訪客"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index c3be21a93d8c..b5f5e2edf993 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"無法建立新的使用者"</string> <string name="add_guest_failed" msgid="8074548434469843443">"無法建立新訪客"</string> <string name="user_nickname" msgid="262624187455825083">"暱稱"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"這部裝置的使用者都會看到你的名稱和相片。"</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"新增使用者"</string> <string name="guest_new_guest" msgid="3482026122932643557">"新增訪客"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"移除訪客"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index f6aaf813af84..19dbebfa3806 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -619,7 +619,8 @@ <string name="add_user_failed" msgid="4809887794313944872">"Yehlulekile ukudala umsebenzisi omusha"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Yehlulekile ukusungula isimenywa esisha"</string> <string name="user_nickname" msgid="262624187455825083">"Isiteketiso"</string> - <string name="edit_user_info_message" msgid="5199468585059260053">"Igama nesithombe sakho kuzobonakala kunoma ubani osebenzisa le divayisi."</string> + <!-- no translation found for edit_user_info_message (6677556031419002895) --> + <skip /> <string name="user_add_user" msgid="7876449291500212468">"Engeza umsebenzisi"</string> <string name="guest_new_guest" msgid="3482026122932643557">"Engeza isivakashi"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Susa isihambeli"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java index 1118efc3e953..64cf5c640143 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothLeBroadcast.java @@ -172,6 +172,7 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { if ((profile == BluetoothProfile.LE_AUDIO_BROADCAST) && mIsBroadcastProfileReady) { mIsBroadcastProfileReady = false; + notifyBroadcastStateChange(BROADCAST_STATE_OFF); unregisterServiceCallBack(mBroadcastCallback); mCachedBroadcastCallbackExecutorMap.clear(); } @@ -1118,6 +1119,7 @@ public class LocalBluetoothLeBroadcast implements LocalBluetoothProfile { Intent intent = new Intent(ACTION_LE_AUDIO_SHARING_STATE_CHANGE); intent.putExtra(EXTRA_LE_AUDIO_SHARING_STATE, state); intent.setPackage(mContext.getPackageName()); + Log.e(TAG, "notifyBroadcastStateChange for state = " + state); mContext.sendBroadcast(intent); } } diff --git a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java index a617bf3278d6..fa27db9a427a 100644 --- a/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java +++ b/packages/SettingsLib/src/com/android/settingslib/dream/DreamBackend.java @@ -60,6 +60,7 @@ public class DreamBackend { public CharSequence description; public Drawable previewImage; public boolean supportsComplications = false; + public int dreamCategory; @Override public String toString() { @@ -207,6 +208,7 @@ public class DreamBackend { dreamInfo.settingsComponentName = dreamMetadata.settingsActivity; dreamInfo.previewImage = dreamMetadata.previewImage; dreamInfo.supportsComplications = dreamMetadata.showComplications; + dreamInfo.dreamCategory = dreamMetadata.dreamCategory; } dreamInfos.add(dreamInfo); } diff --git a/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt b/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt index 21cc9a85edbc..6730aadbdeb3 100644 --- a/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt +++ b/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt @@ -34,6 +34,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.filterNotNull @@ -134,6 +135,7 @@ class AudioRepositoryImpl( } .map { getCurrentAudioStream(audioStream) } .onStart { emit(getCurrentAudioStream(audioStream)) } + .conflate() .flowOn(backgroundCoroutineContext) } diff --git a/packages/SettingsProvider/res/values-af/strings.xml b/packages/SettingsProvider/res/values-af/strings.xml index 24efbb61e0fc..79a7f2d86b74 100644 --- a/packages/SettingsProvider/res/values-af/strings.xml +++ b/packages/SettingsProvider/res/values-af/strings.xml @@ -20,6 +20,4 @@ <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">"Instellingsberging"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Warmkolinstellings het verander"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Tik om besonderhede te sien"</string> </resources> diff --git a/packages/SettingsProvider/res/values-am/strings.xml b/packages/SettingsProvider/res/values-am/strings.xml index 48fb705cdf87..6380b999e9f3 100644 --- a/packages/SettingsProvider/res/values-am/strings.xml +++ b/packages/SettingsProvider/res/values-am/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"የመገናኛ ነጥብ ቅንብሮች ተለውጠዋል"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"ዝርዝሮችን ለማየት መታ ያድርጉ"</string> </resources> diff --git a/packages/SettingsProvider/res/values-ar/strings.xml b/packages/SettingsProvider/res/values-ar/strings.xml index 6371f2c30abc..ab1b808d312a 100644 --- a/packages/SettingsProvider/res/values-ar/strings.xml +++ b/packages/SettingsProvider/res/values-ar/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"تم تغيير إعدادات نقطة الاتصال."</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"انقر للاطّلاع على التفاصيل."</string> </resources> diff --git a/packages/SettingsProvider/res/values-as/strings.xml b/packages/SettingsProvider/res/values-as/strings.xml index ead9f4da21ef..d90599e699e6 100644 --- a/packages/SettingsProvider/res/values-as/strings.xml +++ b/packages/SettingsProvider/res/values-as/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"হটস্পটৰ ছেটিং সলনি হৈছে"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"সবিশেষ চাবলৈ টিপক"</string> </resources> diff --git a/packages/SettingsProvider/res/values-az/strings.xml b/packages/SettingsProvider/res/values-az/strings.xml index b0e864248e10..e99e99bc82ef 100644 --- a/packages/SettingsProvider/res/values-az/strings.xml +++ b/packages/SettingsProvider/res/values-az/strings.xml @@ -20,6 +20,4 @@ <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">"Ayarlar Deposu"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Hotspot ayarları dəyişib"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Detalları görmək üçün toxunun"</string> </resources> diff --git a/packages/SettingsProvider/res/values-b+sr+Latn/strings.xml b/packages/SettingsProvider/res/values-b+sr+Latn/strings.xml index def4b6839143..337b18ef2f4a 100644 --- a/packages/SettingsProvider/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsProvider/res/values-b+sr+Latn/strings.xml @@ -20,6 +20,4 @@ <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">"Podešavanja skladišta"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Podešavanja hotspota su promenjena"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Dodirnite da biste videli detalje"</string> </resources> diff --git a/packages/SettingsProvider/res/values-be/strings.xml b/packages/SettingsProvider/res/values-be/strings.xml index 709178e9116b..3a8557ce9a32 100644 --- a/packages/SettingsProvider/res/values-be/strings.xml +++ b/packages/SettingsProvider/res/values-be/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"Налады хот-спота змяніліся"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Дакраніцеся, каб убачыць падрабязныя звесткі"</string> </resources> diff --git a/packages/SettingsProvider/res/values-bg/strings.xml b/packages/SettingsProvider/res/values-bg/strings.xml index b2eae736acac..f3d21d82c700 100644 --- a/packages/SettingsProvider/res/values-bg/strings.xml +++ b/packages/SettingsProvider/res/values-bg/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"Настройките за точката за достъп са променени"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Докоснете, за да видите подробности"</string> </resources> diff --git a/packages/SettingsProvider/res/values-bn/strings.xml b/packages/SettingsProvider/res/values-bn/strings.xml index b2eaa2f9ec5c..7e72dfb9a968 100644 --- a/packages/SettingsProvider/res/values-bn/strings.xml +++ b/packages/SettingsProvider/res/values-bn/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"হটস্পট সেটিংসে পরিবর্তন করা হয়েছে"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"বিশদে জানতে ট্যাপ করুন"</string> </resources> diff --git a/packages/SettingsProvider/res/values-bs/strings.xml b/packages/SettingsProvider/res/values-bs/strings.xml index 506fea2b8fb5..464a29f17ad2 100644 --- a/packages/SettingsProvider/res/values-bs/strings.xml +++ b/packages/SettingsProvider/res/values-bs/strings.xml @@ -20,6 +20,4 @@ <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">"Postavke za pohranu podataka"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Postavke pristupne tačke su promijenjene"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Dodirnite da vidite detalje"</string> </resources> diff --git a/packages/SettingsProvider/res/values-ca/strings.xml b/packages/SettingsProvider/res/values-ca/strings.xml index 58d3572e5efe..9d6ac7ae4e6d 100644 --- a/packages/SettingsProvider/res/values-ca/strings.xml +++ b/packages/SettingsProvider/res/values-ca/strings.xml @@ -20,6 +20,4 @@ <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">"Configuració de l\'emmagatzematge"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"La configuració del punt d\'accés Wi‑Fi ha canviat"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Toca per veure\'n els detalls"</string> </resources> diff --git a/packages/SettingsProvider/res/values-cs/strings.xml b/packages/SettingsProvider/res/values-cs/strings.xml index 449c63205432..a28ffa1e27a3 100644 --- a/packages/SettingsProvider/res/values-cs/strings.xml +++ b/packages/SettingsProvider/res/values-cs/strings.xml @@ -20,6 +20,4 @@ <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">"Paměť pro nastavení"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Nastavení hotspotu se změnilo"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Klepnutím zobrazíte podrobnosti"</string> </resources> diff --git a/packages/SettingsProvider/res/values-da/strings.xml b/packages/SettingsProvider/res/values-da/strings.xml index 278d97840566..ed450d57e4e8 100644 --- a/packages/SettingsProvider/res/values-da/strings.xml +++ b/packages/SettingsProvider/res/values-da/strings.xml @@ -20,6 +20,4 @@ <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">"Lagring af indstillinger"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Indstillingerne for hotspots har ændret sig"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Tryk for at se flere oplysninger"</string> </resources> diff --git a/packages/SettingsProvider/res/values-de/strings.xml b/packages/SettingsProvider/res/values-de/strings.xml index b006ac936755..6effbaee2196 100644 --- a/packages/SettingsProvider/res/values-de/strings.xml +++ b/packages/SettingsProvider/res/values-de/strings.xml @@ -20,6 +20,4 @@ <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">"Einstellungsspeicher"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Hotspot-Einstellungen wurden geändert"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Für Details tippen"</string> </resources> diff --git a/packages/SettingsProvider/res/values-el/strings.xml b/packages/SettingsProvider/res/values-el/strings.xml index 1bfbf27513d9..5bd1fa6af8e6 100644 --- a/packages/SettingsProvider/res/values-el/strings.xml +++ b/packages/SettingsProvider/res/values-el/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"Οι ρυθμίσεις σημείου πρόσβασης Wi-Fi έχουν αλλάξει"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Πατήστε για προβολή λεπτομερειών."</string> </resources> diff --git a/packages/SettingsProvider/res/values-en-rAU/strings.xml b/packages/SettingsProvider/res/values-en-rAU/strings.xml index 4e90cade7323..c19fdd7aed7f 100644 --- a/packages/SettingsProvider/res/values-en-rAU/strings.xml +++ b/packages/SettingsProvider/res/values-en-rAU/strings.xml @@ -20,6 +20,4 @@ <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">"Settings Storage"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Hotspot settings have changed"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Tap to see details"</string> </resources> diff --git a/packages/SettingsProvider/res/values-en-rCA/strings.xml b/packages/SettingsProvider/res/values-en-rCA/strings.xml index 4e90cade7323..c19fdd7aed7f 100644 --- a/packages/SettingsProvider/res/values-en-rCA/strings.xml +++ b/packages/SettingsProvider/res/values-en-rCA/strings.xml @@ -20,6 +20,4 @@ <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">"Settings Storage"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Hotspot settings have changed"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Tap to see details"</string> </resources> diff --git a/packages/SettingsProvider/res/values-en-rGB/strings.xml b/packages/SettingsProvider/res/values-en-rGB/strings.xml index 4e90cade7323..c19fdd7aed7f 100644 --- a/packages/SettingsProvider/res/values-en-rGB/strings.xml +++ b/packages/SettingsProvider/res/values-en-rGB/strings.xml @@ -20,6 +20,4 @@ <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">"Settings Storage"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Hotspot settings have changed"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Tap to see details"</string> </resources> diff --git a/packages/SettingsProvider/res/values-en-rIN/strings.xml b/packages/SettingsProvider/res/values-en-rIN/strings.xml index 4e90cade7323..c19fdd7aed7f 100644 --- a/packages/SettingsProvider/res/values-en-rIN/strings.xml +++ b/packages/SettingsProvider/res/values-en-rIN/strings.xml @@ -20,6 +20,4 @@ <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">"Settings Storage"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Hotspot settings have changed"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Tap to see details"</string> </resources> diff --git a/packages/SettingsProvider/res/values-en-rXC/strings.xml b/packages/SettingsProvider/res/values-en-rXC/strings.xml index 4ea5c577070b..9b18e2b4028a 100644 --- a/packages/SettingsProvider/res/values-en-rXC/strings.xml +++ b/packages/SettingsProvider/res/values-en-rXC/strings.xml @@ -20,6 +20,4 @@ <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">"Settings Storage"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Hotspot settings have changed"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Tap to see details"</string> </resources> diff --git a/packages/SettingsProvider/res/values-es-rUS/strings.xml b/packages/SettingsProvider/res/values-es-rUS/strings.xml index 4345b7a70792..7a15d8bda8e1 100644 --- a/packages/SettingsProvider/res/values-es-rUS/strings.xml +++ b/packages/SettingsProvider/res/values-es-rUS/strings.xml @@ -20,6 +20,4 @@ <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">"Almacenamiento de configuración"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Se modificó la configuración de hotspot"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Presiona para obtener más información"</string> </resources> diff --git a/packages/SettingsProvider/res/values-es/strings.xml b/packages/SettingsProvider/res/values-es/strings.xml index c79968978686..7a15d8bda8e1 100644 --- a/packages/SettingsProvider/res/values-es/strings.xml +++ b/packages/SettingsProvider/res/values-es/strings.xml @@ -20,6 +20,4 @@ <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">"Almacenamiento de configuración"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Se han cambiado los ajustes de Compartir Internet"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Toca para ver información detallada"</string> </resources> diff --git a/packages/SettingsProvider/res/values-et/strings.xml b/packages/SettingsProvider/res/values-et/strings.xml index 856ccf1c96f0..30b729365f15 100644 --- a/packages/SettingsProvider/res/values-et/strings.xml +++ b/packages/SettingsProvider/res/values-et/strings.xml @@ -20,6 +20,4 @@ <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">"Seadete talletusruum"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Kuumkoha seaded on muutunud"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Puudutage üksikasjade vaatamiseks"</string> </resources> diff --git a/packages/SettingsProvider/res/values-eu/strings.xml b/packages/SettingsProvider/res/values-eu/strings.xml index e7d2c67ab736..6780ae0f663c 100644 --- a/packages/SettingsProvider/res/values-eu/strings.xml +++ b/packages/SettingsProvider/res/values-eu/strings.xml @@ -20,6 +20,4 @@ <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">"Ezarpenen biltegia"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Wifi-gunearen ezarpenak aldatu dira"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Sakatu hau xehetasunak ikusteko"</string> </resources> diff --git a/packages/SettingsProvider/res/values-fa/strings.xml b/packages/SettingsProvider/res/values-fa/strings.xml index 946e2c07c576..dbeab8cbe4bc 100644 --- a/packages/SettingsProvider/res/values-fa/strings.xml +++ b/packages/SettingsProvider/res/values-fa/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"تنظیمات نقطه اتصال تغییر کرده است"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"برای مشاهده جزئیات ضربه بزنید"</string> </resources> diff --git a/packages/SettingsProvider/res/values-fi/strings.xml b/packages/SettingsProvider/res/values-fi/strings.xml index 829bb3b722cf..83c7f66b7374 100644 --- a/packages/SettingsProvider/res/values-fi/strings.xml +++ b/packages/SettingsProvider/res/values-fi/strings.xml @@ -20,6 +20,4 @@ <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">"Asetuksien tallennus"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Hotspot-asetuksia on muutettu"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Katso lisätiedot napauttamalla"</string> </resources> diff --git a/packages/SettingsProvider/res/values-fr-rCA/strings.xml b/packages/SettingsProvider/res/values-fr-rCA/strings.xml index d6408456222c..c90eb0957e52 100644 --- a/packages/SettingsProvider/res/values-fr-rCA/strings.xml +++ b/packages/SettingsProvider/res/values-fr-rCA/strings.xml @@ -20,6 +20,4 @@ <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">"Stockage des paramètres"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Les paramètres de point d\'accès ont changé"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Touchez pour afficher les renseignements"</string> </resources> diff --git a/packages/SettingsProvider/res/values-fr/strings.xml b/packages/SettingsProvider/res/values-fr/strings.xml index ba6ec0b31444..c90eb0957e52 100644 --- a/packages/SettingsProvider/res/values-fr/strings.xml +++ b/packages/SettingsProvider/res/values-fr/strings.xml @@ -20,6 +20,4 @@ <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">"Stockage des paramètres"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Les paramètres de point d\'accès ont changé"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Appuyer ici pour plus d\'infos"</string> </resources> diff --git a/packages/SettingsProvider/res/values-gl/strings.xml b/packages/SettingsProvider/res/values-gl/strings.xml index 1be162e82783..80ef3102ad62 100644 --- a/packages/SettingsProvider/res/values-gl/strings.xml +++ b/packages/SettingsProvider/res/values-gl/strings.xml @@ -20,6 +20,4 @@ <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">"Almacenamento da configuración"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"A configuración da zona wifi cambiou"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Toca a notificación para ver os detalles"</string> </resources> diff --git a/packages/SettingsProvider/res/values-gu/strings.xml b/packages/SettingsProvider/res/values-gu/strings.xml index dded10ea7006..46c34c6fbd90 100644 --- a/packages/SettingsProvider/res/values-gu/strings.xml +++ b/packages/SettingsProvider/res/values-gu/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"હૉટસ્પૉટ સેટિંગ બદલાઈ ગઈ છે"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"વિગતો જોવા માટે ટૅપ કરો"</string> </resources> diff --git a/packages/SettingsProvider/res/values-hi/strings.xml b/packages/SettingsProvider/res/values-hi/strings.xml index 9441a59252e8..da8193fa55b9 100644 --- a/packages/SettingsProvider/res/values-hi/strings.xml +++ b/packages/SettingsProvider/res/values-hi/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"हॉटस्पॉट की सेटिंग बदल गई हैं"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"जानकारी देखने के लिए टैप करें"</string> </resources> diff --git a/packages/SettingsProvider/res/values-hr/strings.xml b/packages/SettingsProvider/res/values-hr/strings.xml index 206f50f1bc0a..87f1270bb139 100644 --- a/packages/SettingsProvider/res/values-hr/strings.xml +++ b/packages/SettingsProvider/res/values-hr/strings.xml @@ -20,6 +20,4 @@ <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">"Postavke pohrane"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Promijenile su se postavke žarišne točke"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Dodirnite da biste vidjeli pojedinosti"</string> </resources> diff --git a/packages/SettingsProvider/res/values-hu/strings.xml b/packages/SettingsProvider/res/values-hu/strings.xml index a7ca0d28df13..dab1b17758b0 100644 --- a/packages/SettingsProvider/res/values-hu/strings.xml +++ b/packages/SettingsProvider/res/values-hu/strings.xml @@ -20,6 +20,4 @@ <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">"Beállítástároló"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"A hotspot beállításai módosultak"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Koppintson a részletek megtekintéséhez"</string> </resources> diff --git a/packages/SettingsProvider/res/values-hy/strings.xml b/packages/SettingsProvider/res/values-hy/strings.xml index 4fdb880197de..b1f1afbaf664 100644 --- a/packages/SettingsProvider/res/values-hy/strings.xml +++ b/packages/SettingsProvider/res/values-hy/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"Թեժ կետի կարգավորումները փոխվել են"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Հպեք՝ ավելին իմանալու համար"</string> </resources> diff --git a/packages/SettingsProvider/res/values-in/strings.xml b/packages/SettingsProvider/res/values-in/strings.xml index 911892b09e55..bed20eb8a327 100644 --- a/packages/SettingsProvider/res/values-in/strings.xml +++ b/packages/SettingsProvider/res/values-in/strings.xml @@ -20,6 +20,4 @@ <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">"Setelan Penyimpanan"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Setelan hotspot telah berubah"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Ketuk untuk melihat detail"</string> </resources> diff --git a/packages/SettingsProvider/res/values-is/strings.xml b/packages/SettingsProvider/res/values-is/strings.xml index c72442e3c238..c4e2aa689702 100644 --- a/packages/SettingsProvider/res/values-is/strings.xml +++ b/packages/SettingsProvider/res/values-is/strings.xml @@ -20,6 +20,4 @@ <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">"Stillingageymsla"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Stillingum heits reits hefur verið breytt"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Ýttu til að sjá upplýsingar"</string> </resources> diff --git a/packages/SettingsProvider/res/values-it/strings.xml b/packages/SettingsProvider/res/values-it/strings.xml index 0e11d0648b70..ba1431d821fa 100644 --- a/packages/SettingsProvider/res/values-it/strings.xml +++ b/packages/SettingsProvider/res/values-it/strings.xml @@ -20,6 +20,4 @@ <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">"Memoria impostazioni"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Le impostazioni di hotspot sono state modificate"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Tocca per vedere i dettagli"</string> </resources> diff --git a/packages/SettingsProvider/res/values-iw/strings.xml b/packages/SettingsProvider/res/values-iw/strings.xml index 10765fe90b45..ad2eaf4a2215 100644 --- a/packages/SettingsProvider/res/values-iw/strings.xml +++ b/packages/SettingsProvider/res/values-iw/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"הגדרות נקודת האינטרנט (hotspot) השתנו"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"יש להקיש להצגת פרטים"</string> </resources> diff --git a/packages/SettingsProvider/res/values-ja/strings.xml b/packages/SettingsProvider/res/values-ja/strings.xml index 5b91b2de1951..d222ca93a0db 100644 --- a/packages/SettingsProvider/res/values-ja/strings.xml +++ b/packages/SettingsProvider/res/values-ja/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"アクセス ポイントの設定が変更されました"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"タップして詳細を確認してください"</string> </resources> diff --git a/packages/SettingsProvider/res/values-ka/strings.xml b/packages/SettingsProvider/res/values-ka/strings.xml index 70845acf262a..691a2e966b1a 100644 --- a/packages/SettingsProvider/res/values-ka/strings.xml +++ b/packages/SettingsProvider/res/values-ka/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"უსადენო ქსელის პარამეტრები შეიცვალა"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"შეეხეთ დეტალების სანახავად"</string> </resources> diff --git a/packages/SettingsProvider/res/values-kk/strings.xml b/packages/SettingsProvider/res/values-kk/strings.xml index 2823e4e925c0..8cf8af2b2894 100644 --- a/packages/SettingsProvider/res/values-kk/strings.xml +++ b/packages/SettingsProvider/res/values-kk/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"Хотспот параметрлері өзгертілді"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Мәліметтерді көру үшін түртіңіз."</string> </resources> diff --git a/packages/SettingsProvider/res/values-km/strings.xml b/packages/SettingsProvider/res/values-km/strings.xml index cdae41066836..7be624279c50 100644 --- a/packages/SettingsProvider/res/values-km/strings.xml +++ b/packages/SettingsProvider/res/values-km/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"បានប្ដូរការកំណត់ហតស្ប៉ត"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"ចុចដើម្បីមើលព័ត៌មានលម្អិត"</string> </resources> diff --git a/packages/SettingsProvider/res/values-kn/strings.xml b/packages/SettingsProvider/res/values-kn/strings.xml index 400b358e7c9b..ca427ec75038 100644 --- a/packages/SettingsProvider/res/values-kn/strings.xml +++ b/packages/SettingsProvider/res/values-kn/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"ಹಾಟ್ಸ್ಪಾಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳು ಬದಲಾಗಿವೆ"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"ವಿವರಗಳನ್ನು ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> </resources> diff --git a/packages/SettingsProvider/res/values-ko/strings.xml b/packages/SettingsProvider/res/values-ko/strings.xml index d76b76667747..8e0cc75de7e0 100644 --- a/packages/SettingsProvider/res/values-ko/strings.xml +++ b/packages/SettingsProvider/res/values-ko/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"핫스팟 설정 변경됨"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"세부정보를 보려면 탭하세요."</string> </resources> diff --git a/packages/SettingsProvider/res/values-ky/strings.xml b/packages/SettingsProvider/res/values-ky/strings.xml index 830182b26594..2bbfa3d0d100 100644 --- a/packages/SettingsProvider/res/values-ky/strings.xml +++ b/packages/SettingsProvider/res/values-ky/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"Байланыш түйүнү параметрлери өзгөрдү"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Чоо-жайын билүү үчүн басыңыз"</string> </resources> diff --git a/packages/SettingsProvider/res/values-lo/strings.xml b/packages/SettingsProvider/res/values-lo/strings.xml index c2b5df71d11b..4e5793661740 100644 --- a/packages/SettingsProvider/res/values-lo/strings.xml +++ b/packages/SettingsProvider/res/values-lo/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"ບັນທຶກການຕັ້ງຄ່າຮັອດສະປອດແລ້ວ"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"ແຕະເພື່ອເບິ່ງລາຍລະອຽດ"</string> </resources> diff --git a/packages/SettingsProvider/res/values-lt/strings.xml b/packages/SettingsProvider/res/values-lt/strings.xml index 64f429b242e5..5b4432ff5f31 100644 --- a/packages/SettingsProvider/res/values-lt/strings.xml +++ b/packages/SettingsProvider/res/values-lt/strings.xml @@ -20,6 +20,4 @@ <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">"Nustatymų saugykla"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Buvo pakeisti viešosios interneto prieigos taško nustatymai"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Palieskite ir peržiūrėkite išsamią informaciją"</string> </resources> diff --git a/packages/SettingsProvider/res/values-lv/strings.xml b/packages/SettingsProvider/res/values-lv/strings.xml index e5af8f785773..c83580c7026e 100644 --- a/packages/SettingsProvider/res/values-lv/strings.xml +++ b/packages/SettingsProvider/res/values-lv/strings.xml @@ -20,6 +20,4 @@ <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">"Iestatījumu krātuve"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Ir mainīti tīklāja iestatījumi"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Pieskarieties, lai skatītu detalizētāku informāciju."</string> </resources> diff --git a/packages/SettingsProvider/res/values-mk/strings.xml b/packages/SettingsProvider/res/values-mk/strings.xml index 13ff8a26d95d..f281baea384d 100644 --- a/packages/SettingsProvider/res/values-mk/strings.xml +++ b/packages/SettingsProvider/res/values-mk/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"Поставките за точка на пристап се променија"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Допрете за да видите детали"</string> </resources> diff --git a/packages/SettingsProvider/res/values-ml/strings.xml b/packages/SettingsProvider/res/values-ml/strings.xml index 8df8ce4e02c8..43a88e1dd5a9 100644 --- a/packages/SettingsProvider/res/values-ml/strings.xml +++ b/packages/SettingsProvider/res/values-ml/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"ഹോട്ട്സ്പോട്ട് ക്രമീകരണം മാറിയിരിക്കുന്നു"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"വിശദാംശങ്ങൾ കാണാൻ ടാപ്പ് ചെയ്യുക"</string> </resources> diff --git a/packages/SettingsProvider/res/values-mn/strings.xml b/packages/SettingsProvider/res/values-mn/strings.xml index a9c2e8ca0e9d..94521451bcee 100644 --- a/packages/SettingsProvider/res/values-mn/strings.xml +++ b/packages/SettingsProvider/res/values-mn/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"Сүлжээний цэгийн тохиргоог өөрчиллөө"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Дэлгэрэнгүй мэдээлэл харахын тулд товшино уу"</string> </resources> diff --git a/packages/SettingsProvider/res/values-mr/strings.xml b/packages/SettingsProvider/res/values-mr/strings.xml index 51b8b194df15..65a876f1a02a 100644 --- a/packages/SettingsProvider/res/values-mr/strings.xml +++ b/packages/SettingsProvider/res/values-mr/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"हॉटस्पॉट सेटिंग्ज बदलल्या आहेत"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"तपशील पाहण्यासाठी टॅप करा"</string> </resources> diff --git a/packages/SettingsProvider/res/values-ms/strings.xml b/packages/SettingsProvider/res/values-ms/strings.xml index 51a8f2baa4e7..9108b0706899 100644 --- a/packages/SettingsProvider/res/values-ms/strings.xml +++ b/packages/SettingsProvider/res/values-ms/strings.xml @@ -20,6 +20,4 @@ <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">"Storan Tetapan"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Tetapan tempat liputan telah berubah"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Ketik untuk melihat butiran"</string> </resources> diff --git a/packages/SettingsProvider/res/values-my/strings.xml b/packages/SettingsProvider/res/values-my/strings.xml index dc9f53171a28..0c5e8407758a 100644 --- a/packages/SettingsProvider/res/values-my/strings.xml +++ b/packages/SettingsProvider/res/values-my/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"ဟော့စပေါ့ ဆက်တင်များ ပြောင်းသွားပြီ"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"အသေးစိတ်ကြည့်ရန် တို့ပါ"</string> </resources> diff --git a/packages/SettingsProvider/res/values-nb/strings.xml b/packages/SettingsProvider/res/values-nb/strings.xml index 8da90c0f32cb..ad18f945d401 100644 --- a/packages/SettingsProvider/res/values-nb/strings.xml +++ b/packages/SettingsProvider/res/values-nb/strings.xml @@ -20,6 +20,4 @@ <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">"Lagring av innstillinger"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Innstillingene for wifi-sone er endret"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Trykk for å se detaljer"</string> </resources> diff --git a/packages/SettingsProvider/res/values-ne/strings.xml b/packages/SettingsProvider/res/values-ne/strings.xml index a0e3465a32ff..af6ef62a17eb 100644 --- a/packages/SettingsProvider/res/values-ne/strings.xml +++ b/packages/SettingsProvider/res/values-ne/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"हटस्पटका सेटिङ परिवर्तन गरिएका छन्"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"विवरणहरू हेर्न ट्याप गर्नुहोस्"</string> </resources> diff --git a/packages/SettingsProvider/res/values-nl/strings.xml b/packages/SettingsProvider/res/values-nl/strings.xml index 91b854242938..010fdb574eac 100644 --- a/packages/SettingsProvider/res/values-nl/strings.xml +++ b/packages/SettingsProvider/res/values-nl/strings.xml @@ -20,6 +20,4 @@ <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">"Opslagruimte voor instellingen"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Hotspot-instellingen zijn gewijzigd"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Tik voor meer informatie"</string> </resources> diff --git a/packages/SettingsProvider/res/values-or/strings.xml b/packages/SettingsProvider/res/values-or/strings.xml index 099130c77a00..1087e93ab92a 100644 --- a/packages/SettingsProvider/res/values-or/strings.xml +++ b/packages/SettingsProvider/res/values-or/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"ହଟସ୍ପଟ୍ ସେଟିଂସ ବଦଳାଯାଇଛି"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"ବିବରଣୀ ଦେଖିବାକୁ ଟାପ୍ କରନ୍ତୁ"</string> </resources> diff --git a/packages/SettingsProvider/res/values-pa/strings.xml b/packages/SettingsProvider/res/values-pa/strings.xml index 1c9a985677eb..1813becf434a 100644 --- a/packages/SettingsProvider/res/values-pa/strings.xml +++ b/packages/SettingsProvider/res/values-pa/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"ਹੌਟਸਪੌਟ ਸੈਟਿੰਗਾਂ ਬਦਲ ਗਈਆਂ ਹਨ"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"ਵੇਰਵੇ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string> </resources> diff --git a/packages/SettingsProvider/res/values-pl/strings.xml b/packages/SettingsProvider/res/values-pl/strings.xml index d86fc4d03fa4..9f81e632a504 100644 --- a/packages/SettingsProvider/res/values-pl/strings.xml +++ b/packages/SettingsProvider/res/values-pl/strings.xml @@ -20,6 +20,4 @@ <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">"Pamięć ustawień"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Ustawienia hotspotu zostały zmienione"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Kliknij, by zobaczyć szczegóły"</string> </resources> diff --git a/packages/SettingsProvider/res/values-pt-rBR/strings.xml b/packages/SettingsProvider/res/values-pt-rBR/strings.xml index a8600188a54e..ade17469292c 100644 --- a/packages/SettingsProvider/res/values-pt-rBR/strings.xml +++ b/packages/SettingsProvider/res/values-pt-rBR/strings.xml @@ -20,6 +20,4 @@ <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">"Armazenamento de configurações"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"As configurações de ponto de acesso mudaram"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Toque para ver os detalhes"</string> </resources> diff --git a/packages/SettingsProvider/res/values-pt-rPT/strings.xml b/packages/SettingsProvider/res/values-pt-rPT/strings.xml index a8a8e07b3e86..c7dc9e6dc6dd 100644 --- a/packages/SettingsProvider/res/values-pt-rPT/strings.xml +++ b/packages/SettingsProvider/res/values-pt-rPT/strings.xml @@ -20,6 +20,4 @@ <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">"Armazenamento de definições"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"As definições da zona Wi-Fi foram alteradas"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Toque para ver os detalhes."</string> </resources> diff --git a/packages/SettingsProvider/res/values-pt/strings.xml b/packages/SettingsProvider/res/values-pt/strings.xml index a8600188a54e..ade17469292c 100644 --- a/packages/SettingsProvider/res/values-pt/strings.xml +++ b/packages/SettingsProvider/res/values-pt/strings.xml @@ -20,6 +20,4 @@ <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">"Armazenamento de configurações"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"As configurações de ponto de acesso mudaram"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Toque para ver os detalhes"</string> </resources> diff --git a/packages/SettingsProvider/res/values-ro/strings.xml b/packages/SettingsProvider/res/values-ro/strings.xml index db1301966100..53e9429a49cd 100644 --- a/packages/SettingsProvider/res/values-ro/strings.xml +++ b/packages/SettingsProvider/res/values-ro/strings.xml @@ -20,6 +20,4 @@ <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">"Stocare setări"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Setările hotspotului s-au modificat"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Atinge pentru detalii"</string> </resources> diff --git a/packages/SettingsProvider/res/values-ru/strings.xml b/packages/SettingsProvider/res/values-ru/strings.xml index 331fae1c9046..4c15984c7ceb 100644 --- a/packages/SettingsProvider/res/values-ru/strings.xml +++ b/packages/SettingsProvider/res/values-ru/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"Настройки точки доступа изменены"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Нажмите, чтобы узнать больше."</string> </resources> diff --git a/packages/SettingsProvider/res/values-si/strings.xml b/packages/SettingsProvider/res/values-si/strings.xml index a9c4d0b8ef0b..24ef79820220 100644 --- a/packages/SettingsProvider/res/values-si/strings.xml +++ b/packages/SettingsProvider/res/values-si/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"හොට්ස්පොට් සැකසීම් වෙනස් කර ඇත"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"විස්තර බැලීමට තට්ටු කරන්න"</string> </resources> diff --git a/packages/SettingsProvider/res/values-sk/strings.xml b/packages/SettingsProvider/res/values-sk/strings.xml index 5712d05f752f..955c834754c2 100644 --- a/packages/SettingsProvider/res/values-sk/strings.xml +++ b/packages/SettingsProvider/res/values-sk/strings.xml @@ -20,6 +20,4 @@ <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">"Ukladací priestor nastavení"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Nastavenia hotspotu boli zmenené"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Klepnutím zobrazíte podrobnosti"</string> </resources> diff --git a/packages/SettingsProvider/res/values-sl/strings.xml b/packages/SettingsProvider/res/values-sl/strings.xml index 4e265fb5ecaf..3d7768dfa024 100644 --- a/packages/SettingsProvider/res/values-sl/strings.xml +++ b/packages/SettingsProvider/res/values-sl/strings.xml @@ -20,6 +20,4 @@ <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">"Shramba nastavitev"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Nastavitve dostopne ročke so spremenjene"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Dotaknite se za ogled podrobnosti"</string> </resources> diff --git a/packages/SettingsProvider/res/values-sq/strings.xml b/packages/SettingsProvider/res/values-sq/strings.xml index 8bbe2e70dbe0..a8e66d5dae80 100644 --- a/packages/SettingsProvider/res/values-sq/strings.xml +++ b/packages/SettingsProvider/res/values-sq/strings.xml @@ -20,6 +20,4 @@ <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">"Hapësira ruajtëse e \"Cilësimeve\""</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Cilësimet e zonës së qasjes për internet kanë ndryshuar"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Trokit për të parë detajet"</string> </resources> diff --git a/packages/SettingsProvider/res/values-sr/strings.xml b/packages/SettingsProvider/res/values-sr/strings.xml index 4d0576212d9c..7082761e1f71 100644 --- a/packages/SettingsProvider/res/values-sr/strings.xml +++ b/packages/SettingsProvider/res/values-sr/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"Подешавања хотспота су промењена"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Додирните да бисте видели детаље"</string> </resources> diff --git a/packages/SettingsProvider/res/values-sv/strings.xml b/packages/SettingsProvider/res/values-sv/strings.xml index 5ee4703dcfc6..b6de084cdeb9 100644 --- a/packages/SettingsProvider/res/values-sv/strings.xml +++ b/packages/SettingsProvider/res/values-sv/strings.xml @@ -20,6 +20,4 @@ <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">"Lagring av inställningar"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Inställningarna för surfzon har ändrats"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Tryck här för mer information"</string> </resources> diff --git a/packages/SettingsProvider/res/values-sw/strings.xml b/packages/SettingsProvider/res/values-sw/strings.xml index 59f82a948177..d17f60b92aea 100644 --- a/packages/SettingsProvider/res/values-sw/strings.xml +++ b/packages/SettingsProvider/res/values-sw/strings.xml @@ -20,6 +20,4 @@ <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">"Hifadhi ya Mipangilio"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Mipangilio ya mtandaopepe imebadilika"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Gusa ili uangalie maelezo"</string> </resources> diff --git a/packages/SettingsProvider/res/values-ta/strings.xml b/packages/SettingsProvider/res/values-ta/strings.xml index 54d2242dced9..7a868785d952 100644 --- a/packages/SettingsProvider/res/values-ta/strings.xml +++ b/packages/SettingsProvider/res/values-ta/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"ஹாட்ஸ்பாட் அமைப்புகள் மாற்றப்பட்டன"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"விவரங்களைப் பார்க்க, தட்டவும்"</string> </resources> diff --git a/packages/SettingsProvider/res/values-te/strings.xml b/packages/SettingsProvider/res/values-te/strings.xml index 95be5c5e9a5d..9bbe7617b02b 100644 --- a/packages/SettingsProvider/res/values-te/strings.xml +++ b/packages/SettingsProvider/res/values-te/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"హాట్స్పాట్ సెట్టింగ్లు మార్చబడ్డాయి"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"వివరాలను చూడటానికి ట్యాప్ చేయండి"</string> </resources> diff --git a/packages/SettingsProvider/res/values-th/strings.xml b/packages/SettingsProvider/res/values-th/strings.xml index ed6317427da4..ae8ba6a430b8 100644 --- a/packages/SettingsProvider/res/values-th/strings.xml +++ b/packages/SettingsProvider/res/values-th/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"การตั้งค่าฮอตสปอตมีการเปลี่ยนแปลง"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"แตะเพื่อดูรายละเอียด"</string> </resources> diff --git a/packages/SettingsProvider/res/values-tl/strings.xml b/packages/SettingsProvider/res/values-tl/strings.xml index 3d6be4071715..0fe535eee8e3 100644 --- a/packages/SettingsProvider/res/values-tl/strings.xml +++ b/packages/SettingsProvider/res/values-tl/strings.xml @@ -20,6 +20,4 @@ <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">"Storage ng Mga Setting"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Nabago ang mga setting ng hotspot"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"I-tap para makita ang mga detalye"</string> </resources> diff --git a/packages/SettingsProvider/res/values-tr/strings.xml b/packages/SettingsProvider/res/values-tr/strings.xml index 75e908f46475..e99e99bc82ef 100644 --- a/packages/SettingsProvider/res/values-tr/strings.xml +++ b/packages/SettingsProvider/res/values-tr/strings.xml @@ -20,6 +20,4 @@ <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">"Ayarlar Deposu"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Hotspot ayarları değişti"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Ayrıntıları görmek için dokunun"</string> </resources> diff --git a/packages/SettingsProvider/res/values-uk/strings.xml b/packages/SettingsProvider/res/values-uk/strings.xml index 2dbb360cbffa..900dd0710be5 100644 --- a/packages/SettingsProvider/res/values-uk/strings.xml +++ b/packages/SettingsProvider/res/values-uk/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"Налаштування точки доступу змінились"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Торкніться, щоб переглянути докладні відомості"</string> </resources> diff --git a/packages/SettingsProvider/res/values-ur/strings.xml b/packages/SettingsProvider/res/values-ur/strings.xml index 5a1b0f985bb6..e79249b00c18 100644 --- a/packages/SettingsProvider/res/values-ur/strings.xml +++ b/packages/SettingsProvider/res/values-ur/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"ہاٹ اسپاٹ کی ترتیبات تبدیل ہو گئیں"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"تفصیلات دیکھنے کے لیے تھپتھپائیں"</string> </resources> diff --git a/packages/SettingsProvider/res/values-uz/strings.xml b/packages/SettingsProvider/res/values-uz/strings.xml index bb6e22eb62ba..38f0ce518bf6 100644 --- a/packages/SettingsProvider/res/values-uz/strings.xml +++ b/packages/SettingsProvider/res/values-uz/strings.xml @@ -20,6 +20,4 @@ <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">"Sozlamalar xotirasi"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Hotspot sozlamalari oʻzgardi"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Tafsilotlar uchun bosing"</string> </resources> diff --git a/packages/SettingsProvider/res/values-vi/strings.xml b/packages/SettingsProvider/res/values-vi/strings.xml index 4608983aa9e1..015fbfda9b82 100644 --- a/packages/SettingsProvider/res/values-vi/strings.xml +++ b/packages/SettingsProvider/res/values-vi/strings.xml @@ -20,6 +20,4 @@ <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">"Lưu trữ bộ nhớ"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Đã thay đổi các tùy chọn cài đặt điểm phát sóng"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Nhấn để xem chi tiết"</string> </resources> diff --git a/packages/SettingsProvider/res/values-zh-rCN/strings.xml b/packages/SettingsProvider/res/values-zh-rCN/strings.xml index a08afc85e9a4..11c5d6c28889 100644 --- a/packages/SettingsProvider/res/values-zh-rCN/strings.xml +++ b/packages/SettingsProvider/res/values-zh-rCN/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"热点设置已更改"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"点按即可查看详细信息"</string> </resources> diff --git a/packages/SettingsProvider/res/values-zh-rHK/strings.xml b/packages/SettingsProvider/res/values-zh-rHK/strings.xml index fb91dbbbf4d8..977c9b91d13d 100644 --- a/packages/SettingsProvider/res/values-zh-rHK/strings.xml +++ b/packages/SettingsProvider/res/values-zh-rHK/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"熱點設定已變更"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"輕按以查看詳情"</string> </resources> diff --git a/packages/SettingsProvider/res/values-zh-rTW/strings.xml b/packages/SettingsProvider/res/values-zh-rTW/strings.xml index 1b8fcb267737..977c9b91d13d 100644 --- a/packages/SettingsProvider/res/values-zh-rTW/strings.xml +++ b/packages/SettingsProvider/res/values-zh-rTW/strings.xml @@ -20,6 +20,4 @@ <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="wifi_softap_config_change" msgid="5688373762357941645">"無線基地台設定有所變更"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"輕觸即可查看詳細資料"</string> </resources> diff --git a/packages/SettingsProvider/res/values-zu/strings.xml b/packages/SettingsProvider/res/values-zu/strings.xml index dad24b496fd9..cb5a7818423b 100644 --- a/packages/SettingsProvider/res/values-zu/strings.xml +++ b/packages/SettingsProvider/res/values-zu/strings.xml @@ -20,6 +20,4 @@ <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">"Izilungiselelo zesitoreji"</string> - <string name="wifi_softap_config_change" msgid="5688373762357941645">"Izilungiselelo ze-Hotspot zishintshile"</string> - <string name="wifi_softap_config_change_summary" msgid="8946397286141531087">"Thepha ukuze ubone imininingwane"</string> </resources> diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index 43ea3ec3de4e..02d19dc84f2e 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -564,7 +564,7 @@ <uses-permission android:name="android.permission.TEST_BIOMETRIC" /> <!-- Permission required for CTS test - android.server.biometrics --> - <uses-permission android:name="android.permission.SET_BIOMETRIC_DIALOG_LOGO" /> + <uses-permission android:name="android.permission.SET_BIOMETRIC_DIALOG_ADVANCED" /> <!-- Permissions required for CTS test - NotificationManagerTest --> <uses-permission android:name="android.permission.MANAGE_NOTIFICATION_LISTENERS" /> diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index f12320163bc6..d9c371a79b2d 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -529,15 +529,6 @@ </intent-filter> </activity-alias> - <!-- Springboard for launching the share and edit activity. This needs to be in the main - system ui process since we need to notify the status bar to dismiss the keyguard --> - <receiver android:name=".screenshot.ActionProxyReceiver" - android:exported="false" /> - - <!-- Callback for deleting screenshot notification --> - <receiver android:name=".screenshot.DeleteScreenshotReceiver" - android:exported="false" /> - <!-- Callback for invoking a smart action from the screenshot notification. --> <receiver android:name=".screenshot.SmartActionsReceiver" android:exported="false"/> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-kk/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-kk/strings.xml index 48c2634191d9..f707e367ce8a 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-kk/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-kk/strings.xml @@ -15,7 +15,7 @@ <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="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> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java index 88181e7e2a52..4dd029c038bb 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java +++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java @@ -280,10 +280,8 @@ public class AccessibilityMenuService extends AccessibilityService return; } - if (Flags.a11yMenuHideBeforeTakingAction()) { - // Hide the a11y menu UI before performing the following shortcut actions. - mA11yMenuLayout.hideMenu(); - } + // Hide the a11y menu UI before performing the following shortcut actions. + mA11yMenuLayout.hideMenu(); if (viewTag == ShortcutId.ID_ASSISTANT_VALUE.ordinal()) { // Always restart the voice command activity, so that the UI is reloaded. @@ -299,31 +297,18 @@ public class AccessibilityMenuService extends AccessibilityService } else if (viewTag == ShortcutId.ID_RECENT_VALUE.ordinal()) { performGlobalActionInternal(GLOBAL_ACTION_RECENTS); } else if (viewTag == ShortcutId.ID_LOCKSCREEN_VALUE.ordinal()) { - if (Flags.a11yMenuHideBeforeTakingAction()) { - // Delay before locking the screen to give time for the UI to close. - mHandler.postDelayed( - () -> performGlobalActionInternal(GLOBAL_ACTION_LOCK_SCREEN), - HIDE_UI_DELAY_MS); - } else { - performGlobalActionInternal(GLOBAL_ACTION_LOCK_SCREEN); - } + // Delay before locking the screen to give time for the UI to close. + mHandler.postDelayed( + () -> performGlobalActionInternal(GLOBAL_ACTION_LOCK_SCREEN), + HIDE_UI_DELAY_MS); } else if (viewTag == ShortcutId.ID_QUICKSETTING_VALUE.ordinal()) { performGlobalActionInternal(GLOBAL_ACTION_QUICK_SETTINGS); } else if (viewTag == ShortcutId.ID_NOTIFICATION_VALUE.ordinal()) { performGlobalActionInternal(GLOBAL_ACTION_NOTIFICATIONS); } else if (viewTag == ShortcutId.ID_SCREENSHOT_VALUE.ordinal()) { - if (Flags.a11yMenuHideBeforeTakingAction()) { - // Delay before taking a screenshot to give time for the UI to close. - mHandler.postDelayed( - () -> performGlobalActionInternal(GLOBAL_ACTION_TAKE_SCREENSHOT), - HIDE_UI_DELAY_MS); - } else { - performGlobalActionInternal(GLOBAL_ACTION_TAKE_SCREENSHOT); - } - } - - if (!Flags.a11yMenuHideBeforeTakingAction()) { - mA11yMenuLayout.hideMenu(); + mHandler.postDelayed( + () -> performGlobalActionInternal(GLOBAL_ACTION_TAKE_SCREENSHOT), + HIDE_UI_DELAY_MS); } } diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index e5e34695f40c..c0fd124fcfd1 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -345,6 +345,16 @@ flag { } flag { + name: "activity_transition_use_largest_window" + namespace: "systemui" + description: "Target largest opening window during activity transitions." + bug: "323294573" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "centralized_status_bar_height_fix" namespace: "systemui" description: "Refactors shade header and keyguard status bar to read status bar dimens from a" @@ -470,6 +480,27 @@ flag { } flag { + name: "disable_contextual_tips_frequency_check" + description: "Disables frequency capping check for contextual tips." + namespace: "systemui" + bug: "322891421" +} + +flag { + name: "disable_contextual_tips_ios_switcher_check" + description: "Disables iOS switcher check which guard the tips designed only for iOS switchers." + namespace: "systemui" + bug: "322891421" +} + +flag { + name: "disable_contextual_tips_first_30d_check" + description: "Disables condition check which only show tips within 30 days after phone setup." + namespace: "systemui" + bug: "322891421" +} + +flag { name: "enable_contextual_tips" description: "Enables showing contextual tips." namespace: "systemui" diff --git a/packages/SystemUI/animation/Android.bp b/packages/SystemUI/animation/Android.bp index 99b7c36d6fb9..2268d16e5b0a 100644 --- a/packages/SystemUI/animation/Android.bp +++ b/packages/SystemUI/animation/Android.bp @@ -44,6 +44,7 @@ android_library { "androidx.core_core-animation-nodeps", "androidx.core_core-ktx", "androidx.annotation_annotation", + "com_android_systemui_flags_lib", "SystemUIShaderLib", "WindowManager-Shell-shared", "animationlib", diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityTransitionAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityTransitionAnimator.kt index 1b99e19eeb95..ea1cb3441215 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityTransitionAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityTransitionAnimator.kt @@ -43,6 +43,7 @@ import androidx.annotation.UiThread import com.android.app.animation.Interpolators import com.android.internal.annotations.VisibleForTesting import com.android.internal.policy.ScreenDecorationsUtils +import com.android.systemui.Flags.activityTransitionUseLargestWindow import kotlin.math.roundToInt private const val TAG = "ActivityTransitionAnimator" @@ -648,11 +649,27 @@ class ActivityTransitionAnimator( var candidate: RemoteAnimationTarget? = null for (it in apps) { if (it.mode == RemoteAnimationTarget.MODE_OPENING) { - if (!it.hasAnimatingParent) { - return it - } - if (candidate == null) { - candidate = it + if (activityTransitionUseLargestWindow()) { + if ( + candidate == null || + !it.hasAnimatingParent && candidate.hasAnimatingParent + ) { + candidate = it + continue + } + if ( + !it.hasAnimatingParent && + it.screenSpaceBounds.hasGreaterAreaThan(candidate.screenSpaceBounds) + ) { + candidate = it + } + } else { + if (!it.hasAnimatingParent) { + return it + } + if (candidate == null) { + candidate = it + } } } } @@ -960,5 +977,9 @@ class ActivityTransitionAnimator( e.printStackTrace() } } + + private fun Rect.hasGreaterAreaThan(other: Rect): Boolean { + return (this.width() * this.height()) > (other.width() * other.height()) + } } } diff --git a/packages/SystemUI/compose/core/src/com/android/compose/PlatformSlider.kt b/packages/SystemUI/compose/core/src/com/android/compose/PlatformSlider.kt index f779cf3671d7..596a297a6dbe 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/PlatformSlider.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/PlatformSlider.kt @@ -241,6 +241,7 @@ private fun Track( measurePolicy = TrackMeasurePolicy( sliderState = sliderState, + enabled = enabled, thumbSize = LocalDensity.current.run { thumbSize.roundToPx() }, isRtl = isRtl, onDrawingStateMeasured = { drawingState = it } @@ -304,6 +305,7 @@ private fun TrackBackground( /** Measures track components sizes and calls [onDrawingStateMeasured] when it's done. */ private class TrackMeasurePolicy( private val sliderState: SliderState, + private val enabled: Boolean, private val thumbSize: Int, private val isRtl: Boolean, private val onDrawingStateMeasured: (DrawingState) -> Unit, @@ -334,7 +336,7 @@ private class TrackMeasurePolicy( ) val iconSize = iconPlaceable?.width ?: 0 - val labelMaxWidth = (desiredWidth - iconSize) / 2 + val labelMaxWidth = if (enabled) (desiredWidth - iconSize) / 2 else desiredWidth - iconSize val labelPlaceable: Placeable? = measurables .fastFirstOrNull { it.layoutId == TrackComponent.Label } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenSceneBlueprintModule.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenSceneBlueprintModule.kt index 53f400fac7e5..55f7f69a08d6 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenSceneBlueprintModule.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/LockscreenSceneBlueprintModule.kt @@ -19,7 +19,6 @@ package com.android.systemui.keyguard.ui.composable import com.android.systemui.keyguard.ui.composable.blueprint.CommunalBlueprintModule import com.android.systemui.keyguard.ui.composable.blueprint.DefaultBlueprintModule import com.android.systemui.keyguard.ui.composable.blueprint.ShortcutsBesideUdfpsBlueprintModule -import com.android.systemui.keyguard.ui.composable.blueprint.SplitShadeBlueprintModule import com.android.systemui.keyguard.ui.composable.blueprint.SplitShadeWeatherClockBlueprintModule import com.android.systemui.keyguard.ui.composable.blueprint.WeatherClockBlueprintModule import com.android.systemui.keyguard.ui.composable.section.OptionalSectionModule @@ -32,7 +31,6 @@ import dagger.Module DefaultBlueprintModule::class, OptionalSectionModule::class, ShortcutsBesideUdfpsBlueprintModule::class, - SplitShadeBlueprintModule::class, SplitShadeWeatherClockBlueprintModule::class, WeatherClockBlueprintModule::class, ], diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ClockTransition.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ClockTransition.kt index c5ff859def17..d9ed4976bb34 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ClockTransition.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ClockTransition.kt @@ -38,6 +38,9 @@ object ClockTransition { from(ClockScenes.largeClockScene, to = ClockScenes.smallClockScene) { transitioningToSmallClock() } + from(ClockScenes.splitShadeLargeClockScene, to = ClockScenes.largeClockScene) { + spec = tween(1000) + } } private fun TransitionBuilder.transitioningToLargeClock() { @@ -70,6 +73,8 @@ object ClockTransition { object ClockScenes { val smallClockScene = SceneKey("small-clock-scene") val largeClockScene = SceneKey("large-clock-scene") + val splitShadeSmallClockScene = SceneKey("split-shade-small-clock-scene") + val splitShadeLargeClockScene = SceneKey("split-shade-large-clock-scene") } object ClockElementKeys { diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt index 9509fd22534a..320c455a8201 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/DefaultBlueprint.kt @@ -22,18 +22,15 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.layout.Layout -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.IntRect import com.android.compose.animation.scene.SceneScope import com.android.systemui.keyguard.ui.composable.LockscreenLongPress import com.android.systemui.keyguard.ui.composable.section.AmbientIndicationSection import com.android.systemui.keyguard.ui.composable.section.BottomAreaSection -import com.android.systemui.keyguard.ui.composable.section.DefaultClockSection import com.android.systemui.keyguard.ui.composable.section.LockSection -import com.android.systemui.keyguard.ui.composable.section.MediaCarouselSection -import com.android.systemui.keyguard.ui.composable.section.NotificationSection import com.android.systemui.keyguard.ui.composable.section.SettingsMenuSection import com.android.systemui.keyguard.ui.composable.section.StatusBarSection +import com.android.systemui.keyguard.ui.composable.section.TopAreaSection import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel import dagger.Binds import dagger.Module @@ -50,13 +47,11 @@ class DefaultBlueprint constructor( private val viewModel: LockscreenContentViewModel, private val statusBarSection: StatusBarSection, - private val clockSection: DefaultClockSection, - private val notificationSection: NotificationSection, private val lockSection: LockSection, private val ambientIndicationSectionOptional: Optional<AmbientIndicationSection>, private val bottomAreaSection: BottomAreaSection, private val settingsMenuSection: SettingsMenuSection, - private val mediaCarouselSection: MediaCarouselSection, + private val topAreaSection: TopAreaSection, ) : ComposableLockscreenSceneBlueprint { override val id: String = "default" @@ -64,7 +59,6 @@ constructor( @Composable override fun SceneScope.Content(modifier: Modifier) { val isUdfpsVisible = viewModel.isUdfpsVisible - val resources = LocalContext.current.resources LockscreenLongPress( viewModel = viewModel.longPress, @@ -77,17 +71,7 @@ constructor( modifier = Modifier.fillMaxWidth(), ) { with(statusBarSection) { StatusBar(modifier = Modifier.fillMaxWidth()) } - with(clockSection) { DefaultClockLayout() } - with(mediaCarouselSection) { MediaCarousel() } - - if (viewModel.areNotificationsVisible(resources = resources)) { - with(notificationSection) { - Notifications( - modifier = Modifier.fillMaxWidth().weight(weight = 1f) - ) - } - } - + with(topAreaSection) { DefaultClockLayoutWithNotifications() } if (!isUdfpsVisible && ambientIndicationSectionOptional.isPresent) { with(ambientIndicationSectionOptional.get()) { AmbientIndication(modifier = Modifier.fillMaxWidth()) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ShortcutsBesideUdfpsBlueprint.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ShortcutsBesideUdfpsBlueprint.kt index 9abfa4233a15..64c2cb3670c8 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ShortcutsBesideUdfpsBlueprint.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/ShortcutsBesideUdfpsBlueprint.kt @@ -22,18 +22,15 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.layout.Layout -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.IntRect import com.android.compose.animation.scene.SceneScope import com.android.systemui.keyguard.ui.composable.LockscreenLongPress import com.android.systemui.keyguard.ui.composable.section.AmbientIndicationSection import com.android.systemui.keyguard.ui.composable.section.BottomAreaSection -import com.android.systemui.keyguard.ui.composable.section.DefaultClockSection import com.android.systemui.keyguard.ui.composable.section.LockSection -import com.android.systemui.keyguard.ui.composable.section.MediaCarouselSection -import com.android.systemui.keyguard.ui.composable.section.NotificationSection import com.android.systemui.keyguard.ui.composable.section.SettingsMenuSection import com.android.systemui.keyguard.ui.composable.section.StatusBarSection +import com.android.systemui.keyguard.ui.composable.section.TopAreaSection import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel import dagger.Binds import dagger.Module @@ -50,13 +47,11 @@ class ShortcutsBesideUdfpsBlueprint constructor( private val viewModel: LockscreenContentViewModel, private val statusBarSection: StatusBarSection, - private val clockSection: DefaultClockSection, - private val notificationSection: NotificationSection, private val lockSection: LockSection, private val ambientIndicationSectionOptional: Optional<AmbientIndicationSection>, private val bottomAreaSection: BottomAreaSection, private val settingsMenuSection: SettingsMenuSection, - private val mediaCarouselSection: MediaCarouselSection, + private val topAreaSection: TopAreaSection, ) : ComposableLockscreenSceneBlueprint { override val id: String = "shortcuts-besides-udfps" @@ -64,7 +59,6 @@ constructor( @Composable override fun SceneScope.Content(modifier: Modifier) { val isUdfpsVisible = viewModel.isUdfpsVisible - val resources = LocalContext.current.resources LockscreenLongPress( viewModel = viewModel.longPress, @@ -77,16 +71,7 @@ constructor( modifier = Modifier.fillMaxWidth(), ) { with(statusBarSection) { StatusBar(modifier = Modifier.fillMaxWidth()) } - with(clockSection) { DefaultClockLayout() } - with(mediaCarouselSection) { MediaCarousel() } - - if (viewModel.areNotificationsVisible(resources = resources)) { - with(notificationSection) { - Notifications( - modifier = Modifier.fillMaxWidth().weight(weight = 1f) - ) - } - } + with(topAreaSection) { DefaultClockLayoutWithNotifications() } if (!isUdfpsVisible && ambientIndicationSectionOptional.isPresent) { with(ambientIndicationSectionOptional.get()) { diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/SplitShadeBlueprint.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/SplitShadeBlueprint.kt deleted file mode 100644 index 652412d13aba..000000000000 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/SplitShadeBlueprint.kt +++ /dev/null @@ -1,222 +0,0 @@ -/* - * 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.keyguard.ui.composable.blueprint - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.layout.Layout -import androidx.compose.ui.res.dimensionResource -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.IntRect -import androidx.compose.ui.unit.dp -import com.android.compose.animation.scene.SceneScope -import com.android.compose.modifiers.padding -import com.android.systemui.Flags -import com.android.systemui.keyguard.ui.composable.LockscreenLongPress -import com.android.systemui.keyguard.ui.composable.section.AmbientIndicationSection -import com.android.systemui.keyguard.ui.composable.section.BottomAreaSection -import com.android.systemui.keyguard.ui.composable.section.DefaultClockSection -import com.android.systemui.keyguard.ui.composable.section.LockSection -import com.android.systemui.keyguard.ui.composable.section.MediaCarouselSection -import com.android.systemui.keyguard.ui.composable.section.NotificationSection -import com.android.systemui.keyguard.ui.composable.section.SettingsMenuSection -import com.android.systemui.keyguard.ui.composable.section.StatusBarSection -import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel -import com.android.systemui.res.R -import com.android.systemui.shade.LargeScreenHeaderHelper -import dagger.Binds -import dagger.Module -import dagger.multibindings.IntoSet -import java.util.Optional -import javax.inject.Inject - -/** - * Renders the lockscreen scene when showing with a split shade (e.g. unfolded foldable and/or - * tablet form factor). - */ -class SplitShadeBlueprint -@Inject -constructor( - private val viewModel: LockscreenContentViewModel, - private val statusBarSection: StatusBarSection, - private val clockSection: DefaultClockSection, - private val notificationSection: NotificationSection, - private val lockSection: LockSection, - private val ambientIndicationSectionOptional: Optional<AmbientIndicationSection>, - private val bottomAreaSection: BottomAreaSection, - private val settingsMenuSection: SettingsMenuSection, - private val mediaCarouselSection: MediaCarouselSection, - private val largeScreenHeaderHelper: LargeScreenHeaderHelper, -) : ComposableLockscreenSceneBlueprint { - - override val id: String = "split-shade" - - @Composable - override fun SceneScope.Content(modifier: Modifier) { - val isUdfpsVisible = viewModel.isUdfpsVisible - - LockscreenLongPress( - viewModel = viewModel.longPress, - modifier = modifier, - ) { onSettingsMenuPlaced -> - Layout( - content = { - // Constrained to above the lock icon. - Column( - modifier = Modifier.fillMaxSize(), - ) { - with(statusBarSection) { StatusBar(modifier = Modifier.fillMaxWidth()) } - Row( - modifier = Modifier.fillMaxSize(), - ) { - Column( - modifier = Modifier.fillMaxHeight().weight(weight = 1f), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - with(clockSection) { DefaultClockLayout() } - with(mediaCarouselSection) { MediaCarousel() } - } - with(notificationSection) { - val splitShadeTopMargin: Dp = - if (Flags.centralizedStatusBarHeightFix()) { - largeScreenHeaderHelper.getLargeScreenHeaderHeight().dp - } else { - dimensionResource( - id = R.dimen.large_screen_shade_header_height - ) - } - Notifications( - modifier = - Modifier.fillMaxHeight() - .weight(weight = 1f) - .padding(top = splitShadeTopMargin) - ) - } - } - - if (!isUdfpsVisible && ambientIndicationSectionOptional.isPresent) { - with(ambientIndicationSectionOptional.get()) { - AmbientIndication(modifier = Modifier.fillMaxWidth()) - } - } - } - - with(lockSection) { LockIcon() } - - // Aligned to bottom and constrained to below the lock icon. - Column(modifier = Modifier.fillMaxWidth()) { - if (isUdfpsVisible && ambientIndicationSectionOptional.isPresent) { - with(ambientIndicationSectionOptional.get()) { - AmbientIndication(modifier = Modifier.fillMaxWidth()) - } - } - - with(bottomAreaSection) { - IndicationArea(modifier = Modifier.fillMaxWidth()) - } - } - - // Aligned to bottom and NOT constrained by the lock icon. - with(bottomAreaSection) { - Shortcut(isStart = true, applyPadding = true) - Shortcut(isStart = false, applyPadding = true) - } - with(settingsMenuSection) { SettingsMenu(onSettingsMenuPlaced) } - }, - modifier = Modifier.fillMaxSize(), - ) { measurables, constraints -> - check(measurables.size == 6) - val aboveLockIconMeasurable = measurables[0] - val lockIconMeasurable = measurables[1] - val belowLockIconMeasurable = measurables[2] - val startShortcutMeasurable = measurables[3] - val endShortcutMeasurable = measurables[4] - val settingsMenuMeasurable = measurables[5] - - val noMinConstraints = - constraints.copy( - minWidth = 0, - minHeight = 0, - ) - val lockIconPlaceable = lockIconMeasurable.measure(noMinConstraints) - val lockIconBounds = - IntRect( - left = lockIconPlaceable[BlueprintAlignmentLines.LockIcon.Left], - top = lockIconPlaceable[BlueprintAlignmentLines.LockIcon.Top], - right = lockIconPlaceable[BlueprintAlignmentLines.LockIcon.Right], - bottom = lockIconPlaceable[BlueprintAlignmentLines.LockIcon.Bottom], - ) - - val aboveLockIconPlaceable = - aboveLockIconMeasurable.measure( - noMinConstraints.copy(maxHeight = lockIconBounds.top) - ) - val belowLockIconPlaceable = - belowLockIconMeasurable.measure( - noMinConstraints.copy( - maxHeight = - (constraints.maxHeight - lockIconBounds.bottom).coerceAtLeast(0) - ) - ) - val startShortcutPleaceable = startShortcutMeasurable.measure(noMinConstraints) - val endShortcutPleaceable = endShortcutMeasurable.measure(noMinConstraints) - val settingsMenuPlaceable = settingsMenuMeasurable.measure(noMinConstraints) - - layout(constraints.maxWidth, constraints.maxHeight) { - aboveLockIconPlaceable.place( - x = 0, - y = 0, - ) - lockIconPlaceable.place( - x = lockIconBounds.left, - y = lockIconBounds.top, - ) - belowLockIconPlaceable.place( - x = 0, - y = constraints.maxHeight - belowLockIconPlaceable.height, - ) - startShortcutPleaceable.place( - x = 0, - y = constraints.maxHeight - startShortcutPleaceable.height, - ) - endShortcutPleaceable.place( - x = constraints.maxWidth - endShortcutPleaceable.width, - y = constraints.maxHeight - endShortcutPleaceable.height, - ) - settingsMenuPlaceable.place( - x = (constraints.maxWidth - settingsMenuPlaceable.width) / 2, - y = constraints.maxHeight - settingsMenuPlaceable.height, - ) - } - } - } - } -} - -@Module -interface SplitShadeBlueprintModule { - @Binds - @IntoSet - fun blueprint(blueprint: SplitShadeBlueprint): ComposableLockscreenSceneBlueprint -} diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/WeatherClockBlueprint.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/WeatherClockBlueprint.kt index f86623fe935c..ee4e2d697833 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/WeatherClockBlueprint.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/blueprint/WeatherClockBlueprint.kt @@ -112,7 +112,7 @@ constructor( with(mediaCarouselSection) { MediaCarousel() } - if (viewModel.areNotificationsVisible(resources = resources)) { + if (viewModel.areNotificationsVisible) { with(notificationSection) { Notifications( modifier = Modifier.fillMaxWidth().weight(weight = 1f) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt index 1ab2bc76c1fd..82e19e7c154c 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/DefaultClockSection.kt @@ -16,39 +16,29 @@ package com.android.systemui.keyguard.ui.composable.section +import android.view.View import android.view.ViewGroup import android.widget.FrameLayout -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.viewinterop.AndroidView +import androidx.core.view.contains import com.android.compose.animation.scene.SceneScope -import com.android.compose.animation.scene.SceneTransitionLayout import com.android.compose.modifiers.padding import com.android.systemui.customization.R as customizationR -import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor import com.android.systemui.keyguard.ui.composable.blueprint.ClockElementKeys.largeClockElementKey import com.android.systemui.keyguard.ui.composable.blueprint.ClockElementKeys.smallClockElementKey -import com.android.systemui.keyguard.ui.composable.blueprint.ClockElementKeys.smartspaceElementKey -import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes.largeClockScene -import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes.smallClockScene -import com.android.systemui.keyguard.ui.composable.blueprint.ClockTransition.defaultClockTransitions -import com.android.systemui.keyguard.ui.composable.blueprint.rememberBurnIn import com.android.systemui.keyguard.ui.composable.modifier.burnInAware import com.android.systemui.keyguard.ui.composable.modifier.onTopPlacementChanged import com.android.systemui.keyguard.ui.viewmodel.AodBurnInViewModel import com.android.systemui.keyguard.ui.viewmodel.BurnInParameters import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel -import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel -import com.android.systemui.res.R import javax.inject.Inject /** Provides small clock and large clock composables for the default clock face. */ @@ -56,91 +46,10 @@ class DefaultClockSection @Inject constructor( private val viewModel: KeyguardClockViewModel, - private val clockInteractor: KeyguardClockInteractor, private val aodBurnInViewModel: AodBurnInViewModel, - private val lockscreenContentViewModel: LockscreenContentViewModel, - private val smartSpaceSection: SmartSpaceSection, ) { @Composable - fun DefaultClockLayout( - modifier: Modifier = Modifier, - ) { - val isLargeClockVisible by viewModel.isLargeClockVisible.collectAsState() - val burnIn = rememberBurnIn(clockInteractor) - val currentScene = - if (isLargeClockVisible) { - largeClockScene - } else { - smallClockScene - } - - LaunchedEffect(isLargeClockVisible) { - if (isLargeClockVisible) { - burnIn.onSmallClockTopChanged(null) - } - } - - SceneTransitionLayout( - modifier = modifier, - currentScene = currentScene, - onChangeScene = {}, - transitions = defaultClockTransitions, - ) { - scene(smallClockScene) { - Column { - SmallClock( - burnInParams = burnIn.parameters, - onTopChanged = burnIn.onSmallClockTopChanged, - modifier = Modifier.element(smallClockElementKey).fillMaxWidth() - ) - SmartSpaceContent() - } - } - - scene(largeClockScene) { - Column { - SmartSpaceContent() - LargeClock(modifier = Modifier.element(largeClockElementKey).fillMaxWidth()) - } - } - } - } - - @Composable - private fun SceneScope.SmartSpaceContent( - modifier: Modifier = Modifier, - ) { - val burnIn = rememberBurnIn(clockInteractor) - val resources = LocalContext.current.resources - - MovableElement(key = smartspaceElementKey, modifier = modifier) { - content { - with(smartSpaceSection) { - this@SmartSpaceContent.SmartSpace( - burnInParams = burnIn.parameters, - onTopChanged = burnIn.onSmartspaceTopChanged, - modifier = - Modifier.fillMaxWidth() - .padding( - top = { - lockscreenContentViewModel.getSmartSpacePaddingTop( - resources - ) - }, - bottom = { - resources.getDimensionPixelSize( - R.dimen.keyguard_status_view_bottom_margin - ) - } - ), - ) - } - } - } - } - - @Composable - private fun SceneScope.SmallClock( + fun SceneScope.SmallClock( burnInParams: BurnInParameters, onTopChanged: (top: Float?) -> Unit, modifier: Modifier = Modifier, @@ -152,58 +61,60 @@ constructor( viewModel.clock = currentClock val context = LocalContext.current - - AndroidView( - factory = { context -> - FrameLayout(context).apply { - val newClockView = checkNotNull(currentClock).smallClock.view - (newClockView.parent as? ViewGroup)?.removeView(newClockView) - addView(newClockView) - } - }, - update = { - val newClockView = checkNotNull(currentClock).smallClock.view - it.removeAllViews() - (newClockView.parent as? ViewGroup)?.removeView(newClockView) - it.addView(newClockView) - }, - modifier = - modifier - .padding( - horizontal = dimensionResource(customizationR.dimen.clock_padding_start) - ) - .padding(top = { viewModel.getSmallClockTopMargin(context) }) - .onTopPlacementChanged(onTopChanged) - .burnInAware( - viewModel = aodBurnInViewModel, - params = burnInParams, - ), - ) + MovableElement(key = smallClockElementKey, modifier = modifier) { + content { + AndroidView( + factory = { context -> + FrameLayout(context).apply { + addClockView(checkNotNull(currentClock).smallClock.view) + } + }, + update = { it.addClockView(checkNotNull(currentClock).smallClock.view) }, + modifier = + Modifier.padding( + horizontal = + dimensionResource(customizationR.dimen.clock_padding_start) + ) + .padding(top = { viewModel.getSmallClockTopMargin(context) }) + .onTopPlacementChanged(onTopChanged) + .burnInAware( + viewModel = aodBurnInViewModel, + params = burnInParams, + ), + ) + } + } } @Composable - private fun SceneScope.LargeClock(modifier: Modifier = Modifier) { + fun SceneScope.LargeClock(modifier: Modifier = Modifier) { val currentClock by viewModel.currentClock.collectAsState() viewModel.clock = currentClock if (currentClock?.largeClock?.view == null) { return } - AndroidView( - factory = { context -> - FrameLayout(context).apply { - val newClockView = checkNotNull(currentClock).largeClock.view - (newClockView.parent as? ViewGroup)?.removeView(newClockView) - addView(newClockView) - } - }, - update = { - val newClockView = checkNotNull(currentClock).largeClock.view - it.removeAllViews() - (newClockView.parent as? ViewGroup)?.removeView(newClockView) - it.addView(newClockView) - }, - modifier = modifier.fillMaxSize() - ) + MovableElement(key = largeClockElementKey, modifier = modifier) { + content { + AndroidView( + factory = { context -> + FrameLayout(context).apply { + addClockView(checkNotNull(currentClock).largeClock.view) + } + }, + update = { it.addClockView(checkNotNull(currentClock).largeClock.view) }, + modifier = Modifier.fillMaxSize() + ) + } + } + } + + private fun FrameLayout.addClockView(clockView: View) { + if (contains(clockView)) { + return + } + removeAllViews() + (clockView.parent as? ViewGroup)?.removeView(clockView) + addView(clockView) } } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt index c7d43fcdf5e6..5c9b271b342c 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/NotificationSection.kt @@ -31,7 +31,6 @@ import com.android.systemui.statusbar.notification.stack.AmbientState import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.notification.stack.NotificationStackSizeCalculator -import com.android.systemui.statusbar.notification.stack.shared.flexiNotifsEnabled import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer import com.android.systemui.statusbar.notification.stack.ui.viewbinder.NotificationStackAppearanceViewBinder import com.android.systemui.statusbar.notification.stack.ui.viewbinder.SharedNotificationContainerBinder @@ -83,7 +82,7 @@ constructor( mainImmediateDispatcher = mainImmediateDispatcher, ) - if (sceneContainerFlags.flexiNotifsEnabled()) { + if (sceneContainerFlags.isEnabled()) { NotificationStackAppearanceViewBinder.bind( context, sharedNotificationContainer, diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/SmartSpaceSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/SmartSpaceSection.kt index d1cc53e093a5..fc8b3b9009ce 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/SmartSpaceSection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/SmartSpaceSection.kt @@ -30,16 +30,20 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import com.android.compose.animation.scene.SceneScope +import com.android.compose.modifiers.padding import com.android.systemui.keyguard.KeyguardUnlockAnimationController +import com.android.systemui.keyguard.ui.composable.blueprint.ClockElementKeys import com.android.systemui.keyguard.ui.composable.modifier.burnInAware import com.android.systemui.keyguard.ui.composable.modifier.onTopPlacementChanged import com.android.systemui.keyguard.ui.viewmodel.AodBurnInViewModel import com.android.systemui.keyguard.ui.viewmodel.BurnInParameters import com.android.systemui.keyguard.ui.viewmodel.KeyguardSmartspaceViewModel +import com.android.systemui.keyguard.ui.viewmodel.LockscreenContentViewModel import com.android.systemui.res.R import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController import javax.inject.Inject @@ -51,6 +55,7 @@ constructor( private val keyguardUnlockAnimationController: KeyguardUnlockAnimationController, private val keyguardSmartspaceViewModel: KeyguardSmartspaceViewModel, private val aodBurnInViewModel: AodBurnInViewModel, + private val lockscreenContentViewModel: LockscreenContentViewModel, ) { @Composable fun SceneScope.SmartSpace( @@ -58,57 +63,71 @@ constructor( onTopChanged: (top: Float?) -> Unit, modifier: Modifier = Modifier, ) { - Column( - modifier = modifier.onTopPlacementChanged(onTopChanged), - ) { - if (!keyguardSmartspaceViewModel.isSmartspaceEnabled) { - return - } + val resources = LocalContext.current.resources + + MovableElement(key = ClockElementKeys.smartspaceElementKey, modifier = modifier) { + Column( + modifier = + modifier + .onTopPlacementChanged(onTopChanged) + .padding( + top = { lockscreenContentViewModel.getSmartSpacePaddingTop(resources) }, + bottom = { + resources.getDimensionPixelSize( + R.dimen.keyguard_status_view_bottom_margin + ) + } + ) + ) { + if (!keyguardSmartspaceViewModel.isSmartspaceEnabled) { + return@Column + } - val paddingBelowClockStart = dimensionResource(R.dimen.below_clock_padding_start) - val paddingBelowClockEnd = dimensionResource(R.dimen.below_clock_padding_end) + val paddingBelowClockStart = dimensionResource(R.dimen.below_clock_padding_start) + val paddingBelowClockEnd = dimensionResource(R.dimen.below_clock_padding_end) - if (keyguardSmartspaceViewModel.isDateWeatherDecoupled) { - Row( - verticalAlignment = Alignment.CenterVertically, + if (keyguardSmartspaceViewModel.isDateWeatherDecoupled) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = + Modifier.fillMaxWidth() + // All items will be constrained to be as tall as the shortest item. + .height(IntrinsicSize.Min) + .padding( + start = paddingBelowClockStart, + ), + ) { + Date( + modifier = + Modifier.burnInAware( + viewModel = aodBurnInViewModel, + params = burnInParams, + ), + ) + Spacer(modifier = Modifier.width(4.dp)) + Weather( + modifier = + Modifier.burnInAware( + viewModel = aodBurnInViewModel, + params = burnInParams, + ), + ) + } + } + + Card( modifier = Modifier.fillMaxWidth() - // All items will be constrained to be as tall as the shortest item. - .height(IntrinsicSize.Min) .padding( start = paddingBelowClockStart, - ), - ) { - Date( - modifier = - Modifier.burnInAware( - viewModel = aodBurnInViewModel, - params = burnInParams, - ), - ) - Spacer(modifier = Modifier.width(4.dp)) - Weather( - modifier = - Modifier.burnInAware( + end = paddingBelowClockEnd, + ) + .burnInAware( viewModel = aodBurnInViewModel, params = burnInParams, ), - ) - } + ) } - - Card( - modifier = - Modifier.fillMaxWidth() - .padding( - start = paddingBelowClockStart, - end = paddingBelowClockEnd, - ) - .burnInAware( - viewModel = aodBurnInViewModel, - params = burnInParams, - ), - ) } } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/TopAreaSection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/TopAreaSection.kt new file mode 100644 index 000000000000..763584182c97 --- /dev/null +++ b/packages/SystemUI/compose/features/src/com/android/systemui/keyguard/ui/composable/section/TopAreaSection.kt @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.composable.section + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.android.compose.animation.scene.SceneTransitionLayout +import com.android.systemui.Flags +import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor +import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes +import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes.largeClockScene +import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes.smallClockScene +import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes.splitShadeLargeClockScene +import com.android.systemui.keyguard.ui.composable.blueprint.ClockScenes.splitShadeSmallClockScene +import com.android.systemui.keyguard.ui.composable.blueprint.ClockTransition +import com.android.systemui.keyguard.ui.composable.blueprint.rememberBurnIn +import com.android.systemui.keyguard.ui.viewmodel.KeyguardClockViewModel +import com.android.systemui.res.R +import com.android.systemui.shade.LargeScreenHeaderHelper +import javax.inject.Inject + +class TopAreaSection +@Inject +constructor( + private val clockViewModel: KeyguardClockViewModel, + private val smartSpaceSection: SmartSpaceSection, + private val mediaCarouselSection: MediaCarouselSection, + private val notificationSection: NotificationSection, + private val clockSection: DefaultClockSection, + private val clockInteractor: KeyguardClockInteractor, +) { + @Composable + fun DefaultClockLayoutWithNotifications( + modifier: Modifier = Modifier, + ) { + val isLargeClockVisible by clockViewModel.isLargeClockVisible.collectAsState() + val currentClockLayout by clockViewModel.currentClockLayout.collectAsState() + val currentScene = + when (currentClockLayout) { + KeyguardClockViewModel.ClockLayout.SPLIT_SHADE_LARGE_CLOCK -> + splitShadeLargeClockScene + KeyguardClockViewModel.ClockLayout.SPLIT_SHADE_SMALL_CLOCK -> + splitShadeSmallClockScene + KeyguardClockViewModel.ClockLayout.LARGE_CLOCK -> largeClockScene + KeyguardClockViewModel.ClockLayout.SMALL_CLOCK -> smallClockScene + } + + val splitShadeTopMargin: Dp = + if (Flags.centralizedStatusBarHeightFix()) { + LargeScreenHeaderHelper.getLargeScreenHeaderHeight(LocalContext.current).dp + } else { + dimensionResource(id = R.dimen.large_screen_shade_header_height) + } + val burnIn = rememberBurnIn(clockInteractor) + + LaunchedEffect(isLargeClockVisible) { + if (isLargeClockVisible) { + burnIn.onSmallClockTopChanged(null) + } + } + + SceneTransitionLayout( + modifier = modifier.fillMaxSize(), + currentScene = currentScene, + onChangeScene = {}, + transitions = ClockTransition.defaultClockTransitions, + ) { + scene(ClockScenes.splitShadeLargeClockScene) { + Row( + modifier = Modifier.fillMaxSize(), + ) { + Column( + modifier = Modifier.fillMaxHeight().weight(weight = 1f), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + with(smartSpaceSection) { + SmartSpace( + burnInParams = burnIn.parameters, + onTopChanged = burnIn.onSmartspaceTopChanged, + ) + } + with(clockSection) { LargeClock(modifier = Modifier.fillMaxWidth()) } + } + with(notificationSection) { + Notifications( + modifier = + Modifier.fillMaxHeight() + .weight(weight = 1f) + .padding(top = splitShadeTopMargin) + ) + } + } + } + + scene(ClockScenes.splitShadeSmallClockScene) { + Row( + modifier = Modifier.fillMaxSize(), + ) { + Column( + modifier = Modifier.fillMaxHeight().weight(weight = 1f), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + with(clockSection) { + SmallClock( + burnInParams = burnIn.parameters, + onTopChanged = burnIn.onSmallClockTopChanged, + modifier = Modifier.fillMaxWidth() + ) + } + with(smartSpaceSection) { + SmartSpace( + burnInParams = burnIn.parameters, + onTopChanged = burnIn.onSmartspaceTopChanged, + ) + } + with(mediaCarouselSection) { MediaCarousel() } + } + with(notificationSection) { + Notifications( + modifier = + Modifier.fillMaxHeight() + .weight(weight = 1f) + .padding(top = splitShadeTopMargin) + ) + } + } + } + + scene(ClockScenes.smallClockScene) { + Column { + with(clockSection) { + SmallClock( + burnInParams = burnIn.parameters, + onTopChanged = burnIn.onSmallClockTopChanged, + modifier = Modifier.fillMaxWidth() + ) + } + with(smartSpaceSection) { + SmartSpace( + burnInParams = burnIn.parameters, + onTopChanged = burnIn.onSmartspaceTopChanged, + ) + } + with(mediaCarouselSection) { MediaCarousel() } + with(notificationSection) { + Notifications( + modifier = + androidx.compose.ui.Modifier.fillMaxWidth().weight(weight = 1f) + ) + } + } + } + + scene(ClockScenes.largeClockScene) { + Column { + with(smartSpaceSection) { + SmartSpace( + burnInParams = burnIn.parameters, + onTopChanged = burnIn.onSmartspaceTopChanged, + ) + } + with(clockSection) { LargeClock(modifier = Modifier.fillMaxWidth()) } + } + } + } + } +} diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt index 791d629179e6..d78097815b5e 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/Notifications.kt @@ -42,7 +42,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.snapshotFlow -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.drawBehind @@ -355,18 +354,7 @@ private fun SceneScope.NotificationPlaceholder( ) } ) { - content { - if (viewModel.isPlaceholderTextVisible) { - Box(Modifier.fillMaxSize()) { - Text( - text = "Notifications", - style = MaterialTheme.typography.titleLarge, - color = MaterialTheme.colorScheme.onSurface, - modifier = Modifier.align(Alignment.Center), - ) - } - } - } + content {} } } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt index fa94ea01d533..24351706cb46 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/volume/ui/composable/VolumeSlider.kt @@ -16,11 +16,7 @@ package com.android.systemui.volume.panel.component.volume.ui.composable -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.animation.slideInVertically -import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.basicMarquee import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.size @@ -87,7 +83,7 @@ fun VolumeSlider( enabled = state.isEnabled, icon = { isDragging -> if (isDragging) { - Text(text = value.toInt().toString(), color = LocalContentColor.current) + Text(text = state.valueText, color = LocalContentColor.current) } else { state.icon?.let { IconButton( @@ -107,7 +103,7 @@ fun VolumeSlider( }, colors = sliderColors, label = { - Column(modifier = Modifier.animateContentSize()) { + Column(modifier = Modifier) { Text( modifier = Modifier.basicMarquee(), text = state.label, @@ -116,12 +112,8 @@ fun VolumeSlider( maxLines = 1, ) - state.disabledMessage?.let { message -> - AnimatedVisibility( - !state.isEnabled, - enter = slideInVertically { it }, - exit = slideOutVertically { it }, - ) { + if (!state.isEnabled) { + state.disabledMessage?.let { message -> Text( modifier = Modifier.basicMarquee(), text = message, diff --git a/packages/SystemUI/customization/src/com/android/systemui/util/Assert.java b/packages/SystemUI/customization/src/com/android/systemui/util/Assert.java index e08936cbf75e..165e9728b9d7 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/util/Assert.java +++ b/packages/SystemUI/customization/src/com/android/systemui/util/Assert.java @@ -37,6 +37,39 @@ public class Assert { sTestThread = thread; } + /** + * Run {@code mainThreadWork} synchronously, ensuring that {@link #isMainThread()} will return + * {@code true} while it is running. + * <ol> + * <li>If {@link #isMainThread()} already passes, the work is simply run. + * <li>If the test thread is {@code null}, it will be set, the work run, and then cleared. + * <li>If the test thread is already set to a different thread, this call will fail the test to + * avoid causing spurious errors on other thread + * </ol> + */ + @VisibleForTesting + public static void runWithCurrentThreadAsMainThread(Runnable mainThreadWork) { + if (sMainLooper.isCurrentThread()) { + // Already on the main thread; just run + mainThreadWork.run(); + return; + } + Thread currentThread = Thread.currentThread(); + Thread originalThread = sTestThread; + if (originalThread == currentThread) { + // test thread is already set; just run + mainThreadWork.run(); + return; + } + if (originalThread != null) { + throw new AssertionError("Can't run with current thread (" + currentThread + + ") as main thread; test thread is already set to " + originalThread); + } + sTestThread = currentThread; + mainThreadWork.run(); + sTestThread = null; + } + public static void isMainThread() { if (!sMainLooper.isCurrentThread() && (sTestThread == null || sTestThread != Thread.currentThread())) { diff --git a/packages/SystemUI/monet/Android.bp b/packages/SystemUI/monet/Android.bp index 98f7aced7522..c54fdab4e77f 100644 --- a/packages/SystemUI/monet/Android.bp +++ b/packages/SystemUI/monet/Android.bp @@ -24,6 +24,7 @@ java_library { static_libs: [ "androidx.annotation_annotation", "androidx.core_core", + "libmonet", ], srcs: [ "src/**/*.java", diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt b/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt index 46a90f63431a..47a00f408460 100644 --- a/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt +++ b/packages/SystemUI/monet/src/com/android/systemui/monet/ColorScheme.kt @@ -20,11 +20,17 @@ import android.annotation.ColorInt import android.app.WallpaperColors import android.graphics.Color import com.android.internal.graphics.ColorUtils -import com.android.internal.graphics.cam.Cam -import com.android.internal.graphics.cam.CamUtils +import com.google.ux.material.libmonet.hct.Hct +import com.google.ux.material.libmonet.scheme.DynamicScheme +import com.google.ux.material.libmonet.scheme.SchemeContent +import com.google.ux.material.libmonet.scheme.SchemeExpressive +import com.google.ux.material.libmonet.scheme.SchemeFruitSalad +import com.google.ux.material.libmonet.scheme.SchemeMonochrome +import com.google.ux.material.libmonet.scheme.SchemeNeutral +import com.google.ux.material.libmonet.scheme.SchemeRainbow +import com.google.ux.material.libmonet.scheme.SchemeTonalSpot +import com.google.ux.material.libmonet.scheme.SchemeVibrant import kotlin.math.absoluteValue -import kotlin.math.max -import kotlin.math.min import kotlin.math.roundToInt const val TAG = "ColorScheme" @@ -33,347 +39,65 @@ const val ACCENT1_CHROMA = 48.0f const val GOOGLE_BLUE = 0xFF1b6ef3.toInt() const val MIN_CHROMA = 5 -internal interface Hue { - fun get(sourceColor: Cam): Double - - /** - * Given a hue, and a mapping of hues to hue rotations, find which hues in the mapping the hue - * fall betweens, and use the hue rotation of the lower hue. - * - * @param sourceHue hue of source color - * @param hueAndRotations list of pairs, where the first item in a pair is a hue, and the second - * item in the pair is a hue rotation that should be applied - */ - fun getHueRotation(sourceHue: Float, hueAndRotations: List<Pair<Int, Int>>): Double { - val sanitizedSourceHue = (if (sourceHue < 0 || sourceHue >= 360) 0 else sourceHue).toFloat() - for (i in 0..hueAndRotations.size - 2) { - val thisHue = hueAndRotations[i].first.toFloat() - val nextHue = hueAndRotations[i + 1].first.toFloat() - if (thisHue <= sanitizedSourceHue && sanitizedSourceHue < nextHue) { - return ColorScheme.wrapDegreesDouble( - sanitizedSourceHue.toDouble() + hueAndRotations[i].second - ) - } - } - - // If this statement executes, something is wrong, there should have been a rotation - // found using the arrays. - return sourceHue.toDouble() - } -} - -internal class HueSource : Hue { - override fun get(sourceColor: Cam): Double { - return sourceColor.hue.toDouble() - } -} - -internal class HueAdd(val amountDegrees: Double) : Hue { - override fun get(sourceColor: Cam): Double { - return ColorScheme.wrapDegreesDouble(sourceColor.hue.toDouble() + amountDegrees) - } -} - -internal class HueSubtract(val amountDegrees: Double) : Hue { - override fun get(sourceColor: Cam): Double { - return ColorScheme.wrapDegreesDouble(sourceColor.hue.toDouble() - amountDegrees) - } -} - -internal class HueVibrantSecondary() : Hue { - val hueToRotations = - listOf( - Pair(0, 18), - Pair(41, 15), - Pair(61, 10), - Pair(101, 12), - Pair(131, 15), - Pair(181, 18), - Pair(251, 15), - Pair(301, 12), - Pair(360, 12) - ) - - override fun get(sourceColor: Cam): Double { - return getHueRotation(sourceColor.hue, hueToRotations) - } -} - -internal class HueVibrantTertiary() : Hue { - val hueToRotations = - listOf( - Pair(0, 35), - Pair(41, 30), - Pair(61, 20), - Pair(101, 25), - Pair(131, 30), - Pair(181, 35), - Pair(251, 30), - Pair(301, 25), - Pair(360, 25) - ) - - override fun get(sourceColor: Cam): Double { - return getHueRotation(sourceColor.hue, hueToRotations) - } -} - -internal class HueExpressiveSecondary() : Hue { - val hueToRotations = - listOf( - Pair(0, 45), - Pair(21, 95), - Pair(51, 45), - Pair(121, 20), - Pair(151, 45), - Pair(191, 90), - Pair(271, 45), - Pair(321, 45), - Pair(360, 45) - ) - - override fun get(sourceColor: Cam): Double { - return getHueRotation(sourceColor.hue, hueToRotations) - } -} - -internal class HueExpressiveTertiary() : Hue { - val hueToRotations = - listOf( - Pair(0, 120), - Pair(21, 120), - Pair(51, 20), - Pair(121, 45), - Pair(151, 20), - Pair(191, 15), - Pair(271, 20), - Pair(321, 120), - Pair(360, 120) - ) - - override fun get(sourceColor: Cam): Double { - return getHueRotation(sourceColor.hue, hueToRotations) - } -} - -internal interface Chroma { - fun get(sourceColor: Cam): Double - - companion object { - val MAX_VALUE = 120.0 - val MIN_VALUE = 0.0 - } -} - -internal class ChromaMaxOut : Chroma { - override fun get(sourceColor: Cam): Double { - // Intentionally high. Gamut mapping from impossible HCT to sRGB will ensure that - // the maximum chroma is reached, even if lower than this constant. - return Chroma.MAX_VALUE + 10.0 - } -} - -internal class ChromaMultiple(val multiple: Double) : Chroma { - override fun get(sourceColor: Cam): Double { - return sourceColor.chroma * multiple - } -} - -internal class ChromaAdd(val amount: Double) : Chroma { - override fun get(sourceColor: Cam): Double { - return sourceColor.chroma + amount - } -} - -internal class ChromaBound( - val baseChroma: Chroma, - val minVal: Double, - val maxVal: Double, -) : Chroma { - override fun get(sourceColor: Cam): Double { - val result = baseChroma.get(sourceColor) - return min(max(result, minVal), maxVal) - } -} - -internal class ChromaConstant(val chroma: Double) : Chroma { - override fun get(sourceColor: Cam): Double { - return chroma - } -} - -internal class ChromaSource : Chroma { - override fun get(sourceColor: Cam): Double { - return sourceColor.chroma.toDouble() - } -} - -internal class TonalSpec(val hue: Hue = HueSource(), val chroma: Chroma) { - fun shades(sourceColor: Cam): List<Int> { - val hue = hue.get(sourceColor) - val chroma = chroma.get(sourceColor) - return Shades.of(hue.toFloat(), chroma.toFloat()).toList() - } - - fun getAtTone(sourceColor: Cam, tone: Float): Int { - val hue = hue.get(sourceColor) - val chroma = chroma.get(sourceColor) - return ColorUtils.CAMToColor(hue.toFloat(), chroma.toFloat(), (1000f - tone) / 10f) - } -} - -internal class CoreSpec( - val a1: TonalSpec, - val a2: TonalSpec, - val a3: TonalSpec, - val n1: TonalSpec, - val n2: TonalSpec -) - -enum class Style(internal val coreSpec: CoreSpec) { - SPRITZ( - CoreSpec( - a1 = TonalSpec(HueSource(), ChromaConstant(12.0)), - a2 = TonalSpec(HueSource(), ChromaConstant(8.0)), - a3 = TonalSpec(HueSource(), ChromaConstant(16.0)), - n1 = TonalSpec(HueSource(), ChromaConstant(2.0)), - n2 = TonalSpec(HueSource(), ChromaConstant(2.0)) - ) - ), - TONAL_SPOT( - CoreSpec( - a1 = TonalSpec(HueSource(), ChromaConstant(36.0)), - a2 = TonalSpec(HueSource(), ChromaConstant(16.0)), - a3 = TonalSpec(HueAdd(60.0), ChromaConstant(24.0)), - n1 = TonalSpec(HueSource(), ChromaConstant(6.0)), - n2 = TonalSpec(HueSource(), ChromaConstant(8.0)) - ) - ), - VIBRANT( - CoreSpec( - a1 = TonalSpec(HueSource(), ChromaMaxOut()), - a2 = TonalSpec(HueVibrantSecondary(), ChromaConstant(24.0)), - a3 = TonalSpec(HueVibrantTertiary(), ChromaConstant(32.0)), - n1 = TonalSpec(HueSource(), ChromaConstant(10.0)), - n2 = TonalSpec(HueSource(), ChromaConstant(12.0)) - ) - ), - EXPRESSIVE( - CoreSpec( - a1 = TonalSpec(HueAdd(240.0), ChromaConstant(40.0)), - a2 = TonalSpec(HueExpressiveSecondary(), ChromaConstant(24.0)), - a3 = TonalSpec(HueExpressiveTertiary(), ChromaConstant(32.0)), - n1 = TonalSpec(HueAdd(15.0), ChromaConstant(8.0)), - n2 = TonalSpec(HueAdd(15.0), ChromaConstant(12.0)) - ) - ), - RAINBOW( - CoreSpec( - a1 = TonalSpec(HueSource(), ChromaConstant(48.0)), - a2 = TonalSpec(HueSource(), ChromaConstant(16.0)), - a3 = TonalSpec(HueAdd(60.0), ChromaConstant(24.0)), - n1 = TonalSpec(HueSource(), ChromaConstant(0.0)), - n2 = TonalSpec(HueSource(), ChromaConstant(0.0)) - ) - ), - FRUIT_SALAD( - CoreSpec( - a1 = TonalSpec(HueSubtract(50.0), ChromaConstant(48.0)), - a2 = TonalSpec(HueSubtract(50.0), ChromaConstant(36.0)), - a3 = TonalSpec(HueSource(), ChromaConstant(36.0)), - n1 = TonalSpec(HueSource(), ChromaConstant(10.0)), - n2 = TonalSpec(HueSource(), ChromaConstant(16.0)) - ) - ), - CONTENT( - CoreSpec( - a1 = TonalSpec(HueSource(), ChromaSource()), - a2 = TonalSpec(HueSource(), ChromaMultiple(0.33)), - a3 = TonalSpec(HueSource(), ChromaMultiple(0.66)), - n1 = TonalSpec(HueSource(), ChromaMultiple(0.0833)), - n2 = TonalSpec(HueSource(), ChromaMultiple(0.1666)) - ) - ), - MONOCHROMATIC( - CoreSpec( - a1 = TonalSpec(HueSource(), ChromaConstant(.0)), - a2 = TonalSpec(HueSource(), ChromaConstant(.0)), - a3 = TonalSpec(HueSource(), ChromaConstant(.0)), - n1 = TonalSpec(HueSource(), ChromaConstant(.0)), - n2 = TonalSpec(HueSource(), ChromaConstant(.0)) - ) - ), - CLOCK( - CoreSpec( - a1 = TonalSpec(HueSource(), ChromaBound(ChromaSource(), 20.0, Chroma.MAX_VALUE)), - a2 = TonalSpec(HueAdd(10.0), ChromaBound(ChromaMultiple(0.85), 17.0, 40.0)), - a3 = TonalSpec(HueAdd(20.0), ChromaBound(ChromaAdd(20.0), 50.0, Chroma.MAX_VALUE)), - - // Not Used - n1 = TonalSpec(HueSource(), ChromaConstant(0.0)), - n2 = TonalSpec(HueSource(), ChromaConstant(0.0)) - ) - ), - CLOCK_VIBRANT( - CoreSpec( - a1 = TonalSpec(HueSource(), ChromaBound(ChromaSource(), 70.0, Chroma.MAX_VALUE)), - a2 = TonalSpec(HueAdd(20.0), ChromaBound(ChromaSource(), 70.0, Chroma.MAX_VALUE)), - a3 = TonalSpec(HueAdd(60.0), ChromaBound(ChromaSource(), 70.0, Chroma.MAX_VALUE)), - - // Not Used - n1 = TonalSpec(HueSource(), ChromaConstant(0.0)), - n2 = TonalSpec(HueSource(), ChromaConstant(0.0)) - ) - ) +enum class Style{ + SPRITZ, + TONAL_SPOT, + VIBRANT, + EXPRESSIVE, + RAINBOW, + FRUIT_SALAD, + CONTENT, + MONOCHROMATIC, + CLOCK, + CLOCK_VIBRANT } class TonalPalette internal constructor( - private val spec: TonalSpec, - seedColor: Int, + private val materialTonalPalette: com.google.ux.material.libmonet.palettes.TonalPalette ) { - val seedCam: Cam = Cam.fromInt(seedColor) - val allShades: List<Int> = spec.shades(seedCam) - val allShadesMapped: Map<Int, Int> = SHADE_KEYS.zip(allShades).toMap() - val baseColor: Int + @Deprecated("Do not use. For color system only") + val allShades: List<Int> + val allShadesMapped: Map<Int, Int> - init { - val h = spec.hue.get(seedCam).toFloat() - val c = spec.chroma.get(seedCam).toFloat() - baseColor = ColorUtils.CAMToColor(h, c, CamUtils.lstarFromInt(seedColor)) + init{ + allShades = SHADE_KEYS.map {key -> getAtTone(key.toFloat()) } + allShadesMapped = SHADE_KEYS.zip(allShades).toMap() } // Dynamically computed tones across the full range from 0 to 1000 - fun getAtTone(tone: Float) = spec.getAtTone(seedCam, tone) + fun getAtTone(shade: Float): Int = materialTonalPalette.tone(((1000.0f - shade) / 10f).toInt()) // Predefined & precomputed tones - val s10: Int + val s0: Int get() = this.allShades[0] - val s50: Int + val s10: Int get() = this.allShades[1] - val s100: Int + val s50: Int get() = this.allShades[2] - val s200: Int + val s100: Int get() = this.allShades[3] - val s300: Int + val s200: Int get() = this.allShades[4] - val s400: Int + val s300: Int get() = this.allShades[5] - val s500: Int + val s400: Int get() = this.allShades[6] - val s600: Int + val s500: Int get() = this.allShades[7] - val s700: Int + val s600: Int get() = this.allShades[8] - val s800: Int + val s700: Int get() = this.allShades[9] - val s900: Int + val s800: Int get() = this.allShades[10] - val s1000: Int + val s900: Int get() = this.allShades[11] + val s1000: Int + get() = this.allShades[12] companion object { - val SHADE_KEYS = listOf(10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000) + val SHADE_KEYS = listOf(0, 10, 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000) } } @@ -381,9 +105,20 @@ internal constructor( "instead") class ColorScheme( @ColorInt val seed: Int, - val darkTheme: Boolean, - val style: Style = Style.TONAL_SPOT + val isDark: Boolean, + val style: Style, + val contrastLevel: Double ) { + var materialScheme: DynamicScheme + + private val proposedSeedHct: Hct = Hct.fromInt(seed) + private val seedHct: Hct = Hct.fromInt(if (seed == Color.TRANSPARENT) { + GOOGLE_BLUE + } else if (style != Style.CONTENT && proposedSeedHct.chroma < 5) { + GOOGLE_BLUE + } else { + seed + }) val accent1: TonalPalette val accent2: TonalPalette @@ -395,62 +130,49 @@ class ColorScheme( @JvmOverloads constructor( + @ColorInt seed: Int, + darkTheme: Boolean, + style: Style + ) : this(seed, darkTheme, style, 0.5) + + @JvmOverloads + constructor( wallpaperColors: WallpaperColors, darkTheme: Boolean, style: Style = Style.TONAL_SPOT ) : this(getSeedColor(wallpaperColors, style != Style.CONTENT), darkTheme, style) - val allHues: List<TonalPalette> - get() { - return listOf(accent1, accent2, accent3, neutral1, neutral2) - } - - val allAccentColors: List<Int> - get() { - val allColors = mutableListOf<Int>() - allColors.addAll(accent1.allShades) - allColors.addAll(accent2.allShades) - allColors.addAll(accent3.allShades) - return allColors - } - - val allNeutralColors: List<Int> - get() { - val allColors = mutableListOf<Int>() - allColors.addAll(neutral1.allShades) - allColors.addAll(neutral2.allShades) - return allColors - } - val backgroundColor - get() = ColorUtils.setAlphaComponent(if (darkTheme) neutral1.s700 else neutral1.s10, 0xFF) + get() = ColorUtils.setAlphaComponent(if (isDark) neutral1.s700 else neutral1.s10, 0xFF) val accentColor - get() = ColorUtils.setAlphaComponent(if (darkTheme) accent1.s100 else accent1.s500, 0xFF) + get() = ColorUtils.setAlphaComponent(if (isDark) accent1.s100 else accent1.s500, 0xFF) init { - val proposedSeedCam = Cam.fromInt(seed) - val seedArgb = - if (seed == Color.TRANSPARENT) { - GOOGLE_BLUE - } else if (style != Style.CONTENT && proposedSeedCam.chroma < 5) { - GOOGLE_BLUE - } else { - seed - } + materialScheme = when (style) { + Style.SPRITZ -> SchemeNeutral(seedHct, isDark, contrastLevel) + Style.TONAL_SPOT -> SchemeTonalSpot(seedHct, isDark, contrastLevel) + Style.VIBRANT -> SchemeVibrant(seedHct, isDark, contrastLevel) + Style.EXPRESSIVE -> SchemeExpressive(seedHct, isDark, contrastLevel) + Style.RAINBOW -> SchemeRainbow(seedHct, isDark, contrastLevel) + Style.FRUIT_SALAD -> SchemeFruitSalad(seedHct, isDark, contrastLevel) + Style.CONTENT -> SchemeContent(seedHct, isDark, contrastLevel) + Style.MONOCHROMATIC -> SchemeMonochrome(seedHct, isDark, contrastLevel) + + // SystemUI Schemes + Style.CLOCK -> SchemeClock(seedHct, isDark, contrastLevel) + Style.CLOCK_VIBRANT -> SchemeClockVibrant(seedHct, isDark, contrastLevel) + } - accent1 = TonalPalette(style.coreSpec.a1, seedArgb) - accent2 = TonalPalette(style.coreSpec.a2, seedArgb) - accent3 = TonalPalette(style.coreSpec.a3, seedArgb) - neutral1 = TonalPalette(style.coreSpec.n1, seedArgb) - neutral2 = TonalPalette(style.coreSpec.n2, seedArgb) + accent1 = TonalPalette(materialScheme.primaryPalette) + accent2 = TonalPalette(materialScheme.secondaryPalette) + accent3 = TonalPalette(materialScheme.tertiaryPalette) + neutral1 = TonalPalette(materialScheme.neutralPalette) + neutral2 = TonalPalette(materialScheme.neutralVariantPalette) } - val shadeCount - get() = this.accent1.allShades.size - val seedTone: Float - get() = 1000f - CamUtils.lstarFromInt(seed) * 10f + get() = 1000f - proposedSeedHct.tone.toFloat() * 10f override fun toString(): String { return "ColorScheme {\n" + @@ -507,7 +229,7 @@ class ColorScheme( if (!filter) { true } else { - Cam.fromInt(it).chroma >= MIN_CHROMA + Hct.fromInt(it).chroma >= MIN_CHROMA } } .toList() @@ -519,15 +241,15 @@ class ColorScheme( val intToProportion = wallpaperColors.allColors.mapValues { it.value.toDouble() / totalPopulation } - val intToCam = wallpaperColors.allColors.mapValues { Cam.fromInt(it.key) } + val intToHct = wallpaperColors.allColors.mapValues { Hct.fromInt(it.key) } // Get an array with 360 slots. A slot contains the percentage of colors with that hue. - val hueProportions = huePopulations(intToCam, intToProportion, filter) + val hueProportions = huePopulations(intToHct, intToProportion, filter) // Map each color to the percentage of the image with its hue. val intToHueProportion = wallpaperColors.allColors.mapValues { - val cam = intToCam[it.key]!! - val hue = cam.hue.roundToInt() + val hct = intToHct[it.key]!! + val hue = hct.hue.roundToInt() var proportion = 0.0 for (i in hue - 15..hue + 15) { proportion += hueProportions[wrapDegrees(i)] @@ -537,18 +259,18 @@ class ColorScheme( // Remove any inappropriate seed colors. For example, low chroma colors look grayscale // raising their chroma will turn them to a much louder color that may not have been // in the image. - val filteredIntToCam = - if (!filter) intToCam + val filteredIntToHct = + if (!filter) intToHct else - (intToCam.filter { - val cam = it.value + (intToHct.filter { + val hct = it.value val proportion = intToHueProportion[it.key]!! - cam.chroma >= MIN_CHROMA && + hct.chroma >= MIN_CHROMA && (totalPopulationMeaningless || proportion > 0.01) }) // Sort the colors by score, from high to low. val intToScoreIntermediate = - filteredIntToCam.mapValues { score(it.value, intToHueProportion[it.key]!!) } + filteredIntToHct.mapValues { score(it.value, intToHueProportion[it.key]!!) } val intToScore = intToScoreIntermediate.entries.toMutableList() intToScore.sortByDescending { it.value } @@ -564,8 +286,8 @@ class ColorScheme( val int = entry.key val existingSeedNearby = seeds.find { - val hueA = intToCam[int]!!.hue - val hueB = intToCam[it]!!.hue + val hueA = intToHct[int]!!.hue + val hueB = intToHct[it]!!.hue hueDiff(hueA, hueB) < i } != null if (existingSeedNearby) { @@ -600,30 +322,16 @@ class ColorScheme( } } - public fun wrapDegreesDouble(degrees: Double): Double { - return when { - degrees < 0 -> { - (degrees % 360) + 360 - } - degrees >= 360 -> { - degrees % 360 - } - else -> { - degrees - } - } - } - - private fun hueDiff(a: Float, b: Float): Float { + private fun hueDiff(a: Double, b: Double): Double { return 180f - ((a - b).absoluteValue - 180f).absoluteValue } private fun stringForColor(color: Int): String { val width = 4 - val hct = Cam.fromInt(color) + val hct = Hct.fromInt(color) val h = "H${hct.hue.roundToInt().toString().padEnd(width)}" val c = "C${hct.chroma.roundToInt().toString().padEnd(width)}" - val t = "T${CamUtils.lstarFromInt(color).roundToInt().toString().padEnd(width)}" + val t = "T${hct.tone.roundToInt().toString().padEnd(width)}" val hex = Integer.toHexString(color and 0xffffff).padStart(6, '0').uppercase() return "$h$c$t = #$hex" } @@ -633,16 +341,16 @@ class ColorScheme( colors.map { stringForColor(it) }.joinToString(separator = "\n") { it } } - private fun score(cam: Cam, proportion: Double): Double { + private fun score(hct: Hct, proportion: Double): Double { val proportionScore = 0.7 * 100.0 * proportion val chromaScore = - if (cam.chroma < ACCENT1_CHROMA) 0.1 * (cam.chroma - ACCENT1_CHROMA) - else 0.3 * (cam.chroma - ACCENT1_CHROMA) + if (hct.chroma < ACCENT1_CHROMA) 0.1 * (hct.chroma - ACCENT1_CHROMA) + else 0.3 * (hct.chroma - ACCENT1_CHROMA) return chromaScore + proportionScore } private fun huePopulations( - camByColor: Map<Int, Cam>, + hctByColor: Map<Int, Hct>, populationByColor: Map<Int, Double>, filter: Boolean = true ): List<Double> { @@ -650,9 +358,9 @@ class ColorScheme( for (entry in populationByColor.entries) { val population = populationByColor[entry.key]!! - val cam = camByColor[entry.key]!! - val hue = cam.hue.roundToInt() % 360 - if (filter && cam.chroma <= MIN_CHROMA) { + val hct = hctByColor[entry.key]!! + val hue = hct.hue.roundToInt() % 360 + if (filter && hct.chroma <= MIN_CHROMA) { continue } huePopulation[hue] = huePopulation[hue] + population diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/SchemeClock.java b/packages/SystemUI/monet/src/com/android/systemui/monet/SchemeClock.java new file mode 100644 index 000000000000..4747cc5dbf9c --- /dev/null +++ b/packages/SystemUI/monet/src/com/android/systemui/monet/SchemeClock.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.monet; + +import static com.google.ux.material.libmonet.utils.MathUtils.clampDouble; + +import static java.lang.Double.max; + +import com.google.ux.material.libmonet.hct.Hct; +import com.google.ux.material.libmonet.palettes.TonalPalette; +import com.google.ux.material.libmonet.scheme.DynamicScheme; +import com.google.ux.material.libmonet.scheme.Variant; + +public class SchemeClock extends DynamicScheme { + public SchemeClock(Hct sourceColorHct, boolean isDark, double contrastLevel) { + super( + sourceColorHct, + Variant.MONOCHROME, + isDark, + contrastLevel, + /*primary*/ + TonalPalette.fromHueAndChroma( + /*hue*/ sourceColorHct.getHue(), + /*chroma*/ max(sourceColorHct.getChroma(), 20) + ), + /*secondary*/ + TonalPalette.fromHueAndChroma( + /*hue*/ sourceColorHct.getHue() + 10.0, + /*chroma*/ clampDouble(17, 40, sourceColorHct.getChroma() * 0.85) + ), + /*tertiary*/ + TonalPalette.fromHueAndChroma( + /*hue*/ sourceColorHct.getHue() + 20.0, + /*chroma*/ max(sourceColorHct.getChroma() + 20, 50) + ), + + //not used + TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 0.0), + TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 0.0)); + } +} diff --git a/packages/SystemUI/monet/src/com/android/systemui/monet/SchemeClockVibrant.java b/packages/SystemUI/monet/src/com/android/systemui/monet/SchemeClockVibrant.java new file mode 100644 index 000000000000..fb5e972434af --- /dev/null +++ b/packages/SystemUI/monet/src/com/android/systemui/monet/SchemeClockVibrant.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.monet; + +import static java.lang.Double.max; + +import com.google.ux.material.libmonet.hct.Hct; +import com.google.ux.material.libmonet.palettes.TonalPalette; +import com.google.ux.material.libmonet.scheme.DynamicScheme; +import com.google.ux.material.libmonet.scheme.Variant; + +public class SchemeClockVibrant extends DynamicScheme { + public SchemeClockVibrant(Hct sourceColorHct, boolean isDark, double contrastLevel) { + super( + sourceColorHct, + Variant.MONOCHROME, + isDark, + contrastLevel, + /*primary*/ + TonalPalette.fromHueAndChroma( + /*hue*/ sourceColorHct.getHue(), + /*chroma*/ max(sourceColorHct.getChroma(), 70) + ), + /*secondary*/ + TonalPalette.fromHueAndChroma( + /*hue*/ sourceColorHct.getHue() + 20.0, + /*chroma*/ max(sourceColorHct.getChroma(), 70) + ), + /*tertiary*/ + TonalPalette.fromHueAndChroma( + /*hue*/ sourceColorHct.getHue() + 60.0, + /*chroma*/ max(sourceColorHct.getChroma(), 70) + ), + + //not used + TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 0.0), + TonalPalette.fromHueAndChroma(sourceColorHct.getHue(), 0.0)); + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelTest.kt new file mode 100644 index 000000000000..02d927a0e5ab --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelTest.kt @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.ui.viewmodel + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository +import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.kosmos.testScope +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class CommunalTransitionViewModelTest : SysuiTestCase() { + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + + val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository + + private lateinit var underTest: CommunalTransitionViewModel + + @Before + fun setup() { + underTest = kosmos.communalTransitionViewModel + } + + @Test + fun testIsUmoOnCommunalDuringTransitionBetweenLockscreenAndGlanceableHub() = + testScope.runTest { + val isUmoOnCommunal by collectLastValue(underTest.isUmoOnCommunal) + assertThat(isUmoOnCommunal).isNull() + + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.LOCKSCREEN, + to = KeyguardState.GLANCEABLE_HUB, + testScope + ) + assertThat(isUmoOnCommunal).isTrue() + + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.GLANCEABLE_HUB, + to = KeyguardState.LOCKSCREEN, + testScope + ) + assertThat(isUmoOnCommunal).isFalse() + } + + @Test + fun testIsUmoOnCommunalDuringTransitionBetweenDreamingAndGlanceableHub() = + testScope.runTest { + val isUmoOnCommunal by collectLastValue(underTest.isUmoOnCommunal) + assertThat(isUmoOnCommunal).isNull() + + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.DREAMING, + to = KeyguardState.GLANCEABLE_HUB, + testScope + ) + assertThat(isUmoOnCommunal).isTrue() + + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.GLANCEABLE_HUB, + to = KeyguardState.DREAMING, + testScope + ) + assertThat(isUmoOnCommunal).isFalse() + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToLockscreenTransitionViewModelTest.kt index af9678022e07..1aa1ec4c22a2 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToLockscreenTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToLockscreenTransitionViewModelTest.kt @@ -50,7 +50,7 @@ class GlanceableHubToLockscreenTransitionViewModelTest : SysuiTestCase() { fun lockscreenFadeIn() = testScope.runTest { val values by collectValues(underTest.keyguardAlpha) - assertThat(values).containsExactly(0f) + assertThat(values).isEmpty() keyguardTransitionRepository.sendTransitionSteps( listOf( @@ -70,7 +70,7 @@ class GlanceableHubToLockscreenTransitionViewModelTest : SysuiTestCase() { testScope, ) - assertThat(values).hasSize(5) + assertThat(values).hasSize(4) values.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt index 6e15c51e8782..fc604aa5a1d2 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelTest.kt @@ -348,6 +348,48 @@ class KeyguardRootViewModelTest : SysuiTestCase() { } @Test + fun alpha_shadeClosedOverLockscreen_isOne() = + testScope.runTest { + val alpha by collectLastValue(underTest.alpha(viewState)) + + // Transition to the lockscreen. + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.AOD, + to = KeyguardState.LOCKSCREEN, + testScope, + ) + + // Open the shade. + shadeRepository.setQsExpansion(1f) + assertThat(alpha).isEqualTo(0f) + + // Close the shade, alpha returns to 1. + shadeRepository.setQsExpansion(0f) + assertThat(alpha).isEqualTo(1f) + } + + @Test + fun alpha_shadeClosedOverDream_isZero() = + testScope.runTest { + val alpha by collectLastValue(underTest.alpha(viewState)) + + // Transition to dreaming. + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.LOCKSCREEN, + to = KeyguardState.DREAMING, + testScope, + ) + + // Open the shade. + shadeRepository.setQsExpansion(1f) + assertThat(alpha).isEqualTo(0f) + + // Close the shade, alpha is still 0 since we're not on the lockscreen. + shadeRepository.setQsExpansion(0f) + assertThat(alpha).isEqualTo(0f) + } + + @Test fun alpha_idleOnOccluded_isZero() = testScope.runTest { val alpha by collectLastValue(underTest.alpha(viewState)) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelTest.kt index ad1cef1c1e92..751ac1d8b458 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelTest.kt @@ -26,7 +26,8 @@ import com.android.systemui.flags.fakeFeatureFlagsClassic import com.android.systemui.keyguard.data.repository.fakeKeyguardClockRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope -import com.android.systemui.res.R +import com.android.systemui.shade.data.repository.shadeRepository +import com.android.systemui.shade.shared.model.ShadeMode import com.android.systemui.testKosmos import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat @@ -47,7 +48,7 @@ class LockscreenContentViewModelTest : SysuiTestCase() { fun setup() { with(kosmos) { fakeFeatureFlagsClassic.set(Flags.LOCK_SCREEN_LONG_PRESS_ENABLED, true) - overrideResource(R.bool.config_use_split_notification_shade, false) + shadeRepository.setShadeMode(ShadeMode.Single) underTest = lockscreenContentViewModel } } @@ -92,10 +93,10 @@ class LockscreenContentViewModelTest : SysuiTestCase() { fun areNotificationsVisible_splitShadeTrue_true() = with(kosmos) { testScope.runTest { - overrideResource(R.bool.config_use_split_notification_shade, true) + shadeRepository.setShadeMode(ShadeMode.Split) kosmos.fakeKeyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) - assertThat(underTest.areNotificationsVisible(context.resources)).isTrue() + assertThat(underTest.areNotificationsVisible).isTrue() } } @Test @@ -103,7 +104,7 @@ class LockscreenContentViewModelTest : SysuiTestCase() { with(kosmos) { testScope.runTest { kosmos.fakeKeyguardClockRepository.setClockSize(KeyguardClockSwitch.SMALL) - assertThat(underTest.areNotificationsVisible(context.resources)).isTrue() + assertThat(underTest.areNotificationsVisible).isTrue() } } @@ -112,7 +113,34 @@ class LockscreenContentViewModelTest : SysuiTestCase() { with(kosmos) { testScope.runTest { kosmos.fakeKeyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) - assertThat(underTest.areNotificationsVisible(context.resources)).isFalse() + assertThat(underTest.areNotificationsVisible).isFalse() + } + } + + @Test + fun shouldUseSplitNotificationShade_withConfigTrue_true() = + with(kosmos) { + testScope.runTest { + shadeRepository.setShadeMode(ShadeMode.Split) + assertThat(underTest.shouldUseSplitNotificationShade).isTrue() + } + } + + @Test + fun shouldUseSplitNotificationShade_withConfigFalse_false() = + with(kosmos) { + testScope.runTest { + shadeRepository.setShadeMode(ShadeMode.Single) + assertThat(underTest.shouldUseSplitNotificationShade).isFalse() + } + } + + @Test + fun sceneKey() = + with(kosmos) { + testScope.runTest { + shadeRepository.setShadeMode(ShadeMode.Single) + assertThat(underTest.shouldUseSplitNotificationShade).isFalse() } } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGlanceableHubTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGlanceableHubTransitionViewModelTest.kt index 241d0b818193..68a7b7e3d384 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGlanceableHubTransitionViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGlanceableHubTransitionViewModelTest.kt @@ -50,7 +50,7 @@ class LockscreenToGlanceableHubTransitionViewModelTest : SysuiTestCase() { fun lockscreenFadeOut() = testScope.runTest { val values by collectValues(underTest.keyguardAlpha) - assertThat(values).containsExactly(1f) + assertThat(values).isEmpty() keyguardTransitionRepository.sendTransitionSteps( listOf( @@ -71,7 +71,7 @@ class LockscreenToGlanceableHubTransitionViewModelTest : SysuiTestCase() { testScope, ) - assertThat(values).hasSize(4) + assertThat(values).hasSize(3) values.forEach { assertThat(it).isIn(Range.closed(0f, 1f)) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractorTest.kt index 37ef6ad17a64..769a54aee862 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileDataInteractorTest.kt @@ -127,31 +127,15 @@ class InternetTileDataInteractorTest : SysuiTestCase() { context.orCreateTestableResources.apply { addOverride(com.android.internal.R.drawable.ic_signal_cellular, TestStubDrawable()) - addOverride( - com.android.settingslib.R.drawable.ic_no_internet_wifi_signal_0, - TestStubDrawable() - ) - addOverride( - com.android.settingslib.R.drawable.ic_no_internet_wifi_signal_1, - TestStubDrawable() - ) - addOverride( - com.android.settingslib.R.drawable.ic_no_internet_wifi_signal_2, - TestStubDrawable() - ) - addOverride( - com.android.settingslib.R.drawable.ic_no_internet_wifi_signal_3, - TestStubDrawable() - ) - addOverride( - com.android.settingslib.R.drawable.ic_no_internet_wifi_signal_4, - TestStubDrawable() - ) addOverride(com.android.settingslib.R.drawable.ic_hotspot_phone, TestStubDrawable()) addOverride(com.android.settingslib.R.drawable.ic_hotspot_laptop, TestStubDrawable()) addOverride(com.android.settingslib.R.drawable.ic_hotspot_tablet, TestStubDrawable()) addOverride(com.android.settingslib.R.drawable.ic_hotspot_watch, TestStubDrawable()) addOverride(com.android.settingslib.R.drawable.ic_hotspot_auto, TestStubDrawable()) + + WifiIcons.WIFI_NO_INTERNET_ICONS.forEach { iconId -> + addOverride(iconId, TestStubDrawable()) + } } underTest = diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt index 47918c8c1b3d..2689fc111142 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationStackAppearanceIntegrationTest.kt @@ -97,6 +97,8 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { sceneInteractor.setTransitionState(transitionState) val expandFraction by collectLastValue(appearanceViewModel.expandFraction) assertThat(expandFraction).isEqualTo(0f) + val isScrollable by collectLastValue(appearanceViewModel.isScrollable) + assertThat(isScrollable).isFalse() fakeSceneDataSource.pause() sceneInteractor.changeScene(Scenes.Shade, "reason") @@ -119,6 +121,7 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { fakeSceneDataSource.unpause(expectedScene = Scenes.Shade) assertThat(expandFraction).isWithin(0.01f).of(1f) + assertThat(isScrollable).isTrue() } @Test @@ -131,6 +134,8 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { sceneInteractor.setTransitionState(transitionState) val expandFraction by collectLastValue(appearanceViewModel.expandFraction) assertThat(expandFraction).isEqualTo(1f) + val isScrollable by collectLastValue(appearanceViewModel.isScrollable) + assertThat(isScrollable).isFalse() } @Test @@ -144,7 +149,12 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { val expandFraction by collectLastValue(appearanceViewModel.expandFraction) assertThat(expandFraction).isEqualTo(1f) + fakeSceneDataSource.changeScene(toScene = Scenes.Shade) + val isScrollable by collectLastValue(appearanceViewModel.isScrollable) + assertThat(isScrollable).isTrue() + fakeSceneDataSource.pause() + sceneInteractor.changeScene(Scenes.QuickSettings, "reason") val transitionProgress = MutableStateFlow(0f) transitionState.value = @@ -165,5 +175,6 @@ class NotificationStackAppearanceIntegrationTest : SysuiTestCase() { fakeSceneDataSource.unpause(expectedScene = Scenes.QuickSettings) assertThat(expandFraction).isEqualTo(1f) + assertThat(isScrollable).isFalse() } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt index 183a58a495a3..be63301e5749 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/AvalancheControllerTest.kt @@ -25,6 +25,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.log.logcatLogBuffer import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder import com.android.systemui.statusbar.notification.shared.NotificationThrottleHun +import com.android.systemui.statusbar.policy.HeadsUpManagerTestUtil.createFullScreenIntentEntry import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.settings.FakeGlobalSettings import com.android.systemui.util.time.FakeSystemClock @@ -97,6 +98,12 @@ class AvalancheControllerTest : SysuiTestCase() { return entry } + private fun createFsiHeadsUpEntry(id: Int): BaseHeadsUpManager.HeadsUpEntry { + val entry = testableHeadsUpManager!!.createHeadsUpEntry() + entry.setEntry(createFullScreenIntentEntry(id, mContext)) + return entry + } + @Test fun testUpdate_isShowing_runsRunnable() { // Entry is showing @@ -238,4 +245,68 @@ class AvalancheControllerTest : SysuiTestCase() { // Next entry is shown Truth.assertThat(mAvalancheController.headsUpEntryShowing).isEqualTo(nextEntry) } + + @Test + fun testGetDurationMs_lastEntry_useAutoDismissTime() { + // Entry is showing + val showingEntry = createHeadsUpEntry(id = 0) + mAvalancheController.headsUpEntryShowing = showingEntry + + // Nothing is next + mAvalancheController.clearNext() + + val durationMs = mAvalancheController.getDurationMs(showingEntry, autoDismissMs = 5000) + Truth.assertThat(durationMs).isEqualTo(5000) + } + + @Test + fun testGetDurationMs_nextEntryLowerPriority_500() { + // Entry is showing + val showingEntry = createFsiHeadsUpEntry(id = 1) + mAvalancheController.headsUpEntryShowing = showingEntry + + // There's another entry waiting to show next + val nextEntry = createHeadsUpEntry(id = 0) + mAvalancheController.addToNext(nextEntry, runnableMock!!) + + // Next entry has lower priority + Truth.assertThat(nextEntry.compareNonTimeFields(showingEntry)).isEqualTo(1) + + val durationMs = mAvalancheController.getDurationMs(showingEntry, autoDismissMs = 5000) + Truth.assertThat(durationMs).isEqualTo(5000) + } + + @Test + fun testGetDurationMs_nextEntrySamePriority_1000() { + // Entry is showing + val showingEntry = createHeadsUpEntry(id = 0) + mAvalancheController.headsUpEntryShowing = showingEntry + + // There's another entry waiting to show next + val nextEntry = createHeadsUpEntry(id = 1) + mAvalancheController.addToNext(nextEntry, runnableMock!!) + + // Same priority + Truth.assertThat(nextEntry.compareNonTimeFields(showingEntry)).isEqualTo(0) + + val durationMs = mAvalancheController.getDurationMs(showingEntry, autoDismissMs = 5000) + Truth.assertThat(durationMs).isEqualTo(1000) + } + + @Test + fun testGetDurationMs_nextEntryHigherPriority_500() { + // Entry is showing + val showingEntry = createHeadsUpEntry(id = 0) + mAvalancheController.headsUpEntryShowing = showingEntry + + // There's another entry waiting to show next + val nextEntry = createFsiHeadsUpEntry(id = 1) + mAvalancheController.addToNext(nextEntry, runnableMock!!) + + // Next entry has higher priority + Truth.assertThat(nextEntry.compareNonTimeFields(showingEntry)).isEqualTo(-1) + + val durationMs = mAvalancheController.getDurationMs(showingEntry, autoDismissMs = 5000) + Truth.assertThat(durationMs).isEqualTo(500) + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/BaseHeadsUpManagerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/BaseHeadsUpManagerTest.java index 830bcef55046..ed0d272cd848 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/BaseHeadsUpManagerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/BaseHeadsUpManagerTest.java @@ -117,21 +117,6 @@ public class BaseHeadsUpManagerTest extends SysuiTestCase { return HeadsUpManagerTestUtil.createEntry(id, notif); } - private PendingIntent createFullScreenIntent() { - return PendingIntent.getActivity( - getContext(), 0, new Intent(getContext(), this.getClass()), - PendingIntent.FLAG_MUTABLE_UNAUDITED); - } - - private NotificationEntry createFullScreenIntentEntry(int id) { - final Notification notif = new Notification.Builder(mContext, "") - .setSmallIcon(R.drawable.ic_person) - .setFullScreenIntent(createFullScreenIntent(), /* highPriority */ true) - .build(); - return HeadsUpManagerTestUtil.createEntry(id, notif); - } - - private void useAccessibilityTimeout(boolean use) { if (use) { doReturn(TEST_A11Y_AUTO_DISMISS_TIME).when(mAccessibilityMgr) @@ -239,7 +224,8 @@ public class BaseHeadsUpManagerTest extends SysuiTestCase { @Test public void testShouldHeadsUpBecomePinned_hasFSI_notUnpinned_true() { final BaseHeadsUpManager hum = createHeadsUpManager(); - final NotificationEntry notifEntry = createFullScreenIntentEntry(/* id = */ 0); + final NotificationEntry notifEntry = + HeadsUpManagerTestUtil.createFullScreenIntentEntry(/* id = */ 0, mContext); // Add notifEntry to ANM mAlertEntries map and make it NOT unpinned hum.showNotification(notifEntry); @@ -254,7 +240,8 @@ public class BaseHeadsUpManagerTest extends SysuiTestCase { @Test public void testShouldHeadsUpBecomePinned_wasUnpinned_false() { final BaseHeadsUpManager hum = createHeadsUpManager(); - final NotificationEntry notifEntry = createFullScreenIntentEntry(/* id = */ 0); + final NotificationEntry notifEntry = + HeadsUpManagerTestUtil.createFullScreenIntentEntry(/* id = */ 0, mContext); // Add notifEntry to ANM mAlertEntries map and make it unpinned hum.showNotification(notifEntry); @@ -443,7 +430,8 @@ public class BaseHeadsUpManagerTest extends SysuiTestCase { @Test public void testIsSticky_hasFullScreenIntent_true() { final BaseHeadsUpManager hum = createHeadsUpManager(); - final NotificationEntry notifEntry = createFullScreenIntentEntry(/* id = */ 0); + final NotificationEntry notifEntry = + HeadsUpManagerTestUtil.createFullScreenIntentEntry(/* id = */ 0, mContext); hum.showNotification(notifEntry); @@ -554,7 +542,8 @@ public class BaseHeadsUpManagerTest extends SysuiTestCase { // Needs full screen intent in order to be pinned final BaseHeadsUpManager.HeadsUpEntry entryToPin = hum.new HeadsUpEntry(); - entryToPin.setEntry(createFullScreenIntentEntry(/* id = */ 0)); + entryToPin.setEntry( + HeadsUpManagerTestUtil.createFullScreenIntentEntry(/* id = */ 0, mContext)); // Note: the standard way to show a notification would be calling showNotification rather // than onAlertEntryAdded. However, in practice showNotification in effect adds diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerTestUtil.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerTestUtil.java index c70b03b08789..bda86197d3bd 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerTestUtil.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/HeadsUpManagerTestUtil.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.policy; import android.app.ActivityManager; +import android.app.PendingIntent; +import android.content.Intent; import android.os.UserHandle; import android.content.Context; @@ -67,4 +69,16 @@ public class HeadsUpManagerTestUtil { return new NotificationEntryBuilder().setSbn( HeadsUpManagerTestUtil.createSbn(id, context)).build(); } + + protected static NotificationEntry createFullScreenIntentEntry(int id, Context context) { + final PendingIntent intent = PendingIntent.getActivity( + context, 0, new Intent(), + PendingIntent.FLAG_IMMUTABLE); + + final Notification notif = new Notification.Builder(context, "") + .setSmallIcon(com.android.systemui.res.R.drawable.ic_person) + .setFullScreenIntent(intent, /* highPriority */ true) + .build(); + return HeadsUpManagerTestUtil.createEntry(id, notif); + } } diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml index 3b2eb15956e4..b4d89ab3ae48 100644 --- a/packages/SystemUI/res-keyguard/values-af/strings.xml +++ b/packages/SystemUI/res-keyguard/values-af/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Gebruik eerder ’n patroon vir bykomende sekuriteit"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Gebruik eerder ’n PIN vir bykomende sekuriteit"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Gebruik eerder ’n wagwoord vir bykomende sekuriteit"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Toestel is deur administrateur gesluit"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Toestel is handmatig gesluit"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nie herken nie"</string> diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml index c3d141c36a53..bfe918f50039 100644 --- a/packages/SystemUI/res-keyguard/values-am/strings.xml +++ b/packages/SystemUI/res-keyguard/values-am/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ለተጨማሪ ደህንነት በምትኩ ስርዓተ ጥለት ይጠቀሙ"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ለተጨማሪ ደህንነት በምትኩ ፒን ይጠቀሙ"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ለተጨማሪ ደህንነት በምትኩ የይለፍ ቃል ይጠቀሙ"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"መሣሪያ በአስተዳዳሪ ተቆልፏል"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"መሣሪያ በተጠቃሚው ራሱ ተቆልፏል"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"አልታወቀም"</string> diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml index cf8341dfd44f..e4dc86dcc01b 100644 --- a/packages/SystemUI/res-keyguard/values-ar/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"لمزيد من الأمان، استخدِم النقش بدلاً من ذلك."</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"لمزيد من الأمان، أدخِل رقم التعريف الشخصي بدلاً من ذلك."</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"لمزيد من الأمان، أدخِل كلمة المرور بدلاً من ذلك."</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"اختار المشرف قفل الجهاز"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"تم حظر الجهاز يدويًا"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"لم يتم التعرّف عليه."</string> diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml index d11a9c182cf3..7a12aef5a980 100644 --- a/packages/SystemUI/res-keyguard/values-as/strings.xml +++ b/packages/SystemUI/res-keyguard/values-as/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"অতিৰিক্ত সুৰক্ষাৰ বাবে, ইয়াৰ পৰিৱৰ্তে আৰ্হি ব্যৱহাৰ কৰক"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"অতিৰিক্ত সুৰক্ষাৰ বাবে, ইয়াৰ পৰিৱৰ্তে পিন ব্যৱহাৰ কৰক"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"অতিৰিক্ত সুৰক্ষাৰ বাবে, ইয়াৰ পৰিৱৰ্তে পাছৱৰ্ড ব্যৱহাৰ কৰক"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"প্ৰশাসকে ডিভাইচ লক কৰি ৰাখিছে"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ডিভাইচটো মেনুৱেলভাৱে লক কৰা হৈছিল"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"চিনাক্ত কৰিব পৰা নাই"</string> diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml index 4de32d91b817..ba07b2719b56 100644 --- a/packages/SystemUI/res-keyguard/values-az/strings.xml +++ b/packages/SystemUI/res-keyguard/values-az/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Əlavə təhlükəsizlik üçün modeldən istifadə edin"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Əlavə təhlükəsizlik üçün PIN istifadə edin"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Əlavə təhlükəsizlik üçün paroldan istifadə edin"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Cihaz admin tərəfindən kilidlənib"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Cihaz əl ilə kilidləndi"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Tanınmır"</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 d23ff41e761a..9d6fdfa14ebe 100644 --- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Za dodatnu bezbednost koristite šablon"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Za dodatnu bezbednost koristite PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Za dodatnu bezbednost koristite lozinku"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administrator je zaključao uređaj"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznat"</string> diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml index e704c3c84583..0a27f5e7cfd3 100644 --- a/packages/SystemUI/res-keyguard/values-be/strings.xml +++ b/packages/SystemUI/res-keyguard/values-be/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"У мэтах дадатковай бяспекі скарыстайце ўзор разблакіроўкі"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"У мэтах дадатковай бяспекі скарыстайце PIN-код"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"У мэтах дадатковай бяспекі скарыстайце пароль"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Прылада заблакіравана адміністратарам"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Прылада была заблакіравана ўручную"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Не распазнана"</string> diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml index 795d4b83c857..ea3cbcff8dbe 100644 --- a/packages/SystemUI/res-keyguard/values-bg/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml @@ -111,6 +111,9 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"За допълнителна сигурност използвайте фигура вместо това"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"За допълнителна сигурност използвайте ПИН код вместо това"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"За допълнителна сигурност използвайте парола вместо това"</string> + <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"За допълнителна сигурност се изисква ПИН код"</string> + <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"За допълнителна сигурност се изисква фигура"</string> + <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"За допълнителна сигурност се изисква парола"</string> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Устройството е заключено от администратора"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Устройството бе заключено ръчно"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Не е разпознато"</string> diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml index e333ddd1ea4a..8fa334ddd1a0 100644 --- a/packages/SystemUI/res-keyguard/values-bn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"অতিরিক্ত সুরক্ষার জন্য, এর বদলে প্যাটার্ন ব্যবহার করুন"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"অতিরিক্ত সুরক্ষার জন্য, এর বদলে পিন ব্যবহার করুন"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"অতিরিক্ত সুরক্ষার জন্য, এর বদলে পাসওয়ার্ড ব্যবহার করুন"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"প্রশাসক ডিভাইসটি লক করেছেন"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ডিভাইসটিকে ম্যানুয়ালি লক করা হয়েছে"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"শনাক্ত করা যায়নি"</string> diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml index 75fe286dfe2f..7290a6011d06 100644 --- a/packages/SystemUI/res-keyguard/values-bs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Radi dodatne zaštite, umjesto toga koristite uzorak"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Radi dodatne zaštite, umjesto toga koristite PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Radi dodatne zašitite, umjesto toga koristite lozinku"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Uređaj je zaključao administrator"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznato"</string> diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml index 4047d7ca662a..1b91b099e3fa 100644 --- a/packages/SystemUI/res-keyguard/values-ca/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Per a més seguretat, utilitza el patró"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Per a més seguretat, utilitza el PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Per a més seguretat, utilitza la contrasenya"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"L\'administrador ha bloquejat el dispositiu"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositiu s\'ha bloquejat manualment"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"No s\'ha reconegut"</string> diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml index ea9a68367652..c62e9ddeb8e4 100644 --- a/packages/SystemUI/res-keyguard/values-cs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Z bezpečnostních důvodů raději použijte gesto"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Z bezpečnostních důvodů raději použijte PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Z bezpečnostních důvodů raději použijte heslo"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Zařízení je uzamknuto administrátorem"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Zařízení bylo ručně uzamčeno"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nerozpoznáno"</string> diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml index 8794bc051f27..f776d2e10076 100644 --- a/packages/SystemUI/res-keyguard/values-da/strings.xml +++ b/packages/SystemUI/res-keyguard/values-da/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Øg sikkerheden ved at bruge dit oplåsningsmønter i stedet"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Øg sikkerheden ved at bruge din pinkode i stedet"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Øg sikkerheden ved at bruge din adgangskode i stedet"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Enheden er blevet låst af administratoren"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheden blev låst manuelt"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ikke genkendt"</string> diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml index 9e80b741c87d..633eab558b44 100644 --- a/packages/SystemUI/res-keyguard/values-de/strings.xml +++ b/packages/SystemUI/res-keyguard/values-de/strings.xml @@ -111,6 +111,12 @@ <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> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Gerät vom Administrator gesperrt"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Gerät manuell gesperrt"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nicht erkannt"</string> diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml index b7d32501a8c0..4f69be150bba 100644 --- a/packages/SystemUI/res-keyguard/values-el/strings.xml +++ b/packages/SystemUI/res-keyguard/values-el/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Για πρόσθετη ασφάλεια, χρησιμοποιήστε εναλλακτικά μοτίβο"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Για πρόσθετη ασφάλεια, χρησιμοποιήστε εναλλακτικά PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Για πρόσθετη ασφάλεια, χρησιμοποιήστε εναλλακτικά κωδικό πρόσβασης"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Η συσκευή κλειδώθηκε από τον διαχειριστή"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Η συσκευή κλειδώθηκε με μη αυτόματο τρόπο"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Δεν αναγνωρίστηκε"</string> diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml index d0461c1a56bb..f9ed76487897 100644 --- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"For additional security, use pattern instead"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"For additional security, use PIN instead"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"For additional security, use password instead"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string> diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml index cb13fd578b7b..3cc7cff4df47 100644 --- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml @@ -111,6 +111,9 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"For additional security, use pattern instead"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"For additional security, use PIN instead"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"For additional security, use password instead"</string> + <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN required for additional security"</string> + <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Pattern required for additional security"</string> + <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Password required for additional security"</string> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognized"</string> diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml index d0461c1a56bb..f9ed76487897 100644 --- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"For additional security, use pattern instead"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"For additional security, use PIN instead"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"For additional security, use password instead"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string> diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml index d0461c1a56bb..f9ed76487897 100644 --- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"For additional security, use pattern instead"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"For additional security, use PIN instead"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"For additional security, use password instead"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognised"</string> diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml index 188acd63e22a..cfa7c7e1ee06 100644 --- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml @@ -111,6 +111,9 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"For additional security, use pattern instead"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"For additional security, use PIN instead"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"For additional security, use password instead"</string> + <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"PIN required for additional security"</string> + <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Pattern required for additional security"</string> + <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Password required for additional security"</string> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Device locked by admin"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Device was locked manually"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Not recognized"</string> diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index 43aea8da6670..5da50fd68917 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para seguridad adicional, usa un patrón"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para seguridad adicional, usa un PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para seguridad adicional, usa una contraseña"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado por el administrador"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositivo se bloqueó de forma manual"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"No se reconoció"</string> diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index 9022a3d44474..9a67b07c01dd 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para mayor seguridad, usa el patrón"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para mayor seguridad, usa el PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para mayor seguridad, usa la contraseña"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado por el administrador"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"El dispositivo se ha bloqueado manualmente"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"No se reconoce"</string> diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml index c0d5e2f23f35..446b92764973 100644 --- a/packages/SystemUI/res-keyguard/values-et/strings.xml +++ b/packages/SystemUI/res-keyguard/values-et/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Kasutage tugevama turvalisuse huvides hoopis mustrit"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Kasutage tugevama turvalisuse huvides hoopis PIN-koodi"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Kasutage tugevama turvalisuse huvides hoopis parooli"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administraator lukustas seadme"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Seade lukustati käsitsi"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ei tuvastatud"</string> diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml index c9ac7e921e7b..ad20008114ad 100644 --- a/packages/SystemUI/res-keyguard/values-eu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Babestuago egoteko, erabili eredua"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Babestuago egoteko, erabili PINa"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Babestuago egoteko, erabili pasahitza"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administratzaileak blokeatu egin du gailua"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Eskuz blokeatu da gailua"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ez da ezagutu"</string> diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml index b1b1f8a5277c..087e45fd6da0 100644 --- a/packages/SystemUI/res-keyguard/values-fa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"برای امنیت بیشتر، بهجای آن از الگو استفاده کنید"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"برای امنیت بیشتر، بهجای آن از پین استفاده کنید"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"برای امنیت بیشتر، بهجای آن از گذرواژه استفاده کنید"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"دستگاه توسط سرپرست سیستم قفل شده است"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"دستگاه بهصورت دستی قفل شده است"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"شناسایی نشد"</string> diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml index f5a67594ced0..b5e8fb564293 100644 --- a/packages/SystemUI/res-keyguard/values-fi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Lisäsuojaa saat, kun käytät sen sijaan kuviota"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Lisäsuojaa saat, kun käytät sen sijaan PIN-koodia"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Lisäsuojaa saat, kun käytät sen sijaan salasanaa"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Järjestelmänvalvoja lukitsi laitteen."</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Laite lukittiin manuaalisesti"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ei tunnistettu"</string> diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index bca8dd7909a7..ea6107028f0d 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Pour plus de sécurité, utilisez plutôt un schéma"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Pour plus de sécurité, utilisez plutôt un NIP"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Pour plus de sécurité, utilisez plutôt un mot de passe"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"L\'appareil a été verrouillé par l\'administrateur"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"L\'appareil a été verrouillé manuellement"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Doigt non reconnu"</string> diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index 97d2081555f9..40e10effb073 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Pour plus de sécurité, utilisez plutôt un schéma"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Pour plus de sécurité, utilisez plutôt un code"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Pour plus de sécurité, utilisez plutôt un mot de passe"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Appareil verrouillé par l\'administrateur"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Appareil verrouillé manuellement"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Non reconnu"</string> diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml index 12b6c2cae28e..2eb03233e4e4 100644 --- a/packages/SystemUI/res-keyguard/values-gl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Utiliza un padrón para obter maior seguranza"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Utiliza un PIN para obter maior seguranza"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Utiliza un contrasinal para obter maior seguranza"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"O administrador bloqueou o dispositivo"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo bloqueouse manualmente"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Non se recoñeceu"</string> diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml index 9e2fd536b3e0..5f01e289ae7b 100644 --- a/packages/SystemUI/res-keyguard/values-gu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"વધારાની સુરક્ષા માટે, તેના બદલે પૅટર્નનો ઉપયોગ કરો"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"વધારાની સુરક્ષા માટે, તેના બદલે પિનનો ઉપયોગ કરો"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"વધારાની સુરક્ષા માટે, તેના બદલે પાસવર્ડનો ઉપયોગ કરો"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"વ્યવસ્થાપકે ઉપકરણ લૉક કરેલું છે"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ઉપકરણ મેન્યુઅલી લૉક કર્યું હતું"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"ઓળખાયેલ નથી"</string> diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml index 12cb7e396ded..11e608ca18ee 100644 --- a/packages/SystemUI/res-keyguard/values-hi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ज़्यादा सुरक्षा के लिए, इसके बजाय पैटर्न का इस्तेमाल करें"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ज़्यादा सुरक्षा के लिए, इसके बजाय पिन का इस्तेमाल करें"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ज़्यादा सुरक्षा के लिए, इसके बजाय पासवर्ड का इस्तेमाल करें"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"व्यवस्थापक ने डिवाइस को लॉक किया है"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"डिवाइस को मैन्युअल रूप से लॉक किया गया था"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"पहचान नहीं हो पाई"</string> diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml index fad222db3172..274fdeea935b 100644 --- a/packages/SystemUI/res-keyguard/values-hr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Za dodatnu sigurnost upotrijebite uzorak"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Za dodatnu sigurnost upotrijebite PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Za dodatnu sigurnost upotrijebite zaporku"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administrator je zaključao uređaj"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Uređaj je ručno zaključan"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nije prepoznato"</string> diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml index a22fbceb8bcf..0a5ac59486a3 100644 --- a/packages/SystemUI/res-keyguard/values-hu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"A nagyobb biztonság érdekében használjon inkább mintát"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"A nagyobb biztonság érdekében használjon inkább PIN-kódot"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"A nagyobb biztonság érdekében használjon inkább jelszót"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"A rendszergazda zárolta az eszközt"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Az eszközt manuálisan lezárták"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nem ismerhető fel"</string> diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml index 119928a43766..28344c90914f 100644 --- a/packages/SystemUI/res-keyguard/values-hy/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Լրացուցիչ անվտանգության համար օգտագործեք նախշ"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Լրացուցիչ անվտանգության համար օգտագործեք PIN կոդ"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Լրացուցիչ անվտանգության համար օգտագործեք գաղտնաբառ"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Սարքը կողպված է ադմինիստրատորի կողմից"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Սարքը կողպվել է ձեռքով"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Չհաջողվեց ճանաչել"</string> diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml index f4db0353a840..2a8d8a95c165 100644 --- a/packages/SystemUI/res-keyguard/values-in/strings.xml +++ b/packages/SystemUI/res-keyguard/values-in/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Untuk keamanan tambahan, gunakan pola"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Untuk keamanan tambahan, gunakan PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Untuk keamanan tambahan, gunakan sandi"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Perangkat dikunci oleh admin"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Perangkat dikunci secara manual"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Tidak dikenali"</string> diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml index c364f60329eb..0c14e6c5c595 100644 --- a/packages/SystemUI/res-keyguard/values-is/strings.xml +++ b/packages/SystemUI/res-keyguard/values-is/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Fyrir aukið öryggi skaltu nota mynstur í staðinn"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Fyrir aukið öryggi skaltu nota PIN-númer í staðinn"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Fyrir aukið öryggi skaltu nota aðgangsorð í staðinn"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Kerfisstjóri læsti tæki"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Tækinu var læst handvirkt"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Þekktist ekki"</string> diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index 659928fc1800..2c2baccec8c9 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Per maggior sicurezza, usa invece la sequenza"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Per maggior sicurezza, usa invece il PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Per maggior sicurezza, usa invece la password"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloccato dall\'amministratore"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Il dispositivo è stato bloccato manualmente"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Non riconosciuto"</string> diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml index 0021d0a87e30..6e54ba9f272c 100644 --- a/packages/SystemUI/res-keyguard/values-iw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"כדי להגביר את רמת האבטחה, כדאי להשתמש בקו ביטול נעילה במקום זאת"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"כדי להגביר את רמת האבטחה, כדאי להשתמש בקוד אימות במקום זאת"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"כדי להגביר את רמת האבטחה, כדאי להשתמש בסיסמה במקום זאת"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"המנהל של המכשיר נהל אותו"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"המכשיר ננעל באופן ידני"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"לא זוהתה"</string> diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml index c94d6b18cc8a..71969c00cc7c 100644 --- a/packages/SystemUI/res-keyguard/values-ja/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml @@ -111,6 +111,9 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"画面ロックを解除するにはパターンを入力してください"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"画面ロックを解除するには PIN を入力してください"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"画面ロックを解除するにはパスワードを入力してください"</string> + <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"追加の確認のため PIN が必要です"</string> + <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"追加の確認のためパターンが必要です"</string> + <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"追加の確認のためパスワードが必要です"</string> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"デバイスは管理者によりロックされています"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"デバイスは手動でロックされました"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"認識されませんでした"</string> diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml index c36b4718c292..db99d965a507 100644 --- a/packages/SystemUI/res-keyguard/values-ka/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"დამატებითი უსაფრთხოებისთვის გამოიყენეთ ნიმუში"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"დამატებითი უსაფრთხოებისთვის გამოიყენეთ PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"დამატებითი უსაფრთხოებისთვის გამოიყენეთ პაროლი"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"მოწყობილობა ჩაკეტილია ადმინისტრატორის მიერ"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"მოწყობილობა ხელით ჩაიკეტა"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"არ არის ამოცნობილი"</string> diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml index fef02beea07a..7bf93aee2f9e 100644 --- a/packages/SystemUI/res-keyguard/values-kk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Қосымша қауіпсіздік үшін өрнекті пайдаланыңыз."</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Қосымша қауіпсіздік үшін PIN кодын пайдаланыңыз."</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Қосымша қауіпсіздік үшін құпия сөзді пайдаланыңыз."</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Құрылғыны әкімші құлыптаған"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Құрылғы қолмен құлыпталды"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Танылмады"</string> diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml index f82defdc453e..b326f4c58aa9 100644 --- a/packages/SystemUI/res-keyguard/values-km/strings.xml +++ b/packages/SystemUI/res-keyguard/values-km/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ដើម្បីសុវត្ថិភាពបន្ថែម សូមប្រើលំនាំជំនួសវិញ"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ដើម្បីសុវត្ថិភាពបន្ថែម សូមប្រើកូដ PIN ជំនួសវិញ"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ដើម្បីសុវត្ថិភាពបន្ថែម សូមប្រើពាក្យសម្ងាត់ជំនួសវិញ"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ឧបករណ៍ត្រូវបានចាក់សោដោយអ្នកគ្រប់គ្រង"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ឧបករណ៍ត្រូវបានចាក់សោដោយអ្នកប្រើផ្ទាល់"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"មិនអាចសម្គាល់បានទេ"</string> diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml index 4ab035e5a420..10bd9bf50b43 100644 --- a/packages/SystemUI/res-keyguard/values-kn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ, ಬದಲಿಗೆ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ಬಳಸಿ"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ, ಬದಲಿಗೆ ಪಿನ್ ಬಳಸಿ"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ಹೆಚ್ಚುವರಿ ಭದ್ರತೆಗಾಗಿ, ಬದಲಿಗೆ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ನಿರ್ವಾಹಕರು ಸಾಧನವನ್ನು ಲಾಕ್ ಮಾಡಿದ್ದಾರೆ"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ಸಾಧನವನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"ಗುರುತಿಸಲಾಗಿಲ್ಲ"</string> diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml index d4563660b01a..630453934323 100644 --- a/packages/SystemUI/res-keyguard/values-ko/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"보안 강화를 위해 대신 패턴 사용"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"보안 강화를 위해 대신 PIN 사용"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"보안 강화를 위해 대신 비밀번호 사용"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"관리자가 기기를 잠갔습니다."</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"기기가 수동으로 잠금 설정되었습니다."</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"인식할 수 없음"</string> diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index e8640ae5caa3..8575d6049391 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Кошумча коопсуздук үчүн анын ордуна графикалык ачкычты колдонуңуз"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Кошумча коопсуздук үчүн анын ордуна PIN кодду колдонуңуз"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Кошумча коопсуздук үчүн анын ордуна сырсөздү колдонуңуз"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Түзмөктү администратор кулпулап койгон"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Түзмөк кол менен кулпуланды"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Таанылган жок"</string> diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml index 6f6c1d11915b..984cc56606a5 100644 --- a/packages/SystemUI/res-keyguard/values-lo/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ, ໃຫ້ໃຊ້ຮູບແບບແທນ"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ, ໃຫ້ໃຊ້ PIN ແທນ"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ເພື່ອຄວາມປອດໄພເພີ່ມເຕີມ, ໃຫ້ໃຊ້ລະຫັດຜ່ານແທນ"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ອຸປະກອນຖືກລັອກໂດຍຜູ້ເບິ່ງແຍງລະບົບ"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ອຸປະກອນຖືກສັ່ງໃຫ້ລັອກ"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"ບໍ່ຮູ້ຈັກ"</string> diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml index 9d134853400f..96dc26687f95 100644 --- a/packages/SystemUI/res-keyguard/values-lt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Papildomai saugai užtikrinti geriau naudokite atrakinimo piešinį"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Papildomai saugai užtikrinti geriau naudokite PIN kodą"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Papildomai saugai užtikrinti geriau naudokite slaptažodį"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Įrenginį užrakino administratorius"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Įrenginys užrakintas neautomatiškai"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Neatpažinta"</string> diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml index 10d657ba999a..9ca5c6e25fce 100644 --- a/packages/SystemUI/res-keyguard/values-lv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Papildu drošībai izmantojiet kombināciju"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Papildu drošībai izmantojiet PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Papildu drošībai izmantojiet paroli"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administrators bloķēja ierīci."</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Ierīce tika bloķēta manuāli."</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nav atpazīts"</string> diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml index 9aafb86c8e27..421637fd8bbe 100644 --- a/packages/SystemUI/res-keyguard/values-mk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"За дополнителна безбедност, користете шема"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"За дополнителна безбедност, користете PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"За дополнителна безбедност, користете лозинка"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Уредот е заклучен од администраторот"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Уредот е заклучен рачно"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Непознат"</string> diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml index f690ce5b35ae..9bb1c60e7b34 100644 --- a/packages/SystemUI/res-keyguard/values-ml/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"അധിക സുരക്ഷയ്ക്കായി, പകരം പാറ്റേൺ ഉപയോഗിക്കുക"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"അധിക സുരക്ഷയ്ക്കായി, പകരം പിൻ ഉപയോഗിക്കുക"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"അധിക സുരക്ഷയ്ക്കായി, പകരം പാസ്വേഡ് ഉപയോഗിക്കുക"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ഉപകരണം അഡ്മിൻ ലോക്കുചെയ്തു"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ഉപകരണം നേരിട്ട് ലോക്കുചെയ്തു"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"തിരിച്ചറിയുന്നില്ല"</string> diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml index 70cfa3741451..443e028baa7a 100644 --- a/packages/SystemUI/res-keyguard/values-mn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Нэмэлт аюулгүй байдлын үүднээс оронд нь хээ ашиглана уу"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Нэмэлт аюулгүй байдлын үүднээс оронд нь ПИН ашиглана уу"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Нэмэлт аюулгүй байдлын үүднээс оронд нь нууц үг ашиглана уу"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Админ төхөөрөмжийг түгжсэн"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Төхөөрөмжийг гараар түгжсэн"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Таньж чадсангүй"</string> diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml index 9da4fb084c12..8b23abe82baf 100644 --- a/packages/SystemUI/res-keyguard/values-mr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"अतिरिक्त सुरक्षेसाठी, त्याऐवजी पॅटर्न वापरा"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"अतिरिक्त सुरक्षेसाठी, त्याऐवजी पिन वापरा"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"अतिरिक्त सुरक्षेसाठी, त्याऐवजी पासवर्ड वापरा"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"प्रशासकाद्वारे लॉक केलेले डिव्हाइस"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"डिव्हाइस मॅन्युअली लॉक केले होते"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"ओळखले नाही"</string> diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml index 76de213cc206..3291bd49940a 100644 --- a/packages/SystemUI/res-keyguard/values-ms/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Untuk keselamatan tambahan, gunakan corak"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Untuk keselamatan tambahan, gunakan PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Untuk keselamatan tambahan, gunakan kata laluan"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Peranti dikunci oleh pentadbir"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Peranti telah dikunci secara manual"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Tidak dikenali"</string> diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml index bedabb811653..9d83323c0ebc 100644 --- a/packages/SystemUI/res-keyguard/values-my/strings.xml +++ b/packages/SystemUI/res-keyguard/values-my/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ထပ်ဆောင်းလုံခြုံရေးအတွက် ၎င်းအစား ပုံစံသုံးပါ"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ထပ်ဆောင်းလုံခြုံရေးအတွက် ၎င်းအစား ပင်နံပါတ်သုံးပါ"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ထပ်ဆောင်းလုံခြုံရေးအတွက် ၎င်းအစား စကားဝှက်သုံးပါ"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"စက်ပစ္စည်းကို စီမံခန့်ခွဲသူက လော့ခ်ချထားပါသည်"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"စက်ပစ္စည်းကို ကိုယ်တိုင်ကိုယ်ကျ လော့ခ်ချထားခဲ့သည်"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"မသိ"</string> diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml index 04b567b29017..1aefaa947e86 100644 --- a/packages/SystemUI/res-keyguard/values-nb/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Bruk mønster i stedet, for å øke sikkerheten"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Bruk PIN-kode i stedet, for å øke sikkerheten"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Bruk passord i stedet, for å øke sikkerheten"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Enheten er låst av administratoren"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheten ble låst manuelt"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ikke gjenkjent"</string> diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml index 692e693968d5..16d23ef5dc56 100644 --- a/packages/SystemUI/res-keyguard/values-ne/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"अतिरिक्त सुरक्षाका लागि यो प्रमाणीकरण विधिको साटो प्याटर्न प्रयोग गर्नुहोस्"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"अतिरिक्त सुरक्षाका लागि यो प्रमाणीकरण विधिको साटो पिन प्रयोग गर्नुहोस्"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"अतिरिक्त सुरक्षाका लागि यो प्रमाणीकरण विधिको साटो पासवर्ड प्रयोग गर्नुहोस्"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"प्रशासकले यन्त्रलाई लक गर्नुभएको छ"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"यन्त्रलाई म्यानुअल तरिकाले लक गरिएको थियो"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"पहिचान भएन"</string> diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml index 9833505e49a7..77b5b57922e5 100644 --- a/packages/SystemUI/res-keyguard/values-nl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Gebruik in plaats daarvan het patroon voor extra beveiliging"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Gebruik de pincode voor extra beveiliging"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Gebruik in plaats daarvan het wachtwoord voor extra beveiliging"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Apparaat vergrendeld door beheerder"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Apparaat is handmatig vergrendeld"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Niet herkend"</string> diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml index 5ed2f11ddf99..73ed727add82 100644 --- a/packages/SystemUI/res-keyguard/values-or/strings.xml +++ b/packages/SystemUI/res-keyguard/values-or/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, ଏହା ପରିବର୍ତ୍ତେ ପାଟର୍ନ ବ୍ୟବହାର କରନ୍ତୁ"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, ଏହା ପରିବର୍ତ୍ତେ PIN ବ୍ୟବହାର କରନ୍ତୁ"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, ଏହା ପରିବର୍ତ୍ତେ ପାସୱାର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ଡିଭାଇସ୍ ଆଡମିନଙ୍କ ଦ୍ୱାରା ଲକ୍ କରାଯାଇଛି"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ଡିଭାଇସ୍ ମାନୁଆଲ ଭାବେ ଲକ୍ କରାଗଲା"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"ଚିହ୍ନଟ ହେଲାନାହିଁ"</string> diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index e591e5d2f724..2e4d190cd915 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ, ਇਸਦੀ ਬਜਾਏ ਪੈਟਰਨ ਵਰਤੋ"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ, ਇਸਦੀ ਬਜਾਏ ਪਿੰਨ ਵਰਤੋ"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ਵਧੀਕ ਸੁਰੱਖਿਆ ਲਈ, ਇਸਦੀ ਬਜਾਏ ਪਾਸਵਰਡ ਵਰਤੋ"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਡੀਵਾਈਸ ਨੂੰ ਲਾਕ ਕੀਤਾ ਗਿਆ"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"ਡੀਵਾਈਸ ਨੂੰ ਹੱਥੀਂ ਲਾਕ ਕੀਤਾ ਗਿਆ"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"ਪਛਾਣ ਨਹੀਂ ਹੋਈ"</string> diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index 396fa7953f29..4a8907031cbd 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -111,6 +111,9 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Ze względów bezpieczeństwa użyj wzoru"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Ze względów bezpieczeństwa użyj kodu PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Ze względów bezpieczeństwa użyj hasła"</string> + <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Dla większego bezpieczeństwa musisz podać kod PIN"</string> + <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Dla większego bezpieczeństwa musisz narysować wzór"</string> + <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Dla większego bezpieczeństwa musisz podać hasło"</string> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Urządzenie zablokowane przez administratora"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Urządzenie zostało zablokowane ręcznie"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nie rozpoznano"</string> diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index 3de54f92cfc6..92cee606d9c2 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para ter mais segurança, use o padrão"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para ter mais segurança, use o PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para ter mais segurança, use a senha"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado pelo administrador"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido"</string> diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index 3d8f7e6ccab1..cc5ccd801dab 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para uma segurança adicional, use antes o padrão"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para uma segurança adicional, use antes o PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para uma segurança adicional, use antes a palavra-passe"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado pelo gestor"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido."</string> diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index 3de54f92cfc6..92cee606d9c2 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para ter mais segurança, use o padrão"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para ter mais segurança, use o PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para ter mais segurança, use a senha"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispositivo bloqueado pelo administrador"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"O dispositivo foi bloqueado manualmente"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Não reconhecido"</string> diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index 053f862f0ba2..7d07480c9812 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Pentru mai multă securitate, folosește modelul"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Pentru mai multă securitate, folosește codul PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Pentru mai multă securitate, folosește parola"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Dispozitiv blocat de administrator"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Dispozitivul a fost blocat manual"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nu este recunoscut"</string> diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml index 6be148934f9c..d91cf97ebcac 100644 --- a/packages/SystemUI/res-keyguard/values-ru/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"В целях дополнительной безопасности используйте графический ключ"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"В целях дополнительной безопасности используйте PIN-код"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"В целях дополнительной безопасности используйте пароль"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Устройство заблокировано администратором"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Устройство было заблокировано вручную"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Не распознано"</string> diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml index 401e147b21a2..a9fc70acc3dc 100644 --- a/packages/SystemUI/res-keyguard/values-si/strings.xml +++ b/packages/SystemUI/res-keyguard/values-si/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"අතිරේක ආරක්ෂාව සඳහා, ඒ වෙනුවට රටාව භාවිතා කරන්න"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"අතිරේක ආරක්ෂාව සඳහා, ඒ වෙනුවට PIN භාවිතා කරන්න"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"අතිරේක ආරක්ෂාව සඳහා, ඒ වෙනුවට මුරපදය භාවිතා කරන්න"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ඔබගේ පරිපාලක විසින් උපාංගය අගුළු දමා ඇත"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"උපාංගය හස්තීයව අගුලු දමන ලදී"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"හඳුනා නොගන්නා ලදී"</string> diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml index 2b65466f7cb4..e1b83eef22ed 100644 --- a/packages/SystemUI/res-keyguard/values-sk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"V rámci zvýšenia zabezpečenia použite radšej vzor"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"V rámci zvýšenia zabezpečenia použite radšej PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"V rámci zvýšenia zabezpečenia použite radšej heslo"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Zariadenie zamkol správca"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Zariadenie bolo uzamknuté ručne"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nerozpoznané"</string> diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml index dbb34c953637..383153b42387 100644 --- a/packages/SystemUI/res-keyguard/values-sl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Za dodatno varnost raje uporabite vzorec."</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Za dodatno varnost raje uporabite kodo PIN."</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Za dodatno varnost raje uporabite geslo."</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Napravo je zaklenil skrbnik"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Naprava je bila ročno zaklenjena"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ni prepoznano"</string> diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml index 00c4999ecef6..9f291f34a1f7 100644 --- a/packages/SystemUI/res-keyguard/values-sq/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Për më shumë siguri, përdor motivin më mirë"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Për më shumë siguri, përdor kodin PIN më mirë"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Për më shumë siguri, përdor fjalëkalimin më mirë"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Pajisja është e kyçur nga administratori"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Pajisja është kyçur manualisht"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Nuk njihet"</string> diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml index feac58330716..404ff9d71b7c 100644 --- a/packages/SystemUI/res-keyguard/values-sr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"За додатну безбедност користите шаблон"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"За додатну безбедност користите PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"За додатну безбедност користите лозинку"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Администратор је закључао уређај"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Уређај је ручно закључан"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Није препознат"</string> diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml index 67fa2f70199b..b891de795f0c 100644 --- a/packages/SystemUI/res-keyguard/values-sv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"För ytterligare säkerhet använder du mönstret i stället"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"För ytterligare säkerhet använder du pinkoden i stället"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"För ytterligare säkerhet använder du lösenordet i stället"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Administratören har låst enheten"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheten har låsts manuellt"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Identifierades inte"</string> diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml index 527e73eeefc0..7dd3180c39b5 100644 --- a/packages/SystemUI/res-keyguard/values-sw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Kwa usalama wa ziada, tumia mchoro badala yake"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Kwa usalama wa ziada, tumia PIN badala yake"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Kwa usalama wa ziada, tumia nenosiri badala yake"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Msimamizi amefunga kifaa"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Umefunga kifaa mwenyewe"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Haitambuliwi"</string> diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml index 05ac0c0b3bb9..14969d53e849 100644 --- a/packages/SystemUI/res-keyguard/values-ta/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"கூடுதல் பாதுகாப்பிற்குப் பேட்டர்னைப் பயன்படுத்தவும்"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"கூடுதல் பாதுகாப்பிற்குப் பின்னை (PIN) பயன்படுத்தவும்"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"கூடுதல் பாதுகாப்பிற்குக் கடவுச்சொல்லைப் பயன்படுத்தவும்"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"நிர்வாகி சாதனத்தைப் பூட்டியுள்ளார்"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"பயனர் சாதனத்தைப் பூட்டியுள்ளார்"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"அடையாளங்காணபடவில்லை"</string> diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index 9d37fc14b80d..a117a5c5d425 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"అదనపు సెక్యూరిటీ కోసం, బదులుగా ఆకృతిని ఉపయోగించండి"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"అదనపు సెక్యూరిటీ కోసం, బదులుగా PINను ఉపయోగించండి"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"అదనపు సెక్యూరిటీ కోసం, బదులుగా పాస్వర్డ్ను ఉపయోగించండి"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"పరికరం నిర్వాహకుల ద్వారా లాక్ చేయబడింది"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"పరికరం మాన్యువల్గా లాక్ చేయబడింది"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"గుర్తించలేదు"</string> diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml index 57aadea4ab56..d9f8d9928632 100644 --- a/packages/SystemUI/res-keyguard/values-th/strings.xml +++ b/packages/SystemUI/res-keyguard/values-th/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"ใช้รูปแบบแทนเพื่อเพิ่มความปลอดภัย"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"ใช้ PIN แทนเพื่อเพิ่มความปลอดภัย"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"ใช้รหัสผ่านแทนเพื่อเพิ่มความปลอดภัย"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"ผู้ดูแลระบบล็อกอุปกรณ์"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"มีการล็อกอุปกรณ์ด้วยตัวเอง"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"ไม่รู้จักลายนิ้วมือ"</string> diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml index bb7c34467677..bfe5ae09d154 100644 --- a/packages/SystemUI/res-keyguard/values-tl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml @@ -111,6 +111,9 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Para sa karagdagang seguridad, gumamit na lang ng pattern"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Para sa karagdagang seguridad, gumamit na lang ng PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Para sa karagdagang seguridad, gumamit na lang ng password"</string> + <string name="kg_prompt_added_security_pin" msgid="5487992065995475528">"Kinakailangan ang PIN para sa karagdagang seguridad"</string> + <string name="kg_prompt_added_security_pattern" msgid="1017068086102168544">"Kinakailangan ang pattern para sa karagdagang seguridad"</string> + <string name="kg_prompt_added_security_password" msgid="6053156069765029006">"Kinakailangan ang password para sa karagdagang seguridad"</string> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Na-lock ng admin ang device"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Manual na na-lock ang device"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Hindi nakilala"</string> diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml index f4016299fa09..e23d03676440 100644 --- a/packages/SystemUI/res-keyguard/values-tr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Ek güvenlik için bunun yerine desen kullanın"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Ek güvenlik için bunun yerine PIN kullanın"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Ek güvenlik için bunun yerine şifre kullanın"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Cihaz, yönetici tarafından kilitlendi"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Cihazın manuel olarak kilitlendi"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Tanınmadı"</string> diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml index 4330b32bc005..d519601d3eef 100644 --- a/packages/SystemUI/res-keyguard/values-uk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"З міркувань додаткової безпеки скористайтеся ключем"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"З міркувань додаткової безпеки скористайтеся PIN-кодом"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"З міркувань додаткової безпеки скористайтеся паролем"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Адміністратор заблокував пристрій"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Пристрій заблоковано вручну"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Не розпізнано"</string> diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml index e466807c6f53..27d422f2f07c 100644 --- a/packages/SystemUI/res-keyguard/values-ur/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"اضافی سیکیورٹی کے لئے، اس کے بجائے پیٹرن استعمال کریں"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"اضافی سیکیورٹی کے لئے، اس کے بجائے PIN استعمال کریں"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"اضافی سیکیورٹی کے لئے، اس کے بجائے پاس ورڈ استعمال کریں"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"آلہ منتظم کی جانب سے مقفل ہے"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"آلہ کو دستی طور پر مقفل کیا گیا تھا"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"تسلیم شدہ نہیں ہے"</string> diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml index f3cdf26be5c4..c34619f48387 100644 --- a/packages/SystemUI/res-keyguard/values-uz/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Qoʻshimcha xavfsizlik maqsadida oʻrniga grafik kalitdan foydalaning"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Qoʻshimcha xavfsizlik maqsadida oʻrniga PIN koddan foydalaning"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Qoʻshimcha xavfsizlik maqsadida oʻrniga paroldan foydalaning"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Qurilma administrator tomonidan bloklangan"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Qurilma qo‘lda qulflangan"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Aniqlanmadi"</string> diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml index 3bad8f1dec4e..52b71a730b0c 100644 --- a/packages/SystemUI/res-keyguard/values-vi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Để tăng cường bảo mật, hãy sử dụng hình mở khoá"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Để tăng cường bảo mật, hãy sử dụng mã PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Để tăng cường bảo mật, hãy sử dụng mật khẩu"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Thiết bị đã bị quản trị viên khóa"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Thiết bị đã bị khóa theo cách thủ công"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Không nhận dạng được"</string> diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml index 2818ffb18673..70a9117243bd 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"为增强安全性,请改用图案"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"为增强安全性,请改用 PIN 码"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"为增强安全性,请改用密码"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"管理员已锁定设备"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"此设备已手动锁定"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"无法识别"</string> diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml index 1b196d4db25d..d1e70f4bed98 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"為提升安全性,請改用圖案"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"為提升安全性,請改用 PIN"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"為提升安全性,請改用密碼"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"裝置已由管理員鎖定"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"使用者已手動將裝置上鎖"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"未能識別"</string> diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml index 9b7e4318dc86..bd223d6070a0 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"為強化安全性,請改用解鎖圖案"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"為強化安全性,請改用 PIN 碼"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"為強化安全性,請改用密碼"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"管理員已鎖定裝置"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"裝置已手動鎖定"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"無法識別"</string> diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml index cd36f9596e3a..ccc160691c89 100644 --- a/packages/SystemUI/res-keyguard/values-zu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml @@ -111,6 +111,12 @@ <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Ukuze uthole ukuvikeleka okwengeziwe, sebenzisa iphetheni esikhundleni salokho"</string> <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Ukuze uthole ukuvikeleka okwengeziwe, sebenzisa i-PIN esikhundleni salokho"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Ukuze uthole ukuvikeleka okwengeziwe, sebenzisa iphasiwedi esikhundleni salokho"</string> + <!-- no translation found for kg_prompt_added_security_pin (5487992065995475528) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_pattern (1017068086102168544) --> + <skip /> + <!-- no translation found for kg_prompt_added_security_password (6053156069765029006) --> + <skip /> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Idivayisi ikhiywe ngumlawuli"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Idivayisi ikhiywe ngokwenza"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Akwaziwa"</string> diff --git a/packages/SystemUI/res/layout/super_notification_shade.xml b/packages/SystemUI/res/layout/super_notification_shade.xml index b792acc8b097..c9985354b11e 100644 --- a/packages/SystemUI/res/layout/super_notification_shade.xml +++ b/packages/SystemUI/res/layout/super_notification_shade.xml @@ -69,7 +69,10 @@ <com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer android:id="@+id/shared_notification_container" android:layout_width="match_parent" - android:layout_height="match_parent" /> + android:layout_height="match_parent" + android:clipChildren="false" + android:clipToPadding="false" + /> <include layout="@layout/brightness_mirror_container" /> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 2e2d2866e0eb..9bc14453718b 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ontkoppel"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiveer"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Skakel dit môre outomaties weer aan"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Kenmerke soos Kitsdeel, Kry My Toestel en toestelligging gebruik Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth sal môre om 05:00 aanskakel"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batterykrag"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Oudio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Kopstuk"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Verwyder"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Voeg legstuk by"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Klaar"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Laat enige legstuk op die sluitskerm toe?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Maak instellings oop"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Hervat werkapps?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Hervat"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Wissel gebruiker"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"aftrekkieslys"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alle programme en data in hierdie sessie sal uitgevee word."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Demp"</string> <string name="media_device_cast" msgid="4786241789687569892">"Saai uit"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Onbeskikbaar omdat luitoon gedemp is"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tik om te ontdemp."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tik om op vibreer te stel. Toeganklikheidsdienste kan dalk gedemp wees."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tik om te demp. Toeganklikheidsdienste kan dalk gedemp wees."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Tik om op vibreer te stel."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Tik om te demp."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Geraasbeheer"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Ruimtelike Oudio"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Af"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Vasgestel"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Kopnasporing"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tik om luiermodus te verander"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"demp"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ontdemp"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibreer"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s volumekontroles"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Oproepe en kennisgewings sal lui (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> speel tans op"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Oudio sal speel op"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Stelsel-UI-ontvanger"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Gebruikerteenwoordigheid is bespeur"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Stel versteknotasapp in Instellings"</string> <string name="install_app" msgid="5066668100199613936">"Installeer app"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 897820cd4636..c333483694ac 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ግንኙነትን አቋርጥ"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ያግብሩ"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"ነገ እንደገና በራስ-ሰር አስጀምር"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"እንደ ፈጣን ማጋራት፣ የእኔን መሣሪያ አግኝ እና የመሣሪያ አካባቢ ያሉ ባህሪያት ብሉቱዝን ይጠቀማሉ"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"ብሉቱዝ ነገ ጠዋቱ 5 ሰዓት ላይ ይበራል"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ባትሪ"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ኦዲዮ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"ማዳመጫ"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"አስወግድ"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ምግብር አክል"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ተከናውኗል"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"በማያ ገጽ ቁልፍ ላይ ማንኛውንም ምግብር ይፈቀድ?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"ቅንብሮችን ክፈት"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"የሥራ መተግበሪያዎች ከቆሙበት ይቀጥሉ?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"ከቆመበት ቀጥል"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ድምጸ-ከል አድርግ"</string> <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"የጥሪ ድምጽ ስለተዘጋ አይገኝም"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s። ወደ ንዝረት ለማቀናበር መታ ያድርጉ። የተደራሽነት አገልግሎቶች ድምጸ-ከል ሊደረግባቸው ይችላል።"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ። የተደራሽነት አገልግሎቶች ድምጸ-ከል ሊደረግባቸው ይችላል።"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s። ወደ ንዝረት ለማቀናበር መታ ያድርጉ።"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ።"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"የጫጫታ መቆጣጠሪያ"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Spatial ኦዲዮ"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"አጥፋ"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ቋሚ"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"የጭንቅላት ክትትል"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"የደዋይ ሁነታን ለመቀየር መታ ያድርጉ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ድምጸ-ከል አድርግ"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ድምጸ-ከልን አንሳ"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ንዘር"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s የድምፅ መቆጣጠሪያዎች"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ጥሪዎች እና ማሳወቂያዎች (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>) ላይ ይደውላሉ"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> እየተጫወተ ያለው በ"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"ኦዲዮ ይጫወታል በ"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"የስርዓት በይነገጽ መቃኛ"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"የተጠቃሚ ተገኝነት ታውቋል"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"በቅንብሮች ውስጥ ነባሪ የማስታወሻዎች መተግበሪያን ያቀናብሩ"</string> <string name="install_app" msgid="5066668100199613936">"መተግበሪያን ጫን"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 89b4ccf8e382..9a36bcf4f712 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"إلغاء الربط"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"تفعيل"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"تفعيل البلوتوث تلقائيًا مرة أخرى غدًا"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"يُستخدَم البلوتوث في ميزات مثل Quick Share و\"العثور على جهازي\" والموقع الجغرافي للجهاز"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"سيتم تفعيل البلوتوث غدًا الساعة 5 صباحًا"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"مستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"صوت"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"سماعة الرأس"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"إزالة"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"إضافة تطبيق مصغّر"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"تم"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"هل تريد السماح بعرض أي تطبيق مصغّر على شاشة القفل؟"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"فتح الإعدادات"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"أتريد إعادة تفعيل تطبيقات العمل؟"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"إعادة التفعيل"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"كتم الصوت"</string> <string name="media_device_cast" msgid="4786241789687569892">"البثّ"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"يتعذّر التغيير بسبب كتم صوت الرنين."</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. انقر لإلغاء التجاهل."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. انقر للتعيين على الاهتزاز. قد يتم تجاهل خدمات \"سهولة الاستخدام\"."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. انقر للتجاهل. قد يتم تجاهل خدمات \"سهولة الاستخدام\"."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. انقر للتعيين على الاهتزاز."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. انقر لكتم الصوت."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"التحكُّم في مستوى الضجيج"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"الصوت المكاني"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"إيقاف"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"مفعّل"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"تتبُّع حركة الرأس"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"انقر لتغيير وضع الرنين."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"كتم الصوت"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"إعادة الصوت"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"اهتزاز"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s عنصر للتحكم في مستوى الصوت"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"سيصدر الهاتف رنينًا عند تلقي المكالمات والإشعارات (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)."</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"تشغيل <xliff:g id="LABEL">%s</xliff:g> على"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"سيتم تشغيل الصوت على"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"أداة ضبط واجهة مستخدم النظام"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"تم رصد تواجد المستخدم."</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"يمكنك ضبط تطبيق تدوين الملاحظات التلقائي في \"الإعدادات\"."</string> <string name="install_app" msgid="5066668100199613936">"تثبيت التطبيق"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 9a2d744fcbb3..a211d1ea8d10 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"সংযোগ বিচ্ছিন্ন কৰক"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"সক্ৰিয় কৰক"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"কাইলৈ পুনৰ স্বয়ংক্ৰিয়ভাৱে অন কৰক"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Quick Share, Find My Device আৰু ডিভাইচৰ অৱস্থানৰ দৰে সুবিধাই ব্লুটুথ ব্যৱহাৰ কৰে"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"কাইলৈ পুৱা ৫ বজাত ব্লুটুথ অন হ’ব"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"বেটাৰী <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"অডিঅ’"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"হেডছেট"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"আঁতৰাওক"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ৱিজেট যোগ দিয়ক"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"কৰা হ’ল"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"লক স্ক্ৰীনত যিকোনো ৱিজেটৰ অনুমতি দিবনে?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"ছেটিং খোলক"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"কাম সম্পৰ্কীয় এপ্ আনপজ কৰিবনে?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"আনপজ কৰক"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"মিউট"</string> <string name="media_device_cast" msgid="4786241789687569892">"কাষ্ট কৰক"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"ৰিং মিউট কৰি থোৱাৰ বাবে উপলব্ধ নহয়"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s। আনমিউট কৰিবৰ বাবে টিপক।"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s। কম্পনৰ বাবে টিপক। দিব্য়াংগসকলৰ বাবে থকা সেৱা মিউট হৈ থাকিব পাৰে।"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s। মিউট কৰিবলৈ টিপক। দিব্য়াংগসকলৰ বাবে থকা সেৱা মিউট হৈ থাকিব পাৰে।"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s। কম্পন অৱস্থাত ছেট কৰিবলৈ টিপক।"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s। মিউট কৰিবলৈ টিপক।"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"কোলাহল নিয়ন্ত্ৰণ"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"স্থানিক অডিঅ’"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"অফ কৰক"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"নিৰ্ধাৰিত"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"হে’ড ট্ৰেকিং"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ৰিংগাৰ ম’ড সলনি কৰিবলৈ টিপক"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"মিউট কৰক"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"আনমিউট কৰক"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"কম্পন কৰক"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s ধ্বনি নিয়ন্ত্ৰণসমূহ"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"কল আৰু জাননীবোৰ ইমান ভলিউমত বাজিব (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"ইয়াত <xliff:g id="LABEL">%s</xliff:g> প্লে’ হৈ আছে"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"অডিঅ’ ইয়াত প্লে’ হ’ব"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"অধিক ৰিজ’লিউছনৰ বাবে, ফ’নটো লুটিয়াই দিয়ক"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"জপাব পৰা ডিভাইচৰ জাপ খুলি থকা হৈছে"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"জপাব পৰা ডিভাইচৰ ওলোটাই থকা হৈছে"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ফ’ল্ড কৰা"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"আনফ’ল্ড কৰা"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> বেটাৰী বাকী আছে"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"আপোনাৰ ষ্টাইলাছ এটা চাৰ্জাৰৰ সৈতে সংযোগ কৰক"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"ষ্টাইলাছৰ বেটাৰী কম আছে"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"ব্যৱহাৰকাৰীৰ উপস্থিতি চিনাক্ত কৰা হৈছে"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ছেটিঙত টোকাৰ ডিফ’ল্ট এপ্ ছেট কৰক"</string> <string name="install_app" msgid="5066668100199613936">"এপ্টো ইনষ্টল কৰক"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index ebd4073155a2..0b0788a56334 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"əlaqəni kəsin"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivləşdirin"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Sabah avtomatik aktiv edin"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Cəld Paylaşım, Cihazın Tapılması və cihaz məkanı kimi funksiyalar Bluetooth istifadə edir"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth sabah 05:00-da aktiv olacaq"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batareya"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Qulaqlıq"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Silin"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Vidcet əlavə edin"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Hazırdır"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Kilid ekranında istənilən vidcetə icazə verilsin?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Ayarları açın"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"İş tətbiqi üzrə pauza bitsin?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Pauzanı bitirin"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"aşağı çəkilən menyu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Bu sessiyada bütün tətbiqlər və data silinəcək."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Susdurun"</string> <string name="media_device_cast" msgid="4786241789687569892">"Yayım"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Zəng səssiz edildiyi üçün əlçatan deyil"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Səsli etmək üçün tıklayın."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Vibrasiyanı ayarlamaq üçün tıklayın. Əlçatımlılıq xidmətləri səssiz edilmiş ola bilər."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Səssiz etmək üçün tıklayın. Əlçatımlılıq xidmətləri səssiz edilmiş ola bilər."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Vibrasiyanı ayarlamaq üçün klikləyin."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Səssiz etmək üçün klikləyin."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Səs-küy idarəetməsi"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Məkani səs"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Sönülü"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Sabit"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Baş izləməsi"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Zəng rejimini dəyişmək üçün toxunun"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"susdurun"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"səssiz rejimdən çıxarın"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrasiya"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s səs nəzarətləri"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Çağrı və bildirişlər zəng çalacaq (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> tətbiqində oxudulur"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio oxudulacaq"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"İstifadəçi mövcudluğu aşkarlandı"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ayarlarda defolt qeydlər tətbiqi ayarlayın"</string> <string name="install_app" msgid="5066668100199613936">"Tətbiqi quraşdırın"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 17599b2a92a1..48caa06008c7 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"prekinite vezu"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivirajte"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatski ponovo uključi sutra"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funkcije kao što su Quick Share, Pronađi moj uređaj i lokacija uređaja koriste Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth će se uključiti sutra u 5:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Slušalice"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Ukloni"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodaj vidžet"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gotovo"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Želite da dozvolite sve vidžete na zaključanom ekranu?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Otvori podešavanja"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Uključiti poslovne aplikacije?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Ponovo aktiviraj"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Zameni korisnika"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"padajući meni"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Sve aplikacije i podaci u ovoj sesiji će biti izbrisani."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Isključi zvuk"</string> <string name="media_device_cast" msgid="4786241789687569892">"Prebacivanje"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nedostupno jer je zvuk isključen"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Dodirnite da biste uključili zvuk."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Dodirnite da biste podesili na vibraciju. Zvuk usluga pristupačnosti će možda biti isključen."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Dodirnite da biste isključili zvuk. Zvuk usluga pristupačnosti će možda biti isključen."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Dodirnite da biste podesili na vibraciju."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Dodirnite da biste isključili zvuk."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Kontrola šuma"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Prostorni zvuk"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Isključeno"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fiksno"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Praćenje glave"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Dodirnite da biste promenili režim zvona"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"isključite zvuk"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"uključite zvuk"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibracija"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Kontrole za jačinu zvuka za %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Melodija zvona za pozive i obaveštenja je uključena (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> se pušta na"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk se pušta na"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Tjuner za korisnički interfejs sistema"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Prisustvo korisnika može da se otkrije"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Podesite podrazumevanu aplikaciju za beleške u Podešavanjima"</string> <string name="install_app" msgid="5066668100199613936">"Instaliraj aplikaciju"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 93921fcde82f..cf35a24900f1 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"адключыць"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"актываваць"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Аўтаматычнае ўключэнне заўтра"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Bluetooth выкарыстоўваецца для вызначэння месцазнаходжання прылады, а таксама такімі функцыямі, як Хуткае абагульванне і Знайсці прыладу"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth будзе ўключаны заўтра ў 5 гадзін раніцы"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Узровень зараду: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Гук"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Гарнітура"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Выдаліць"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Дадаць віджэт"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Гатова"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Дазволіць размяшчаць на экране блакіроўкі любыя віджэты?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Адкрыць налады"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Уключыць працоўныя праграмы?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Уключыць"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Гук выключаны"</string> <string name="media_device_cast" msgid="4786241789687569892">"Трансляцыя"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недаступна, бо выключаны гук выклікаў"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Дакраніцеся, каб уключыць гук."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Дакраніцеся, каб уключыць вібрацыю. Можа быць адключаны гук службаў спецыяльных магчымасцей."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Дакраніцеся, каб адключыць гук. Можа быць адключаны гук службаў спецыяльных магчымасцей."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Дакраніцеся, каб уключыць вібрацыю."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Дакраніцеся, каб адключыць гук"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Кантроль шуму"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Прасторавае гучанне"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Выключыць"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Замацавана"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Адсочваць рух галавы"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Націсніце, каб змяніць рэжым званка"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"выключыць гук"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"уключыць гук"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"вібрыраваць"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Рэгулятар гучнасці %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Для выклікаў і апавяшчэнняў уключаны гук (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> прайграецца тут:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аўдыявыхад:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Наладка сістэмнага інтэрфейсу карыстальніка"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Каб зрабіць фота з больш высокай раздзяляльнасцю, павярніце тэлефон"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Складная прылада ў раскладзеным выглядзе"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Перавернутая складная прылада"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"складзена"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"раскладзена"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Засталося зараду: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Падключыце пяро да зараднай прылады"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"Нізкі ўзровень зараду пяра"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Выяўлена прысутнасць карыстальніка"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайце ў Наладах стандартную праграму для нататак"</string> <string name="install_app" msgid="5066668100199613936">"Усталяваць праграму"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index f3ae4411f533..c8539e632583 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"прекратяване на връзката"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"активиране"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Автоматично включване отново утре"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Bluetooth се използва от различни функции, като например „Бързо споделяне“, „Намиране на устройството ми“ и местоположението на устройството"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth ще се включи утре в 5:00 ч."</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Аудио"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Слушалки"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Премахване"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Добавяне на приспособление"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Да се разреши ли което и да е приспособление на заключения екран?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Отваряне на настройките"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Отмяна на паузата за служ. прил.?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Отмяна на паузата"</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> @@ -581,26 +583,29 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Без звук"</string> <string name="media_device_cast" msgid="4786241789687569892">"Предаване"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Не е налице, защото звъненето е спряно"</string> + <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Не е налице, защото режимът „Не безпокойте“ е вкл."</string> + <string name="stream_media_unavailable" msgid="6823020894438959853">"Не е налице, защото режимът „Не безпокойте“ е вкл."</string> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Докоснете, за да включите отново звука."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Докоснете, за да зададете вибриране. Възможно е звукът на услугите за достъпност да бъде заглушен."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Докоснете, за да заглушите звука. Възможно е звукът на услугите за достъпност да бъде заглушен."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Докоснете, за да зададете вибриране."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Докоснете, за да заглушите звука."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Управление на шума"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Пространствено аудио"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Изкл."</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Фиксирано"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Прослед. на движенията на главата"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Докоснете, за да промените режима на звънене"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"спиране"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"пускане"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"вибриране"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Контроли за силата на звука – %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"При обаждания и известия устройството ще звъни (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Отваряне на изходните настройки"</string> + <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Плъзгачите за силата на звука са разгънати"</string> + <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Плъзгачите за силата на звука са свити"</string> + <string name="volume_panel_hint_mute" msgid="6962563028495243738">"спиране на звука на %s"</string> + <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"включване на звука на %s"</string> <string name="media_output_label_title" msgid="872824698593182505">"Възпроизвеждане на <xliff:g id="LABEL">%s</xliff:g> на"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудиото ще се възпроизвежда на"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Тунер на системния потребителски интерфейс"</string> @@ -1254,7 +1259,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Установено е присъствие на потребител"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайте стандартно приложение за бележки от настройките"</string> <string name="install_app" msgid="5066668100199613936">"Инсталиране на приложението"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 0e95c2c93b24..dac69cb6b0fa 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ডিসকানেক্ট করুন"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"চালু করুন"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"আগামীকাল অটোমেটিক আবার চালু হবে"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"\'দ্রুত শেয়ার\', \'Find My Device\' ও \'ডিভাইস লোকেশনের\' মতো ফিচার ব্লুটুথ ব্যবহার করে"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"আগামীকাল ভোর ৫টায় ব্লুটুথ চালু হবে"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"চার্জ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"অডিও"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"হেডসেট"</string> @@ -439,6 +437,12 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"সরান"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"উইজেট যোগ করুন"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"হয়ে গেছে"</string> + <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) --> + <skip /> + <!-- no translation found for button_text_to_open_settings (1987729256950941628) --> + <skip /> + <string name="work_mode_off_title" msgid="5794818421357835873">"অফিসের অ্যাপ আনপজ করতে চান?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"আনপজ করুন"</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> @@ -581,26 +585,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"মিউট"</string> <string name="media_device_cast" msgid="4786241789687569892">"কাস্ট করুন"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"রিং মিউট করা হয়েছে বলে উপলভ্য নেই"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s। সশব্দ করতে আলতো চাপুন।"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s। কম্পন এ সেট করতে আলতো চাপুন। অ্যাক্সেসযোগ্যতার পরিষেবাগুলিকে মিউট করা হতে পারে।"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s। মিউট করতে আলতো চাপুন। অ্যাক্সেসযোগ্যতার পরিষেবাগুলিকে মিউট করা হতে পারে।"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s। ভাইব্রেট করতে ট্যাপ করুন।"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s। মিউট করতে ট্যাপ করুন।"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"আশপাশের আওয়াজ কন্ট্রোল করা"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"স্পেশিয়ল অডিও"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"বন্ধ আছে"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"চালু আছে"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"হেড ট্র্যাকিং"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"রিঙ্গার মোড পরিবর্তন করতে ট্যাপ করুন"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"মিউট করুন"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"আনমিউট করুন"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ভাইব্রেট করান"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s ভলিউম নিয়ন্ত্রণ"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"কল এবং বিজ্ঞপ্তির রিং হবে (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>-এ প্লে করা হচ্ছে"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"অডিও প্লে করা হবে"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"সিস্টেম UI টিউনার"</string> @@ -1236,12 +1250,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"আরও বেশি রেজোলিউশনের জন্য, ফোন ফ্লিপ করুন"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ফোল্ড করা যায় এমন ডিভাইস খোলা হচ্ছে"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ফোল্ড করা যায় এমন ডিভাইস উল্টানো হচ্ছে"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ফোল্ড করা রয়েছে"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ফোল্ড করা নেই"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ব্যাটারির চার্জ বাকি আছে"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"কোনও চার্জারের সাথে আপনার স্টাইলাস কানেক্ট করুন"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"স্টাইলাস ব্যাটারিতে চার্জ কম আছে"</string> @@ -1257,7 +1268,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"ব্যবহারকারীর উপস্থিতি শনাক্ত করা হয়েছে"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"\'সেটিংস\' থেকে ডিফল্ট নোট নেওয়ার অ্যাপ সেট করুন"</string> <string name="install_app" msgid="5066668100199613936">"অ্যাপ ইনস্টল করুন"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 7abe5ffc5741..dd4fee004f6d 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"prekid veze"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiviranje"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatski uključi ponovo sutra"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funkcije kao što su Quick Share, Pronađi moj uređaj i lokacija uređaja koriste Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth će se uključiti sutra u 5:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> baterije"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Zvuk"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Slušalice"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Uklanjanje"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodajte vidžet"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gotovo"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Želite li dopustiti bilo koji widget na zaključanom zaslonu?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Otvori postavke"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Pokrenuti poslovne aplikacije?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Ponovo pokreni"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Zamijeni korisnika"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"padajući meni"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Sve aplikacije i podaci iz ove sesije će se izbrisati."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Isključi zvuk"</string> <string name="media_device_cast" msgid="4786241789687569892">"Emitiraj"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nedostupno zbog isključenog zvona"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Dodirnite da uključite zvukove."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Dodirnite za postavljanje vibracije. Zvukovi usluga pristupačnosti mogu biti isključeni."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Dodirnite da isključite zvuk. Zvukovi usluga pristupačnosti mogu biti isključeni."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Dodirnite da postavite vibraciju."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Dodirnite da isključite zvuk."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Upravljanje bukom"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Prostorni zvuk"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Isključi"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fiksno"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Praćenje glave"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Dodirnite da promijenite način rada zvuka zvona"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"isključite zvuk"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"uključite zvuk"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibriranje"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Kontrole glasnoće za %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Pozivi i obavještenja će zvoniti jačinom (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Reproduciranje: <xliff:g id="LABEL">%s</xliff:g>"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk će se reprod. na:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Podešavač za korisnički interfejs sistema"</string> @@ -1236,9 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Za višu rezoluciju obrnite telefon"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Sklopivi uređaj se rasklapa"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Sklopivi uređaj se obrće"</string> - <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"zatvoreno"</string> - <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"otvoreno"</string> - <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"sklopljeno"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"otklopljeno"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Preostalo baterije: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Priključite pisaljku na punjač"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"Baterija pisaljke je slaba"</string> @@ -1254,7 +1266,8 @@ <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">"Način rada Prioriteti je uključen"</string> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Otkriveno je prisustvo korisnika"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Postavite zadanu aplikaciju za bilješke u Postavkama"</string> <string name="install_app" msgid="5066668100199613936">"Instaliraj aplikaciju"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 29ef2f959d17..bf5e58ce4c18 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desconnecta"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activa"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Torna\'l a activar automàticament demà"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funcions com ara Quick Share, Troba el meu dispositiu i la ubicació del dispositiu utilitzen el Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth s\'activarà a les 5:00 h demà"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de bateria"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Àudio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Auriculars"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Suprimeix"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Afegeix un widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Fet"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vols permetre qualsevol widget a la pantalla de bloqueig?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Obre la configuració"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Reactivar les apps de treball?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Reactiva"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Canvia d\'usuari"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú desplegable"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Totes les aplicacions i les dades d\'aquesta sessió se suprimiran."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Silencia"</string> <string name="media_device_cast" msgid="4786241789687569892">"Emet"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"No disponible perquè el so està silenciat"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Toca per activar el so."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Toca per activar la vibració. Pot ser que els serveis d\'accessibilitat se silenciïn."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Toca per silenciar el so. Pot ser que els serveis d\'accessibilitat se silenciïn."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Toca per activar la vibració."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Toca per silenciar."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Control de soroll"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Àudio espacial"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Desactiva"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fix"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Seguiment del cap"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Toca per canviar el mode de timbre"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"silenciar"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"deixar de silenciar"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Controls de volum %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Les trucades i les notificacions sonaran (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"S\'està reproduint <xliff:g id="LABEL">%s</xliff:g> a"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Es reproduirà a"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Personalitzador d\'interfície d\'usuari"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Per a una resolució més alta, gira el telèfon"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositiu plegable desplegant-se"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositiu plegable girant"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"plegat"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"desplegat"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g> de bateria"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Connecta el llapis òptic a un carregador"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"Bateria del llapis òptic baixa"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"S\'ha detectat la presència d\'usuaris"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defineix l\'aplicació de notes predeterminada a Configuració"</string> <string name="install_app" msgid="5066668100199613936">"Instal·la l\'aplicació"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 0bbeb9c998e1..5e8acfa009b0 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"odpojit"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivovat"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Zítra znovu automaticky zapnout"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funkce jako Quick Share, Najdi moje zařízení a vyhledávání zařízení používají Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth se zapne zítra v 5:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Zvuk"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Sluchátka"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Odstranit"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Přidat widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Hotovo"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Povolit jakýkoli widget na obrazovce uzamčení?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Otevřít nastavení"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Zrušit pozastavení pracovních aplikací?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Zrušit pozastavení"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Přepnout uživatele"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rozbalovací nabídka"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Veškeré aplikace a data v této relaci budou vymazána."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Ztlumení"</string> <string name="media_device_cast" msgid="4786241789687569892">"Odesílání"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nedostupné, protože vyzvánění je ztlumené"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Klepnutím zapnete zvuk."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Klepnutím aktivujete režim vibrací. Služby přístupnosti mohou být ztlumeny."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Klepnutím vypnete zvuk. Služby přístupnosti mohou být ztlumeny."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Klepnutím nastavíte vibrace."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Klepnutím vypnete zvuk."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Omezení hluku"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Prostorový zvuk"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Vypnuto"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Pevné"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Sledování hlavy"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Klepnutím změníte režim vyzvánění"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"vypnout zvuk"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"zapnout zvuk"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrovat"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Ovládací prvky hlasitosti %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Volání a oznámení budou vyzvánět (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Přehrávání <xliff:g id="LABEL">%s</xliff:g> na"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk se přehraje na"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Nástroj na ladění uživatelského rozhraní systému"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Je zjištěna přítomnost uživatele"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Výchozí aplikaci pro poznámky nastavíte v Nastavení"</string> <string name="install_app" msgid="5066668100199613936">"Nainstalovat aplikaci"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 2ea1e12def5d..8e178e8cf510 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"afbryd forbindelse"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivér"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Aktivér automatisk igen i morgen"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funktioner som f.eks. Quick Share, Find min enhed og enhedslokation anvender Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth aktiveres i morgen kl. 5.00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batteri"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Lyd"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Fjern"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Tilføj widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Udfør"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vil du tillade alle widgets på låseskærmen?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Åbn Indstillinger"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Vil du genoptage arbejdsapps?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Genoptag"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Skift bruger"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullemenu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alle apps og data i denne session slettes."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Slå lyden fra"</string> <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Ikke muligt, da ringetonen er slået fra"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tryk for at slå lyden til."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tryk for at konfigurere til at vibrere. Tilgængelighedstjenester kan blive deaktiveret."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tryk for at slå lyden fra. Lyden i tilgængelighedstjenester kan blive slået fra."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Tryk for at aktivere vibration."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Tryk for at slå lyden fra."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Støjstyring"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Rumlig lyd"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Fra"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fast"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Reg. af hovedbevægelser"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tryk for at ændre ringetilstand"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"slå lyden fra"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"slå lyden til"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrer"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s lydstyrkeknapper"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Der afspilles lyd ved opkald og notifikationer (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Afspiller <xliff:g id="LABEL">%s</xliff:g> på"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Lyden afspilles på"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -992,7 +1004,7 @@ <string name="controls_removed" msgid="3731789252222856959">"Fjernet"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Vil du tilføje <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> kan vælge, hvilke styringselementer og hvilket indhold der skal vises her."</string> - <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Vil du fjerne styringselementerne for <xliff:g id="APPNAME">%s</xliff:g>?"</string> + <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Vil du fjerne styringselementerne for <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Angivet som favorit"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Angivet som favorit. Position <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="accessibility_control_not_favorite" msgid="1291760269563092359">"Fjernet fra favoritter"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Brugertilstedeværelse er registreret"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Angiv standardapp til noter i Indstillinger"</string> <string name="install_app" msgid="5066668100199613936">"Installer app"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index edd718fd69fc..a61e80235883 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"Verknüpfung aufheben"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivieren"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Morgen automatisch wieder aktivieren"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Für Funktionen wie Quick Share, „Mein Gerät finden“ und den Gerätestandort wird Bluetooth verwendet"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth wird morgen um 5:00 Uhr aktiviert"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Entfernen"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Widget hinzufügen"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Fertig"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Beliebige Widgets auf Sperrbildschirm zulassen?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Einstellungen öffnen"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Geschäftliche Apps nicht mehr pausieren?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Nicht mehr pausieren"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Nutzer wechseln"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"Pull-down-Menü"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alle Apps und Daten in dieser Sitzung werden gelöscht."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Stummschalten"</string> <string name="media_device_cast" msgid="4786241789687569892">"Stream"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nicht verfügbar, da Klingelton stumm"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Zum Aufheben der Stummschaltung tippen."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tippen, um Vibrieren festzulegen. Bedienungshilfen werden unter Umständen stummgeschaltet."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Zum Stummschalten tippen. Bedienungshilfen werden unter Umständen stummgeschaltet."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Zum Aktivieren der Vibration tippen."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Zum Stummschalten tippen."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Geräuschunterdrückung"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Spatial Audio"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Aus"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Statisch"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Erfassung von Kopfbewegungen"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Zum Ändern des Klingeltonmodus tippen"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"Stummschalten"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"Aufheben der Stummschaltung"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"Vibrieren lassen"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Lautstärkeregler von %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Gerät klingelt bei Anrufen und Benachrichtigungen (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Wiedergabe von <xliff:g id="LABEL">%s</xliff:g> über"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audiowiedergabe über"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Für höhere Auflösung Smartphone umdrehen"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Faltbares Gerät wird geöffnet"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Faltbares Gerät wird umgeklappt"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"zugeklappt"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"aufgeklappt"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Akku bei <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Schließe deinen Eingabestift an ein Ladegerät an"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"Stylus-Akkustand niedrig"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Anwesenheit des Nutzers wurde erkannt"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standard-Notizen-App in den Einstellungen einrichten"</string> <string name="install_app" msgid="5066668100199613936">"App installieren"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 54303b5e3cc6..3167843826df 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"αποσύνδεση"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ενεργοποίηση"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Αυτόματη ενεργοποίηση ξανά αύριο"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Λειτουργίες όπως το Quick Share, η Εύρεση συσκευής και η τοποθεσία της συσκευής χρησιμοποιούν Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Το Bluetooth θα ενεργοποιηθεί αύριο στις 5 π.μ."</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Ήχος"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Ακουστικά"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Κατάργηση"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Προσθήκη γραφικού στοιχείου"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Τέλος"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Να επιτρέπονται όλα τα γραφικά στοιχεία στην οθόνη κλειδώματος;"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Άνοιγμα ρυθμίσεων"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Αναίρ. παύσης εφαρμ. εργασιών;"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Αναίρεση παύσης"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Σίγαση"</string> <string name="media_device_cast" msgid="4786241789687569892">"Μετάδοση"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Μη διαθέσιμο λόγω σίγασης ήχου κλήσης"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Πατήστε για κατάργηση σίγασης."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Πατήστε για ενεργοποιήσετε τη δόνηση. Οι υπηρεσίες προσβασιμότητας ενδέχεται να τεθούν σε σίγαση."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Πατήστε για σίγαση. Οι υπηρεσίες προσβασιμότητας ενδέχεται να τεθούν σε σίγαση."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Πατήστε για να ενεργοποιήσετε τη δόνηση."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Πατήστε για σίγαση."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Έλεγχος θορύβου"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Χωρικός ήχος"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Ανενεργός"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Σταθερός"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Παρακ. κίνησ. κεφαλ."</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Πατήστε για να αλλάξετε τη λειτουργία ειδοποίησης ήχου"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"σίγαση"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"κατάργηση σίγασης"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"δόνηση"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s στοιχεία ελέγχου έντασης ήχου"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Θα υπάρχει ηχητική ειδοποίηση για κλήσεις και ειδοποιήσεις (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Αναπαραγωγή <xliff:g id="LABEL">%s</xliff:g> σε"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Ο ήχος θα παίξει σε"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Για υψηλότερη ανάλυση, αναστρέψτε το τηλέφωνο"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Αναδιπλούμενη συσκευή που ξεδιπλώνει"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Αναδιπλούμενη συσκευή που διπλώνει"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"διπλωμένη"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ξεδιπλωμένη"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Απομένει το <xliff:g id="PERCENTAGE">%s</xliff:g> της μπαταρίας"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Συνδέστε τη γραφίδα σε έναν φορτιστή"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"Χαμηλή στάθμη μπαταρίας γραφίδας"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Εντοπίστηκε παρουσία χρήστη"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ορίστε την προεπιλεγμένη εφαρμογή σημειώσεων στις Ρυθμίσεις"</string> <string name="install_app" msgid="5066668100199613936">"Εγκατάσταση εφαρμογής"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 0fcd2b08d4bb..6d79b47ab601 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"disconnect"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activate"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatically turn on again tomorrow"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Features like Quick Share, Find My Device and device location use Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth will turn on tomorrow at 5.00 a.m."</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> battery"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on the lock screen?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Unpause"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"All apps and data in this session will be deleted."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Mute"</string> <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Unavailable because ring is muted"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tap to unmute."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tap to mute. Accessibility services may be muted."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Tap to set to vibrate."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Tap to mute."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Noise control"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Spatial audio"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Off"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fixed"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Head tracking"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tap to change ringer mode"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"mute"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"unmute"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrate"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s volume controls"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Calls and notifications will ring (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Playing <xliff:g id="LABEL">%s</xliff:g> on"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio will play on"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1254,7 +1266,8 @@ <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera is blocked"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string> - <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string> <string name="install_app" msgid="5066668100199613936">"Install app"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index da1dcd848b3b..62e0e5707367 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"disconnect"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activate"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatically turn on again tomorrow"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Features like Quick Share, Find My Device, and device location use Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth will turn on tomorrow at 5 AM"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> battery"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on lock screen?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Unpause"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"All apps and data in this session will be deleted."</string> @@ -581,6 +583,8 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Mute"</string> <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Unavailable because ring is muted"</string> + <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Unavailable because Do Not Disturb is on"</string> + <string name="stream_media_unavailable" msgid="6823020894438959853">"Unavailable because Do Not Disturb is on"</string> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tap to unmute."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tap to mute. Accessibility services may be muted."</string> @@ -597,6 +601,11 @@ <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrate"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s volume controls"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Calls and notifications will ring (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Enter output settings"</string> + <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Volume sliders expanded"</string> + <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Volume sliders collapsed"</string> + <string name="volume_panel_hint_mute" msgid="6962563028495243738">"mute %s"</string> + <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"unmute %s"</string> <string name="media_output_label_title" msgid="872824698593182505">"Playing <xliff:g id="LABEL">%s</xliff:g> on"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio will play on"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1250,7 +1259,7 @@ <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera blocked"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone blocked"</string> - <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Do not disturb"</string> <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string> <string name="install_app" msgid="5066668100199613936">"Install app"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 0fcd2b08d4bb..6d79b47ab601 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"disconnect"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activate"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatically turn on again tomorrow"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Features like Quick Share, Find My Device and device location use Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth will turn on tomorrow at 5.00 a.m."</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> battery"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on the lock screen?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Unpause"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"All apps and data in this session will be deleted."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Mute"</string> <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Unavailable because ring is muted"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tap to unmute."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tap to mute. Accessibility services may be muted."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Tap to set to vibrate."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Tap to mute."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Noise control"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Spatial audio"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Off"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fixed"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Head tracking"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tap to change ringer mode"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"mute"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"unmute"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrate"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s volume controls"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Calls and notifications will ring (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Playing <xliff:g id="LABEL">%s</xliff:g> on"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio will play on"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1254,7 +1266,8 @@ <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera is blocked"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string> - <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string> <string name="install_app" msgid="5066668100199613936">"Install app"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 0fcd2b08d4bb..6d79b47ab601 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"disconnect"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activate"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatically turn on again tomorrow"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Features like Quick Share, Find My Device and device location use Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth will turn on tomorrow at 5.00 a.m."</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> battery"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on the lock screen?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Unpause"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"All apps and data in this session will be deleted."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Mute"</string> <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Unavailable because ring is muted"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tap to unmute."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tap to mute. Accessibility services may be muted."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Tap to set to vibrate."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Tap to mute."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Noise control"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Spatial audio"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Off"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fixed"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Head tracking"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tap to change ringer mode"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"mute"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"unmute"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrate"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s volume controls"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Calls and notifications will ring (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Playing <xliff:g id="LABEL">%s</xliff:g> on"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio will play on"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1254,7 +1266,8 @@ <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera is blocked"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone is blocked"</string> - <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string> <string name="install_app" msgid="5066668100199613936">"Install app"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 516c3af2e324..8b3a37f9b770 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"disconnect"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activate"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatically turn on again tomorrow"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Features like Quick Share, Find My Device, and device location use Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth will turn on tomorrow at 5 AM"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> battery"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Remove"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Add widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Done"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Allow any widget on lock screen?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Open settings"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Unpause work apps?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Unpause"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Switch user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"All apps and data in this session will be deleted."</string> @@ -581,6 +583,8 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Mute"</string> <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Unavailable because ring is muted"</string> + <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Unavailable because Do Not Disturb is on"</string> + <string name="stream_media_unavailable" msgid="6823020894438959853">"Unavailable because Do Not Disturb is on"</string> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tap to unmute."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tap to set to vibrate. Accessibility services may be muted."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tap to mute. Accessibility services may be muted."</string> @@ -597,6 +601,11 @@ <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrate"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s volume controls"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Calls and notifications will ring (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Enter output settings"</string> + <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Volume sliders expanded"</string> + <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Volume sliders collapsed"</string> + <string name="volume_panel_hint_mute" msgid="6962563028495243738">"mute %s"</string> + <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"unmute %s"</string> <string name="media_output_label_title" msgid="872824698593182505">"Playing <xliff:g id="LABEL">%s</xliff:g> on"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio will play on"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1250,7 +1259,7 @@ <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Camera blocked"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Camera and microphone blocked"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone blocked"</string> - <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Priority mode on"</string> + <string name="priority_mode_dream_overlay_content_description" msgid="3361628029609329182">"Do not disturb"</string> <string name="assistant_attention_content_description" msgid="4166330881435263596">"User presence is detected"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Set default notes app in Settings"</string> <string name="install_app" msgid="5066668100199613936">"Install app"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 11e31e1c3f2b..ddeae202da03 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desconectar"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activar"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Volver a activar automáticamente mañana"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Las funciones como Quick Share, Encontrar mi dispositivo y la ubicación del dispositivo usan Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Se activará el Bluetooth mañana a las 5 a.m."</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batería"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Auriculares"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Quitar"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Agregar widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Listo"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"¿Quieres permitir cualquier widget en la pantalla de bloqueo?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir configuración"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"¿Reanudar apps de trabajo?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Reanudar"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar usuario"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú expandible"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Se eliminarán las aplicaciones y los datos de esta sesión."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Silenciar"</string> <string name="media_device_cast" msgid="4786241789687569892">"Transmisión"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"No disponible por timbre silenciado"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Presiona para dejar de silenciar."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Presiona para establecer el modo vibración. Es posible que los servicios de accesibilidad estén silenciados."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Presiona para silenciar. Es posible que los servicios de accesibilidad estén silenciados."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Presiona para establecer el modo vibración."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Presiona para silenciar."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Control de ruido"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Audio espacial"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Desactivar"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fijar"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Seg. de cabeza"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Presiona para cambiar el modo de timbre"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"silenciar"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"dejar de silenciar"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Controles de volumen %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Sonarán las llamadas y notificaciones (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Reproduciendo <xliff:g id="LABEL">%s</xliff:g> en"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Se reproducirá en"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Sintonizador de IU del sistema"</string> @@ -740,7 +752,7 @@ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Mostrando combinaciones de teclas para la app actual"</string> <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Ver notificaciones"</string> <string name="group_system_full_screenshot" msgid="5742204844232667785">"Tomar captura de pantalla"</string> - <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar accesos directos"</string> + <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar combinaciones de teclas"</string> <string name="group_system_go_back" msgid="2730322046244918816">"Atrás"</string> <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir a la pantalla principal"</string> <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ver apps recientes"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Para obtener una resolución más alta, gira el teléfono"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Dispositivo plegable siendo desplegado"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Dispositivo plegable siendo girado"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"plegado"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"desplegado"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> de batería restante"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Conecta tu pluma stylus a un cargador"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"La pluma stylus tiene poca batería"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Se detectó la presencia del usuario"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Configura la app de notas predeterminada en Configuración"</string> <string name="install_app" msgid="5066668100199613936">"Instalar app"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index ec03f8dd982c..db65640fb375 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desconectar"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activar"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Volver a activar automáticamente mañana"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Las funciones como Quick Share y Encontrar mi dispositivo, y la ubicación del dispositivo usan Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"El Bluetooth se activará mañana a las 5:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batería"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Auriculares"</string> @@ -439,6 +437,12 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Quitar"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Añadir widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Hecho"</string> + <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) --> + <skip /> + <!-- no translation found for button_text_to_open_settings (1987729256950941628) --> + <skip /> + <string name="work_mode_off_title" msgid="5794818421357835873">"¿Reactivar apps de trabajo?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Reactivar"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar de usuario"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú desplegable"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Se eliminarán todas las aplicaciones y datos de esta sesión."</string> @@ -581,26 +585,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Silenciar"</string> <string name="media_device_cast" msgid="4786241789687569892">"Enviar"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"No disponible (el tono está silenciado)"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Toca para activar el sonido."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Toca para poner el dispositivo en vibración. Los servicios de accesibilidad pueden silenciarse."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Toca para silenciar. Los servicios de accesibilidad pueden silenciarse."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Toca para activar la vibración."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Toca para silenciar."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Control de ruido"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Audio espacial"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Desactivado"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fijo"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Seguimiento de cabeza"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Toca para cambiar el modo de timbre"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"silenciar"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"dejar de silenciar"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Controles de volumen %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Las llamadas y las notificaciones sonarán (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Reproduciendo <xliff:g id="LABEL">%s</xliff:g> en"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Se reproducirá en"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Configurador de UI del sistema"</string> @@ -742,12 +756,12 @@ <string name="group_system_full_screenshot" msgid="5742204844232667785">"Hacer captura de pantalla"</string> <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Mostrar accesos directos"</string> <string name="group_system_go_back" msgid="2730322046244918816">"Volver"</string> - <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir a la pantalla de inicio"</string> + <string name="group_system_access_home_screen" msgid="4130366993484706483">"Ir a pantalla de inicio"</string> <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Ver aplicaciones recientes"</string> - <string name="group_system_cycle_forward" msgid="5478663965957647805">"Desplazarse por las aplicaciones recientes (adelante)"</string> - <string name="group_system_cycle_back" msgid="8194102916946802902">"Desplazarse por las aplicaciones recientes (atrás)"</string> + <string name="group_system_cycle_forward" msgid="5478663965957647805">"Desplazarse por aplicaciones recientes (adelante)"</string> + <string name="group_system_cycle_back" msgid="8194102916946802902">"Desplazarse por aplicaciones recientes (atrás)"</string> <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Abrir lista de aplicaciones"</string> - <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar la barra de tareas"</string> + <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Mostrar barra de tareas"</string> <string name="group_system_access_system_settings" msgid="8731721963449070017">"Abrir ajustes"</string> <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Abrir el Asistente"</string> <string name="group_system_lock_screen" msgid="7391191300363416543">"Pantalla de bloqueo"</string> @@ -758,8 +772,8 @@ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Cambiar de pantalla dividida a pantalla completa"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Con pantalla dividida: reemplazar una aplicación por otra"</string> <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string> - <string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar al siguiente idioma"</string> - <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Cambiar al idioma anterior"</string> + <string name="input_switch_input_language_next" msgid="3782155659868227855">"Cambiar a siguiente idioma"</string> + <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Cambiar a idioma anterior"</string> <string name="input_access_emoji" msgid="8105642858900406351">"Acceder a los emojis"</string> <string name="input_access_voice_typing" msgid="7291201476395326141">"Acceder a Escribir por voz"</string> <string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Aplicaciones"</string> @@ -1254,7 +1268,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Se ha detectado la presencia de usuarios"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Configura la aplicación de notas predeterminada en Ajustes"</string> <string name="install_app" msgid="5066668100199613936">"Instalar aplicación"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index dfbb1ee562d1..04a2a9c95881 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"katkesta ühendus"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiveeri"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Lülita automaatselt homme uuesti sisse"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funktsioonid, nagu Kiirjagamine, Leia mu seade ja seadme asukoht, kasutavad Bluetoothi"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth lülitatakse sisse homme kell viis hommikul"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> akut"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Heli"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Peakomplekt"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Eemalda"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Lisa vidin"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Valmis"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Kas lubada lukustuskuval kõik vidinad?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Ava seaded"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Kas lõpetada töörakenduste peatamine?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Lõpeta peatamine"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Kasutaja vahetamine"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rippmenüü"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Seansi kõik rakendused ja andmed kustutatakse."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Vaigistatud"</string> <string name="media_device_cast" msgid="4786241789687569892">"Ülekandmine"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Pole saadaval, kuna helin on vaigistatud"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Puudutage vaigistuse tühistamiseks."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Puudutage värinarežiimi määramiseks. Juurdepääsetavuse teenused võidakse vaigistada."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Puudutage vaigistamiseks. Juurdepääsetavuse teenused võidakse vaigistada."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Puudutage vibreerimise määramiseks."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Puudutage vaigistamiseks."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Mürasummutus"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Ruumiline heli"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Väljas"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fikseeritud"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Pea jälgimine"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Puudutage telefonihelina režiimi muutmiseks"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"vaigistamine"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"vaigistuse tühistamine"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibreerimine"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Helitugevuse juhtnupud: %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Kõnede ja märguannete puhul telefon heliseb (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Esitamine jätkub seadmes <xliff:g id="LABEL">%s</xliff:g>"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Heli esitamine jätkub"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Süsteemi kasutajaliidese tuuner"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Suurema eraldusvõime saavutamiseks pöörake telefon ümber"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Volditava seadme lahtivoltimine"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Volditava seadme ümberpööramine"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"kokku volditud"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"lahti volditud"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Akutase on <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Ühendage elektronpliiats laadijaga"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"Elektronpliiatsi akutase on madal"</string> @@ -1257,7 +1266,8 @@ <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kaamera on blokeeritud"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kaamera ja mikrofon on blokeeritud"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofon on blokeeritud"</string> - <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Prioriteetne režiim on sisse lülitatud"</string> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Tuvastati kasutaja kohalolu"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Määrake seadetes märkmete vaikerakendus."</string> <string name="install_app" msgid="5066668100199613936">"Installi rakendus"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index e41333c1baab..faffa937734a 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"deskonektatu"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktibatu"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Aktibatu automatikoki berriro bihar"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Quick Share, Bilatu nire gailua, gailuaren kokapena eta beste eginbide batzuek Bluetootha darabilte"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetootha bihar 05:00etan aktibatuko da"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audioa"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Entzungailua"</string> @@ -439,6 +437,12 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Kendu"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Gehitu widget bat"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Eginda"</string> + <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) --> + <skip /> + <!-- no translation found for button_text_to_open_settings (1987729256950941628) --> + <skip /> + <string name="work_mode_off_title" msgid="5794818421357835873">"Laneko aplikazioak berraktibatu?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Berraktibatu"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Aldatu erabiltzailea"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"zabaldu menua"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Saioko aplikazio eta datu guztiak ezabatuko dira."</string> @@ -581,26 +585,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Ez jo tonua"</string> <string name="media_device_cast" msgid="4786241789687569892">"Igorri"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Ez dago erabilgarri, tonua desaktibatuta dagoelako"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Sakatu audioa aktibatzeko."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Sakatu dardara ezartzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Sakatu audioa desaktibatzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Sakatu hau dardara ezartzeko."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Sakatu hau audioa desaktibatzeko."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Zarata-murrizketa"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Audio espaziala"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Desaktibatuta"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Finkoa"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Buruaren jarraipena"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Sakatu tonu-jotzailearen modua aldatzeko"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"desaktibatu audioa"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"aktibatu audioa"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"dardara"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s gailuaren bolumena kontrolatzeko aukerak"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Tonuak jo egingo du deiak eta jakinarazpenak jasotzean (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> hemen erreproduzitzen:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audioa erreproduzitzen jarraituko du"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Sistemaren erabiltzaile-interfazearen konfiguratzailea"</string> @@ -1254,7 +1268,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Erabiltzailearen presentzia hauteman da"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ezarri oharren aplikazio lehenetsia ezarpenetan"</string> <string name="install_app" msgid="5066668100199613936">"Instalatu aplikazioa"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 6b5c4ccaefe6..1e24158c671f 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"قطع اتصال"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"فعال کردن"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"فردا دوباره بهطور خودکار روشن شود"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"ویژگیهایی مثل «همرسانی سریع»، «پیدا کردن دستگاهم»، و مکان دستگاه از بلوتوث استفاده میکنند"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"بلوتوث فردا ۵ ق.ظ. روشن خواهد شد"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"شارژ باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"صوت"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"هدست"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"برداشتن"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"افزودن ابزارک"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"تمام"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"هر نوع ابزارکی در صفحه قفل مجاز شود؟"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"باز کردن تنظیمات"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"مکث برنامههای کاری لغو شود؟"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"لغو مکث"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"صامت"</string> <string name="media_device_cast" msgid="4786241789687569892">"ارسال محتوا"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"دردسترس نیست، چون زنگ بیصدا شده است"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. برای باصدا کردن ضربه بزنید."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. برای تنظیم روی لرزش ضربه بزنید. ممکن است سرویسهای دسترسپذیری بیصدا شوند."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. برای صامت کردن ضربه بزنید. ممکن است سرویسهای دسترسپذیری صامت شود."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. برای تنظیم روی لرزش، ضربه بزنید."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. برای صامت کردن ضربه بزنید."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"کنترل صدای محیط"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"صدای فضایی"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"خاموش"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ثابت"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ردیابی سر"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"برای تغییر حالت زنگ، ضربه بزنید"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"صامت کردن"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"باصدا کردن"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"لرزش"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s کنترلهای میزان صدا"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"تماسها و اعلانها زنگ میخورند (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"درحال پخش <xliff:g id="LABEL">%s</xliff:g> در"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"صدا پخش میشود در"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"تنظیمکننده واسط کاربری سیستم"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"برای وضوح بیشتر، تلفن را بچرخانید"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"دستگاه تاشو درحال باز شدن"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"دستگاه تاشو درحال چرخش به اطراف"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"تاشده"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"تانشده"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> باتری باقی مانده است"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"قلم را به شارژر وصل کنید"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"باتری قلم ضعیف است"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"حضور کاربر شناسایی میشود"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"برنامه پیشفرض یادداشت را در «تنظیمات» تنظیم کنید"</string> <string name="install_app" msgid="5066668100199613936">"نصب برنامه"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 78f401fd9277..26d7bcb20f0d 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"katkaise yhteys"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivoi"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Laita automaattisesti päälle taas huomenna"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Ominaisuudet (esim. Quick Share ja Paikanna laite) ja laitteen sijainti käyttävät Bluetoothia"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth käynnistetään huomenna klo 5.00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Akun taso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Ääni"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Poista"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Lisää widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Valmis"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Sallitaanko kaikki widgetit lukitusnäytöllä?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Avaa asetukset"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Laita työsovellukset päälle?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Laita päälle"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Vaihda käyttäjää"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"alasvetovalikko"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Kaikki sovellukset ja tämän istunnon tiedot poistetaan."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Äänetön"</string> <string name="media_device_cast" msgid="4786241789687569892">"Striimaa"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Ei käytettävissä, soittoääni mykistetty"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Poista mykistys koskettamalla."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Siirry värinätilaan koskettamalla. Myös esteettömyyspalvelut saattavat mykistyä."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Mykistä koskettamalla. Myös esteettömyyspalvelut saattavat mykistyä."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Siirry värinätilaan napauttamalla."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Mykistä napauttamalla."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Melunvaimennus"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Tila-audio"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Pois päältä"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Kiinteä"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Pään seuranta"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Vaihda soittoäänen tilaa napauttamalla"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"mykistä"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"poista mykistys"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"värinä"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Äänenvoimakkuuden säädin: %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Puhelut ja ilmoitukset soivat (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Toistetaan: <xliff:g id="LABEL">%s</xliff:g>"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audiota toistetaan laitteella"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Resoluutio on parempi, kun käännät puhelimen"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Taitettava laite taitetaan"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Taitettava laite käännetään ympäri"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"taitettu"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"taittamaton"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Akkua jäljellä <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Yhdistä näyttökynä laturiin"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"Näyttökynän akku vähissä"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Käyttäjän läsnäolo havaittu"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Aseta oletusmuistiinpanosovellus Asetuksista"</string> <string name="install_app" msgid="5066668100199613936">"Asenna sovellus"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 4c4913e4a959..d6aaf084080c 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"Déconnecter"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"Activer"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Activer le Bluetooth automatiquement demain"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Les fonctionnalités comme le Partage rapide, Localiser mon appareil et la position de l\'appareil utilisent le Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Le Bluetooth s\'activera demain à 5 h"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Pile : <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Écouteurs"</string> @@ -439,6 +437,12 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Retirer"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ajouter un widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Terminé"</string> + <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) --> + <skip /> + <!-- no translation found for button_text_to_open_settings (1987729256950941628) --> + <skip /> + <string name="work_mode_off_title" msgid="5794818421357835873">"Réactiver les applis pros?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Réactiver"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Changer d\'utilisateur"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu déroulant"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Toutes les applications et les données de cette session seront supprimées."</string> @@ -581,26 +585,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Sonnerie désactivée"</string> <string name="media_device_cast" msgid="4786241789687569892">"Diffuser"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Inaccessible : sonnerie en sourdine"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Touchez pour réactiver le son."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Touchez pour activer les vibrations. Il est possible de couper le son des services d\'accessibilité."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Touchez pour couper le son. Il est possible de couper le son des services d\'accessibilité."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Touchez pour activer les vibrations."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Touchez pour couper le son."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Contrôle du bruit"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Son spatial"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Désactivé"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fixé"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Suivi de la tête"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Touchez pour modifier le mode de sonnerie"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"désactiver le son"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"réactiver le son"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibration"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Commandes de volume de %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Les appels et les notifications seront annoncés par une sonnerie (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Lecture de <xliff:g id="LABEL">%s</xliff:g> sur"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Lecture audio sur"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1254,7 +1268,8 @@ <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Appareil photo bloqué"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Appareil photo et microphone bloqués"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microphone bloqué"</string> - <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Mode Priorité activé"</string> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"La présence d\'un utilisateur est détectée"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Définir l\'application de prise de notes par défaut dans les Paramètres"</string> <string name="install_app" msgid="5066668100199613936">"Installer l\'application"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 5bd34d78eec6..7f6bddaa70a7 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"dissocier"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activer"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Réactiver automatiquement demain"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Certaines fonctionnalités telles que Quick Share, Localiser mon appareil ou encore la position de l\'appareil utilisent le Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Le Bluetooth sera activé demain à 5h00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batterie"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Casque"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Supprimer"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ajouter un widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"OK"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Autoriser n\'importe quel widget sur l\'écran de verrouillage ?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Ouvrir les paramètres"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Réactiver les applis pro ?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Réactiver"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Changer d\'utilisateur"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu déroulant"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Toutes les applications et les données de cette session seront supprimées."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Couper le son"</string> <string name="media_device_cast" msgid="4786241789687569892">"Caster"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponible, car la sonnerie est coupée"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Appuyez pour ne plus ignorer."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Appuyez pour mettre en mode vibreur. Vous pouvez ignorer les services d\'accessibilité."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Appuyez pour ignorer. Vous pouvez ignorer les services d\'accessibilité."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Appuyez pour mettre en mode vibreur."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Appuyez pour ignorer."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Contrôle du bruit"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Son spatial"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Désactivé"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Activé"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Suivi des mouvements de la tête"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Appuyez pour changer le mode de la sonnerie"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"couper le son"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"réactiver le son"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"activer le vibreur"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Commandes de volume %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Les appels et les notifications sonneront (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Diffusion de <xliff:g id="LABEL">%s</xliff:g> sur"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"L\'audio se mettra en marche"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -744,7 +756,7 @@ <string name="group_system_go_back" msgid="2730322046244918816">"Retour"</string> <string name="group_system_access_home_screen" msgid="4130366993484706483">"Accéder à l\'écran d\'accueil"</string> <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Afficher les applis récentes"</string> - <string name="group_system_cycle_forward" msgid="5478663965957647805">"Aller vers les applications récentes"</string> + <string name="group_system_cycle_forward" msgid="5478663965957647805">"Avancer dans les applications récentes"</string> <string name="group_system_cycle_back" msgid="8194102916946802902">"Revenir sur les applications récentes"</string> <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"Ouvrir la liste d\'applications"</string> <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"Afficher la barre des tâches"</string> @@ -759,7 +771,7 @@ <string name="system_multitasking_replace" msgid="7410071959803642125">"En mode écran partagé : Remplacer une appli par une autre"</string> <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Saisie"</string> <string name="input_switch_input_language_next" msgid="3782155659868227855">"Passer à la langue suivante"</string> - <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Passer à la langue précédente"</string> + <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Revenir à la langue précédente"</string> <string name="input_access_emoji" msgid="8105642858900406351">"Accéder aux emoji"</string> <string name="input_access_voice_typing" msgid="7291201476395326141">"Accéder à la saisie vocale"</string> <string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"Applications"</string> @@ -900,7 +912,7 @@ <string name="mobile_data_disable_message" msgid="8604966027899770415">"Vous n\'aurez pas accès aux données mobiles ni à Internet via <xliff:g id="CARRIER">%s</xliff:g>. Vous ne pourrez accéder à Internet que par Wi-Fi."</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"votre opérateur"</string> <string name="auto_data_switch_disable_title" msgid="5146527155665190652">"Rebasculer sur <xliff:g id="CARRIER">%s</xliff:g> ?"</string> - <string name="auto_data_switch_disable_message" msgid="5885533647399535852">"Il n\'y aura pas de basculement automatique entre les données mobile selon la disponibilité"</string> + <string name="auto_data_switch_disable_message" msgid="5885533647399535852">"Il n\'y aura pas de basculement automatique entre les données mobiles selon la disponibilité"</string> <string name="auto_data_switch_dialog_negative_button" msgid="2370876875999891444">"Non, merci"</string> <string name="auto_data_switch_dialog_positive_button" msgid="8531782041263087564">"Oui, rebasculer"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"L\'application Paramètres ne peut pas valider votre réponse, car une application masque la demande d\'autorisation."</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"La présence de l\'utilisateur est détectée"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Définir une appli de notes par défaut dans les paramètres"</string> <string name="install_app" msgid="5066668100199613936">"Installer l\'appli"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index e694d14086a2..97980e5fb052 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desconectar"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activar"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Volver activar automaticamente mañá"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"As funcións como Quick Share, Localizar o meu dispositivo ou a de localización do dispositivo utilizan o Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"O Bluetooth activarase mañá ás 05:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batería"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Auriculares"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Quitar"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Engadir widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Feito"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Queres permitir calquera widget na pantalla de bloqueo?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir configuración"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Reactivar apps do traballo?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Reactivar"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambiar usuario"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menú despregable"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Eliminaranse todas as aplicacións e datos desta sesión."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Silenciar"</string> <string name="media_device_cast" msgid="4786241789687569892">"Emitir"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Non dispoñible (o son está silenciado)"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Toca para activar o son."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Toca para establecer a vibración. Pódense silenciar os servizos de accesibilidade."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Toca para silenciar. Pódense silenciar os servizos de accesibilidade."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Toca para establecer a vibración."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Toca para silenciar."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Control de ruído"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Audio espacial"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Desactivar"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fixo"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Seguimento da cabeza"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Toca para cambiar o modo de timbre"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"silenciar"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"activar o son"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Controis de volume de %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"As chamadas e as notificacións soarán (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Reproducindo <xliff:g id="LABEL">%s</xliff:g> en"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio reproducido en"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Configurador da IU do sistema"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Detectouse a presenza de usuarios"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Establece a aplicación de notas predeterminada en Configuración"</string> <string name="install_app" msgid="5066668100199613936">"Instalar aplicación"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 5099773c360a..e47b3243ee4b 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ડિસ્કનેક્ટ કરો"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"સક્રિય કરો"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"આવતીકાલે ફરીથી ઑટોમૅટિક રીતે ચાલુ કરો"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"ક્વિક શેર, Find My Device અને ડિવાઇસના લોકેશન જેવી સુવિધાઓ બ્લૂટૂથનો ઉપયોગ કરે છે"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"બ્લૂટૂથ આવતીકાલે સવારે 5 વાગ્યે ચાલુ થશે"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> બૅટરી"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ઑડિયો"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"હૅડસેટ"</string> @@ -439,6 +437,12 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"કાઢી નાખો"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"વિજેટ ઉમેરો"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"થઈ ગયું"</string> + <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) --> + <skip /> + <!-- no translation found for button_text_to_open_settings (1987729256950941628) --> + <skip /> + <string name="work_mode_off_title" msgid="5794818421357835873">"ઑફિસની થોભાવેલી ઍપ ચાલુ કરીએ?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"ફરી ચાલુ કરો"</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> @@ -581,26 +585,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"મ્યૂટ કરો"</string> <string name="media_device_cast" msgid="4786241789687569892">"કાસ્ટ કરો"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"રિંગ મ્યૂટ કરી હોવાના કારણે અનુપલબ્ધ છે"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. અનમ્યૂટ કરવા માટે ટૅપ કરો."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. વાઇબ્રેટ પર સેટ કરવા માટે ટૅપ કરો. ઍક્સેસિબિલિટી સેવાઓ મ્યૂટ કરવામાં આવી શકે છે."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. મ્યૂટ કરવા માટે ટૅપ કરો. ઍક્સેસિબિલિટી સેવાઓ મ્યૂટ કરવામાં આવી શકે છે."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. કંપન પર સેટ કરવા માટે ટૅપ કરો."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. મ્યૂટ કરવા માટે ટૅપ કરો."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"અવાજનું નિયંત્રણ"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"સ્પેશલ ઑડિયો"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"બંધ કરો"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ફિક્સ્ડ"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"હેડ ટ્રૅકિંગ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"રિંગર મોડ બદલવા માટે ટૅપ કરો"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"મ્યૂટ કરો"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"અનમ્યૂટ કરો"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"વાઇબ્રેટ"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s વૉલ્યૂમ નિયંત્રણો"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"કૉલ અને નોટિફિકેશનની રિંગ (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>) પર વાગશે"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> વગાડી રહ્યાં છીએ"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"ઑડિયો આની પર વાગશે"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"સિસ્ટમ UI ટ્યૂનર"</string> @@ -1236,12 +1250,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"વધુ રિઝોલ્યુશન માટે, ફોનને ફ્લિપ કરો"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ફોલ્ડ કરી શકાય એવું ડિવાઇસ અનફોલ્ડ કરવામાં આવી રહ્યું છે"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ફોલ્ડ કરી શકાય એવું ડિવાઇસ ફ્લિપ કરવામાં આવી રહ્યું છે"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ફોલ્ડ કરેલું"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"અનફોલ્ડ કરેલું"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> બૅટરી બાકી છે"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"તમારા સ્ટાઇલસને ચાર્જર સાથે કનેક્ટ કરો"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"સ્ટાઇલસની બૅટરીમાં ચાર્જ ઓછો છે"</string> @@ -1257,7 +1268,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"વપરાશકર્તાની હાજરીની ભાળ મળી છે"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"સેટિંગમાં નોંધની ડિફૉલ્ટ ઍપ સેટ કરો"</string> <string name="install_app" msgid="5066668100199613936">"ઍપ ઇન્સ્ટૉલ કરો"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index ea4ccc02a947..c36b6f913de4 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -31,7 +31,7 @@ <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"चालू करें"</string> <string name="battery_saver_start_action" msgid="8353766979886287140">"चालू करें"</string> <string name="battery_saver_dismiss_action" msgid="7199342621040014738">"रहने दें"</string> - <string name="standard_battery_saver_text" msgid="6855876746552374119">"स्टैंडर्ड मोड"</string> + <string name="standard_battery_saver_text" msgid="6855876746552374119">"स्टैंडर्ड"</string> <string name="extreme_battery_saver_text" msgid="8455810156739865335">"एक्सट्रीम"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"स्क्रीन अपने आप घुमाना"</string> <string name="usb_device_permission_prompt" msgid="4414719028369181772">"<xliff:g id="APPLICATION">%1$s</xliff:g> को <xliff:g id="USB_DEVICE">%2$s</xliff:g> के ऐक्सेस की अनुमति दें?"</string> @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"डिसकनेक्ट करें"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"चालू करें"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"कल फिर से अपने-आप चालू हो जाएगा"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"क्विक शेयर, Find My Device, और डिवाइस की जगह की जानकारी का पता लगाने जैसी सुविधाएं, ब्लूटूथ का इस्तेमाल करती हैं"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"कल सुबह 5 बजे ब्लूटूथ चालू हो जाएगा"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> बैटरी"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ऑडियो"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"हेडसेट"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"हटाएं"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"विजेट जोड़ें"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"हो गया"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"लॉक स्क्रीन पर किसी भी विजेट को अनुमति देनी है?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"सेटिंग खोलें"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"वर्क ऐप्लिकेशन चालू करने हैं?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"चालू करें"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"आवाज़ बंद है"</string> <string name="media_device_cast" msgid="4786241789687569892">"कास्ट करें"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"रिंग म्यूट होने से आवाज़ नहीं सुनाई दी"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. अनम्यूट करने के लिए टैप करें."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. कंपन पर सेट करने के लिए टैप करें. सुलभता सेवाएं म्यूट हो सकती हैं."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. म्यूट करने के लिए टैप करें. सुलभता सेवाएं म्यूट हो सकती हैं."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. कंपन (वाइब्रेशन) पर सेट करने के लिए छूएं."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. म्यूट करने के लिए टैप करें."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"शोर को कंट्रोल करने की सुविधा"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"स्पेशल ऑडियो"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"बंद करें"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"चालू करें"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"सिर हिलना ट्रैक करें"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"रिंगर मोड बदलने के लिए टैप करें"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"म्यूट करें"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"अनम्यूट करें"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"वाइब्रेशन की सुविधा चालू करें"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s की आवाज़ कम या ज़्यादा करने की सुविधा"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"कॉल और सूचनाएं आने पर घंटी बजेगी (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> को चलाया जा रहा है"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"ऑडियो इसमें चलेगा"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"सिस्टम यूज़र इंटरफ़ेस (यूआई) ट्यूनर"</string> @@ -738,28 +750,28 @@ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"इनपुट के लिए शॉर्टकट दिखाए जा रहे हैं"</string> <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"ऐसे शॉर्टकट दिखाए जा रहे हैं जिनसे ऐप्लिकेशन खोले जा सकें"</string> <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"मौजूदा ऐप्लिकेशन के लिए शॉर्टकट दिखाए जा रहे हैं"</string> - <string name="group_system_access_notification_shade" msgid="1619028907006553677">"सूचनाएं देखें"</string> - <string name="group_system_full_screenshot" msgid="5742204844232667785">"स्क्रीनशॉट लें"</string> - <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"शॉर्टकट दिखाएं"</string> - <string name="group_system_go_back" msgid="2730322046244918816">"वापस जाएं"</string> - <string name="group_system_access_home_screen" msgid="4130366993484706483">"होम स्क्रीन पर जाएं"</string> - <string name="group_system_overview_open_apps" msgid="5659958952937994104">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन देखें"</string> - <string name="group_system_cycle_forward" msgid="5478663965957647805">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन के अगले पेज पर जाएं"</string> - <string name="group_system_cycle_back" msgid="8194102916946802902">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन के पिछले पेज पर जाएं"</string> - <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ऐप्लिकेशन की सूची खोलें"</string> - <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"टास्कबार दिखाएं"</string> - <string name="group_system_access_system_settings" msgid="8731721963449070017">"सेटिंग खोलें"</string> - <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Google Assistant खोलें"</string> + <string name="group_system_access_notification_shade" msgid="1619028907006553677">"सूचनाएं देखने के लिए"</string> + <string name="group_system_full_screenshot" msgid="5742204844232667785">"स्क्रीनशॉट लेने के लिए"</string> + <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"शॉर्टकट दिखाने के लिए"</string> + <string name="group_system_go_back" msgid="2730322046244918816">"वापस पीछे जाने के लिए"</string> + <string name="group_system_access_home_screen" msgid="4130366993484706483">"होम स्क्रीन पर जाने के लिए"</string> + <string name="group_system_overview_open_apps" msgid="5659958952937994104">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन देखने के लिए"</string> + <string name="group_system_cycle_forward" msgid="5478663965957647805">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन के अगले पेज पर जाने के लिए"</string> + <string name="group_system_cycle_back" msgid="8194102916946802902">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन के पिछले पेज पर जाने के लिए"</string> + <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"ऐप्लिकेशन की सूची खोलने के लिए"</string> + <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"टास्कबार दिखाने के लिए"</string> + <string name="group_system_access_system_settings" msgid="8731721963449070017">"सेटिंग खोलने के लिए"</string> + <string name="group_system_access_google_assistant" msgid="7210074957915968110">"Google Assistant खोलने के लिए"</string> <string name="group_system_lock_screen" msgid="7391191300363416543">"लॉक स्क्रीन"</string> <string name="group_system_quick_memo" msgid="3764560265935722903">"नोट करें"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"सिस्टम मल्टीटास्किंग"</string> <string name="system_multitasking_rhs" msgid="2454557648974553729">"स्प्लिट स्क्रीन का इस्तेमाल करके, मौजूदा ऐप्लिकेशन को दाईं ओर ले जाएं"</string> <string name="system_multitasking_lhs" msgid="3516599774920979402">"स्प्लिट स्क्रीन का इस्तेमाल करके, मौजूदा ऐप्लिकेशन को बाईं ओर ले जाएं"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रीन से फ़ुल स्क्रीन मोड पर स्विच करें"</string> + <string name="system_multitasking_full_screen" msgid="336048080383640562">"स्प्लिट स्क्रीन से फ़ुल स्क्रीन मोड पर स्विच करने के लिए"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"स्प्लिट स्क्रीन के दौरान: एक ऐप्लिकेशन को दूसरे ऐप्लिकेशन से बदलें"</string> <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"इनपुट"</string> - <string name="input_switch_input_language_next" msgid="3782155659868227855">"अगली भाषा पर स्विच करें"</string> - <string name="input_switch_input_language_previous" msgid="6043341362202336623">"इस्तेमाल की गई पिछली भाषा पर स्विच करें"</string> + <string name="input_switch_input_language_next" msgid="3782155659868227855">"अगली भाषा पर स्विच करने के लिए"</string> + <string name="input_switch_input_language_previous" msgid="6043341362202336623">"पिछली भाषा पर स्विच करने के लिए"</string> <string name="input_access_emoji" msgid="8105642858900406351">"इमोजी ऐक्सेस करें"</string> <string name="input_access_voice_typing" msgid="7291201476395326141">"बोली को लिखाई में बदलने की सुविधा ऐक्सेस करें"</string> <string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"ऐप्लिकेशन"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"उपयोगकर्ता की मौजूदगी का पता लगाया गया"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिंग में जाकर, नोट लेने की सुविधा देने वाले ऐप्लिकेशन को डिफ़ॉल्ट के तौर पर सेट करें"</string> <string name="install_app" msgid="5066668100199613936">"ऐप्लिकेशन इंस्टॉल करें"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index a6cfeb9f8d0a..2d44e1c828b9 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -76,7 +76,7 @@ <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"šalje sliku"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Spremanje snimke zaslona..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Spremanje snimke zaslona na poslovni profil…"</string> - <string name="screenshot_saved_title" msgid="8893267638659083153">"Snimka zaslona spremljena"</string> + <string name="screenshot_saved_title" msgid="8893267638659083153">"Snimka zaslona je spremljena"</string> <string name="screenshot_failed_title" msgid="3259148215671936891">"Snimka zaslona nije spremljena"</string> <string name="screenshot_failed_external_display_indication" msgid="6555673132061101936">"Vanjski prikaz"</string> <string name="screenshot_failed_to_save_user_locked_text" msgid="6156607948256936920">"Uređaj mora biti otključan da bi se snimka zaslona mogla spremiti"</string> @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"prekini vezu"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiviraj"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatski ponovo uključi sutra"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Značajke kao što su brzo dijeljenje, Pronađi moj uređaj i lokacija uređaja upotrebljavaju Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth će se uključiti sutra u 5:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> baterije"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Slušalice"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Ukloni"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodaj widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gotovo"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Želite li dopustiti bilo koji widget na zaključanom zaslonu?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Otvori postavke"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Pokrenuti poslovne aplikacije?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Ponovno pokreni"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Promjena korisnika"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"padajući izbornik"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Izbrisat će se sve aplikacije i podaci u ovoj sesiji."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Zvuk je isključen"</string> <string name="media_device_cast" msgid="4786241789687569892">"Emitiraj"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nedostupno jer je zvono utišano"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Dodirnite da biste uključili zvuk."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Dodirnite da biste postavili na vibraciju. Usluge pristupačnosti možda neće imati zvuk."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Dodirnite da biste isključili zvuk. Usluge pristupačnosti možda neće imati zvuk."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Dodirnite da biste postavili na vibraciju."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Dodirnite da biste isključili zvuk."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Kontrola buke"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Prostorni zvuk"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Isključeno"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Otklonjeno"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Praćenje glave"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Dodirnite da biste promijenili način softvera zvona"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"isključivanje zvuka"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"uključivanje zvuka"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibriranje"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Kontrole glasnoće – %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Telefon će zvoniti za pozive i obavijesti (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Reproducira se – <xliff:g id="LABEL">%s</xliff:g>"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk će se reproducirati"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Ugađanje korisničkog sučelja sustava"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Otkrivena je prisutnost korisnika"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Postavite zadanu aplikaciju za bilješke u postavkama"</string> <string name="install_app" msgid="5066668100199613936">"Instalacija"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 7a3af4fb3da4..98565c0cd99a 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"leválasztás"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiválás"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatikus visszakapcsolás holnap"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Az olyan funkciók, mint a Quick Share, a Készülékkereső és az eszköz helyadatai Bluetootht használnak"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"A Bluetooth bekapcsol holnap reggel 5-kor"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Akkumulátor: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Hang"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Eltávolítás"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Modul hozzáadása"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Kész"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Minden modult engedélyez a lezárási képernyőn?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Beállítások megnyitása"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Feloldja a munkahelyi appokat?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Szüneteltetés feloldása"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Felhasználóváltás"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"lehúzható menü"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"A munkamenetben található összes alkalmazás és adat törlődni fog."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Néma"</string> <string name="media_device_cast" msgid="4786241789687569892">"Átküldés"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nem lehetséges, a csörgés le van némítva"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Koppintson a némítás megszüntetéséhez."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Koppintson a rezgés beállításához. Előfordulhat, hogy a kisegítő lehetőségek szolgáltatásai le vannak némítva."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Koppintson a némításhoz. Előfordulhat, hogy a kisegítő lehetőségek szolgáltatásai le vannak némítva."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Koppintson a rezgés beállításához."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Koppintson a némításhoz."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Zajszabályozás"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Térbeli hangzás"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Ki"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Rögzített"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Fejkövetés"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Koppintson a csengés módjának módosításához"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"némítás"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"némítás feloldása"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"rezgés"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s hangerőszabályzók"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"A hívásoknál és értesítéseknél csörög a telefon (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> lejátszása itt:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Hang lejátszása itt:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Kezelőfelület-hangoló"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Felhasználói jelenlét észlelve"</string> <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> <string name="install_app" msgid="5066668100199613936">"Alkalmazás telepítése"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index d3b50d708032..5d88e0d1a731 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"անջատել"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ակտիվացնել"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Վաղը նորից ավտոմատ միացնել"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Գործառույթները, ինչպիսիք են Quick Share-ը, «Գտնել իմ սարքը» գործառույթը և սարքի տեղորոշումը, օգտագործում են Bluetooth-ը"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth-ը կմիանա վաղը՝ ժամը 05։00-ին"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Աուդիո"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Ականջակալ"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Հեռացնել"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ավելացնել վիջեթ"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Պատրաստ է"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Թույլատրե՞լ վիջեթների ցուցադրումը կողպէկրանին"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Բացել կարգավորումները"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Վերսկսե՞լ աշխ. հավելվածները"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Վերսկսել"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Անձայն"</string> <string name="media_device_cast" msgid="4786241789687569892">"Հեռարձակում"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Հասանելի չէ, երբ զանգի ձայնն անջատված է"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s: Հպեք՝ ձայնը միացնելու համար:"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s: Հպեք՝ թրթռումը միացնելու համար: Մատչելիության ծառայությունների ձայնը կարող է անջատվել:"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s: Հպեք՝ ձայնն անջատելու համար: Մատչելիության ծառայությունների ձայնը կարող է անջատվել:"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s։ Հպեք՝ թրթռոցը միացնելու համար։"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s։ Հպեք՝ ձայնը անջատելու համար։"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Աղմուկի կառավարում"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Տարածական հնչողություն"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Անջատել"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Ֆիքսված"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Գլխի շարժումների հետագծում"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Հպեք՝ զանգակի ռեժիմը փոխելու համար"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"անջատել ձայնը"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"միացնել ձայնը"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"միացնել թրթռոցը"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Ձայնի ուժգնության կառավարներ` %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Զանգերի և ծանուցումների համար հեռախոսի ձայնը միացված է (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>. նվագարկվում է"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Աուդիոն կնվագարկվի"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Համակարգի ՕՄ-ի կարգավորիչ"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Ավելի մեծ լուծաչափի համար շրջեք հեռախոսը"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Ծալովի սարք՝ բացված վիճակում"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Ծալովի սարք՝ շրջված վիճակում"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ծալված"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"բացված"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Մարտկոցի լիցքը՝ <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Ձեր ստիլուսը միացրեք լիցքավորիչի"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"Ստիլուսի մարտկոցի լիցքի ցածր մակարդակ"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Հայտնաբերվել է օգտատեր"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Կարգավորեք նշումների կանխադրված հավելված Կարգավորումներում"</string> <string name="install_app" msgid="5066668100199613936">"Տեղադրել հավելվածը"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 3e34e5f642e4..5c3eb5313e1e 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -32,7 +32,7 @@ <string name="battery_saver_start_action" msgid="8353766979886287140">"Aktifkan"</string> <string name="battery_saver_dismiss_action" msgid="7199342621040014738">"Lain kali"</string> <string name="standard_battery_saver_text" msgid="6855876746552374119">"Standar"</string> - <string name="extreme_battery_saver_text" msgid="8455810156739865335">"Ekstrem"</string> + <string name="extreme_battery_saver_text" msgid="8455810156739865335">"Super"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"Putar layar otomatis"</string> <string name="usb_device_permission_prompt" msgid="4414719028369181772">"Izinkan <xliff:g id="APPLICATION">%1$s</xliff:g> mengakses <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string> <string name="usb_device_permission_prompt_warn" msgid="2309129784984063656">"Izinkan <xliff:g id="APPLICATION">%1$s</xliff:g> mengakses <xliff:g id="USB_DEVICE">%2$s</xliff:g>?\nAplikasi ini belum diberi izin merekam, tetapi dapat merekam audio melalui perangkat USB ini."</string> @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"putuskan koneksi"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktifkan"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Otomatis aktifkan lagi besok"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Fitur seperti Quick Share, Temukan Perangkat Saya, dan lokasi perangkat menggunakan Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth akan diaktifkan besok pada pukul 05.00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Hapus"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Tambahkan widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Selesai"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Izinkan widget di layar kunci?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Buka setelan"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Batalkan jeda aplikasi kerja?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Batalkan jeda"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Beralih pengguna"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu pulldown"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Semua aplikasi dan data dalam sesi ini akan dihapus."</string> @@ -544,7 +546,7 @@ <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"Overlay teks"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"aktifkan"</string> <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"nonaktifkan"</string> - <string name="sound_settings" msgid="8874581353127418308">"Suara & getaran"</string> + <string name="sound_settings" msgid="8874581353127418308">"Suara dan getaran"</string> <string name="volume_panel_dialog_settings_button" msgid="2513228491513390310">"Setelan"</string> <string name="volume_panel_captioning_title" msgid="5984936949147684357">"Teks Otomatis"</string> <string name="csd_lowered_title" product="default" msgid="2464112924151691129">"Volume diturunkan ke level yang lebih aman"</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Nonaktifkan"</string> <string name="media_device_cast" msgid="4786241789687569892">"Transmisi"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Tidak tersedia karena volume dering dibisukan"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Ketuk untuk menyuarakan."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Ketuk untuk menyetel agar bergetar. Layanan aksesibilitas mungkin dibisukan."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Ketuk untuk membisukan. Layanan aksesibilitas mungkin dibisukan."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Ketuk untuk menyetel agar bergetar."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Ketuk untuk menonaktifkan."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Kontrol Bising"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Audio Spasial"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Nonaktif"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Tetap"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Pelacakan Gerak Kepala"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Ketuk untuk mengubah mode pendering"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"Tanpa suara"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"aktifkan"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"getar"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s kontrol volume"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Panggilan telepon dan notifikasi akan berdering (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Memutar <xliff:g id="LABEL">%s</xliff:g> di"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio akan diputar di"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Penyetel Antarmuka Pengguna Sistem"</string> @@ -995,9 +1007,9 @@ <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Hapus kontrol untuk <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Difavoritkan"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Difavoritkan, posisi <xliff:g id="NUMBER">%d</xliff:g>"</string> - <string name="accessibility_control_not_favorite" msgid="1291760269563092359">"Batal difavoritkan"</string> + <string name="accessibility_control_not_favorite" msgid="1291760269563092359">"Tidak difavoritkan"</string> <string name="accessibility_control_change_favorite" msgid="2943178027582253261">"favorit"</string> - <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"batal favoritkan"</string> + <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"tidak memfavoritkan"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"Pindah ke posisi <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Kontrol"</string> <string name="controls_favorite_subtitle" msgid="5818709315630850796">"Pilih kontrol perangkat untuk mengakses dengan cepat"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Kehadiran pengguna terdeteksi"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setel aplikasi catatan default di Setelan"</string> <string name="install_app" msgid="5066668100199613936">"Instal aplikasi"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index a707d364ee43..ea0726b21f0b 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"aftengja"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"virkja"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Kveikja sjálfkrafa aftur á morgun"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Eiginleikar á borð við flýtideilingu, „Finna tækið mitt“ og staðsetningu tækis nota Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Kveikt verður á Bluetooth á morgun kl. 05:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> rafhlöðuhleðsla"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Hljóð"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Höfuðtól"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Fjarlægja"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Bæta græju við"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Lokið"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Leyfa allar græjur á lásskjá?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Opna stillingar"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Ljúka hléi vinnuforrita?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Ljúka hléi"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Skipta um notanda"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"Fellivalmynd"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Öllum forritum og gögnum í þessari lotu verður eytt."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Hljóð af"</string> <string name="media_device_cast" msgid="4786241789687569892">"Senda út"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Ekki í boði þar sem hringing er þögguð"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Ýttu til að hætta að þagga."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Ýttu til að stilla á titring. Hugsanlega verður slökkt á hljóði aðgengisþjónustu."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Ýttu til að þagga. Hugsanlega verður slökkt á hljóði aðgengisþjónustu."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Ýttu til að stilla á titring."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Ýttu til að þagga."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Hávaðavörn"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Rýmishljóð"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Slökkt"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fast"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Rakning höfuðhreyfinga"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Ýta til að skipta um hringjarastillingu"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"þagga"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"hætta að þagga"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"titringur"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s stýringar á hljóstyrk"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Símhringingar og tilkynningar heyrast (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Í spilun í <xliff:g id="LABEL">%s</xliff:g>"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Hljóð heldur áfram að spilast"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Fínstillingar kerfisviðmóts"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Viðvera notanda greindist"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Stilltu sjálfgefið glósuforrit í stillingunum"</string> <string name="install_app" msgid="5066668100199613936">"Setja upp forrit"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index dc957175e749..b2eb5f9771d8 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"disconnetti"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"attiva"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Riattiva automaticamente domani"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funzionalità come Quick Share, Trova il mio dispositivo e la posizione del dispositivo usano il Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Il Bluetooth verrà attivato domani alle 05:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Batteria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Auricolare"</string> @@ -285,7 +283,7 @@ <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"Rotazione automatica dello schermo"</string> <string name="quick_settings_location_label" msgid="2621868789013389163">"Geolocalizzazione"</string> <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Salvaschermo"</string> - <string name="quick_settings_camera_label" msgid="5612076679385269339">"Accesso alla videocamera"</string> + <string name="quick_settings_camera_label" msgid="5612076679385269339">"Accesso alla fotocamera"</string> <string name="quick_settings_mic_label" msgid="8392773746295266375">"Accesso al microfono"</string> <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Disponibile"</string> <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Bloccato"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Rimuovi"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Aggiungi widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Fine"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Consentire tutti i widget nella schermata di blocco?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Apri impostazioni"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Riattivare le app di lavoro?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Riattiva"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Cambio utente"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu a discesa"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Tutte le app e i dati di questa sessione verranno eliminati."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Silenzia"</string> <string name="media_device_cast" msgid="4786241789687569892">"Trasmissione"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Non disponibile con l\'audio disattivato"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tocca per riattivare l\'audio."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tocca per attivare la vibrazione. L\'audio dei servizi di accessibilità può essere disattivato."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tocca per disattivare l\'audio. L\'audio dei servizi di accessibilità può essere disattivato."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Tocca per attivare la vibrazione."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Tocca per disattivare l\'audio."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Controllo del rumore"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Audio spaziale"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Off"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fisso"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Rilev. movim. testa"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tocca per cambiare la modalità della suoneria"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"silenzia"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"riattiva l\'audio"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrazione"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Controlli del volume %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"La suoneria sarà attiva per chiamate e notifiche (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> in riproduzione su"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio riprodotto su:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Ottimizzatore UI di sistema"</string> @@ -758,7 +770,7 @@ <string name="system_multitasking_full_screen" msgid="336048080383640562">"Passa da schermo diviso a schermo intero"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Con lo schermo diviso: sostituisci un\'app con un\'altra"</string> <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Inserimento"</string> - <string name="input_switch_input_language_next" msgid="3782155659868227855">"Passa alla prossima lingua"</string> + <string name="input_switch_input_language_next" msgid="3782155659868227855">"Passa alla lingua successiva"</string> <string name="input_switch_input_language_previous" msgid="6043341362202336623">"Passa alla lingua precedente"</string> <string name="input_access_emoji" msgid="8105642858900406351">"Accedi all\'emoji"</string> <string name="input_access_voice_typing" msgid="7291201476395326141">"Accedi alla digitazione vocale"</string> @@ -961,7 +973,7 @@ <string name="accessibility_magnification_right_handle" msgid="9055988237319397605">"Punto di manipolazione destro"</string> <string name="accessibility_magnification_bottom_handle" msgid="6531646968813821258">"Punto di manipolazione inferiore"</string> <string name="accessibility_magnification_settings_panel_description" msgid="8174187340747846953">"Impostazioni di ingrandimento"</string> - <string name="accessibility_magnifier_size" msgid="3038755600030422334">"Dimensione dell\'ingrandimento"</string> + <string name="accessibility_magnifier_size" msgid="3038755600030422334">"Dimensione ingrandimento"</string> <string name="accessibility_magnification_zoom" msgid="4222088982642063979">"Zoom"</string> <string name="accessibility_magnification_medium" msgid="6994632616884562625">"Medio"</string> <string name="accessibility_magnification_small" msgid="8144502090651099970">"Piccolo"</string> @@ -1254,7 +1266,8 @@ <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Videocamera bloccata"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Videocamera e microfono bloccati"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Microfono bloccato"</string> - <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Modalità priorità attivata"</string> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Viene rilevata la presenza dell\'utente"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Imposta l\'app per le note predefinita nelle Impostazioni"</string> <string name="install_app" msgid="5066668100199613936">"Installa app"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index f88b1049798d..2881bad63e5a 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ניתוק"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"הפעלה"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"החיבור יופעל שוב אוטומטית מחר"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"תכונות כמו \'שיתוף מהיר\', \'איפה המכשיר שלי\' ומיקום המכשיר משתמשות בחיבור Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth יופעל מחר בשעה 5 בבוקר"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> סוללה"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"אודיו"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"אוזניות"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"הסרה"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"הוספת ווידג\'ט"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"סיום"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"לאפשר להציג כל ווידג\'ט במסך הנעילה?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"לפתיחת ההגדרות"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"להפעיל את האפליקציות לעבודה?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"ביטול ההשהיה"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"השתקה"</string> <string name="media_device_cast" msgid="4786241789687569892">"הפעלת Cast"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"לא זמין כי הצלצול מושתק"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. יש להקיש כדי לבטל את ההשתקה."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. צריך להקיש כדי להגדיר רטט. ייתכן ששירותי הנגישות מושתקים."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. יש להקיש כדי להשתיק. ייתכן ששירותי הנגישות יושתקו."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. יש להקיש כדי להעביר למצב רטט."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. יש להקיש כדי להשתיק."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"בקרת הרעש"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"אודיו מרחבי"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"השבתה"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"מצב קבוע"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"מעקב אחר תנועות הראש"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"יש להקיש כדי לשנות את מצב תוכנת הצלצול"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"השתקה"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ביטול ההשתקה"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"רטט"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"בקרי עוצמת קול של %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"הטלפון יצלצל כשמתקבלות שיחות והתראות (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"הפעלה של <xliff:g id="LABEL">%s</xliff:g> במכשיר"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"האודיו יופעל במכשיר"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"נוכחות המשתמש זוהתה"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"צריך להגדיר את אפליקציית ברירת המחדל לפתקים ב\'הגדרות\'"</string> <string name="install_app" msgid="5066668100199613936">"התקנת האפליקציה"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 36fc26f84cfc..070713a32ca3 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"接続を解除"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"有効化"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"明日自動的に ON に戻す"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"クイック共有、デバイスを探す、デバイスの位置情報などの機能は Bluetooth を使用します"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"午前 5 時に Bluetooth が ON になります"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"バッテリー <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"オーディオ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"ヘッドセット"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"削除"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ウィジェットを追加"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"完了"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ロック画面でのウィジェットを許可しますか?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"設定を開く"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"仕事用アプリの停止解除"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"停止解除"</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> @@ -581,26 +583,29 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ミュート"</string> <string name="media_device_cast" msgid="4786241789687569892">"キャスト"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"着信音がミュートされているため利用できません"</string> + <string name="stream_alarm_unavailable" msgid="4059817189292197839">"サイレント モードが ON のため利用できません"</string> + <string name="stream_media_unavailable" msgid="6823020894438959853">"サイレント モードが ON のため利用できません"</string> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s。タップしてミュートを解除します。"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s。タップしてバイブレーションに設定します。ユーザー補助機能サービスがミュートされる場合があります。"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s。タップしてミュートします。ユーザー補助機能サービスがミュートされる場合があります。"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s。タップしてバイブレーションに設定します。"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s。タップしてミュートします。"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"ノイズ コントロール"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"空間オーディオ"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"OFF"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"固定"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ヘッド トラッキング"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"タップすると、着信音のモードを変更できます"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ミュート"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ミュートを解除"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"バイブレーション"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s の音量調節"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"着信音と通知音が鳴ります(<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"出力の設定を入力してください"</string> + <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"音量スライダーを開きました"</string> + <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"音量スライダーを閉じました"</string> + <string name="volume_panel_hint_mute" msgid="6962563028495243738">"%s をミュート"</string> + <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"%s のミュートを解除"</string> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> を再生:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"音声の再生形式:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"システムUI調整ツール"</string> @@ -1254,7 +1259,8 @@ <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">"優先モードは ON です"</string> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"会話を始められます"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"[設定] でデフォルトのメモアプリを設定してください"</string> <string name="install_app" msgid="5066668100199613936">"アプリをインストール"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index e77d13705369..5a11a75141fb 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"კავშირის გაწყვეტა"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"გააქტიურება"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"ხელახლა ავტომატურად ჩართვა ხვალ"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"ფუნქციები, როგორებიცაა „სწრაფი გაზიარება“, „ჩემი მოწყობილობის პოვნა“ და „მოწყობილობის მდებარეობა“ იყენებს Bluetooth-ს"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth ჩაირთვება ხვალ დილის 5 საათზე"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ბატარეა"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"აუდიო"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"ყურსაცვამი"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"ამოშლა"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ვიჯეტის დამატება"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"მზადაა"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ნებისმიერი ვიჯეტის დაშვება ჩაკეტილ ეკრანზე"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"პარამეტრების გახსნა"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"კვლავ გააქტიურდეს სამსახურის აპები?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"გააქტიურება"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"დადუმება"</string> <string name="media_device_cast" msgid="4786241789687569892">"ტრანსლირება"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"ზარის დადუმების გამო ხელმისაწვდომი არაა"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. შეეხეთ დადუმების გასაუქმებლად."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. შეეხეთ ვიბრაციაზე დასაყენებლად. შეიძლება დადუმდეს მარტივი წვდომის სერვისებიც."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. შეეხეთ დასადუმებლად. შეიძლება დადუმდეს მარტივი წვდომის სერვისებიც."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. შეეხეთ ვიბრაციაზე დასაყენებლად."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. შეეხეთ დასადუმებლად."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"ხმაურის კონტროლი"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"სივრცითი აუდიო"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"გამორთული"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ფიქსირებული"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"თავის მოძრ. თვალყურის დევნა"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"შეეხეთ მრეკავის რეჟიმის შესაცვლელად"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"დადუმება"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"დადუმების მოხსნა"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ვიბრაცია"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s-ის ხმის მართვის საშუალებები"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ზარებისა და შეტყობინებების მიღებისას დაირეკება (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"უკრავს <xliff:g id="LABEL">%s</xliff:g>:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"აუდიო დაიკვრება"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"სისტემის UI ტუნერი"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"აღმოჩენილია მომხმარებლის ყოფნა"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"დააყენეთ ნაგულისხმევი შენიშვნების აპი პარამეტრებში"</string> <string name="install_app" msgid="5066668100199613936">"აპის ინსტალაცია"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 6daba135cd65..781dbbff642e 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ажырату"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"іске қосу"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Ертең автоматты түрде қосылсын"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Quick Share, Find My Device сияқты функциялар мен құрылғы локациясы Bluetooth пайдаланады."</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth ертең таңғы сағат 5-те қосылады."</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Батарея деңгейі: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Aудио"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Гарнитура"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Өшіру"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Виджет қосу"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Дайын"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Құлыптаулы экранда кез келген виджетке рұқсат беру керек пе?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Параметрлерді ашу"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Жұмыс қолданбаларын қайта қосасыз ба?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Қайта қосу"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Дыбысын өшіру"</string> <string name="media_device_cast" msgid="4786241789687569892">"Трансляциялау"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Қолжетімді емес, шылдырлату өшірулі."</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Дыбысын қосу үшін түртіңіз."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Діріл режимін орнату үшін түртіңіз. Арнайы мүмкіндік қызметтерінің дыбысы өшуі мүмкін."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Дыбысын өшіру үшін түртіңіз. Арнайы мүмкіндік қызметтерінің дыбысы өшуі мүмкін."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Діріл режимін орнату үшін түртіңіз."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Дыбысын өшіру үшін түртіңіз."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Шуды реттеу"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Кеңістіктік дыбыс"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Өшіру"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Бекітілген"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Бас қимылын қадағалау"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Қоңырау режимін өзгерту үшін түртіңіз."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"дыбысын өшіру"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"дыбысын қосу"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"дірілдету"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Дыбысты басқару элементтері: %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Қоңыраулар мен хабарландырулар дыбысы қосулы (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> ойнатылатын құрылғы:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудио ойнатылатын құрылғы:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Жүйелік пайдаланушылық интерфейс тюнері"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Пайдаланушы анықталды."</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Параметрлерден әдепкі жазба қолданбасын орнатыңыз."</string> <string name="install_app" msgid="5066668100199613936">"Қолданбаны орнату"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 69adb22d810e..60a1970eb78c 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ផ្ដាច់"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"បើកដំណើរការ"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"បើកដោយស្វ័យប្រវត្តិម្ដងទៀតនៅថ្ងៃស្អែក"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"មុខងារដូចជា Quick Share, រកឧបករណ៍របស់ខ្ញុំ និងប៊្លូធូសប្រើប្រាស់ទីតាំងឧបករណ៍"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"ប៊្លូធូសនឹងបើកនៅថ្ងៃស្អែកនៅម៉ោង 5 ព្រឹក"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"ថ្ម <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"សំឡេង"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"កាស"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"ដកចេញ"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"បញ្ចូលធាតុក្រាហ្វិក"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"រួចរាល់"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"អនុញ្ញាតធាតុក្រាហ្វិកនៅលើអេក្រង់ចាក់សោឬ?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"បើកការកំណត់"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"ឈប់ផ្អាកកម្មវិធីការងារឬ?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"ឈប់ផ្អាក"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"បិទសំឡេង"</string> <string name="media_device_cast" msgid="4786241789687569892">"បញ្ជូន"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"មិនអាចប្រើបានទេ ព្រោះសំឡេងរោទ៍ត្រូវបានបិទ"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s។ ប៉ះដើម្បីបើកសំឡេង។"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s។ ប៉ះដើម្បីកំណត់ឲ្យញ័រ។ សេវាកម្មលទ្ធភាពប្រើប្រាស់អាចនឹងត្រូវបានបិទសំឡេង។"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s។ ប៉ះដើម្បីបិទសំឡេង។ សេវាកម្មលទ្ធភាពប្រើប្រាស់អាចនឹងត្រូវបានបិទសំឡេង។"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s ។ ចុចដើម្បីកំណត់ឲ្យញ័រ។"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s ។ ចុចដើម្បីបិទសំឡេង។"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"ការគ្រប់គ្រងសំឡេងរំខាន"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"សំឡេងលំហ"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"បិទ"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ថេរ"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ការតាមដានក្បាល"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ចុចដើម្បីប្ដូរមុខងាររោទ៍"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"បិទសំឡេង"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"បើកសំឡេង"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ញ័រ"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s របារបញ្ជាកម្រិតសំឡេង"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ការហៅទូរសព្ទ និងការជូនដំណឹងនឹងរោទ៍ (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"កំពុងចាក់ <xliff:g id="LABEL">%s</xliff:g> នៅលើ"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"សំឡេងនឹងលេងនៅលើ"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"កម្មវិធីសម្រួល UI ប្រព័ន្ធ"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"សម្រាប់កម្រិតគុណភាពកាន់តែខ្ពស់ សូមត្រឡប់ទូរសព្ទ"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ឧបករណ៍អាចបត់បានកំពុងត្រូវបានលា"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ឧបករណ៍អាចបត់បានកំពុងត្រូវបានលា"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"បត់"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"លា"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"ថ្មនៅសល់ <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"ភ្ជាប់ប៊ិករបស់អ្នកជាមួយឆ្នាំងសាក"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"ថ្មប៊ិកនៅសល់តិច"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"វត្តមានអ្នកប្រើប្រាស់ត្រូវបានចាប់ដឹង"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"កំណត់កម្មវិធីកំណត់ចំណាំលំនាំដើមនៅក្នុងការកំណត់"</string> <string name="install_app" msgid="5066668100199613936">"ដំឡើងកម្មវិធី"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index f62c2a6daf5c..e498ca4957e2 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ಡಿಸ್ಕನೆಕ್ಟ್ ಮಾಡಿ"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"ನಾಳೆ ಪುನಃ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆನ್ ಮಾಡಿ"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"ಕ್ವಿಕ್ ಶೇರ್, Find My Device ನಂತಹ ಫೀಚರ್ಗಳು ಹಾಗೂ ಸಾಧನದ ಸ್ಥಳವು ಬ್ಲೂಟೂತ್ ಅನ್ನು ಬಳಸುತ್ತವೆ"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"ಬ್ಲೂಟೂತ್ ನಾಳೆ ಬೆಳಗ್ಗೆ 5 ಗಂಟೆಗೆ ಆನ್ ಆಗುತ್ತದೆ"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ಬ್ಯಾಟರಿ"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ಆಡಿಯೋ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"ಹೆಡ್ಸೆಟ್"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"ತೆಗೆದುಹಾಕಿ"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ವಿಜೆಟ್ ಅನ್ನು ಸೇರಿಸಿ"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ಮುಗಿದಿದೆ"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ಲಾಕ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ಯಾವುದೇ ವಿಜೆಟ್ ಅನ್ನು ಅನುಮತಿಸಬೇಕೇ?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"ಕೆಲಸದ ಆ್ಯಪ್ ವಿರಾಮ ರದ್ದುಮಾಡಬೇಕೇ"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"ವಿರಾಮವನ್ನು ರದ್ದುಗೊಳಿಸಿ"</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> @@ -523,7 +525,7 @@ <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_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="8220190039787149671">"ಈ ಸಾಧನವನ್ನು <xliff:g id="VPN_APP">%1$s</xliff:g> ಮೂಲಕ ಇಂಟರ್ನೆಟ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ. ಇಮೇಲ್ಗಳು ಮತ್ತು ಬ್ರೌಸಿಂಗ್ ಡೇಟಾ ಸೇರಿದಂತೆ, ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯು VPN ಪೂರೈಕೆದಾರರಿಗೆ ಕಾಣಿಸುತ್ತದೆ."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ಮ್ಯೂಟ್"</string> <string name="media_device_cast" msgid="4786241789687569892">"ಬಿತ್ತರಿಸಿ"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"ರಿಂಗ್ ಮ್ಯೂಟ್ ಆಗಿರುವ ಕಾರಣ ಲಭ್ಯವಿಲ್ಲ"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. ಅನ್ಮ್ಯೂಟ್ ಮಾಡುವುದಕ್ಕಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. ಕಂಪನಕ್ಕೆ ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಬಹುದು."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಬಹುದು."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. ವೈಬ್ರೇಟ್ ಮಾಡಲು ಹೊಂದಿಸುವುದಕ್ಕಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"ಗದ್ದಲ ನಿಯಂತ್ರಣ"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"ಸ್ಪೇಷಿಯಲ್ ಆಡಿಯೋ"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ಆಫ್ ಮಾಡಿ"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ಫಿಕ್ಸಡ್"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ಹೆಡ್ ಟ್ರ್ಯಾಕಿಂಗ್"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ರಿಂಗರ್ ಮೋಡ್ ಬದಲಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ಮ್ಯೂಟ್ ಮಾಡಿ"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ಅನ್ಮ್ಯೂಟ್ ಮಾಡಿ"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ವೈಬ್ರೇಟ್"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಕಗಳು"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"(<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>) ನಲ್ಲಿ ಕರೆಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳು ರಿಂಗ್ ಆಗುತ್ತವೆ"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> ನಲ್ಲಿ ಪ್ಲೇ ಆಗು..."</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"ಇಲ್ಲಿ ಆಡಿಯೋ ಪ್ಲೇ..."</string> <string name="system_ui_tuner" msgid="1471348823289954729">"ಸಿಸ್ಟಂ UI ಟ್ಯೂನರ್"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"ಅಧಿಕ ರೆಸಲ್ಯೂಷನ್ಗಾಗಿ, ಫೋನ್ ಅನ್ನು ಫ್ಲಿಪ್ ಮಾಡಿ"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ಫೋಲ್ಡ್ ಮಾಡಬಹುದಾದ ಸಾಧನವನ್ನು ಅನ್ಫೋಲ್ಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ಫೋಲ್ಡ್ ಮಾಡಬಹುದಾದ ಸಾಧನವನ್ನು ಸುತ್ತಲೂ ತಿರುಗಿಸಲಾಗುತ್ತಿದೆ"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ಫೋಲ್ಡ್ ಮಾಡಿರುವುದು"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ಅನ್ಫೋಲ್ಡ್ ಮಾಡಿರುವುದು"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ಬ್ಯಾಟರಿ ಉಳಿದಿದೆ"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"ನಿಮ್ಮ ಸ್ಟೈಲಸ್ ಅನ್ನು ಚಾರ್ಜರ್ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"ಸ್ಟೈಲಸ್ ಬ್ಯಾಟರಿ ಕಡಿಮೆಯಿದೆ"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"ಬಳಕೆದಾರರ ಉಪಸ್ಥಿತಿಯನ್ನು ಪತ್ತೆಹಚ್ಚಲಾಗಿದೆ"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಡೀಫಾಲ್ಟ್ ಟಿಪ್ಪಣಿಗಳ ಆ್ಯಪ್ ಅನ್ನು ಸೆಟ್ ಮಾಡಿ"</string> <string name="install_app" msgid="5066668100199613936">"ಆ್ಯಪ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 40fb618795b5..75a6808a64d4 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -32,7 +32,7 @@ <string name="battery_saver_start_action" msgid="8353766979886287140">"사용"</string> <string name="battery_saver_dismiss_action" msgid="7199342621040014738">"사용 안함"</string> <string name="standard_battery_saver_text" msgid="6855876746552374119">"표준"</string> - <string name="extreme_battery_saver_text" msgid="8455810156739865335">"긴급"</string> + <string name="extreme_battery_saver_text" msgid="8455810156739865335">"최대"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"화면 자동 회전"</string> <string name="usb_device_permission_prompt" msgid="4414719028369181772">"<xliff:g id="APPLICATION">%1$s</xliff:g> 앱이 <xliff:g id="USB_DEVICE">%2$s</xliff:g>에 액세스하도록 허용하시겠습니까?"</string> <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> @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"연결 해제"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"실행"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"내일 다시 자동으로 사용 설정"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Quick Share, 내 기기 찾기, 기기 위치 등의 기능에서 블루투스를 사용합니다."</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"블루투스가 내일 오전 5시에 켜집니다."</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"오디오"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"헤드셋"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"삭제"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"위젯 추가"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"완료"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"잠금 화면에서 위젯 사용을 허용하시겠습니까?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"설정 열기"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"직장 앱 일시중지를 해제하시겠습니까?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"일시중지 해제"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"음소거"</string> <string name="media_device_cast" msgid="4786241789687569892">"전송"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"벨소리가 음소거되어 있으므로 사용할 수 없음"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. 탭하여 음소거를 해제하세요."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. 탭하여 진동으로 설정하세요. 접근성 서비스가 음소거될 수 있습니다."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. 탭하여 음소거로 설정하세요. 접근성 서비스가 음소거될 수 있습니다."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. 탭하여 진동으로 설정하세요."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. 탭하여 음소거로 설정하세요."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"소음 제어"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"공간 음향"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"사용 안함"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"수정됨"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"머리 추적"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"탭하여 벨소리 장치 모드 변경"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"음소거"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"음소거 해제"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"진동"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s 볼륨 컨트롤"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"전화 및 알림이 오면 벨소리가 울림(<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> 재생 위치:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"오디오 재생 위치:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"시스템 UI 튜너"</string> @@ -731,7 +743,7 @@ <string name="keyboard_shortcut_search_list_no_result" msgid="6819302191660875501">"단축키 없음"</string> <string name="keyboard_shortcut_search_category_system" msgid="1151182120757052669">"시스템"</string> <string name="keyboard_shortcut_search_category_input" msgid="5440558509904296233">"입력"</string> - <string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"열린 앱"</string> + <string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"앱 열기"</string> <string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"현재 앱"</string> <string name="keyboard_shortcut_a11y_show_search_results" msgid="2865241062981833705">"검색 결과 표시"</string> <string name="keyboard_shortcut_a11y_filter_system" msgid="7744143131119370483">"시스템 바로가기 표시"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"사용자 정보가 감지되었습니다."</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"설정에서 기본 메모 앱 설정"</string> <string name="install_app" msgid="5066668100199613936">"앱 설치"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index ef213caec594..74bc943c50e7 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ажыратуу"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"иштетүү"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Эртең автоматтык түрдө кайра күйгүзүү"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Тез Бөлүшүү, \"Түзмөгүм кайда?\" жана түзмөктүн турган жерин аныктоо сыяктуу функциялар Bluetooth\'ду колдонот"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth эртең саат 05:00 күйөт"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Батареянын деңгээли <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Аудио"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Гарнитура"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Өчүрүү"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Виджет кошуу"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Бүттү"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Бардык виджеттер кулпуланган экранда көрсөтүлсүнбү?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Параметрлерди ачуу"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Жумуш колдонмолорун иштетесизби?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Иштетүү"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Үнсүз"</string> <string name="media_device_cast" msgid="4786241789687569892">"Тышкы экранга чыгруу"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Үнсүз режимде жеткиликсиз"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Үнүн чыгаруу үчүн таптап коюңуз."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Дирилдөөгө коюу үчүн таптап коюңуз. Атайын мүмкүнчүлүктөр кызматынын үнүн өчүрүп койсо болот."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Үнүн өчүрүү үчүн таптап коюңуз. Атайын мүмкүнчүлүктөр кызматынын үнүн өчүрүп койсо болот."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Дирилдөөгө коюу үчүн басыңыз."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Үнүн өчүрүү үчүн басыңыз."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Ызы-чууну көзөмөлдөө"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Мейкиндиктүү үн"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Өчүк"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Туруктуу"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Баштын кыймылына көз салуу"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Коңгуроо режимин өзгөртүү үчүн басыңыз"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"үнсүз"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"үнүн чыгаруу"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"дирилдөө"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s үндү башкаруу элементтери"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Чалуулар менен эскертмелердин үнү чыгарылат (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> аркылуу ойнотулууда"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудио төмөнкүдө ойнотулат:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Колдонуучу аныкталды"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Параметрлерден демейки кыска жазуулар колдонмосун тууралаңыз"</string> <string name="install_app" msgid="5066668100199613936">"Колдонмону орнотуу"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 94685028f9a3..6652200e4982 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ຕັດການເຊື່ອມຕໍ່"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ເປີດນຳໃຊ້"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"ເປີດໃຊ້ໂດຍອັດຕະໂນມັດອີກຄັ້ງມື້ອື່ນ"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"ຄຸນສົມບັດຕ່າງໆ ເຊັ່ນ: ການແຊຣ໌ດ່ວນ, ຊອກຫາອຸປະກອນຂອງຂ້ອຍ ແລະ ສະຖານທີ່ຂອງອຸປະກອນແມ່ນໃຊ້ Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth ຈະເປີດມື້ອື່ນເວລາ 05:00 ໂມງ"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ສຽງ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"ຊຸດຫູຟັງ"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"ລຶບອອກ"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ເພີ່ມວິດເຈັດ"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ແລ້ວໆ"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ອະນຸຍາດວິດເຈັດໃດກໍຕາມຢູ່ໜ້າຈໍລັອກບໍ?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"ເປີດການຕັ້ງຄ່າ"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"ຍົກເລີກການຢຸດຊົ່ວຄາວແອັບບ່ອນເຮັດວຽກບໍ?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"ຍົກເລີກການຢຸດຊົ່ວຄາວ"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ປິດ"</string> <string name="media_device_cast" msgid="4786241789687569892">"ສົ່ງສັນຍານ"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"ບໍ່ມີໃຫ້ໃຊ້ເນື່ອງຈາກມີການປິດສຽງໂທເຂົ້າ"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. ແຕະເພື່ອເຊົາປິດສຽງ."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. ແຕະເພື່ອຕັ້ງເປັນສັ່ນ. ບໍລິການຊ່ວຍເຂົ້າເຖິງອາດຖືກປິດສຽງໄວ້."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. ແຕະເພື່ອປິດສຽງ. ບໍລິການຊ່ວຍເຂົ້າເຖິງອາດຖືກປິດສຽງໄວ້."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. ແຕະເພື່ອຕັ້ງເປັນສັ່ນເຕືອນ."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. ແຕະເພື່ອປິດສຽງ."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"ການຄວບຄຸມສຽງລົບກວນ"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"ສຽງຮອບທິດທາງ"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ປິດ"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ຄົງທີ່"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ການຕິດຕາມການເຄື່ອນໄຫວຂອງຫົວ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ແຕະເພື່ອປ່ຽນໂໝດຣິງເກີ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ປິດສຽງ"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ເຊົາປິດສຽງ"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ສັ່ນເຕືອນ"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"ການຄວບຄຸມສຽງ %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ການໂທ ແລະ ການແຈ້ງເຕືອນຈະມີສຽງດັງ (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"ກຳລັງຫຼິ້ນ <xliff:g id="LABEL">%s</xliff:g> ໃນ"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"ສຽງຈະຫຼິ້ນຕໍ່ໄປ"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"ກວດພົບຕົວຕົນຜູ້ໃຊ້"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ຕັ້ງຄ່າແອັບຈົດບັນທຶກເລີ່ມຕົ້ນໃນການຕັ້ງຄ່າ"</string> <string name="install_app" msgid="5066668100199613936">"ຕິດຕັ້ງແອັບ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 3fc0dcb36750..aae13c97e8cc 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"atjungti"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"suaktyvinti"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatiškai vėl įjungti rytoj"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Tokioms funkcijoms kaip „Spartusis bendrinimas“, „Rasti įrenginį“ ir įrenginio vietovė naudojamas „Bluetooth“ ryšys"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"„Bluetooth“ bus įjungtas rytoj, 5 val."</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Akumuliatorius: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Garsas"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Virtualiosios realybės įrenginys"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Pašalinti"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Pridėti valdiklį"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Atlikta"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Leisti visus valdiklius užrakinimo ekrane?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Atidaryti nustatymus"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Atš. darbo progr. pristabd.?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Atšaukti pristabdymą"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Perjungti naudotoją"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"išplečiamasis meniu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Bus ištrintos visos šios sesijos programos ir duomenys."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Nutildyti"</string> <string name="media_device_cast" msgid="4786241789687569892">"Perdavimas"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nepasiekiama, nes skambutis nutildytas"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Palieskite, kad įjungtumėte garsą."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Palieskite, kad nustatytumėte vibravimą. Gali būti nutildytos pritaikymo neįgaliesiems paslaugos."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Palieskite, kad nutildytumėte. Gali būti nutildytos pritaikymo neįgaliesiems paslaugos."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Palieskite, kad nustatytumėte vibravimą."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Palieskite, kad nutildytumėte."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Triukšmo valdymas"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Erdvinis garsas"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Išjungti"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fiksuotas"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Galvos stebėjimas"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Palieskite, kad pakeistumėte skambučio režimą"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"nutildyti"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"įjungti garsą"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibruoti"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Garsumo valdikliai: %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Skambučiai ir pranešimai skambės (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Leidžiama „<xliff:g id="LABEL">%s</xliff:g>“"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Garsas bus leidžiamas"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Sistemos naudotojo sąsajos derinimo priemonė"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Aptikta naudotojo veikla"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nustatykite numatytąją užrašų programą Nustatymuose"</string> <string name="install_app" msgid="5066668100199613936">"Įdiegti programą"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 1a2f8ba98996..abe280da443e 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"atvienot"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivizēt"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automātiski atkal ieslēgt rīt"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Tādas funkcijas kā “Ātrā kopīgošana”, “Atrast ierīci” un ierīces atrašanās vietas noteikšana izmanto tehnoloģiju Bluetooth."</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth tiks ieslēgts rīt plkst. 5:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Akumulators: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Austiņas"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Noņemt"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Pievienot logrīku"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gatavs"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vai atļaut jebkāda veida logrīkus bloķēšanas ekrānā?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Atvērt iestatījumus"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Vai aktivizēt darba lietotnes?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Aktivizēt"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Mainīt lietotāju"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"novelkamā izvēlne"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Tiks dzēstas visas šīs sesijas lietotnes un dati."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Izslēgt skaņu"</string> <string name="media_device_cast" msgid="4786241789687569892">"Apraide"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nevar mainīt, jo izslēgts skaņas signāls"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Pieskarieties, lai ieslēgtu skaņu."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Pieskarieties, lai iestatītu uz vibrozvanu. Var tikt izslēgti pieejamības pakalpojumu signāli."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Pieskarieties, lai izslēgtu skaņu. Var tikt izslēgti pieejamības pakalpojumu signāli."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Pieskarieties, lai iestatītu vibrozvanu."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Pieskarieties, lai izslēgtu skaņu."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Trokšņu kontrole"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Telpiskais audio"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Izslēgts"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fiksēts"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Galvas kustību reģistrēšana"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Pieskarieties, lai mainītu zvanītāja režīmu."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"izslēgt skaņu"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ieslēgt skaņu"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrēt"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s skaļuma vadīklas"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Zvani un paziņojumi aktivizēs zvana signālu (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> — atskaņošana šeit:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio tiks atskaņots šeit:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Sistēmas saskarnes regulators"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Lai izmantotu augstāku izšķirtspēju, apvērsiet tālruni"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Salokāma ierīce tiek atlocīta"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Salokāma ierīce tiek apgriezta"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"aizvērta"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"atvērta"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Atlikušais uzlādes līmenis: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Pievienojiet skārienekrāna pildspalvu lādētājam"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"Zems skārienekrāna pildspalvas akumulatora līmenis"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Konstatēta lietotāja klātbūtne"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Iestatījumos iestatiet noklusējuma piezīmju lietotni."</string> <string name="install_app" msgid="5066668100199613936">"Instalēt lietotni"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index b6651ad78510..c3690efd790b 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"прекини врска"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"активирај"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Автоматски вклучи повторно утре"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Функциите како „Брзо споделување“, „Најди го мојот уред“ и локација на уредот користат Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth ќе се вклучи утре во 5:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> батерија"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Аудио"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Слушалки"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Отстранува"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Додајте виџет"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Да се дозволи каков било виџет на заклучен екран?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Отвори ги поставките"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Да се актив. работните аплик.?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Прекини ја паузата"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Исклучи звук"</string> <string name="media_device_cast" msgid="4786241789687569892">"Емитување"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недостапно бидејќи ѕвонењето е исклучено"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Допрете за да вклучите звук."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Допрете за да поставите на вибрации. Можеби ќе се исклучи звукот на услугите за достапност."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Допрете за да исклучите звук. Можеби ќе се исклучи звукот на услугите за достапност."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Допрете за да се постави на вибрации."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Допрете за да се исклучи звукот."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Контрола на бучавата"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Просторен звук"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Исклучено"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Фиксно"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Следење на главата"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Допрете за да го промените режимот на ѕвончето"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"исклучен звук"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"вклучен звук"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"вибрации"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Контроли на јачината на звукот за %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Повиците и известувањата ќе ѕвонат (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>: пуштено на"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудиото ќе се пушти на"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Адаптер на УИ на системот"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Отворете го телефонот за да добиете повисока резолуција"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Преклопувачки уред се отклопува"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Преклопувачки уред се врти"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"затворен"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"отворен"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Преостаната батерија: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Поврзете го пенкалото со полнач"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"Слаба батерија на пенкало"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Откриено е присуство на корисник"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Поставете стандардна апликација за белешки во „Поставки“"</string> <string name="install_app" msgid="5066668100199613936">"Инсталирајте ја апликацијата"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index a48d530374af..363795350160 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"വിച്ഛേദിക്കുക"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"സജീവമാക്കുക"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"നാളെ വീണ്ടും സ്വയമേവ ഓണാക്കുക"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"ക്വിക്ക് ഷെയർ, Find My Device, ഉപകരണ ലൊക്കേഷൻ എന്നിവ പോലുള്ള ഫീച്ചറുകൾ Bluetooth ഉപയോഗിക്കുന്നു"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth നാളെ 5 AM-ന് ഓണാക്കും"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ബാറ്ററി"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ഓഡിയോ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"ഹെഡ്സെറ്റ്"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"നീക്കം ചെയ്യുക"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"വിജറ്റ് ചേർക്കുക"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"പൂർത്തിയായി"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"ലോക്ക് സ്ക്രീനിൽ ഏതെങ്കിലും വിജറ്റ് അനുവദിക്കണോ?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"ക്രമീകരണം തുറക്കുക"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"വർക്ക് ആപ്പുകൾ പുനരാരംഭിക്കണോ?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"പുനരാരംഭിക്കുക"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"മ്യൂട്ട് ചെയ്യുക"</string> <string name="media_device_cast" msgid="4786241789687569892">"കാസ്റ്റ് ചെയ്യുക"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"റിംഗ് മ്യൂട്ട് ചെയ്തതിനാൽ ലഭ്യമല്ല"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. അൺമ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. വൈബ്രേറ്റിലേക്ക് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക. ഉപയോഗസഹായി സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. മ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക. ഉപയോഗസഹായി സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s വൈബ്രേറ്റിലേക്ക് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s മ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"നോയ്സ് നിയന്ത്രണം"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"സ്പേഷ്യൽ ഓഡിയോ"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ഓഫാക്കുക"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ഓൺ ചെയ്തിരിക്കുന്നു"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ഹെഡ് ട്രാക്കിംഗ്"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"റിംഗർ മോഡ് മാറ്റാൻ ടാപ്പ് ചെയ്യുക"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"മ്യൂട്ട് ചെയ്യുക"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"അൺമ്യൂട്ട് ചെയ്യുക"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"വൈബ്രേറ്റ് ചെയ്യുക"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s ശബ്ദ നിയന്ത്രണങ്ങൾ"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"കോളുകളും അറിയിപ്പുകളും ലഭിക്കുമ്പോൾ റിംഗ് ചെയ്യും (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> എന്നതിൽ പ്ലേ ചെയ്യുന്നു"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"ഓഡിയോ പ്ലേ ചെയ്യും"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"സിസ്റ്റം UI ട്യൂണർ"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"ഉപയോക്താവിന്റെ സാന്നിധ്യം കണ്ടെത്തി"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ക്രമീകരണത്തിൽ കുറിപ്പുകൾക്കുള്ള ഡിഫോൾട്ട് ആപ്പ് സജ്ജീകരിക്കുക"</string> <string name="install_app" msgid="5066668100199613936">"ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യൂ"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 625b8b7d3a8f..26c502788eb1 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"салгах"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"идэвхжүүлэх"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Маргааш автоматаар дахин асаах"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Түргэн хуваалцах, Миний төхөөрөмжийг олох зэрэг онцлогууд болон төхөөрөмжийн байршил Bluetooth-г ашигладаг"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth маргааш ҮӨ 5 цагт асна"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> батарей"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Аудио"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Чихэвч"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Хасах"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Виджет нэмэх"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Болсон"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Түгжээтэй дэлгэц дээр дурын виджетийг зөвшөөрөх үү?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Тохиргоог нээх"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Ажлын аппыг үргэлжлүүлэх үү?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Үргэлжлүүлэх"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Хаах"</string> <string name="media_device_cast" msgid="4786241789687569892">"Дамжуулах"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Хонхны дууг хаасан тул боломжгүй"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Дууг нь нээхийн тулд товшино уу."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Чичиргээнд тохируулахын тулд товшино уу. Хүртээмжийн үйлчилгээний дууг хаасан."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Дууг нь хаахын тулд товшино уу. Хүртээмжийн үйлчилгээний дууг хаасан."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Чичиргээнд тохируулахын тулд товшино уу."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Дууг хаахын тулд товшино уу."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Шуугианы хяналт"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Орчны аудио"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Унтраах"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Зассан"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Толгой хянах"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Хонхны горимыг өөрчлөхийн тулд товшино уу"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"дууг хаах"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"дууг нээх"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"чичрэх"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s түвшний хяналт"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Дуудлага болон мэдэгдлийн хонх дуугарна (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> дээр тоглуулж байна"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудиог дараахад тоглуулна"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Системийн UI Тохируулагч"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Хэрэглэгч байгааг илрүүлсэн"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Тохиргоонд тэмдэглэлийн өгөгдмөл апп тохируулна уу"</string> <string name="install_app" msgid="5066668100199613936">"Аппыг суулгах"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index b5c0dc76b8dd..11f42afdad51 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"डिस्कनेक्ट करा"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ॲक्टिव्हेट करा"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"उद्या पुन्हा आपोआप सुरू करा"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"क्विक शेअर, Find My Device आणि डिव्हाइसचे स्थान यांसारखी वैशिष्ट्ये ब्लूटूथ वापरतात"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"ब्लूटूथ उद्या सकाळी ५ वाजता सुरू होईल"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> बॅटरी"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ऑडिओ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"हेडसेट"</string> @@ -439,6 +437,12 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"काढून टाका"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"विजेट जोडा"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"पूर्ण झाले"</string> + <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) --> + <skip /> + <!-- no translation found for button_text_to_open_settings (1987729256950941628) --> + <skip /> + <string name="work_mode_off_title" msgid="5794818421357835873">"वर्क ॲप्स पुन्हा सुरू करायची?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"पुन्हा सुरू करा"</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> @@ -581,26 +585,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"म्यूट करा"</string> <string name="media_device_cast" msgid="4786241789687569892">"कास्ट करा"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"रिंग म्यूट केल्यामुळे उपलब्ध नाही"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. अनम्यूट करण्यासाठी टॅप करा."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. व्हायब्रेट सेट करण्यासाठी टॅप करा. प्रवेशयोग्यता सेवा म्यूट केल्या जाऊ शकतात."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. म्यूट करण्यासाठी टॅप करा. प्रवेशक्षमता सेवा म्यूट केल्या जाऊ शकतात."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. व्हायब्रेट सेट करण्यासाठी टॅप करा."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. म्यूट करण्यासाठी टॅप करा."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"नॉइझ कंट्रोल"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"स्पेशियल ऑडिओ"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"बंद करा"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"निश्चित केला आहे"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"हेड ट्रॅकिंग"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"रिंगर मोड बदलण्यासाठी टॅप करा"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"म्यूट करा"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"म्यूट काढून टाका"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"व्हायब्रेट करा"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s व्हॉल्यूम नियंत्रण"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"कॉल आणि सूचना वाजतील (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> वर प्ले करत आहे"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"यावर ऑडिओ प्ले होईल"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"सिस्टम UI ट्युनर"</string> @@ -1236,12 +1250,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"उच्च रेझोल्यूशनसाठी, फोन फ्लिप करा"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"फोल्ड करता येण्यासारखे डिव्हाइस अनफोल्ड केले जात आहे"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"फोल्ड करता येण्यासारखे डिव्हाइस आजूबाजूला फ्लिप केले जात आहे"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"फोल्ड केलेले"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"फोल्ड न केलेले"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> बॅटरी शिल्लक आहे"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"तुमचे स्टायलस चार्जरशी कनेक्ट करा"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"स्टायलस बॅटरी कमी आहे"</string> @@ -1257,7 +1268,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"वापरकर्त्याची उपस्थिती डिटेक्ट केली"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिंग्ज मध्ये डीफॉल्ट टिपा अॅप सेट करा"</string> <string name="install_app" msgid="5066668100199613936">"अॅप इंस्टॉल करा"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 3419e6307a96..e7e30573bf5c 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"putuskan sambungan"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktifkan"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Dihidupkan sekali lagi esok secara automatik"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Ciri seperti Quick Share, Find My Device dan lokasi peranti menggunakan Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth akan dihidupkan esok pada pukul 5 PG"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> bateri"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Set Kepala"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Alih keluar"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Tambahkan widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Selesai"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Benarkan sebarang widget pada skrin kunci?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Buka tetapan"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Nyahjeda apl kerja?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Nyahjeda"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Tukar pengguna"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu tarik turun"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Semua apl dan data dalam sesi ini akan dipadam."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Redam"</string> <string name="media_device_cast" msgid="4786241789687569892">"Hantar"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Tidak tersedia kerana deringan diredam"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Ketik untuk menyahredam."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Ketik untuk menetapkan pada getar. Perkhidmatan kebolehaksesan mungkin diredamkan."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Ketik untuk meredam. Perkhidmatan kebolehaksesan mungkin diredamkan."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Ketik untuk menetapkan pada getar."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Ketik untuk meredam."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Kawalan Hingar"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Audio Ruang"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Mati"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Tetap"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Penjejakan Kepala"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Ketik untuk menukar mod pendering"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"redam"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"nyahredam"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"getar"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s kawalan kelantangan"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Panggilan dan pemberitahuan akan berdering (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Memainkan <xliff:g id="LABEL">%s</xliff:g> pada"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio dimainkan pada"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Penala UI Sistem"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Kehadiran pengguna dikesan"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Tetapkan apl nota lalai dalam Tetapan"</string> <string name="install_app" msgid="5066668100199613936">"Pasang apl"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 36984fc5e4c6..109d67401210 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ချိတ်ဆက်မှုဖြုတ်ရန်"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"စသုံးရန်"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"မနက်ဖြန် အလိုအလျောက် ထပ်ဖွင့်ရန်"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"‘အမြန် မျှဝေပါ’၊ Find My Device နှင့် စက်ပစ္စည်းတည်နေရာကဲ့သို့ တူးလ်များသည် ဘလူးတုသ်သုံးသည်"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"မနက်ဖြန် မနက် ၅ နာရီတွင် ဘလူးတုသ်ကို ဖွင့်ပါမည်"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ဘက်ထရီ"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"အသံ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"မိုက်ခွက်ပါနားကြပ်"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"ဖယ်ရှားရန်"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ဝိဂျက်ထည့်ရန်"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ပြီးပြီ"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"လော့ခ်မျက်နှာပြင်ရှိ ဝိဂျက်အားလုံးကို ခွင့်ပြုမလား။"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"ဆက်တင်များ ဖွင့်ရန်"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"အလုပ်သုံးအက်ပ် ပြန်ဖွင့်မလား။"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"ပြန်ဖွင့်ရန်"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"အသံတိတ်သည်"</string> <string name="media_device_cast" msgid="4786241789687569892">"ကာစ်လုပ်ရန်"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"ဖုန်းမြည်သံပိတ်ထားသဖြင့် မရနိုင်ပါ"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s။ အသံပြန်ဖွင့်ရန် တို့ပါ။"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s။ တုန်ခါမှုကို သတ်မှတ်ရန် တို့ပါ။ အများသုံးနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s။ အသံပိတ်ရန် တို့ပါ။ အများသုံးနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s။ တုန်ခါခြင်းသို့ သတ်မှတ်ရန်တို့ပါ။"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s။ အသံပိတ်ရန် တို့ပါ။"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"ဆူညံသံ ထိန်းချုပ်ရန်"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"ထောင့်စုံအော်ဒီယို"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ပိတ်"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ဖွင့်ပြီးပြီ"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ဦးခေါင်းလှုပ်ရှားမှု စောင့်ကြည့်ခြင်း"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ဖုန်းခေါ်သံမုဒ်သို့ ပြောင်းရန် တို့ပါ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"အသံပိတ်ရန်"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"အသံဖွင့်ရန်"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"တုန်ခါမှု"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s အသံအတိုးအလျှော့ ခလုတ်များ"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ခေါ်ဆိုမှုများနှင့် အကြောင်းကြားချက်များအတွက် အသံမြည်နှုန်း (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>) ဖြစ်သည်"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> ကို ဖွင့်နေသည်"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"အောက်တွင်အသံဖွင့်မည်"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"စနစ် UI ဖမ်းစက်"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"အသုံးပြုသူရှိကြောင်း တွေ့ရသည်"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ဆက်တင်များတွင် မူရင်းမှတ်စုများအက်ပ် သတ်မှတ်ပါ"</string> <string name="install_app" msgid="5066668100199613936">"အက်ပ် ထည့်သွင်းရန်"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index e126deaaa38f..57b40b9d1899 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"koble fra"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiver"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Slå på igjen i morgen automatisk"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funksjoner som Quick Share, Finn enheten min og enhetsposisjon bruker Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth slås på i morgen kl. 05.00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batteri"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Lyd"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Hodetelefoner"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Fjern"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Legg til modul"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Ferdig"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vil du tillate alle moduler på låseskjermen?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Åpne innstillingene"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Vil du slå på jobbapper igjen?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Slå på"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Bytt bruker"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullegardinmeny"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alle apper og data i denne økten blir slettet."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Ignorer"</string> <string name="media_device_cast" msgid="4786241789687569892">"Cast"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Utilgjengelig fordi ringelyden er kuttet"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Trykk for å slå på lyden."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Trykk for å angi vibrasjon. Lyden kan bli slått av for tilgjengelighetstjenestene."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Trykk for å slå av lyden. Lyden kan bli slått av for tilgjengelighetstjenestene."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Trykk for å angi vibrasjon."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Trykk for å slå av lyden."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Støykontroll"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Romlig lyd"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Av"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fast"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Hodesporing"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Trykk for å endre ringemodus"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"kutt lyden"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"slå på lyden"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrer"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s volumkontroller"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Anrop og varsler ringer (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Spiller av <xliff:g id="LABEL">%s</xliff:g> på"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Lyden spilles av på"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -701,7 +713,7 @@ <string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string> <string name="keyboard_key_space" msgid="6980847564173394012">"Mellomrom"</string> <string name="keyboard_key_enter" msgid="8633362970109751646">"Enter"</string> - <string name="keyboard_key_backspace" msgid="4095278312039628074">"Tilbaketasten"</string> + <string name="keyboard_key_backspace" msgid="4095278312039628074">"Tilbake"</string> <string name="keyboard_key_media_play_pause" msgid="8389984232732277478">"Spill av / sett på pause"</string> <string name="keyboard_key_media_stop" msgid="1509943745250377699">"Stopp"</string> <string name="keyboard_key_media_next" msgid="8502476691227914952">"Neste"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Det er registrert at brukeren er til stede"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Du kan velge en standardapp for notater i Innstillinger"</string> <string name="install_app" msgid="5066668100199613936">"Installer appen"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index a06c1607342c..b682e4404049 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"डिस्कनेक्ट गर्नुहोस्"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"एक्टिभेट गर्नुहोस्"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"भोलि फेरि स्वतः अन गरियोस्"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"क्विक सेयर, Find My Device र डिभाइसको लोकेसन जस्ता सुविधाहरूले ब्लुटुथ प्रयोग गर्छन्"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"ब्लुटुथ भोलि बिहान ५ बजे अन हुने छ"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ब्याट्री"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"अडियो"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"हेडसेट"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"हटाउनुहोस्"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"विजेट हाल्नुहोस्"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"पूरा भयो"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"लक स्क्रिनमा कुनै विजेट देखाउने हो?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"सेटिङ खोल्नुहोस्"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"कामसम्बन्धी एपहरू अनपज गर्ने हो?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"अनपज गर्नुहोस्"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"म्युट गर्नुहोस्"</string> <string name="media_device_cast" msgid="4786241789687569892">"कास्ट गर्नुहोस्"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"डिभाइस म्युट गरिएकाले यो सुविधा उपलब्ध छैन"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s। अनम्यूट गर्नाका लागि ट्याप गर्नुहोस्।"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s। कम्पनमा सेट गर्नाका लागि ट्याप गर्नुहोस्। पहुँच सम्बन्धी सेवाहरू म्यूट हुन सक्छन्।"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s। म्यूट गर्नाका लागि ट्याप गर्नुहोस्। पहुँच सम्बन्धी सेवाहरू म्यूट हुन सक्छन्।"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s। कम्पन मोडमा सेट गर्न ट्याप गर्नुहोस्।"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s। म्यूट गर्न ट्याप गर्नुहोस्।"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"नोइज कन्ट्रोल"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"स्पेसियल अडियो"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"अफ छ"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"निश्चित"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"हेड ट्र्याकिङ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"रिङ्गर मोड बदल्न ट्याप गर्नुहोस्"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"म्युट गर्नुहोस्"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"अनम्युट गर्नुहोस्"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"कम्पन गर्नुहोस्"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s भोल्युमका नियन्त्रणहरू"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"कल तथा सूचनाहरू आउँदा घन्टी बज्ने छ (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> प्ले गरिँदै छ"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"अडियो प्ले भइरहने छ"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"सिस्टम UI ट्युनर"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"उच्च रिजोल्युसनको सेल्फी खिच्न फोन फ्लिप गर्नुहोस्"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"फोल्ड गर्न मिल्ने डिभाइस अनफोल्ड गरेको देखाइएको एनिमेसन"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"फोल्ड गर्न मिल्ने डिभाइस यताउता पल्टाएर देखाइएको एनिमेसन"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"फोल्ड गरिएको"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"अनफोल्ड गरिएको"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ब्याट्री बाँकी छ"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"आफ्नो स्टाइलस चार्जरमा कनेक्ट गर्नुहोस्"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"स्टाइलसको ब्याट्री लो छ"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"प्रयोगकर्ता उपस्थित भएको कुरा पत्ता लागेको छ"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"सेटिङमा गई नोट बनाउने डिफल्ट एप तोक्नुहोस्"</string> <string name="install_app" msgid="5066668100199613936">"एप इन्स्टल गर्नुहोस्"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 86b2ebe460a0..dd56a2ed6467 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"loskoppelen"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activeren"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Morgen weer automatisch aanzetten"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Functies zoals Quick Share, Vind mijn apparaat en apparaatlocatie maken gebruik van bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth gaat morgen om 05:00 uur aan"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batterijniveau"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Verwijderen"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Widget toevoegen"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Klaar"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Elke widget toestaan op het vergrendelscherm?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Instellingen openen"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Werk-apps hervatten?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Hervatten"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Gebruiker wijzigen"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pull-downmenu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alle apps en gegevens in deze sessie worden verwijderd."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Geluid staat uit"</string> <string name="media_device_cast" msgid="4786241789687569892">"Casten"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Niet beschikbaar, belgeluid staat uit"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tik om dempen op te heffen."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tik om in te stellen op trillen. Het geluid van toegankelijkheidsservices kan hierdoor uitgaan."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tik om te dempen. Het geluid van toegankelijkheidsservices kan hierdoor uitgaan."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Tik om in te stellen op trillen."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Tik om geluid uit te zetten."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Ruisonderdrukking"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Ruimtelijke audio"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Uit"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Vast"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Hoofdbeweging volgen"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tik om de beltoonmodus te wijzigen"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"geluid uit"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"geluid aanzetten"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"trillen"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s-volumeknoppen"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Geluid bij gesprekken en meldingen (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> wordt afgespeeld op"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio wordt afgespeeld op"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Systeem-UI-tuner"</string> @@ -618,7 +630,7 @@ <string name="wallet_secondary_label_device_locked" msgid="5175862019125370506">"Ontgrendelen om te gebruiken"</string> <string name="wallet_error_generic" msgid="257704570182963611">"Er is een probleem opgetreden bij het ophalen van je kaarten. Probeer het later opnieuw."</string> <string name="wallet_lockscreen_settings_label" msgid="3539105300870383570">"Instellingen voor vergrendelscherm"</string> - <string name="qr_code_scanner_title" msgid="1938155688725760702">"QR-codescanner"</string> + <string name="qr_code_scanner_title" msgid="1938155688725760702">"QR-code-scanner"</string> <string name="qr_code_scanner_updating_secondary_label" msgid="8344598017007876352">"Updaten"</string> <string name="status_bar_work" msgid="5238641949837091056">"Werkprofiel"</string> <string name="status_bar_airplane" msgid="4848702508684541009">"Vliegtuigmodus"</string> @@ -740,7 +752,7 @@ <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Snelkoppelingen voor de huidige app tonen"</string> <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Meldingen bekijken"</string> <string name="group_system_full_screenshot" msgid="5742204844232667785">"Screenshot maken"</string> - <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Snelkoppelingen tonen"</string> + <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Sneltoetsen tonen"</string> <string name="group_system_go_back" msgid="2730322046244918816">"Terug"</string> <string name="group_system_access_home_screen" msgid="4130366993484706483">"Naar het startscherm gaan"</string> <string name="group_system_overview_open_apps" msgid="5659958952937994104">"Recente apps bekijken"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Gebruikersaanwezigheid is waargenomen"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standaard notitie-app instellen in Instellingen"</string> <string name="install_app" msgid="5066668100199613936">"App installeren"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index afe1e662f94d..40683a7746c3 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ଡିସକନେକ୍ଟ କରନ୍ତୁ"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ଚାଲୁ କରନ୍ତୁ"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"ଆସନ୍ତାକାଲି ସ୍ୱତଃ ପୁଣି ଚାଲୁ ହେବ"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Quick Share, Find My Device ଏବଂ ଡିଭାଇସ ଲୋକେସନ ପରି ଫିଚରଗୁଡ଼ିକ ବ୍ଲୁଟୁଥ ବ୍ୟବହାର କରେ"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"ବ୍ଲୁଟୁଥ ଆସନ୍ତାକାଲି 5 AMରେ ଚାଲୁ ହେବ"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ବ୍ୟାଟେରୀ"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ଅଡିଓ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"ହେଡସେଟ୍"</string> @@ -439,6 +437,12 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"କାଢ଼ି ଦିଅନ୍ତୁ"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ୱିଜେଟ ଯୋଗ କରନ୍ତୁ"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ହୋଇଗଲା"</string> + <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) --> + <skip /> + <!-- no translation found for button_text_to_open_settings (1987729256950941628) --> + <skip /> + <string name="work_mode_off_title" msgid="5794818421357835873">"ୱାର୍କ ଆପ୍ସକୁ ପୁଣି ଚାଲୁ କରିବେ?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"ପୁଣି ଚାଲୁ କରନ୍ତୁ"</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> @@ -581,26 +585,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ମ୍ୟୁଟ"</string> <string name="media_device_cast" msgid="4786241789687569892">"କାଷ୍ଟ କରନ୍ତୁ"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"ରିଂକୁ ମ୍ୟୁଟ କରାଯାଇଥିବା ଯୋଗୁଁ ଉପଲବ୍ଧ ନାହିଁ"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s। ଅନମ୍ୟୁଟ୍ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s। ଭାଇବ୍ରେଟ୍ ସେଟ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ। ଆକ୍ସେସିବିଲିଟୀ ସର୍ଭିସ୍ ମ୍ୟୁଟ୍ କରାଯାଇପାରେ।"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s। ମ୍ୟୁଟ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ। ଆକ୍ସେସିବିଲିଟୀ ସର୍ଭିସ୍ ମ୍ୟୁଟ୍ କରାଯାଇପାରେ।"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s। ଭାଇବ୍ରେଟରେ ସେଟ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s। ମ୍ୟୁଟ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"ନଏଜ କଣ୍ଟ୍ରୋଲ"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"ସ୍ପାସିଅଲ ଅଡିଓ"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ବନ୍ଦ ଅଛି"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ନିର୍ଦ୍ଦିଷ୍ଟ"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ହେଡ ଟ୍ରାକିଂ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ରିଙ୍ଗର୍ ମୋଡ୍ ବଦଳାଇବାକୁ ଟାପ୍ କରନ୍ତୁ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ମ୍ୟୁଟ"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ଅନ୍-ମ୍ୟୁଟ୍ କରନ୍ତୁ"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ଭାଇବ୍ରେଟ୍"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s ଭଲ୍ୟୁମ୍ ନିୟନ୍ତ୍ରଣ"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"କଲ୍ ଓ ବିଜ୍ଞପ୍ତି ପାଇଁ (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)ରେ ରିଙ୍ଗ ହେବ"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>ରେ ପ୍ଲେ କରାଯାଉଛି"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"ଅଡିଓ ପ୍ଲେ ହେବ"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"ସିଷ୍ଟମ୍ UI ଟ୍ୟୁନର୍"</string> @@ -1236,12 +1250,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"ଉଚ୍ଚ ରିଜୋଲ୍ୟୁସନ ପାଇଁ ଫୋନକୁ ଫ୍ଲିପ କରନ୍ତୁ"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ଫୋଲ୍ଡ କରାଯାଇପାରୁଥିବା ଡିଭାଇସକୁ ଅନଫୋଲ୍ଡ କରାଯାଉଛି"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ଫୋଲ୍ଡ କରାଯାଇପାରୁଥିବା ଡିଭାଇସକୁ ଫ୍ଲିପ କରାଯାଉଛି"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ଫୋଲ୍ଡେଡ"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ଅନଫୋଲ୍ଡେଡ"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ବେଟେରୀ ଚାର୍ଜ ବାକି ଅଛି"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"ଏକ ଚାର୍ଜର ସହ ଆପଣଙ୍କ ଷ୍ଟାଇଲସକୁ କନେକ୍ଟ କରନ୍ତୁ"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"ଷ୍ଟାଇଲସ ବେଟେରୀର ଚାର୍ଜ କମ ଅଛି"</string> @@ -1257,7 +1268,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"ୟୁଜରଙ୍କ ଉପସ୍ଥିତି ଚିହ୍ନଟ କରାଯାଇଛି"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ସେଟିଂସରେ ଡିଫଲ୍ଟ ନୋଟ୍ସ ଆପ ସେଟ କରନ୍ତୁ"</string> <string name="install_app" msgid="5066668100199613936">"ଆପ ଇନଷ୍ଟଲ କରନ୍ତୁ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 8fda667fa95c..b2296b227681 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ਕਿਰਿਆਸ਼ੀਲ ਕਰੋ"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"ਕੱਲ੍ਹ ਨੂੰ ਆਪਣੇ ਆਪ ਚਾਲੂ ਹੋ ਜਾਵੇਗਾ"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"ਕਵਿੱਕ ਸ਼ੇਅਰ, Find My Device ਅਤੇ ਡੀਵਾਈਸ ਦਾ ਟਿਕਾਣਾ ਵਰਗੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਬਲੂਟੁੱਥ ਦੀ ਵਰਤੋਂ ਕਰਦੀਆਂ ਹਨ"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"ਬਲੂਟੁੱਥ ਕੱਲ੍ਹ ਸਵੇਰੇ 5 ਵਜੇ ਚਾਲੂ ਹੋਵੇਗਾ"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ਬੈਟਰੀ"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ਆਡੀਓ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"ਹੈੱਡਸੈੱਟ"</string> @@ -439,6 +437,12 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"ਹਟਾਓ"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ਵਿਜੇਟ ਸ਼ਾਮਲ ਕਰੋ"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ਹੋ ਗਿਆ"</string> + <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) --> + <skip /> + <!-- no translation found for button_text_to_open_settings (1987729256950941628) --> + <skip /> + <string name="work_mode_off_title" msgid="5794818421357835873">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਤੋਂ ਰੋਕ ਹਟਾਈਏ?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"ਰੋਕ ਹਟਾਓ"</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> @@ -581,26 +585,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ਮਿਊਟ"</string> <string name="media_device_cast" msgid="4786241789687569892">"ਕਾਸਟ ਕਰੋ"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"ਉਪਲਬਧ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਘੰਟੀ ਮਿਊਟ ਕੀਤੀ ਹੋਈ ਹੈ"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s। ਅਣਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s। ਥਰਥਰਾਹਟ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ। ਪਹੁੰਚਯੋਗਤਾ ਸੇਵਾਵਾਂ ਮਿਊਟ ਹੋ ਸਕਦੀਆਂ ਹਨ।"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s। ਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ। ਪਹੁੰਚਯੋਗਤਾ ਸੇਵਾਵਾਂ ਮਿਊਟ ਹੋ ਸਕਦੀਆਂ ਹਨ।"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s। ਥਰਥਰਾਹਟ \'ਤੇ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s। ਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"ਸ਼ੋਰ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"ਸਪੇਸ਼ਿਅਲ ਆਡੀਓ"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ਬੰਦ"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ਸਥਿਰ"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ਹੈੱਡ ਟਰੈਕਿੰਗ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ਰਿੰਗਰ ਮੋਡ ਨੂੰ ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ਮਿਊਟ ਕਰੋ"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ਅਣਮਿਊਟ ਕਰੋ"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"ਥਰਥਰਾਹਟ"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s ਵੌਲਿਊਮ ਕੰਟਰੋਲ"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ਕਾਲਾਂ ਆਉਣ ਅਤੇ ਸੂਚਨਾਵਾਂ ਮਿਲਣ \'ਤੇ ਘੰਟੀ ਵਜੇਗੀ (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> ਚਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"ਆਡੀਓ ਇਸ \'ਤੇ ਚੱਲੇਗੀ"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI ਟਿਊਨਰ"</string> @@ -1236,12 +1250,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"ਉੱਚ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਲਈ, ਫ਼ੋਨ ਨੂੰ ਫਲਿੱਪ ਕਰੋ"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"ਮੋੜਨਯੋਗ ਡੀਵਾਈਸ ਨੂੰ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"ਮੋੜਨਯੋਗ ਡੀਵਾਈਸ ਨੂੰ ਆਲੇ-ਦੁਆਲੇ ਫਲਿੱਪ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"ਫੋਲਡਯੋਗ ਡੀਵਾਈਸ"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"ਅਣਫੋਲਡਯੋਗ ਡੀਵਾਈਸ"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> ਬੈਟਰੀ ਬਾਕੀ"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"ਆਪਣੇ ਸਟਾਈਲਸ ਨੂੰ ਚਾਰਜਰ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"ਸਟਾਈਲਸ ਦੀ ਬੈਟਰੀ ਘੱਟ ਹੈ"</string> @@ -1257,7 +1268,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"ਵਰਤੋਂਕਾਰ ਦੀ ਮੌਜੂਦਗੀ ਦਾ ਪਤਾ ਲਗਾਇਆ ਜਾਂਦਾ ਹੈ"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਨੋਟ ਐਪ ਨੂੰ ਸੈੱਟ ਕਰੋ"</string> <string name="install_app" msgid="5066668100199613936">"ਐਪ ਸਥਾਪਤ ਕਰੋ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index cfbfa8a3fee0..a08e47334c70 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"rozłącz"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktywuj"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automatycznie włącz ponownie jutro"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funkcje takie jak szybkie udostępnianie, Znajdź moje urządzenie czy lokalizacja urządzenia używają Bluetootha"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth włączy się jutro o 5 rano"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> naładowania baterii"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Dźwięk"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Zestaw słuchawkowy"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Usuń"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodaj widżet"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gotowe"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Zezwolić na dowolny widżet na ekranie blokady?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Otwórz ustawienia"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Cofnąć wstrzymanie aplikacji służbowych?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Cofnij wstrzymanie"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Przełącz użytkownika"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Wszystkie aplikacje i dane w tej sesji zostaną usunięte."</string> @@ -581,26 +583,29 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Wyciszenie"</string> <string name="media_device_cast" msgid="4786241789687569892">"Przesyłanie"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Niedostępne, bo dzwonek jest wyciszony"</string> + <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Niedostępne, bo włączone jest „Nie przeszkadzać”"</string> + <string name="stream_media_unavailable" msgid="6823020894438959853">"Niedostępne, bo włączone jest „Nie przeszkadzać”"</string> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Kliknij, by wyłączyć wyciszenie."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Kliknij, by włączyć wibracje. Ułatwienia dostępu mogą być wyciszone."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Kliknij, by wyciszyć. Ułatwienia dostępu mogą być wyciszone."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Kliknij, by włączyć wibracje."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Kliknij, by wyciszyć."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Tłumienie szumów"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Dźwięk przestrzenny"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Wyłączony"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Stały"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Monitorowanie głowy"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Kliknij, aby zmienić tryb dzwonka"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"wycisz"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"wyłącz wyciszenie"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"włącz wibracje"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Sterowanie głośnością: %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Połączenia i powiadomienia będą uruchamiały dzwonek (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Otwórz ustawienia sygnału wyjściowego"</string> + <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Suwaki głośności są rozwinięte"</string> + <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Suwaki głośności są zwinięte"</string> + <string name="volume_panel_hint_mute" msgid="6962563028495243738">"wycisz: %s"</string> + <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"wyłącz wyciszenie: %s"</string> <string name="media_output_label_title" msgid="872824698593182505">"Odtwarzam <xliff:g id="LABEL">%s</xliff:g> na"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Wyjścia dźwięku:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Kalibrator System UI"</string> @@ -1254,7 +1259,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Wykryto obecność użytkownika"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ustaw domyślną aplikację do obsługi notatek w Ustawieniach"</string> <string name="install_app" msgid="5066668100199613936">"Zainstaluj aplikację"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 381c3bdc9cb3..83d523a3d04b 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desconectar"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ativar"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Ativar automaticamente de novo amanhã"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Recursos como o Quick Share, o Encontre Meu Dispositivo e a localização do dispositivo usam o Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"O Bluetooth será ativado amanhã às 5h"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Áudio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Fone de ouvido"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Remover"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Adicionar widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Concluído"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Permitir qualquer widget na tela de bloqueio?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir as configurações"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Reativar apps de trabalho?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Reativar"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Trocar usuário"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu suspenso"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Todos os apps e dados nesta sessão serão excluídos."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Desativar som"</string> <string name="media_device_cast" msgid="4786241789687569892">"Transmitir"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponível com o toque foi silenciado"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Toque para ativar o som."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Toque para configurar para vibrar. É possível que os serviços de acessibilidade sejam silenciados."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Toque para configurar para vibrar."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Toque para silenciar."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Controle de ruído"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Áudio espacial"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Desativado"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fixo"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Rastreamento de cabeça"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Toque para mudar o modo da campainha"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"desativar o som"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ativar o som"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Controles de volume %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Chamadas e notificações farão o smartphone tocar (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Tocando <xliff:g id="LABEL">%s</xliff:g> em"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"O áudio vai tocar em"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Sintonizador System UI"</string> @@ -1254,7 +1266,8 @@ <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âmera 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 de prioridade ativado"</string> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Presença do usuário detectada"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defina o app de notas padrão nas Configurações"</string> <string name="install_app" msgid="5066668100199613936">"Instalar o app"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 607a4aa1e760..44637a37e027 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desassociar"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ativar"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Reativar amanhã automaticamente"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"As funcionalidades como Partilha rápida, Localizar o meu dispositivo e localização do dispositivo usam o Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"O Bluetooth vai ser ativado amanhã às 05:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de bateria"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Áudio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Ausc. c/ mic. integ."</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Remover"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Adicionar widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Concluir"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Permitir qualquer widget no ecrã de bloqueio?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir definições"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Retomar apps de trabalho?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Retomar"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Mudar utilizador"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu pendente"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Todas as apps e dados desta sessão serão eliminados."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Desativar som"</string> <string name="media_device_cast" msgid="4786241789687569892">"Transmitir"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponível porque o toque está desat."</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Toque para reativar o som."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Toque para ativar a vibração. Os serviços de acessibilidade podem ser silenciados."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Toque para desativar o som. Os serviços de acessibilidade podem ser silenciados."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Toque para ativar a vibração."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Toque para desativar o som."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Controlo de ruído"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Áudio espacial"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Desativar"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Corrigido"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Head tracking"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Toque para alterar o modo de campainha"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"desativar som"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"reativar som"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Controlos de volume de %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"As chamadas e as notificações tocam (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"A ouvir <xliff:g id="LABEL">%s</xliff:g> em"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"O áudio será ouv. em"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Sintonizador da interface do sistema"</string> @@ -755,7 +767,7 @@ <string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Execução de várias tarefas em simultâneo no sistema"</string> <string name="system_multitasking_rhs" msgid="2454557648974553729">"Aceder ao ecrã dividido com a app atual para RHS"</string> <string name="system_multitasking_lhs" msgid="3516599774920979402">"Aceder ao ecrã dividido com a app atual para LHS"</string> - <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mude de ecrã dividido para ecrã inteiro"</string> + <string name="system_multitasking_full_screen" msgid="336048080383640562">"Mudar de ecrã dividido para ecrã inteiro"</string> <string name="system_multitasking_replace" msgid="7410071959803642125">"Durante o ecrã dividido: substituir uma app por outra"</string> <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Entrada"</string> <string name="input_switch_input_language_next" msgid="3782155659868227855">"Mudar para idioma seguinte"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Quando deteta a presença do utilizador"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Predefina a app de notas nas Definições"</string> <string name="install_app" msgid="5066668100199613936">"Instalar app"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 381c3bdc9cb3..83d523a3d04b 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"desconectar"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"ativar"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Ativar automaticamente de novo amanhã"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Recursos como o Quick Share, o Encontre Meu Dispositivo e a localização do dispositivo usam o Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"O Bluetooth será ativado amanhã às 5h"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Áudio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Fone de ouvido"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Remover"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Adicionar widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Concluído"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Permitir qualquer widget na tela de bloqueio?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Abrir as configurações"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Reativar apps de trabalho?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Reativar"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Trocar usuário"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu suspenso"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Todos os apps e dados nesta sessão serão excluídos."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Desativar som"</string> <string name="media_device_cast" msgid="4786241789687569892">"Transmitir"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponível com o toque foi silenciado"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Toque para ativar o som."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Toque para configurar para vibrar. É possível que os serviços de acessibilidade sejam silenciados."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Toque para configurar para vibrar."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Toque para silenciar."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Controle de ruído"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Áudio espacial"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Desativado"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fixo"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Rastreamento de cabeça"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Toque para mudar o modo da campainha"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"desativar o som"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ativar o som"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrar"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Controles de volume %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Chamadas e notificações farão o smartphone tocar (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Tocando <xliff:g id="LABEL">%s</xliff:g> em"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"O áudio vai tocar em"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Sintonizador System UI"</string> @@ -1254,7 +1266,8 @@ <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âmera 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 de prioridade ativado"</string> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Presença do usuário detectada"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Defina o app de notas padrão nas Configurações"</string> <string name="install_app" msgid="5066668100199613936">"Instalar o app"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 857a167cfad8..24bec4a3ae98 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"deconectează"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"activează"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Activează din nou automat mâine"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funcții precum Quick Share, Găsește-mi dispozitivul și locația dispozitivului folosesc Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth se va activa mâine la 5 dimineața"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Nivelul bateriei: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Căști"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Elimină"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Adaugă un widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Gata"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Permiți vreun widget pe ecranul de blocare?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Deschide setările"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Reactivezi aplicații de lucru?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Reactivează"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Schimbă utilizatorul"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"meniu vertical"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Toate aplicațiile și datele din această sesiune vor fi șterse."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Blochează"</string> <string name="media_device_cast" msgid="4786241789687569892">"Proiectează"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Indisponibil; soneria este dezactivată"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Atinge pentru a activa sunetul."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Atinge pentru a seta vibrarea. Sunetul se poate dezactiva pentru serviciile de accesibilitate."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Atinge pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Atinge pentru a seta pe vibrații."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Atinge pentru a dezactiva sunetul."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Controlul zgomotului"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Audio spațial"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Dezactivat"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fix"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Urmărirea mișcărilor capului"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Atinge pentru a schimba modul soneriei"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"dezactivează sunetul"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"activează sunetul"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrații"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Comenzi de volum pentru %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Apelurile și notificările vor suna (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Se redă <xliff:g id="LABEL">%s</xliff:g> pe"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Conținutul audio se va reda pe"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"S-a detectat prezența utilizatorului"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setează aplicația prestabilită de note din Setări"</string> <string name="install_app" msgid="5066668100199613936">"Instalează aplicația"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 87150cf6baea..584a7dabc31a 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"отключить"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"активировать"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Включить завтра автоматически"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Bluetooth используется в сервисе \"Найти устройство\", таких функциях, как Быстрая отправка, и при определении местоположения устройства"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth будет включен завтра в 05:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Заряд: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Аудиоустройство"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Гарнитура"</string> @@ -439,6 +437,12 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Удалить"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Добавить виджет"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string> + <!-- no translation found for dialog_title_to_allow_any_widget (1004820948962675644) --> + <skip /> + <!-- no translation found for button_text_to_open_settings (1987729256950941628) --> + <skip /> + <string name="work_mode_off_title" msgid="5794818421357835873">"Включить рабочие приложения?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Включить"</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> @@ -581,26 +585,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Без звука"</string> <string name="media_device_cast" msgid="4786241789687569892">"Трансляция"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недоступно, когда отключен звук вызовов"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Нажмите, чтобы включить звук."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Нажмите, чтобы включить вибрацию. Специальные возможности могут прекратить работу."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Нажмите, чтобы выключить звук. Специальные возможности могут прекратить работу."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Нажмите, чтобы включить вибрацию."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Нажмите, чтобы выключить звук."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Контроль уровня шума"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Пространственное звучание"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Отключено"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Без отслеживания"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"С отслеживанием"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Нажмите, чтобы изменить режим звонка."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"отключить звук"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"включить звук"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"включить вибрацию"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s: регулировка громкости"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Для звонков и уведомлений включен звук (уровень громкости: <xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> – запущено здесь:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Проигрывание аудио:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1254,7 +1268,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Обнаружен пользователь"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Задайте стандартное приложение для заметок в настройках."</string> <string name="install_app" msgid="5066668100199613936">"Установить приложение"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index e72f1ce015e9..30f7db30e070 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"විසන්ධි කරන්න"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"සක්රිය කරන්න"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"හෙට ස්වයංක්රීයව නැවත ක්රියාත්මක කරන්න"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"ඉක්මන් බෙදා ගැනීම, මගේ උපාංගය සෙවීම, සහ උපාංග ස්ථානය වැනි විශේෂාංග බ්ලූටූත් භාවිත කරයි"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"බ්ලූටූත් හෙට පෙ.ව. 5ට ක්රියාත්මක වනු ඇත"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ශ්රව්ය"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"හෙඩ්සෙටය"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"ඉවත් කරන්න"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"විජට්ටුව එක් කරන්න"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"නිමයි"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"අගුළු තිරය මත ඕනෑම විජට් එකකට ඉඩ දෙන්න"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"සැකසීම් විවෘත කරන්න"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"කාර්ය යෙදුම් විරාම නොකරන්න ද?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"විරාම නොකරන්න"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"නිහඬ කරන්න"</string> <string name="media_device_cast" msgid="4786241789687569892">"විකාශය"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"නාදය නිහඬ කර ඇති නිසා නොලැබේ"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. නිහඬ කිරීම ඉවත් කිරීමට තට්ටු කරන්න."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. කම්පනය කිරීමට තට්ටු කරන්න. ප්රවේශ්යතා සේවා නිහඬ කළ හැකිය."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. නිහඬ කිරීමට තට්ටු කරන්න. ප්රවේශ්යතා සේවා නිහඬ කළ හැකිය."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. කම්පනය කිරීමට සකස් කිරීමට තට්ටු කරන්න."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. නිහඬ කිරීමට තට්ටු කරන්න."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"ඝෝෂාව පාලනය"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"අවකාශීය ශ්රව්ය"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ක්රියාවිරහිතයි"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"නියම කළ"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"හිස ලුහුබැඳීම"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"නාදකය වෙනස් කිරීමට තට්ටු කරන්න"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"නිහඬ කරන්න"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"නිශ්ශබ්දතාවය ඉවත් කරන්න"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"කම්පනය"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"හඬ පරිමා පාලන %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"ඇමතුම් සහ දැනුම්දීම් (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>) නාද කරනු ඇත"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> වාදනය කරන්නේ"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"ශ්රව්ය වාදනය වනු ඇත්තේ"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"පද්ධති UI සුසරකය"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"ඉහළ විභේදනය සඳහා, දුරකථනය හරවන්න"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"දිග හැරෙමින් පවතින නැමිය හැකි උපාංගය"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"වටා පෙරළෙමින් තිබෙන නැමිය හැකි උපාංගය"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"නැවූ"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"නොනැවූ"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> බැටරිය ඉතිරිව ඇත"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"ඔබේ පන්හිඳ චාජරයකට සම්බන්ධ කරන්න"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"පන්හිඳ බැටරිය අඩුයි"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"පරිශීලක රූපාකාරය අනාවරණය වේ"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"සැකසීම් තුළ පෙරනිමි සටහන් යෙදුම සකසන්න"</string> <string name="install_app" msgid="5066668100199613936">"යෙදුම ස්ථාපනය කරන්න"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 6614c0d37fe6..21a01221eb14 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"odpojiť"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivovať"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Automaticky zajtra znova zapnúť"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funkcie, ako sú Quick Share, Nájdi moje zariadenie a poloha zariadenia, používajú Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth sa zapne zajtra o 5:00."</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Batéria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Zvuk"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Náhlavná súprava"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Odstrániť"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Pridať miniaplikáciu"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Hotovo"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Chcete povoliť akúkoľvek miniaplikáciu na uzamknutej obrazovke?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Otvoriť nastavenia"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Zrušiť pozast. prac. aplikácií?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Zrušiť pozastavenie"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Prepnutie používateľa"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rozbaľovacia ponuka"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Všetky aplikácie a údaje v tejto relácii budú odstránené."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Vypnúť zvuk"</string> <string name="media_device_cast" msgid="4786241789687569892">"Prenos"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nedostupné, pretože je vypnuté zvonenie"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Klepnutím zapnite zvuk."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Klepnutím aktivujte režim vibrovania. Služby dostupnosti je možné stlmiť."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Klepnutím vypnite zvuk. Služby dostupnosti je možné stlmiť."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Klepnutím nastavíte vibrovanie."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Klepnutím vypnete zvuk."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Ovládanie šumu"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Priestorový zvuk"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Vypnuté"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Pevné"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Sled. pohybov hlavy"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Režim zvonenia zmeníte klepnutím"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"vypnite zvuk"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"zapnite zvuk"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"zapnite vibrovanie"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Ovládacie prvky hlasitosti %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Hovory a upozornenia spustia zvonenie (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> sa prehráva v:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvuk sa prehrá v:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Tuner používateľského rozhrania systému"</string> @@ -1254,7 +1266,8 @@ <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokovaná"</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Kamera a mikrofón sú blokované"</string> <string name="microphone_blocked_dream_overlay_content_description" msgid="5466897982130007033">"Mikrofón je blokovaný"</string> - <string name="priority_mode_dream_overlay_content_description" msgid="6044561000253314632">"Režim priority je zapnutý"</string> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Bola rozpoznaná prítomnosť používateľa"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nastavte predvolenú aplikáciu na poznámky v Nastaveniach"</string> <string name="install_app" msgid="5066668100199613936">"Inštalovať aplikáciu"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 4a46742369c7..06774ed995cf 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"prekinitev povezave"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktiviranje"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Samodejno znova vklopi jutri"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funkcije, kot so Hitro deljenje, Poišči mojo napravo in zaznavanje lokacije naprave, uporabljajo Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth se bo vklopil jutri ob 5. uri"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Baterija na <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Zvok"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Slušalke z mikrofonom"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Odstrani"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Dodajanje pripomočka"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Končano"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Želite dovoliti poljubne pripomočke na zaklenjenem zaslonu?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Odpri nastavitve"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Želite znova aktivirati delovne aplikacije?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Znova aktiviraj"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Preklop med uporabniki"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"spustni meni"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Vse aplikacije in podatki v tej seji bodo izbrisani."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Utišano"</string> <string name="media_device_cast" msgid="4786241789687569892">"Predvajanje"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Ni na voljo, ker je zvonjenje izklopljeno"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Dotaknite se, če želite vklopiti zvok."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Dotaknite se, če želite nastaviti vibriranje. V storitvah za dostopnost bo morda izklopljen zvok."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Dotaknite se, če želite izklopiti zvok. V storitvah za dostopnost bo morda izklopljen zvok."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Dotaknite se, če želite nastaviti vibriranje."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Dotaknite se, če želite izklopiti zvok."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Omejevanje hrupa"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Prostorski zvok"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Izklopljeno"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Fiksno"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Spremljanje položaja glave"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Dotaknite se, če želite spremeniti način zvonjenja."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"izklop zvoka"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"vklop zvoka"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibriranje"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Kontrolniki glasnosti za %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Klici in obvestila bodo pozvonili (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Predvajanje »<xliff:g id="LABEL">%s</xliff:g>« v"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Zvok bo predvajan v"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Uglaševalnik uporabniškega vmesnika sistema"</string> @@ -1254,7 +1266,8 @@ <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Fotoaparat je blokiran."</string> <string name="camera_and_microphone_blocked_dream_overlay_content_description" msgid="7891078093416249764">"Fotoaparat in mikrofon sta blokirana."</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">"Prednostni način je vklopljen."</string> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Zaznana je prisotnost uporabnika"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Nastavite privzeto aplikacijo za zapiske v nastavitvah."</string> <string name="install_app" msgid="5066668100199613936">"Namesti aplikacijo"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 1fb6251adf9b..b541c47ecaed 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"shkëput"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivizo"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Aktivizoje automatikisht nesër"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Veçoritë si \"Ndarja e shpejtë\", \"Gjej pajisjen time\" dhe vendndodhja e pajisjes përdorin Bluetooth-in"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth-i do të aktivizohet nesër në 5:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> bateri"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Kufje me mikrofon"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Hiq"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Shto miniaplikacionin"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"U krye"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Të lejohet ndonjë miniaplikacion te ekrani i kyçjes?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Hap cilësimet"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Hiq nga pauza apl. e punës?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Hiq nga pauza"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Ndërro përdorues"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menyja me tërheqje poshtë"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Të gjitha aplikacionet dhe të dhënat në këtë sesion do të fshihen."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Pa zë"</string> <string name="media_device_cast" msgid="4786241789687569892">"Transmeto"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Nuk ofrohet; ziles i është hequr zëri"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Trokit për të aktivizuar."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Trokit për ta caktuar te dridhja. Shërbimet e qasshmërisë mund të çaktivizohen."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Trokit për të çaktivizuar. Shërbimet e qasshmërisë mund të çaktivizohen."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Trokit për ta vendosur në dridhje."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Trokit për ta çaktivizuar."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Kontrolli i zhurmës"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Audioja hapësinore"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Joaktive"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"E fiksuar"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Monitorimi i lëvizjes së kokës"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Trokit për të ndryshuar modalitetin e ziles"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"çaktivizo audion"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"aktivizo audion"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"lësho dridhje"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Kontrollet e volumit %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Do të bjerë zilja për telefonatat dhe njoftimet (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Po luhet <xliff:g id="LABEL">%s</xliff:g> në"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Do të luhet audio në"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Sintonizuesi i Sistemit të Ndërfaqes së Përdoruesit"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Për rezolucion më të lartë, përmbys telefonin"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Pajisja e palosshme duke u hapur"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Pajisja e palosshme duke u rrotulluar"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"palosur"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"shpalosur"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Përqindja e mbetur e baterisë: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Lidhe stilolapsin me një karikues"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"Bateria e stilolapsit në nivel të ulët"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Është zbuluar prania e përdoruesit"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Cakto aplikacionin e parazgjedhur të shënimeve te \"Cilësimet\""</string> <string name="install_app" msgid="5066668100199613936">"Instalo aplikacionin"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 3444c8085f44..3ae30b535e92 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"прекините везу"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"активирајте"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Аутоматски поново укључи сутра"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Функције као што су Quick Share, Пронађи мој уређај и локација уређаја користе Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth ће се укључити сутра у 5:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Аудио"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Слушалице"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Уклони"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Додај виџет"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Желите да дозволите све виџете на закључаном екрану?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Отвори подешавања"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Укључити пословне апликације?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Поново активирај"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Искључи звук"</string> <string name="media_device_cast" msgid="4786241789687569892">"Пребацивање"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недоступно јер је звук искључен"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Додирните да бисте укључили звук."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Додирните да бисте подесили на вибрацију. Звук услуга приступачности ће можда бити искључен."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Додирните да бисте искључили звук. Звук услуга приступачности ће можда бити искључен."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Додирните да бисте подесили на вибрацију."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Додирните да бисте искључили звук."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Контрола шума"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Просторни звук"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Искључено"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Фиксно"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Праћење главе"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Додирните да бисте променили режим звона"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"искључите звук"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"укључите звук"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"вибрација"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Контроле за јачину звука за %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Мелодија звона за позиве и обавештења је укључена (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> се пушта на"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Звук се пушта на"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Тјунер за кориснички интерфејс система"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Присуство корисника може да се открије"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Подесите подразумевану апликацију за белешке у Подешавањима"</string> <string name="install_app" msgid="5066668100199613936">"Инсталирај апликацију"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 2ca3d5d03651..e8f0d2c34440 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"koppla från"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"aktivera"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Aktivera automatiskt igen i morgon"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Funktioner som Snabbdelning, Hitta min enhet och enhetens plats använder Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth aktiveras i morgon kl. 5.00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> batteri"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Ljud"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Ta bort"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Lägg till widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Klar"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vill du tillåta alla widgetar på låsskärmen?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Öppna inställningarna"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Vill du återuppta jobbappar?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Återuppta"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Byt användare"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"rullgardinsmeny"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alla appar och data i denna session kommer att raderas."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Dölj"</string> <string name="media_device_cast" msgid="4786241789687569892">"Casta"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Otillgängligt eftersom ringljudet är av"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tryck här om du vill slå på ljudet."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tryck här om du vill sätta på vibrationen. Tillgänglighetstjänster kanske inaktiveras."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tryck här om du vill stänga av ljudet. Tillgänglighetstjänsterna kanske inaktiveras."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Tryck här om du vill aktivera vibrationsläget."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Tryck här om du vill stänga av ljudet."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Bruskontroll"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Rumsligt ljud"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Av"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Statisk"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Huvudspårning"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tryck för att ändra ringsignalens läge"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"stänga av ljudet"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"slå på ljudet"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibration"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Volymkontroller för %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Ringsignal används för samtal och aviseringar (volym: <xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Spelar upp <xliff:g id="LABEL">%s</xliff:g> på"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Ljud spelas upp på"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Inställningar för systemgränssnitt"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Vänd telefonen för högre upplösning"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"En vikbar enhet viks upp"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"En vikbar enhet vänds"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"hopvikt"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"uppvikt"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s/%2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> av batteriet återstår"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Anslut e-pennan till en laddare"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"E-pennans batterinivå är låg"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Användarnärvaro har upptäckts"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ställ in en standardapp för anteckningar i inställningarna"</string> <string name="install_app" msgid="5066668100199613936">"Installera appen"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index b48a0f57d4ce..19685b1368b1 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ondoa"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"anza kutumia"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Iwashe tena kesho kiotomatiki"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Vipengele kama vile Kutuma Haraka, Tafuta Kifaa Changu na mahali kifaa kilipo hutumia Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth itawaka kesho saa 11 alfajiri"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Sauti"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Vifaa vya sauti"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Ondoa"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Ongeza wijeti"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Nimemaliza"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Ungependa kuruhusu wijeti yoyote kwenye skrini iliyofungwa?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Fungua mipangilio"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Je, ungependa kuacha kusitisha programu za kazini?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Acha kusitisha"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Badili mtumiaji"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menyu ya kuvuta chini"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Data na programu zote katika kipindi hiki zitafutwa."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Zima sauti"</string> <string name="media_device_cast" msgid="4786241789687569892">"Tuma"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Halipatikani kwa sababu sauti imezimwa"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Gusa ili urejeshe."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Gusa ili uweke mtetemo. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Gusa ili ukomeshe. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Gusa ili uweke mtetemo."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Gusa ili usitishe."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Kidhibiti cha Kelele"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Sauti Inayojirekebisha Kulingana na Hali"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Imezimwa"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Imerekebishwa"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Ufuatilizi wa Kichwa"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Gusa ili ubadilishe hali ya programu inayotoa milio ya simu"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"zima sauti"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"washa sauti"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"tetema"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Vidhibiti %s vya sauti"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Itatoa mlio arifa ikitumwa na simu ikipigwa (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Inacheza <xliff:g id="LABEL">%s</xliff:g> kwenye"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Sauti itacheza kwenye"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Kirekebishi cha kiolesura cha mfumo"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Imetambua uwepo wa mtumiaji"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Teua programu chaguomsingi ya madokezo katika Mipangilio"</string> <string name="install_app" msgid="5066668100199613936">"Sakinisha programu"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index b95406425bcc..742e88f14010 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"இணைப்பு நீக்கும்"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"செயல்படுத்தும்"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"நாளைக்குத் தானாகவே மீண்டும் இயக்கப்படும்"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"விரைவுப் பகிர்தல், Find My Device போன்ற அம்சங்களும் சாதன இருப்பிடமும் புளூடூத்தைப் பயன்படுத்துகின்றன"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"நாளை 5 AMக்கு புளூடூத் ஆன் ஆகும்"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> பேட்டரி"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ஆடியோ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"ஹெட்செட்"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"அகற்றும்"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"விட்ஜெட்டைச் சேர்"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"முடிந்தது"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"பூட்டுத் திரையில் எந்தவொரு விட்ஜெட்டையும் அனுமதிக்கவா?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"அமைப்புகளைத் திற"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"பணி ஆப்ஸை மீண்டும் இயக்கவா?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"மீண்டும் இயக்கு"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"அமைதி"</string> <string name="media_device_cast" msgid="4786241789687569892">"அலைபரப்பு"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"\'ரிங்\' மியூட்டில் உள்ளதால் கிடைக்கவில்லை"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. ஒலி இயக்க, தட்டவும்."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. அதிர்விற்கு அமைக்க, தட்டவும். அணுகல்தன்மை சேவைகள் ஒலியடக்கப்படக்கூடும்."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. ஒலியடக்க, தட்டவும். அணுகல்தன்மை சேவைகள் ஒலியடக்கப்படக்கூடும்."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. அதிர்விற்கு அமைக்க, தட்டவும்."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. ஒலியடக்க, தட்டவும்."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"இரைச்சல் கட்டுப்பாடு"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"சுற்றிலும் கேட்கும் ஆடியோ"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ஆஃப்"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"நிலையானது"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"ஹெட் டிராக்கிங்"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"ரிங்கர் பயன்முறையை மாற்ற தட்டவும்"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ஒலியடக்கும்"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ஒலி இயக்கும்"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"அதிர்வுறும்"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s ஒலியளவுக் கட்டுப்பாடுகள்"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"அழைப்புகளும் அறிவிப்புகளும் வரும்போது ஒலிக்கச் செய்யும் (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"இதில் <xliff:g id="LABEL">%s</xliff:g> பிளே ஆகிறது"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"இல் ஆடியோ பிளே ஆகும்"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"பயனர் கண்டறியப்பட்டுள்ளார்"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"குறிப்பு எடுப்பதற்கான இயல்புநிலை ஆப்ஸை அமைப்புகளில் அமையுங்கள்"</string> <string name="install_app" msgid="5066668100199613936">"ஆப்ஸை நிறுவுங்கள்"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 75f872f0c602..0ec2a0e7aa9e 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"డిస్కనెక్ట్ చేయండి"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"యాక్టివేట్ చేయండి"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"రేపు మళ్లీ ఆటోమేటిక్గా ఆన్ చేస్తుంది"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"క్విక్ షేర్, Find My Device, పరికర లొకేషన్ వంటి ఫీచర్లు బ్లూటూత్ను ఉపయోగిస్తాయి"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"బ్లూటూత్ రేపు ఉదయం 5 గంటలకు ఆన్ అవుతుంది"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> బ్యాటరీ"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"ఆడియో"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"హెడ్సెట్"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"తీసివేయండి"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"విడ్జెట్ను జోడించండి"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"పూర్తయింది"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"లాక్ స్క్రీన్లో ఏదైనా విడ్జెట్ను అనుమతించాలా?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"సెట్టింగ్లను తెరవండి"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"వర్క్ యాప్స్ అన్పాజ్ చేయాలా?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"అన్పాజ్ చేయండి"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"మ్యూట్"</string> <string name="media_device_cast" msgid="4786241789687569892">"ప్రసారం చేయండి"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"వాల్యూమ్ మ్యూట్ అయినందున అందుబాటులో లేదు"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. అన్మ్యూట్ చేయడానికి నొక్కండి."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. వైబ్రేషన్కు సెట్ చేయడానికి నొక్కండి. యాక్సెస్ సామర్థ్య సేవలు మ్యూట్ చేయబడవచ్చు."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. మ్యూట్ చేయడానికి నొక్కండి. యాక్సెస్ సామర్థ్య సేవలు మ్యూట్ చేయబడవచ్చు."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. వైబ్రేట్ అయ్యేలా సెట్ చేయడం కోసం నొక్కండి."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. మ్యూట్ చేయడానికి నొక్కండి."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"నాయిస్ కంట్రోల్"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"స్పేషియల్ ఆడియో"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ఆఫ్ చేయండి"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"ఆరంభించండి"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"హెడ్ ట్రాకింగ్"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"రింగర్ మోడ్ను మార్చడానికి ట్యాప్ చేయండి"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"మ్యూట్ చేయి"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"అన్మ్యూట్ చేయి"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"వైబ్రేట్"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s వాల్యూమ్ నియంత్రణలు"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"కాల్స్ మరియు నోటిఫికేషన్లు రింగ్ అవుతాయి (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>లో ప్లే అవుతోంది"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"ఆడియో ప్లే అవుతుంది"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"సిస్టమ్ UI ట్యూనర్"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"అధిక రిజల్యూషన్ కోసం, ఫోన్ను తిప్పండి"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"మడవగల పరికరం విప్పబడుతోంది"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"మడవగల పరికరం చుట్టూ తిప్పబడుతోంది"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"మడిచే సదుపాయం గల పరికరం"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"మడిచే సదుపాయం లేని పరికరం"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> బ్యాటరీ మిగిలి ఉంది"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"మీ స్టైలస్ను ఛార్జర్కి కనెక్ట్ చేయండి"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"తక్కువ స్టైలస్ బ్యాటరీ"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"యూజర్ ఉనికి గుర్తించబడింది"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"సెట్టింగ్లలో ఆటోమేటిక్గా ఉండేలా ఒక నోట్స్ యాప్ను సెట్ చేసుకోండి"</string> <string name="install_app" msgid="5066668100199613936">"యాప్ను ఇన్స్టాల్ చేయండి"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 94243b0329e2..835c5bbbdb3f 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ยกเลิกการเชื่อมต่อ"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"เปิดใช้งาน"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"เปิดอีกครั้งโดยอัตโนมัติในวันพรุ่งนี้"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"ฟีเจอร์ต่างๆ เช่น Quick Share, หาอุปกรณ์ของฉัน และตำแหน่งของอุปกรณ์ ใช้บลูทูธ"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"บลูทูธจะเปิดพรุ่งนี้เวลา 05:00 น."</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"เสียง"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"ชุดหูฟัง"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"นำออก"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"เพิ่มวิดเจ็ต"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"เสร็จสิ้น"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"อนุญาตวิดเจ็ตบนหน้าจอล็อกไหม"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"เปิดการตั้งค่า"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"ยกเลิกการหยุดแอปงานชั่วคราวไหม"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"ยกเลิกการหยุดชั่วคราว"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"ปิดเสียง"</string> <string name="media_device_cast" msgid="4786241789687569892">"แคสต์"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"เปลี่ยนไม่ได้เนื่องจากปิดเสียงเรียกเข้า"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s แตะเพื่อเปิดเสียง"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s แตะเพื่อตั้งค่าให้สั่น อาจมีการปิดเสียงบริการการเข้าถึง"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s แตะเพื่อปิดเสียง อาจมีการปิดเสียงบริการการเข้าถึง"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s แตะเพื่อตั้งค่าให้สั่น"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s แตะเพื่อปิดเสียง"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"การควบคุมเสียง"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"เสียงรอบทิศทาง"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"ปิด"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"คงที่"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"การติดตามการเคลื่อนไหวของศีรษะ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"แตะเพื่อเปลี่ยนโหมดเสียงเรียกเข้า"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ปิดเสียง"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"เปิดเสียง"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"สั่น"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"ตัวควบคุมระดับเสียง %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"สายเรียกเข้าและการแจ้งเตือนจะส่งเสียง (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"กำลังเล่น <xliff:g id="LABEL">%s</xliff:g> ใน"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"เสียงจะเล่นต่อไป"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"ตัวรับสัญญาณ UI ระบบ"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"ตรวจพบการแสดงข้อมูลของผู้ใช้"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"กำหนดแอปการจดบันทึกเริ่มต้นในการตั้งค่า"</string> <string name="install_app" msgid="5066668100199613936">"ติดตั้งแอป"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 99b61e97579e..ec3e2b673a2c 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"idiskonekta"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"i-activate"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Awtomatikong i-on ulit bukas"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Guamgamit ng Bluetooth ang mga feature tulad ng Quick Share, Hanapin ang Aking Device, at lokasyon ng device"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Mag-o-on ang Bluetooth bukas nang 5 AM"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> na baterya"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Alisin"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Magdagdag ng widget"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Tapos na"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Payagan ang anumang widget sa lock screen?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Buksan ang mga setting"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"I-unpause ang mga work app?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"I-unpause"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Magpalit ng user"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"pulldown menu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Ide-delete ang lahat ng app at data sa session na ito."</string> @@ -581,26 +583,29 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"I-mute"</string> <string name="media_device_cast" msgid="4786241789687569892">"Mag-cast"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Hindi available dahil naka-mute ang ring"</string> + <string name="stream_alarm_unavailable" msgid="4059817189292197839">"Hindi available dahil naka-on ang Huwag Istorbohin"</string> + <string name="stream_media_unavailable" msgid="6823020894438959853">"Hindi available dahil naka-on ang Huwag Istorbohin"</string> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. I-tap upang i-unmute."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. I-tap upang itakda na mag-vibrate. Maaaring i-mute ang mga serbisyo sa Accessibility."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. I-tap upang i-mute. Maaaring i-mute ang mga serbisyo sa Accessibility."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. I-tap upang itakda na mag-vibrate."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. I-tap upang i-mute."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Pagkontrol sa Ingay"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Spatial Audio"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Naka-off"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Nakapirmi"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Pag-track ng Ulo"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"I-tap para baguhin ang ringer mode"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"i-mute"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"i-unmute"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"i-vibrate"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Mga kontrol ng volume ng %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Magri-ring kapag may mga tawag at notification (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <string name="volume_panel_enter_media_output_settings" msgid="8824244246272552669">"Pumunta sa mga setting ng output"</string> + <string name="volume_panel_expanded_sliders" msgid="1885750987768506271">"Na-expand ang mga slider ng volume"</string> + <string name="volume_panel_collapsed_sliders" msgid="1413383759434791450">"Na-collapse ang mga slider ng volume"</string> + <string name="volume_panel_hint_mute" msgid="6962563028495243738">"i-mute ang %s"</string> + <string name="volume_panel_hint_unmute" msgid="7489063242934477382">"i-unmute ang %s"</string> <string name="media_output_label_title" msgid="872824698593182505">"Nagpe-play ang <xliff:g id="LABEL">%s</xliff:g> sa"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"I-play ang audio sa"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Tuner ng System UI"</string> @@ -1254,7 +1259,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Na-detect ang presensya ng user"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Magtakda ng default na app sa pagtatala sa Mga Setting"</string> <string name="install_app" msgid="5066668100199613936">"I-install ang app"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index c20c62aad2d3..3c9d4795e4e7 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"bağlantıyı kes"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"etkinleştir"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Yarın otomatik olarak tekrar aç"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Quick Share, Cihazımı Bul ve cihaz konumu gibi özellikler Bluetooth\'u kullanır"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth yarın saat 05:00\'te açılacak"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Pil düzeyi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Ses"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Mikrofonlu kulaklık"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Kaldır"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Widget ekle"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Bitti"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Kilit ekranında tüm widget\'lara izin verilsin mi?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Ayarları açın"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"İş uygulamaları devam ettirilsin mi?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Devam ettir"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Kullanıcı değiştirme"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"açılır menü"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Bu oturumdaki tüm uygulamalar ve veriler silinecek."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Sesi kapat"</string> <string name="media_device_cast" msgid="4786241789687569892">"Yayınla"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Zil sesi kapatıldığı için kullanılamıyor"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Sesi açmak için dokunun."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Titreşime ayarlamak için dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Sesi kapatmak için dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Titreşime ayarlamak için dokunun."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Sesi kapatmak için dokunun."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Gürültü Kontrolü"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Üç Boyutlu Ses"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Kapalı"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Sabit"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Kafa Hareketi İzleme"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Telefon zili modunu değiştirmek için dokunun"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"sesi kapat"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"sesi aç"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"titreşim"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s ses denetimleri"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Aramalar ve bildirimler telefonun zilini çaldıracak (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> şurada çalacak:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Ses şurada çalacak:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Sistem Arayüzü Ayarlayıcısı"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Kullanıcı varlığı algılandı"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Ayarlar\'ı kullanarak varsayılan notlar ayarlayın"</string> <string name="install_app" msgid="5066668100199613936">"Uygulamayı yükle"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 3338bce79494..bc557c6b85f6 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"від’єднати"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"активувати"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Автоматично ввімкнути знову завтра"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Такі функції, як швидкий обмін, \"Знайти пристрій\" і визначення місцезнаходження пристрою, використовують Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth увімкнеться завтра о 5:00"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> заряду акумулятора"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Аудіопристрій"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Гарнітура"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Видалити"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Додати віджет"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Готово"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Дозволити використовувати будь-який віджет на заблокованому екрані?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Відкрити налаштування"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Увімкнути робочі додатки?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Увімкнути"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Без звуку"</string> <string name="media_device_cast" msgid="4786241789687569892">"Трансляція"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Недоступно: звук дзвінків вимкнено"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Торкніться, щоб увімкнути звук."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Торкніться, щоб налаштувати вібросигнал. Спеціальні можливості може бути вимкнено."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Торкніться, щоб вимкнути звук. Спеціальні можливості може бути вимкнено."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Торкніться, щоб налаштувати вібросигнал."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Торкніться, щоб вимкнути звук."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Контроль шуму"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Просторове звучання"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Вимкнено"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Завжди ввімкнено"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Відстеження рухів голови"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Торкніться, щоб змінити режим дзвінка"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"вимкнути звук"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"увімкнути звук"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"увімкнути вібросигнал"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Регуляторів гучності: %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Для викликів і сповіщень налаштовано звуковий сигнал (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Відтворюється <xliff:g id="LABEL">%s</xliff:g> на:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Аудіо гратиме на:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"System UI Tuner"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"Для вищої роздільної здатності переверніть телефон"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"Розкладний пристрій у розкладеному стані"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"Розкладний пристрій обертається"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"складений"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"розкладений"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"Заряд акумулятора: <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"Підключіть стилус до зарядного пристрою"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"Низький заряд акумулятора стилуса"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Виявлено присутність користувача"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Призначте стандартний додаток для нотаток у налаштуваннях"</string> <string name="install_app" msgid="5066668100199613936">"Установити додаток"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index bbc77674207b..5bd251d9d226 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"غیر منسلک کریں"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"فعال کریں"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"کل دوبارہ خودکار طور پر آن ہوگا"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"فوری اشتراک، میرا آلہ ڈھونڈیں، اور آلہ کے مقام جیسی خصوصیات بلوٹوتھ کا استعمال کرتی ہیں"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"بلوٹوتھ کل صبح 5 بجے آن ہو جائے گا"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> بیٹری"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"آڈیو"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"ہیڈ سیٹ"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"ہٹائیں"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"ویجیٹ شامل کریں"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"ہو گیا"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"مقفل اسکرین پر کسی ویجیٹ کی اجازت دیں؟"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"ترتیبات کھولیں"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"ورک ایپس کو غیر موقوف کریں؟"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"غیر موقوف کریں"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"خاموش کریں"</string> <string name="media_device_cast" msgid="4786241789687569892">"کاسٹ"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"دستیاب نہیں ہے کیونکہ رنگ خاموش ہے"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s۔ آواز چالو کرنے کیلئے تھپتھپائیں۔"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s۔ ارتعاش پر سیٹ کرنے کیلئے تھپتھپائیں۔ ایکسیسبیلٹی سروسز شاید خاموش ہوں۔"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s۔ خاموش کرنے کیلئے تھپتھپائیں۔ ایکسیسبیلٹی سروسز شاید خاموش ہوں۔"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s۔ ارتعاش پر سیٹ کرنے کیلئے تھپتھپائیں۔"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s۔ خاموش کرنے کیلئے تھپتھپائیں۔"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"شور کنٹرول"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"اسپیشیئل آڈیو"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"آف کریں"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"مقرر"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"سر کی ٹریکنگ"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"رنگر وضع تبدیل کرنے کیلئے تھپتھپائیں"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"خاموش کریں"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"غیر خاموش کریں"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"وائبریٹ"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s والیوم کے کنٹرولز"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"کالز اور اطلاعات موصول ہونے پر گھنٹی بجے گی (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g> پر چل رہی ہے"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"آڈیو چلتی رہے گی"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"سسٹم UI ٹیونر"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"زیادہ ریزولوشن کے لیے، فون پلٹائیں"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"فولڈ ہونے والے آلے کو کھولا جا رہا ہے"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"فولڈ ہونے والے آلے کو گھمایا جا رہا ہے"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"فولڈ کردہ"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"اَن فولڈ کردہ"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"<xliff:g id="PERCENTAGE">%s</xliff:g> بیٹری باقی ہے"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"اپنے اسٹائلس کو چارجر منسلک کریں"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"اسٹائلس بیٹری کم ہے"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"صارف کی موجودگی کا پتہ چلا ہے"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"ترتیبات میں ڈیفالٹ نوٹس ایپ سیٹ کریں"</string> <string name="install_app" msgid="5066668100199613936">"ایپ انسٹال کریں"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 4967115f7ee4..7d3f2af3b34d 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"uzish"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"faollashtirish"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Ertaga yana avtomatik yoqilsin"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Tezkor ulashuv, Qurilmamni top va qurilma geolokatsiyasi kabi funksiyalar Bluetooth ishlatadi"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth ertaga soat 5 da yoqiladi"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"Batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Garnitura"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Olib tashlash"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Vidjet kiritish"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Tayyor"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Ekran qulfida istalgan vidjet chiqsinmi?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Sozlamalarni ochish"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Ishga oid ilovalar qaytarilsinmi?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Davom ettirish"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Foydalanuvchini almashtirish"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"tortib tushiriladigan menyu"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Ushbu seansdagi barcha ilovalar va ma’lumotlar o‘chirib tashlanadi."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Ovozsiz"</string> <string name="media_device_cast" msgid="4786241789687569892">"Translatsiya"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Jiringlash ovozsizligi uchun ishlamaydi"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Ovozini yoqish uchun ustiga bosing."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tebranishni yoqish uchun ustiga bosing. Qulayliklar ishlamasligi mumkin."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Ovozini o‘chirish uchun ustiga bosing. Qulayliklar ishlamasligi mumkin."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Tebranishni yoqish uchun ustiga bosing."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Ovozsiz qilish uchun ustiga bosing."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Shovqin boshqaruvi"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Qamrovli ovoz"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Oʻchiq"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Statik"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Boshni kuzatish"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Jiringlagich rejimini oʻzgartirish uchun bosing"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"ovozsiz qilish"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"ovozni yoqish"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"tebranish"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s tovush balandligi tugmalari"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Chaqiruvlar va bildirishnomalar jiringlaydi (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>da ijro etilmoqda"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Audio ijro etiladi"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"SystemUI Tuner"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Foydalanuvchi aniqlandi"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Standart qaydlar ilovasini Sozlamalar orqali tanlang"</string> <string name="install_app" msgid="5066668100199613936">"Ilovani oʻrnatish"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 0b411b5d1925..0a9cbb44f33d 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"ngắt kết nối"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"kích hoạt"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Tự động bật lại vào ngày mai"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Các tính năng như Chia sẻ nhanh, Tìm thiết bị của tôi và dịch vụ vị trí trên thiết bị có sử dụng Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"Bluetooth sẽ bật vào ngày mai lúc 5 giờ sáng"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> pin"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Âm thanh"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Tai nghe"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Xoá"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Thêm tiện ích"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Xong"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Cho phép mọi tiện ích trên màn hình khoá?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Mở phần Cài đặt"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Tiếp tục dùng ứng dụng công việc?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Tiếp tục dùng"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Chuyển đổi người dùng"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"trình đơn kéo xuống"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Tất cả ứng dụng và dữ liệu trong phiên này sẽ bị xóa."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Tắt tiếng"</string> <string name="media_device_cast" msgid="4786241789687569892">"Truyền"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Không hoạt động vì chuông bị tắt"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Nhấn để bật tiếng."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Nhấn để đặt chế độ rung. Bạn có thể tắt tiếng dịch vụ trợ năng."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Nhấn để tắt tiếng. Bạn có thể tắt tiếng dịch vụ trợ năng."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Nhấn để đặt chế độ rung."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Nhấn để tắt tiếng."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Kiểm soát tiếng ồn"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Âm thanh không gian"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Tắt"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Cố định"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Theo dõi chuyển động của đầu"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Nhấn để thay đổi chế độ chuông"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"tắt tiếng"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"bật tiếng"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"rung"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Điều khiển âm lượng %s"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Cuộc gọi và thông báo sẽ đổ chuông (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Đang phát <xliff:g id="LABEL">%s</xliff:g> trên"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Âm thanh sẽ phát ra"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Bộ điều hướng giao diện người dùng hệ thống"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Phát hiện thấy người dùng đang hiện diện"</string> <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> <string name="install_app" msgid="5066668100199613936">"Cài đặt ứng dụng"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 9a7588496fc7..874286ac4c66 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"断开连接"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"启用"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"明天自动重新开启"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"“快速分享”“查找我的设备”“设备位置信息”等功能会使用蓝牙"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"蓝牙将于明天早晨 5 点开启"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> 的电量"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"音频"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"耳机"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"移除"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"添加微件"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"完成"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"允许在锁屏状态下显示任何微件?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"打开设置"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"是否为工作应用解除暂停状态?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"解除暂停"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"静音"</string> <string name="media_device_cast" msgid="4786241789687569892">"投屏"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"该功能无法使用,因为铃声被静音"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s。点按即可取消静音。"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s。点按即可设为振动,但可能会同时将无障碍服务设为静音。"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s。点按即可设为静音,但可能会同时将无障碍服务设为静音。"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s。点按即可设为振动。"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s。点按即可设为静音。"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"噪声控制"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"空间音频"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"关闭"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"固定"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"头部跟踪"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"点按即可更改振铃器模式"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"静音"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"取消静音"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"振动"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s音量控件"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"有来电和通知时会响铃 (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"<xliff:g id="LABEL">%s</xliff:g>播放位置:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"音频播放位置:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"系统界面调节工具"</string> @@ -743,9 +755,9 @@ <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"显示快捷键"</string> <string name="group_system_go_back" msgid="2730322046244918816">"返回"</string> <string name="group_system_access_home_screen" msgid="4130366993484706483">"前往主屏幕"</string> - <string name="group_system_overview_open_apps" msgid="5659958952937994104">"查看最近运行过的应用"</string> - <string name="group_system_cycle_forward" msgid="5478663965957647805">"向前循环浏览近期使用的应用"</string> - <string name="group_system_cycle_back" msgid="8194102916946802902">"向后循环浏览近期使用的应用"</string> + <string name="group_system_overview_open_apps" msgid="5659958952937994104">"查看最近用过的应用"</string> + <string name="group_system_cycle_forward" msgid="5478663965957647805">"向前循环浏览最近用过的应用"</string> + <string name="group_system_cycle_back" msgid="8194102916946802902">"向后循环浏览最近用过的应用"</string> <string name="group_system_access_all_apps_search" msgid="1553588630154197469">"打开应用列表"</string> <string name="group_system_hide_reshow_taskbar" msgid="6108733797075862081">"显示任务栏"</string> <string name="group_system_access_system_settings" msgid="8731721963449070017">"打开设置"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"检测到用户存在"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在设置中设置默认记事应用"</string> <string name="install_app" msgid="5066668100199613936">"安装应用"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 2cf6da461f41..bb7919bf886d 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"解除連結"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"啟動"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"明天自動重新開啟"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"「快速共享」、「尋找我的裝置」和裝置位置等功能都會使用藍牙"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"藍牙將於明天上午 5 時開啟"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"音訊"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"耳機"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"移除"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"新增小工具"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"完成"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"要允許在上鎖畫面上顯示任何小工具嗎?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"開啟設定"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"要取消暫停工作應用程式嗎?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"取消暫停"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"靜音"</string> <string name="media_device_cast" msgid="4786241789687569892">"投放"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"鈴聲已設定為靜音,因此無法使用"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s。輕按即可取消靜音。"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s。輕按即可設為震動。無障礙功能服務可能已經設為靜音。"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s。輕按即可設為靜音。無障礙功能服務可能已經設為靜音。"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s。輕按即可設為震動。"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s。輕按即可設為靜音。"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"噪音控制"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"空間音訊"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"關閉"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"固定"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"頭部追蹤"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"輕按即可變更響鈴模式"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"靜音"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"取消靜音"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"震動"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s音量控制項"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"有來電和通知時會發出鈴聲 (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"正在播放「<xliff:g id="LABEL">%s</xliff:g>」的裝置:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"音訊播放媒體"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"系統使用者介面調諧器"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"偵測到使用者動態"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在「設定」中指定預設筆記應用程式"</string> <string name="install_app" msgid="5066668100199613936">"安裝應用程式"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 12ca94c458b5..e48e483d4f82 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"取消連結"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"啟用"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"明天自動重新開啟"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"藍牙會用於快速分享、「尋找我的裝置」,以及裝置位置資訊等功能"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"藍牙將在明天早上 5 點開啟"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"電量:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"音訊"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"耳機"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"移除"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"新增小工具"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"完成"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"要允許在螢幕鎖定畫面上顯示任何小工具嗎?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"開啟設定"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"要解除工作應用程式的暫停狀態嗎?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"取消暫停"</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> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"靜音"</string> <string name="media_device_cast" msgid="4786241789687569892">"投放"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"鈴聲已設為靜音,因此無法使用"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s。輕觸即可取消靜音。"</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s。輕觸即可設為震動,但系統可能會將無障礙服務一併設為靜音。"</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s。輕觸即可設為靜音,但系統可能會將無障礙服務一併設為靜音。"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s。輕觸即可設為震動。"</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s。輕觸即可設為靜音。"</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"噪音控制"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"空間音訊"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"關閉"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"固定"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"頭部追蹤"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"輕觸即可變更鈴聲模式"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"靜音"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"取消靜音"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"震動"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"「%s」音量控制項"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"有來電和通知時會響鈴 (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"正在播放「<xliff:g id="LABEL">%s</xliff:g>」的裝置:"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"將播放音訊的媒體:"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"系統使用者介面調整精靈"</string> @@ -995,7 +1007,7 @@ <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"要移除「<xliff:g id="APPNAME">%s</xliff:g>」的控制項嗎?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"已加入收藏"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"已加入收藏,位置 <xliff:g id="NUMBER">%d</xliff:g>"</string> - <string name="accessibility_control_not_favorite" msgid="1291760269563092359">"從收藏中移除"</string> + <string name="accessibility_control_not_favorite" msgid="1291760269563092359">"未加入收藏"</string> <string name="accessibility_control_change_favorite" msgid="2943178027582253261">"加入收藏"</string> <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"從收藏中移除"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"移到位置 <xliff:g id="NUMBER">%d</xliff:g>"</string> @@ -1236,12 +1248,9 @@ <string name="rear_display_unfolded_bottom_sheet_description" msgid="7229961336309960201">"如要提高解析度,請切換至手機後置鏡頭"</string> <string name="rear_display_accessibility_folded_animation" msgid="1538121649587978179">"正在展開的折疊式裝置"</string> <string name="rear_display_accessibility_unfolded_animation" msgid="1946153682258289040">"正在翻轉折疊式裝置"</string> - <!-- no translation found for quick_settings_rotation_posture_folded (2430280856312528289) --> - <skip /> - <!-- no translation found for quick_settings_rotation_posture_unfolded (6372316273574167114) --> - <skip /> - <!-- no translation found for rotation_tile_with_posture_secondary_label_template (7648496484163318886) --> - <skip /> + <string name="quick_settings_rotation_posture_folded" msgid="2430280856312528289">"已摺疊"</string> + <string name="quick_settings_rotation_posture_unfolded" msgid="6372316273574167114">"已展開"</string> + <string name="rotation_tile_with_posture_secondary_label_template" msgid="7648496484163318886">"%1$s / %2$s"</string> <string name="stylus_battery_low_percentage" msgid="1620068112350141558">"剩餘電量:<xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="stylus_battery_low_subtitle" msgid="3583843128908823273">"將觸控筆接上充電器"</string> <string name="stylus_battery_low" msgid="7134370101603167096">"觸控筆電力不足"</string> @@ -1257,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"偵測到使用者"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"在「設定」中指定預設記事應用程式"</string> <string name="install_app" msgid="5066668100199613936">"安裝應用程式"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index b6f4a1959553..da75c5d6fae8 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -271,10 +271,8 @@ <string name="accessibility_quick_settings_bluetooth_device_tap_to_disconnect" msgid="415980329093277342">"nqamula"</string> <string name="accessibility_quick_settings_bluetooth_device_tap_to_activate" msgid="3724301751036877403">"yenza kusebenze"</string> <string name="turn_on_bluetooth_auto_tomorrow" msgid="414836329962473906">"Vula ngokuzenzekela futhi kusasa"</string> - <!-- no translation found for turn_on_bluetooth_auto_info_disabled (8267380591344023327) --> - <skip /> - <!-- no translation found for turn_on_bluetooth_auto_info_enabled (4802071533678400330) --> - <skip /> + <string name="turn_on_bluetooth_auto_info_disabled" msgid="8267380591344023327">"Izakhi ezifana Nokwabelana Ngokushesha, okuthi Thola Idivayisi Yami, kanye nendawo yedivayisi zisebenzisa i-Bluetooth"</string> + <string name="turn_on_bluetooth_auto_info_enabled" msgid="4802071533678400330">"I-Bluetooth izovulwa kusasa ngo-5 AM"</string> <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="4182034939479344093">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> ibhethri"</string> <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Umsindo"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Ihedisethi"</string> @@ -439,6 +437,10 @@ <string name="button_to_remove_widget" msgid="3948204829181214098">"Susa"</string> <string name="hub_mode_add_widget_button_text" msgid="4831464661209971729">"Engeza iwijethi"</string> <string name="hub_mode_editing_exit_button_text" msgid="3704686734192264771">"Kwenziwe"</string> + <string name="dialog_title_to_allow_any_widget" msgid="1004820948962675644">"Vumela noma iyiphi iwijethi ekukhiyeni isikrini?"</string> + <string name="button_text_to_open_settings" msgid="1987729256950941628">"Vula amasethingi"</string> + <string name="work_mode_off_title" msgid="5794818421357835873">"Susa ukumisa ama-app omsebenzi?"</string> + <string name="work_mode_turn_on" msgid="907813741770247267">"Qhubekisa"</string> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"Shintsha umsebenzisi"</string> <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"imenyu yokudonsela phansi"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Wonke ama-app nedatha kulesi sikhathi azosuswa."</string> @@ -581,26 +583,36 @@ <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Thulisa"</string> <string name="media_device_cast" msgid="4786241789687569892">"Sakaza"</string> <string name="stream_notification_unavailable" msgid="4313854556205836435">"Ayitholakali ngoba ukukhala kuthulisiwe"</string> + <!-- no translation found for stream_alarm_unavailable (4059817189292197839) --> + <skip /> + <!-- no translation found for stream_media_unavailable (6823020894438959853) --> + <skip /> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Thepha ukuze ususe ukuthula."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Thepha ukuze usethe ukudlidliza. Amasevisi okufinyelela angathuliswa."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Thepha ukuze uthulise. Amasevisi okufinyelela angathuliswa."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Thepha ukuze usethele ekudlidlizeni."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Thepha ukuze uthulise."</string> <string name="volume_panel_noise_control_title" msgid="7413949943872304474">"Ulawulo Lomsindo"</string> - <!-- no translation found for volume_panel_spatial_audio_title (3367048857932040660) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_off (4177490084606772989) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_fixed (3136080137827746046) --> - <skip /> - <!-- no translation found for volume_panel_spatial_audio_tracking (5711115234001762974) --> - <skip /> + <string name="volume_panel_spatial_audio_title" msgid="3367048857932040660">"Umsindo Wokulalelwayo"</string> + <string name="volume_panel_spatial_audio_off" msgid="4177490084606772989">"Kuvaliwe"</string> + <string name="volume_panel_spatial_audio_fixed" msgid="3136080137827746046">"Okugxilile"</string> + <string name="volume_panel_spatial_audio_tracking" msgid="5711115234001762974">"Ukulandelela Ikhanda"</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Thepha ukuze ushintshe imodi yokukhala"</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"thulisa"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"susa ukuthula"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"dlidliza"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"%s izilawuli zevolomu"</string> <string name="volume_dialog_ringer_guidance_ring" msgid="9143194270463146858">"Amakholi nezaziso zizokhala (<xliff:g id="VOLUME_LEVEL">%1$s</xliff:g>)"</string> + <!-- no translation found for volume_panel_enter_media_output_settings (8824244246272552669) --> + <skip /> + <!-- no translation found for volume_panel_expanded_sliders (1885750987768506271) --> + <skip /> + <!-- no translation found for volume_panel_collapsed_sliders (1413383759434791450) --> + <skip /> + <!-- no translation found for volume_panel_hint_mute (6962563028495243738) --> + <skip /> + <!-- no translation found for volume_panel_hint_unmute (7489063242934477382) --> + <skip /> <string name="media_output_label_title" msgid="872824698593182505">"Idlala ku-<xliff:g id="LABEL">%s</xliff:g>"</string> <string name="media_output_title_without_playing" msgid="3825663683169305013">"Umsindo uzodlala"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Isishuni se-UI yesistimu"</string> @@ -1254,7 +1266,8 @@ <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> + <!-- no translation found for priority_mode_dream_overlay_content_description (3361628029609329182) --> + <skip /> <string name="assistant_attention_content_description" msgid="4166330881435263596">"Ubukhona bomsebenzisi butholakele"</string> <string name="set_default_notes_app_toast_content" msgid="2812374329662610753">"Setha i-app yamanothi azenzakalelayo Kumsethingi"</string> <string name="install_app" msgid="5066668100199613936">"Faka i-app"</string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 76465c6e5011..2285550d94c7 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -898,8 +898,9 @@ <dimen name="communal_tutorial_indicator_horizontal_offset">32dp</dimen> <!-- Size of the maximum radius for the enforced rounded rectangles on communal hub. - Keep it the same as in Launcher--> - <dimen name="communal_enforced_rounded_corner_max_radius">16dp</dimen> + Larger than the 16dp Launcher uses, to ensure consistency on the hub, where it's much more + obvious when corner radii differ.--> + <dimen name="communal_enforced_rounded_corner_max_radius">28dp</dimen> <!-- Width and height used to filter widgets displayed in the communal widget picker --> <dimen name="communal_widget_picker_desired_width">424dp</dimen> @@ -1967,4 +1968,7 @@ <!-- Microns/ums (1000 um = 1mm) per pixel for the given device. If unspecified, UI that relies on this value will not be sized correctly. --> <item name="pixel_pitch" format="float" type="dimen">-1</item> + + <!-- SliceView grid gutter for ANC Slice --> + <dimen name="abc_slice_grid_gutter">0dp</dimen> </resources> diff --git a/packages/SystemUI/res/xml/home_controls_dream_metadata.xml b/packages/SystemUI/res/xml/home_controls_dream_metadata.xml index eb7c79e24b04..69bd9a477f05 100644 --- a/packages/SystemUI/res/xml/home_controls_dream_metadata.xml +++ b/packages/SystemUI/res/xml/home_controls_dream_metadata.xml @@ -16,4 +16,5 @@ <dream xmlns:android="http://schemas.android.com/apk/res/android" android:showClockAndComplications="false" android:previewImage="@drawable/homecontrols_sq" + android:dreamCategory="home_panel" />
\ No newline at end of file diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java index 69aa90996946..c08b0837da8e 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/QuickStepContract.java @@ -77,7 +77,7 @@ public class QuickStepContract { // settings is expanded. public static final int SYSUI_STATE_QUICK_SETTINGS_EXPANDED = 1 << 11; // Winscope tracing is enabled - public static final int SYSUI_STATE_DISABLE_GESTURE_SPLIT_INVOCATION = 1 << 12; + public static final int SYSUI_STATE_TRACING_ENABLED = 1 << 12; // The Assistant gesture should be constrained. It is up to the launcher implementation to // decide how to constrain it public static final int SYSUI_STATE_ASSIST_GESTURE_CONSTRAINED = 1 << 13; @@ -148,7 +148,7 @@ public class QuickStepContract { SYSUI_STATE_OVERVIEW_DISABLED, SYSUI_STATE_HOME_DISABLED, SYSUI_STATE_SEARCH_DISABLED, - SYSUI_STATE_DISABLE_GESTURE_SPLIT_INVOCATION, + SYSUI_STATE_TRACING_ENABLED, SYSUI_STATE_ASSIST_GESTURE_CONSTRAINED, SYSUI_STATE_BUBBLES_EXPANDED, SYSUI_STATE_DIALOG_SHOWING, @@ -211,8 +211,8 @@ public class QuickStepContract { if ((flags & SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE) != 0) { str.add("a11y_long_click"); } - if ((flags & SYSUI_STATE_DISABLE_GESTURE_SPLIT_INVOCATION) != 0) { - str.add("disable_gesture_split_invocation"); + if ((flags & SYSUI_STATE_TRACING_ENABLED) != 0) { + str.add("tracing"); } if ((flags & SYSUI_STATE_ASSIST_GESTURE_CONSTRAINED) != 0) { str.add("asst_gesture_constrain"); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 05eeac6fc199..70465bc3d0b7 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -343,6 +343,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout { setPadding(getPaddingLeft(), getPaddingTop() + getResources().getDimensionPixelSize( R.dimen.keyguard_security_container_padding_top), getPaddingRight(), getPaddingBottom()); + setBackgroundColor(Utils.getColorAttrDefaultColor(getContext(), + com.android.internal.R.attr.materialColorSurface)); } void onResume(SecurityMode securityMode, boolean faceAuthEnabled) { @@ -800,6 +802,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout { void reloadColors() { mViewMode.reloadColors(); + setBackgroundColor(Utils.getColorAttrDefaultColor(getContext(), + com.android.internal.R.attr.materialColorSurface)); } /** Handles density or font scale changes. */ diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java index 8e9815085e31..039a2e5a8ffc 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java @@ -23,6 +23,7 @@ import static com.android.keyguard.LockIconView.ICON_FINGERPRINT; import static com.android.keyguard.LockIconView.ICON_LOCK; import static com.android.keyguard.LockIconView.ICON_UNLOCK; import static com.android.systemui.Flags.keyguardBottomAreaRefactor; +import static com.android.systemui.Flags.migrateClocksToBlueprint; import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset; import static com.android.systemui.flags.Flags.DOZING_MIGRATION_1; import static com.android.systemui.flags.Flags.LOCKSCREEN_WALLPAPER_DREAM_ENABLED; @@ -452,7 +453,7 @@ public class LockIconViewController implements Dumpable { private void updateLockIconLocation() { final float scaleFactor = mAuthController.getScaleFactor(); final int scaledPadding = (int) (mDefaultPaddingPx * scaleFactor); - if (keyguardBottomAreaRefactor()) { + if (keyguardBottomAreaRefactor() || migrateClocksToBlueprint()) { mView.getLockIcon().setPadding(scaledPadding, scaledPadding, scaledPadding, scaledPadding); } else { diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java index 15ef61ed5934..ea8fe59d3c89 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java @@ -82,6 +82,7 @@ public class SystemUIApplication extends Application implements public SystemUIApplication() { super(); + Trace.registerWithPerfetto(); Log.v(TAG, "SystemUIApplication constructed."); // SysUI may be building without protolog preprocessing in some cases ProtoLog.REQUIRE_PROTOLOGTOOL = false; diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java index da49201db808..c6716e44899f 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java @@ -54,7 +54,7 @@ import com.android.systemui.recents.Recents; import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.ShadeController; -import com.android.systemui.shade.ShadeViewController; +import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBarWindowCallback; @@ -190,7 +190,7 @@ public class SystemActions implements CoreStartable, ConfigurationController.Con private final NotificationShadeWindowController mNotificationShadeController; private final KeyguardStateController mKeyguardStateController; private final ShadeController mShadeController; - private final Lazy<ShadeViewController> mShadeViewController; + private final Lazy<PanelExpansionInteractor> mPanelExpansionInteractor; private final StatusBarWindowCallback mNotificationShadeCallback; private boolean mDismissNotificationShadeActionRegistered; @@ -200,14 +200,14 @@ public class SystemActions implements CoreStartable, ConfigurationController.Con NotificationShadeWindowController notificationShadeController, KeyguardStateController keyguardStateController, ShadeController shadeController, - Lazy<ShadeViewController> shadeViewController, + Lazy<PanelExpansionInteractor> panelExpansionInteractor, Optional<Recents> recentsOptional, DisplayTracker displayTracker) { mContext = context; mUserTracker = userTracker; mKeyguardStateController = keyguardStateController; mShadeController = shadeController; - mShadeViewController = shadeViewController; + mPanelExpansionInteractor = panelExpansionInteractor; mRecentsOptional = recentsOptional; mDisplayTracker = displayTracker; mReceiver = new SystemActionsBroadcastReceiver(); @@ -330,7 +330,7 @@ public class SystemActions implements CoreStartable, ConfigurationController.Con private void registerOrUnregisterDismissNotificationShadeAction() { Assert.isMainThread(); - if (mShadeViewController.get().isPanelExpanded() + if (mPanelExpansionInteractor.get().isPanelExpanded() && !mKeyguardStateController.isShowing()) { if (!mDismissNotificationShadeActionRegistered) { mA11yManager.registerSystemAction( diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java index 9dd1454d2528..0f4d63c7ebcc 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnificationAnimationController.java @@ -302,6 +302,14 @@ class WindowMagnificationAnimationController implements ValueAnimator.AnimatorUp if (mEndAnimationCanceled || mController == null) { return; } + + // If the animation is playing backwards, mStartSpec will be the final spec we would + // like to reach. + AnimationSpec spec = isReverse ? mStartSpec : mEndSpec; + mController.enableWindowMagnificationInternal( + spec.mScale, spec.mCenterX, spec.mCenterY, + mMagnificationFrameOffsetRatioX, mMagnificationFrameOffsetRatioY); + if (mState == STATE_DISABLING) { mController.deleteWindowMagnification(); } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java index 0c9712de3264..1f5a0bf328af 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/MenuView.java @@ -185,11 +185,7 @@ class MenuView extends FrameLayout implements final GradientDrawable gradientDrawable = getContainerViewGradient(); gradientDrawable.setStroke(mMenuViewAppearance.getMenuStrokeWidth(), mMenuViewAppearance.getMenuStrokeColor()); - if (Flags.floatingMenuRadiiAnimation()) { - mMenuAnimationController.startRadiiAnimation(mMenuViewAppearance.getMenuRadii()); - } else { - gradientDrawable.setCornerRadii(mMenuViewAppearance.getMenuRadii()); - } + mMenuAnimationController.startRadiiAnimation(mMenuViewAppearance.getMenuRadii()); } void setRadii(float[] radii) { @@ -402,13 +398,8 @@ class MenuView extends FrameLayout implements getContainerViewInsetLayer().setLayerInset(INDEX_MENU_ITEM, insets[0], insets[1], insets[2], insets[3]); - if (Flags.floatingMenuRadiiAnimation()) { - mMenuAnimationController.startRadiiAnimation( - mMenuViewAppearance.getMenuMovingStateRadii()); - } else { - final GradientDrawable gradientDrawable = getContainerViewGradient(); - gradientDrawable.setCornerRadii(mMenuViewAppearance.getMenuMovingStateRadii()); - } + mMenuAnimationController.startRadiiAnimation( + mMenuViewAppearance.getMenuMovingStateRadii()); } void onBoundsInParentChanged(int newLeft, int newTop) { diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/RadiiAnimator.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/RadiiAnimator.java index 4aa0d89cddb5..8de12f3e1f34 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/RadiiAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/RadiiAnimator.java @@ -73,7 +73,7 @@ class RadiiAnimator { @Override public void onAnimationRepeat(@NonNull Animator animation) {} }); - mAnimationDriver.setInterpolator(new android.view.animation.BounceInterpolator()); + mAnimationDriver.setInterpolator(new android.view.animation.DecelerateInterpolator()); } void startAnimation(float[] endValues) { diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModel.kt new file mode 100644 index 000000000000..96e4b341cb6d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModel.kt @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.ui.viewmodel + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.keyguard.ui.viewmodel.DreamingToGlanceableHubTransitionViewModel +import com.android.systemui.keyguard.ui.viewmodel.GlanceableHubToDreamingTransitionViewModel +import com.android.systemui.keyguard.ui.viewmodel.GlanceableHubToLockscreenTransitionViewModel +import com.android.systemui.keyguard.ui.viewmodel.LockscreenToGlanceableHubTransitionViewModel +import javax.inject.Inject +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.merge + +/** View model for transitions related to the communal hub. */ +@OptIn(ExperimentalCoroutinesApi::class) +@SysUISingleton +class CommunalTransitionViewModel +@Inject +constructor( + glanceableHubToLockscreenTransitionViewModel: GlanceableHubToLockscreenTransitionViewModel, + lockscreenToGlanceableHubTransitionViewModel: LockscreenToGlanceableHubTransitionViewModel, + dreamToGlanceableHubTransitionViewModel: DreamingToGlanceableHubTransitionViewModel, + glanceableHubToDreamTransitionViewModel: GlanceableHubToDreamingTransitionViewModel, +) { + /** + * Whether UMO location should be on communal. This flow is responsive to transitions so that a + * new value is emitted at the right step of a transition to/from communal hub that the location + * of UMO should be updated. + */ + val isUmoOnCommunal: Flow<Boolean> = + merge( + lockscreenToGlanceableHubTransitionViewModel.showUmo, + glanceableHubToLockscreenTransitionViewModel.showUmo, + dreamToGlanceableHubTransitionViewModel.showUmo, + glanceableHubToDreamTransitionViewModel.showUmo, + ) + .distinctUntilChanged() +} diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java index 3d8e4cb71aca..6aa5e8b6d098 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java @@ -22,8 +22,6 @@ import com.android.systemui.GuestResetOrExitSessionReceiver; import com.android.systemui.media.dialog.MediaOutputDialogReceiver; import com.android.systemui.people.widget.PeopleSpaceWidgetPinnedReceiver; import com.android.systemui.people.widget.PeopleSpaceWidgetProvider; -import com.android.systemui.screenshot.ActionProxyReceiver; -import com.android.systemui.screenshot.DeleteScreenshotReceiver; import com.android.systemui.screenshot.SmartActionsReceiver; import com.android.systemui.volume.VolumePanelDialogReceiver; @@ -42,24 +40,6 @@ public abstract class DefaultBroadcastReceiverBinder { */ @Binds @IntoMap - @ClassKey(ActionProxyReceiver.class) - public abstract BroadcastReceiver bindActionProxyReceiver( - ActionProxyReceiver broadcastReceiver); - - /** - * - */ - @Binds - @IntoMap - @ClassKey(DeleteScreenshotReceiver.class) - public abstract BroadcastReceiver bindDeleteScreenshotReceiver( - DeleteScreenshotReceiver broadcastReceiver); - - /** - * - */ - @Binds - @IntoMap @ClassKey(SmartActionsReceiver.class) public abstract BroadcastReceiver bindSmartActionsReceiver( SmartActionsReceiver broadcastReceiver); 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 88ddfd4f4347..47f8046a92ad 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 @@ -33,7 +33,11 @@ import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch @SysUISingleton @@ -66,6 +70,25 @@ constructor( listenForTransitionToCamera(scope, keyguardInteractor) } + val surfaceBehindVisibility: Flow<Boolean?> = + combine( + transitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.transitionStepsFromState(KeyguardState.ALTERNATE_BOUNCER) + ) { startedStep, fromBouncerStep -> + if (startedStep.to != KeyguardState.GONE) { + return@combine null + } + + // The alt bouncer is pretty fast to hide, so start the surface behind animation + // around 30%. + fromBouncerStep.value > 0.3f + } + .onStart { + // Default to null ("don't care, use a reasonable default"). + emit(null) + } + .distinctUntilChanged() + private fun listenForAlternateBouncerToLockscreenHubAodOrDozing() { scope.launch { keyguardInteractor.alternateBouncerShowing 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 391dccc7f444..c7fafba3aa19 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 @@ -26,7 +26,6 @@ import com.android.systemui.flags.FeatureFlags import com.android.systemui.keyguard.KeyguardWmStateRefactor import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.KeyguardSurfaceBehindModel import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.user.domain.interactor.SelectedUserInteractor @@ -96,36 +95,6 @@ constructor( } .distinctUntilChanged() - val surfaceBehindModel: Flow<KeyguardSurfaceBehindModel?> = - combine( - transitionInteractor.startedKeyguardTransitionStep, - transitionInteractor.transitionStepsFromState(KeyguardState.PRIMARY_BOUNCER) - ) { startedStep, fromBouncerStep -> - if (startedStep.to != KeyguardState.GONE) { - // BOUNCER to anything but GONE does not require any special surface - // visibility handling. - return@combine null - } - - if (fromBouncerStep.value > 0.5f) { - KeyguardSurfaceBehindModel( - animateFromAlpha = 0f, - alpha = 1f, - animateFromTranslationY = 500f, - translationY = 0f, - ) - } else { - KeyguardSurfaceBehindModel( - alpha = 0f, - ) - } - } - .onStart { - // Default to null ("don't care, use a reasonable default"). - emit(null) - } - .distinctUntilChanged() - fun dismissPrimaryBouncer() { scope.launch { startTransitionTo(KeyguardState.GONE) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt index c877192cd804..d39bd3d5eb12 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt @@ -92,7 +92,7 @@ constructor( when { useWeatherClockLayout && useSplitShade -> SPLIT_SHADE_WEATHER_CLOCK_BLUEPRINT_ID useWeatherClockLayout -> WEATHER_CLOCK_BLUEPRINT_ID - useSplitShade -> SplitShadeKeyguardBlueprint.ID + useSplitShade && !ComposeLockscreen.isEnabled -> SplitShadeKeyguardBlueprint.ID else -> DefaultKeyguardBlueprint.DEFAULT } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardSurfaceBehindInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardSurfaceBehindInteractor.kt index c496a6ee437f..80e94a27bec5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardSurfaceBehindInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardSurfaceBehindInteractor.kt @@ -95,7 +95,17 @@ constructor( } .distinctUntilChanged() - val isAnimatingSurface = repository.isAnimatingSurface + /** + * Whether we're animating the surface, or a notification launch animation is running (which + * means we're going to animate the surface, even if animators aren't yet running). + */ + val isAnimatingSurface = + combine( + repository.isAnimatingSurface, + notificationLaunchInteractor.isLaunchAnimationRunning + ) { animatingSurface, animatingLaunch -> + animatingSurface || animatingLaunch + } fun setAnimatingSurface(animating: Boolean) { repository.setAnimatingSurface(animating) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt index cff74b333530..8d02e0efd72d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt @@ -40,6 +40,7 @@ constructor( surfaceBehindInteractor: KeyguardSurfaceBehindInteractor, fromLockscreenInteractor: FromLockscreenTransitionInteractor, fromBouncerInteractor: FromPrimaryBouncerTransitionInteractor, + fromAlternateBouncerInteractor: FromAlternateBouncerTransitionInteractor, notificationLaunchAnimationInteractor: NotificationLaunchAnimationInteractor, ) { private val defaultSurfaceBehindVisibility = @@ -65,6 +66,9 @@ constructor( KeyguardState.PRIMARY_BOUNCER -> { fromBouncerInteractor.surfaceBehindVisibility } + KeyguardState.ALTERNATE_BOUNCER -> { + fromAlternateBouncerInteractor.surfaceBehindVisibility + } else -> flowOf(null) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt index 1085f945506a..8fd8becab76f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySection.kt @@ -29,6 +29,7 @@ import androidx.constraintlayout.widget.ConstraintSet import com.android.keyguard.LockIconView import com.android.keyguard.LockIconViewController import com.android.systemui.Flags.keyguardBottomAreaRefactor +import com.android.systemui.Flags.migrateClocksToBlueprint import com.android.systemui.biometrics.AuthController import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor @@ -70,7 +71,11 @@ constructor( private val deviceEntryIconViewId = R.id.device_entry_icon_view override fun addViews(constraintLayout: ConstraintLayout) { - if (!keyguardBottomAreaRefactor() && !DeviceEntryUdfpsRefactor.isEnabled) { + if ( + !keyguardBottomAreaRefactor() && + !migrateClocksToBlueprint() && + !DeviceEntryUdfpsRefactor.isEnabled + ) { return } @@ -82,7 +87,7 @@ constructor( if (DeviceEntryUdfpsRefactor.isEnabled) { DeviceEntryIconView(context, null).apply { id = deviceEntryIconViewId } } else { - // keyguardBottomAreaRefactor() + // keyguardBottomAreaRefactor() or migrateClocksToBlueprint() LockIconView(context, null).apply { id = R.id.lock_icon_view } } constraintLayout.addView(view) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/NotificationStackScrollLayoutSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/NotificationStackScrollLayoutSection.kt index 02c889dd771d..5dea7cbb801d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/NotificationStackScrollLayoutSection.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/NotificationStackScrollLayoutSection.kt @@ -34,7 +34,6 @@ import com.android.systemui.shade.NotificationPanelView import com.android.systemui.statusbar.notification.stack.AmbientState import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.notification.stack.NotificationStackSizeCalculator -import com.android.systemui.statusbar.notification.stack.shared.flexiNotifsEnabled import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer import com.android.systemui.statusbar.notification.stack.ui.viewbinder.NotificationStackAppearanceViewBinder import com.android.systemui.statusbar.notification.stack.ui.viewbinder.SharedNotificationContainerBinder @@ -115,7 +114,7 @@ constructor( ) ) - if (sceneContainerFlags.flexiNotifsEnabled()) { + if (sceneContainerFlags.isEnabled()) { disposableHandles.add( NotificationStackAppearanceViewBinder.bind( context, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToGlanceableHubTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToGlanceableHubTransitionViewModel.kt index 789e4fbd46c2..d948e47e6267 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToGlanceableHubTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToGlanceableHubTransitionViewModel.kt @@ -29,6 +29,7 @@ import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flatMapLatest +import kotlinx.coroutines.flow.map @OptIn(ExperimentalCoroutinesApi::class) @SysUISingleton @@ -71,6 +72,17 @@ constructor( name = "DREAMING->GLANCEABLE_HUB: dreamOverlayAlpha", ) + // Show UMO once the transition starts. + val showUmo: Flow<Boolean> = + transitionAnimation + .sharedFlow( + duration = TO_GLANCEABLE_HUB_DURATION, + onStep = { it }, + onCancel = { 0f }, + onFinish = { 1f }, + ) + .map { step -> step != 0f } + private companion object { val TO_GLANCEABLE_HUB_DURATION = 1.seconds } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToDreamingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToDreamingTransitionViewModel.kt index 478c4faa1be3..838c22b0da33 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToDreamingTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToDreamingTransitionViewModel.kt @@ -28,6 +28,7 @@ import kotlin.time.Duration.Companion.seconds import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flatMapLatest +import kotlinx.coroutines.flow.map @OptIn(ExperimentalCoroutinesApi::class) @SysUISingleton @@ -66,6 +67,17 @@ constructor( ) } + // Show UMO until transition finishes. + val showUmo: Flow<Boolean> = + transitionAnimation + .sharedFlow( + duration = FROM_GLANCEABLE_HUB_DURATION, + onStep = { it }, + onCancel = { 0f }, + onFinish = { 1f }, + ) + .map { step -> step != 1f } + private companion object { val FROM_GLANCEABLE_HUB_DURATION = 1.seconds } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToLockscreenTransitionViewModel.kt index 6042117eff12..e05b500620d5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToLockscreenTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToLockscreenTransitionViewModel.kt @@ -31,7 +31,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onStart /** * Breaks down GLANCEABLE_HUB->LOCKSCREEN transition into discrete steps for corresponding views to @@ -53,16 +52,17 @@ constructor( ) val keyguardAlpha: Flow<Float> = - transitionAnimation - .sharedFlow( - duration = 167.milliseconds, - startTime = 167.milliseconds, - onStep = { it }, - onFinish = { 1f }, - onCancel = { 0f }, - name = "GLANCEABLE_HUB->LOCKSCREEN: keyguardAlpha", - ) - .onStart { emit(0f) } + transitionAnimation.sharedFlow( + duration = 167.milliseconds, + startTime = 167.milliseconds, + onStep = { it }, + onFinish = { 1f }, + onCancel = { 0f }, + name = "GLANCEABLE_HUB->LOCKSCREEN: keyguardAlpha", + ) + + // Show UMO as long as keyguard is not visible. + val showUmo: Flow<Boolean> = keyguardAlpha.map { alpha -> alpha == 0f } val keyguardTranslationX: Flow<StateToValue> = configurationInteractor diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt index 58c45c74815c..b6622e5c07b1 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModel.kt @@ -28,8 +28,9 @@ import com.android.systemui.keyguard.shared.ComposeLockscreen import com.android.systemui.keyguard.shared.model.SettingsClockSize import com.android.systemui.plugins.clocks.ClockController import com.android.systemui.res.R +import com.android.systemui.shade.domain.interactor.ShadeInteractor +import com.android.systemui.shade.shared.model.ShadeMode import com.android.systemui.statusbar.notification.domain.interactor.NotificationsKeyguardInteractor -import com.android.systemui.statusbar.policy.SplitShadeStateController import com.android.systemui.util.Utils import javax.inject.Inject import kotlinx.coroutines.CoroutineScope @@ -46,8 +47,8 @@ constructor( keyguardInteractor: KeyguardInteractor, private val keyguardClockInteractor: KeyguardClockInteractor, @Application private val applicationScope: CoroutineScope, - private val splitShadeStateController: SplitShadeStateController, notifsKeyguardInteractor: NotificationsKeyguardInteractor, + private val shadeInteractor: ShadeInteractor, ) { var burnInLayer: Layer? = null val useLargeClock: Boolean @@ -111,12 +112,33 @@ constructor( initialValue = false ) + val currentClockLayout: StateFlow<ClockLayout> = + combine(isLargeClockVisible, clockShouldBeCentered, shadeInteractor.shadeMode) { + isLargeClockVisible, + clockShouldBeCentered, + shadeMode -> + val shouldUseSplitShade = shadeMode == ShadeMode.Split + when { + shouldUseSplitShade && clockShouldBeCentered -> ClockLayout.LARGE_CLOCK + shouldUseSplitShade && isLargeClockVisible -> + ClockLayout.SPLIT_SHADE_LARGE_CLOCK + shouldUseSplitShade -> ClockLayout.SPLIT_SHADE_SMALL_CLOCK + isLargeClockVisible -> ClockLayout.LARGE_CLOCK + else -> ClockLayout.SMALL_CLOCK + } + } + .stateIn( + scope = applicationScope, + started = SharingStarted.WhileSubscribed(), + initialValue = ClockLayout.SMALL_CLOCK + ) + /** Calculates the top margin for the small clock. */ fun getSmallClockTopMargin(context: Context): Int { var topMargin: Int val statusBarHeight = Utils.getStatusBarHeaderHeightKeyguard(context) - if (splitShadeStateController.shouldUseSplitNotificationShade(context.resources)) { + if (shadeInteractor.shadeMode.value == ShadeMode.Split) { topMargin = context.resources.getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin) if (ComposeLockscreen.isEnabled) { @@ -130,4 +152,11 @@ constructor( } return topMargin } + + enum class ClockLayout { + LARGE_CLOCK, + SMALL_CLOCK, + SPLIT_SHADE_LARGE_CLOCK, + SPLIT_SHADE_SMALL_CLOCK, + } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt index 5ca9215ce199..55a402597d5b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModel.kt @@ -54,8 +54,8 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.combineTransform import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterNotNull @@ -125,13 +125,36 @@ constructor( .onStart { emit(false) } .distinctUntilChanged() - private val alphaOnShadeExpansion: Flow<Float> = + private val isOnLockscreen: Flow<Boolean> = combine( + keyguardTransitionInteractor.isFinishedInState(LOCKSCREEN).onStart { emit(false) }, + keyguardTransitionInteractor + .isInTransitionWhere { from, to -> from == LOCKSCREEN || to == LOCKSCREEN } + .onStart { emit(false) } + ) { onLockscreen, transitioningToOrFromLockscreen -> + onLockscreen || transitioningToOrFromLockscreen + } + .distinctUntilChanged() + + private val alphaOnShadeExpansion: Flow<Float> = + combineTransform( + isOnLockscreen, shadeInteractor.qsExpansion, shadeInteractor.shadeExpansion, - ) { qsExpansion, shadeExpansion -> + ) { isOnLockscreen, qsExpansion, shadeExpansion -> // Fade out quickly as the shade expands - 1f - MathUtils.constrainedMap(0f, 1f, 0f, 0.2f, max(qsExpansion, shadeExpansion)) + if (isOnLockscreen) { + val alpha = + 1f - + MathUtils.constrainedMap( + /* rangeMin = */ 0f, + /* rangeMax = */ 1f, + /* valueMin = */ 0f, + /* valueMax = */ 0.2f, + /* value = */ max(qsExpansion, shadeExpansion) + ) + emit(alpha) + } } .distinctUntilChanged() @@ -159,10 +182,6 @@ constructor( /** Last point that the root view was tapped */ val lastRootViewTapPosition: Flow<Point?> = keyguardInteractor.lastRootViewTapPosition - /** the shared notification container bounds *on the lockscreen* */ - val notificationBounds: StateFlow<NotificationContainerBounds> = - keyguardInteractor.notificationContainerBounds - /** * The keyguard root view can be clipped as the shade is pulled down, typically only for * non-split shade cases. @@ -235,11 +254,7 @@ constructor( burnInJob?.cancel() burnInJob = - scope.launch { - aodBurnInViewModel.movement(params).collect { - burnInModel.value = it - } - } + scope.launch { aodBurnInViewModel.movement(params).collect { burnInModel.value = it } } } val scale: Flow<BurnInScaleViewModel> = diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt index 23320be129fd..1f80441492bc 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt @@ -23,7 +23,8 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor import com.android.systemui.res.R -import com.android.systemui.statusbar.policy.SplitShadeStateController +import com.android.systemui.shade.domain.interactor.ShadeInteractor +import com.android.systemui.shade.shared.model.ShadeMode import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted @@ -40,7 +41,7 @@ constructor( private val interactor: KeyguardBlueprintInteractor, private val authController: AuthController, val longPress: KeyguardLongPressViewModel, - val splitShadeStateController: SplitShadeStateController, + val shadeInteractor: ShadeInteractor, ) { private val clockSize = clockInteractor.clockSize @@ -48,10 +49,12 @@ constructor( get() = authController.isUdfpsSupported val isLargeClockVisible: Boolean get() = clockSize.value == KeyguardClockSwitch.LARGE - fun areNotificationsVisible(resources: Resources): Boolean { - return !isLargeClockVisible || - splitShadeStateController.shouldUseSplitNotificationShade(resources) - } + + val areNotificationsVisible: Boolean + get() = !isLargeClockVisible || shouldUseSplitNotificationShade + + val shouldUseSplitNotificationShade: Boolean + get() = shadeInteractor.shadeMode.value == ShadeMode.Split fun getSmartSpacePaddingTop(resources: Resources): Int { return if (isLargeClockVisible) { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGlanceableHubTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGlanceableHubTransitionViewModel.kt index 5cbc1d4a3745..dae7897a2325 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGlanceableHubTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToGlanceableHubTransitionViewModel.kt @@ -31,7 +31,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onStart /** * Breaks down LOCKSCREEN->GLANCEABLE_HUB transition into discrete steps for corresponding views to @@ -53,15 +52,16 @@ constructor( ) val keyguardAlpha: Flow<Float> = - transitionAnimation - .sharedFlow( - duration = 167.milliseconds, - onStep = { 1f - it }, - onFinish = { 0f }, - onCancel = { 1f }, - name = "LOCKSCREEN->GLANCEABLE_HUB: keyguardAlpha", - ) - .onStart { emit(1f) } + transitionAnimation.sharedFlow( + duration = 167.milliseconds, + onStep = { 1f - it }, + onFinish = { 0f }, + onCancel = { 1f }, + name = "LOCKSCREEN->GLANCEABLE_HUB: keyguardAlpha", + ) + + // Show UMO as long as keyguard is not visible. + val showUmo: Flow<Boolean> = keyguardAlpha.map { alpha -> alpha == 0f } val keyguardTranslationX: Flow<StateToValue> = configurationInteractor diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt index dbd71f3e3a04..a4f3e2174791 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt @@ -36,7 +36,7 @@ import androidx.annotation.VisibleForTesting import com.android.app.animation.Interpolators import com.android.app.tracing.traceSection import com.android.keyguard.KeyguardViewController -import com.android.systemui.communal.domain.interactor.CommunalInteractor +import com.android.systemui.communal.ui.viewmodel.CommunalTransitionViewModel import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Main @@ -58,7 +58,6 @@ import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.statusbar.policy.SplitShadeStateController import com.android.systemui.util.animation.UniqueObjectHostView -import com.android.systemui.util.kotlin.BooleanFlowOperators.and import com.android.systemui.util.settings.SecureSettings import javax.inject.Inject import kotlinx.coroutines.CoroutineScope @@ -102,7 +101,7 @@ constructor( private val mediaManager: MediaDataManager, private val keyguardViewController: KeyguardViewController, private val dreamOverlayStateController: DreamOverlayStateController, - private val communalInteractor: CommunalInteractor, + communalTransitionViewModel: CommunalTransitionViewModel, configurationController: ConfigurationController, wakefulnessLifecycle: WakefulnessLifecycle, shadeInteractor: ShadeInteractor, @@ -587,11 +586,10 @@ constructor( // Listen to the communal UI state. Make sure that communal UI is showing and hub itself is // available, ie. not disabled and able to be shown. coroutineScope.launch { - and(communalInteractor.isCommunalShowing, communalInteractor.isCommunalAvailable) - .collect { value -> - isCommunalShowing = value - updateDesiredLocation() - } + communalTransitionViewModel.isUmoOnCommunal.collect { value -> + isCommunalShowing = value + updateDesiredLocation(forceNoAnimation = true) + } } } diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java index 5f0635bdba01..1d820a14be4e 100644 --- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java +++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetManager.java @@ -21,9 +21,6 @@ import static android.app.NotificationManager.INTERRUPTION_FILTER_ALARMS; import static android.app.NotificationManager.INTERRUPTION_FILTER_ALL; import static android.app.NotificationManager.INTERRUPTION_FILTER_NONE; import static android.app.NotificationManager.INTERRUPTION_FILTER_PRIORITY; -import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN; -import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD; -import static android.appwidget.flags.Flags.generatedPreviews; import static android.content.Intent.ACTION_BOOT_COMPLETED; import static android.content.Intent.ACTION_PACKAGE_ADDED; import static android.content.Intent.ACTION_PACKAGE_REMOVED; @@ -83,15 +80,12 @@ import android.service.notification.StatusBarNotification; import android.service.notification.ZenModeConfig; import android.text.TextUtils; import android.util.Log; -import android.util.SparseBooleanArray; import android.widget.RemoteViews; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLoggerImpl; -import com.android.keyguard.KeyguardUpdateMonitor; -import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.Dumpable; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.SysUISingleton; @@ -102,8 +96,6 @@ import com.android.systemui.people.PeopleBackupFollowUpJob; import com.android.systemui.people.PeopleSpaceUtils; import com.android.systemui.people.PeopleTileViewHelper; import com.android.systemui.people.SharedPreferencesHelper; -import com.android.systemui.res.R; -import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationListener.NotificationHandler; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -168,27 +160,13 @@ public class PeopleSpaceWidgetManager implements Dumpable { @GuardedBy("mLock") public static Map<Integer, PeopleSpaceTile> mTiles = new HashMap<>(); - @NonNull private final UserTracker mUserTracker; - @NonNull private final SparseBooleanArray mUpdatedPreviews = new SparseBooleanArray(); - @NonNull private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback = - new KeyguardUpdateMonitorCallback() { - @Override - public void onUserUnlocked() { - if (DEBUG) { - Log.d(TAG, "onUserUnlocked " + mUserTracker.getUserId()); - } - updateGeneratedPreviewForUser(mUserTracker.getUserHandle()); - } - }; - @Inject public PeopleSpaceWidgetManager(Context context, LauncherApps launcherApps, CommonNotifCollection notifCollection, PackageManager packageManager, Optional<Bubbles> bubblesOptional, UserManager userManager, NotificationManager notificationManager, BroadcastDispatcher broadcastDispatcher, @Background Executor bgExecutor, - DumpManager dumpManager, @NonNull UserTracker userTracker, - @NonNull KeyguardUpdateMonitor keyguardUpdateMonitor) { + DumpManager dumpManager) { if (DEBUG) Log.d(TAG, "constructor"); mContext = context; mAppWidgetManager = AppWidgetManager.getInstance(context); @@ -209,8 +187,6 @@ public class PeopleSpaceWidgetManager implements Dumpable { mBroadcastDispatcher = broadcastDispatcher; mBgExecutor = bgExecutor; dumpManager.registerNormalDumpable(TAG, this); - mUserTracker = userTracker; - keyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback); } /** Initializes {@PeopleSpaceWidgetManager}. */ @@ -270,7 +246,7 @@ public class PeopleSpaceWidgetManager implements Dumpable { CommonNotifCollection notifCollection, PackageManager packageManager, Optional<Bubbles> bubblesOptional, UserManager userManager, BackupManager backupManager, INotificationManager iNotificationManager, NotificationManager notificationManager, - @Background Executor executor, UserTracker userTracker) { + @Background Executor executor) { mContext = context; mAppWidgetManager = appWidgetManager; mIPeopleManager = iPeopleManager; @@ -286,7 +262,6 @@ public class PeopleSpaceWidgetManager implements Dumpable { mManager = this; mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); mBgExecutor = executor; - mUserTracker = userTracker; } /** @@ -1432,24 +1407,4 @@ public class PeopleSpaceWidgetManager implements Dumpable { Trace.traceEnd(Trace.TRACE_TAG_APP); } - - @VisibleForTesting - void updateGeneratedPreviewForUser(UserHandle user) { - if (!generatedPreviews() || mUpdatedPreviews.get(user.getIdentifier()) - || !mUserManager.isUserUnlocked(user)) { - return; - } - if (DEBUG) { - Log.d(TAG, "Updating People Space widget preview for user " + user.getIdentifier()); - } - boolean success = mAppWidgetManager.setWidgetPreview( - new ComponentName(mContext, PeopleSpaceWidgetProvider.class), - WIDGET_CATEGORY_HOME_SCREEN | WIDGET_CATEGORY_KEYGUARD, - new RemoteViews(mContext.getPackageName(), - R.layout.people_space_placeholder_layout)); - if (DEBUG && !success) { - Log.d(TAG, "Failed to update generated preview for user " + user.getIdentifier()); - } - mUpdatedPreviews.put(user.getIdentifier(), success); - } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index c657b55d42d6..9c88eb95c274 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -17,6 +17,8 @@ package com.android.systemui.qs; import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; +import static com.android.systemui.Flags.centralizedStatusBarHeightFix; + import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; @@ -27,6 +29,7 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.systemui.res.R; +import com.android.systemui.shade.LargeScreenHeaderHelper; import com.android.systemui.util.LargeScreenUtils; /** @@ -97,7 +100,9 @@ public class QuickStatusBarHeader extends FrameLayout { qqsLP.topMargin = mContext.getResources() .getDimensionPixelSize(R.dimen.qqs_layout_margin_top); } else { - qqsLP.topMargin = mContext.getResources() + qqsLP.topMargin = centralizedStatusBarHeightFix() + ? LargeScreenHeaderHelper.getLargeScreenHeaderHeight(mContext) + : mContext.getResources() .getDimensionPixelSize(R.dimen.large_screen_shade_header_min_height); } mHeaderQsPanel.setLayoutParams(qqsLP); diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 9ae049d6d6f1..d0ff33869a77 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -37,6 +37,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_F import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_GOING_AWAY; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED; +import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_TRACING_ENABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_WAKEFULNESS_TRANSITION; @@ -114,6 +115,8 @@ import com.android.systemui.unfold.progress.UnfoldTransitionProgressForwarder; import com.android.wm.shell.desktopmode.DesktopModeStatus; import com.android.wm.shell.sysui.ShellInterface; +import dagger.Lazy; + import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; @@ -125,8 +128,6 @@ import java.util.function.Supplier; import javax.inject.Inject; import javax.inject.Provider; -import dagger.Lazy; - /** * Class to send information from overview to launcher with a binder. */ @@ -669,7 +670,8 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis // Listen for tracing state changes @Override public void onTracingStateChanged(boolean enabled) { - // TODO(b/286509643) Cleanup callers of this; Unused downstream + mSysUiState.setFlag(SYSUI_STATE_TRACING_ENABLED, enabled) + .commitUpdate(mContext.getDisplayId()); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt index 6df57edd34c3..32e8f55e68e7 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt @@ -46,7 +46,6 @@ import com.android.systemui.scene.shared.logger.SceneLogger import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor -import com.android.systemui.statusbar.notification.stack.shared.flexiNotifsEnabled import com.android.systemui.statusbar.phone.CentralSurfaces import com.android.systemui.statusbar.policy.domain.interactor.DeviceProvisioningInteractor import com.android.systemui.util.asIndenting @@ -120,7 +119,6 @@ constructor( printSection("SceneContainerFlags") { println("isEnabled", flags.isEnabled()) printSection("requirementDescription") { println(flags.requirementDescription()) } - println("flexiNotifsEnabled", flags.flexiNotifsEnabled()) } } diff --git a/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt b/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt index 1808d98cd692..467089d24f2c 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/shared/flag/SceneContainerFlags.kt @@ -19,9 +19,11 @@ package com.android.systemui.scene.shared.flag import com.android.systemui.Flags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR +import com.android.systemui.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR import com.android.systemui.Flags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT import com.android.systemui.Flags.FLAG_SCENE_CONTAINER import com.android.systemui.Flags.keyguardBottomAreaRefactor +import com.android.systemui.Flags.keyguardWmStateRefactor import com.android.systemui.Flags.migrateClocksToBlueprint import com.android.systemui.Flags.sceneContainer import com.android.systemui.dagger.SysUISingleton @@ -46,7 +48,8 @@ object SceneContainerFlag { keyguardBottomAreaRefactor() && migrateClocksToBlueprint() && ComposeLockscreen.isEnabled && - MediaInSceneContainerFlag.isEnabled + MediaInSceneContainerFlag.isEnabled && + keyguardWmStateRefactor() // NOTE: Changes should also be made in getSecondaryFlags and @EnableSceneContainer /** @@ -65,6 +68,7 @@ object SceneContainerFlag { sequenceOf( FlagToken(FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR, keyguardBottomAreaRefactor()), FlagToken(FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT, migrateClocksToBlueprint()), + FlagToken(FLAG_KEYGUARD_WM_STATE_REFACTOR, keyguardWmStateRefactor()), ComposeLockscreen.token, MediaInSceneContainerFlag.token, // NOTE: Changes should also be made in isEnabled and @EnableSceneContainer diff --git a/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt index 7c31ca269eb9..809ac2ea9f82 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/ui/view/SceneWindowRootViewBinder.kt @@ -46,7 +46,6 @@ import com.android.systemui.scene.shared.model.SceneDataSourceDelegator import com.android.systemui.scene.ui.composable.ComposableScene import com.android.systemui.scene.ui.composable.SceneContainer import com.android.systemui.scene.ui.viewmodel.SceneContainerViewModel -import com.android.systemui.statusbar.notification.stack.shared.flexiNotifsEnabled import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted @@ -116,7 +115,7 @@ object SceneWindowRootViewBinder { // the SceneContainerView. This SharedNotificationContainer should contain NSSL // due to the NotificationStackScrollLayoutSection (legacy) or // NotificationSection (scene container) moving it there. - if (flags.flexiNotifsEnabled()) { + if (flags.isEnabled()) { (sharedNotificationContainer.parent as? ViewGroup)?.removeView( sharedNotificationContainer ) diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java index ac94f39bff5a..b2c01e180ec4 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java @@ -82,7 +82,7 @@ public class RecordingService extends Service implements ScreenMediaRecorderList private final RecordingController mController; protected final KeyguardDismissUtil mKeyguardDismissUtil; private final Handler mMainHandler; - private ScreenRecordingAudioSource mAudioSource; + private ScreenRecordingAudioSource mAudioSource = ScreenRecordingAudioSource.NONE; private boolean mShowTaps; private boolean mOriginalShowTaps; private ScreenMediaRecorder mRecorder; diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java b/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java deleted file mode 100644 index 7e234aeed0aa..000000000000 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ActionProxyReceiver.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2020 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.screenshot; - -import static com.android.systemui.screenshot.ScreenshotController.ACTION_TYPE_EDIT; -import static com.android.systemui.screenshot.ScreenshotController.ACTION_TYPE_SHARE; -import static com.android.systemui.screenshot.ScreenshotController.EXTRA_ACTION_INTENT; -import static com.android.systemui.screenshot.ScreenshotController.EXTRA_DISALLOW_ENTER_PIP; -import static com.android.systemui.screenshot.ScreenshotController.EXTRA_ID; -import static com.android.systemui.screenshot.ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED; -import static com.android.systemui.statusbar.phone.CentralSurfaces.SYSTEM_DIALOG_REASON_SCREENSHOT; - -import android.app.ActivityOptions; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -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 javax.inject.Inject; - -/** - * Receiver to proxy the share or edit intent, used to clean up the notification and send - * appropriate signals to the system (ie. to dismiss the keyguard if necessary). - */ -public class ActionProxyReceiver extends BroadcastReceiver { - private static final String TAG = "ActionProxyReceiver"; - - private final ActivityManagerWrapper mActivityManagerWrapper; - private final ScreenshotSmartActions mScreenshotSmartActions; - private final DisplayTracker mDisplayTracker; - private final ActivityStarter mActivityStarter; - - @Inject - public ActionProxyReceiver(ActivityManagerWrapper activityManagerWrapper, - ScreenshotSmartActions screenshotSmartActions, - DisplayTracker displayTracker, - ActivityStarter activityStarter) { - mActivityManagerWrapper = activityManagerWrapper; - mScreenshotSmartActions = screenshotSmartActions; - mDisplayTracker = displayTracker; - mActivityStarter = activityStarter; - } - - @Override - public void onReceive(Context context, final Intent intent) { - Runnable startActivityRunnable = () -> { - mActivityManagerWrapper.closeSystemWindows(SYSTEM_DIALOG_REASON_SCREENSHOT); - - PendingIntent actionIntent = intent.getParcelableExtra(EXTRA_ACTION_INTENT); - ActivityOptions opts = ActivityOptions.makeBasic(); - opts.setDisallowEnterPictureInPictureWhileLaunching( - intent.getBooleanExtra(EXTRA_DISALLOW_ENTER_PIP, false)); - opts.setPendingIntentBackgroundActivityStartMode( - ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED); - try { - actionIntent.send(context, 0, null, null, null, null, opts.toBundle()); - if (intent.getBooleanExtra(ScreenshotController.EXTRA_OVERRIDE_TRANSITION, false)) { - RemoteAnimationAdapter runner = new RemoteAnimationAdapter( - ScreenshotController.SCREENSHOT_REMOTE_RUNNER, 0, 0); - try { - WindowManagerGlobal.getWindowManagerService() - .overridePendingAppTransitionRemote(runner, - mDisplayTracker.getDefaultDisplayId()); - } catch (Exception e) { - Log.e(TAG, "Error overriding screenshot app transition", e); - } - } - } catch (PendingIntent.CanceledException e) { - Log.e(TAG, "Pending intent canceled", e); - } - - }; - - 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()) - ? ACTION_TYPE_EDIT - : ACTION_TYPE_SHARE; - mScreenshotSmartActions.notifyScreenshotAction( - intent.getStringExtra(EXTRA_ID), actionType, false, null); - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/DeleteScreenshotReceiver.java b/packages/SystemUI/src/com/android/systemui/screenshot/DeleteScreenshotReceiver.java deleted file mode 100644 index e0346f2e2a98..000000000000 --- a/packages/SystemUI/src/com/android/systemui/screenshot/DeleteScreenshotReceiver.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2020 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.screenshot; - -import static com.android.systemui.screenshot.ScreenshotController.ACTION_TYPE_DELETE; -import static com.android.systemui.screenshot.ScreenshotController.EXTRA_ID; -import static com.android.systemui.screenshot.ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED; -import static com.android.systemui.screenshot.ScreenshotController.SCREENSHOT_URI_ID; - -import android.content.BroadcastReceiver; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; - -import com.android.systemui.dagger.qualifiers.Background; - -import java.util.concurrent.Executor; - -import javax.inject.Inject; - -/** - * Removes the file at a provided URI. - */ -public class DeleteScreenshotReceiver extends BroadcastReceiver { - - private final ScreenshotSmartActions mScreenshotSmartActions; - private final Executor mBackgroundExecutor; - - @Inject - public DeleteScreenshotReceiver(ScreenshotSmartActions screenshotSmartActions, - @Background Executor backgroundExecutor) { - mScreenshotSmartActions = screenshotSmartActions; - mBackgroundExecutor = backgroundExecutor; - } - - @Override - public void onReceive(Context context, Intent intent) { - if (!intent.hasExtra(SCREENSHOT_URI_ID)) { - return; - } - - // And delete the image from the media store - final Uri uri = Uri.parse(intent.getStringExtra(SCREENSHOT_URI_ID)); - mBackgroundExecutor.execute(() -> { - ContentResolver resolver = context.getContentResolver(); - resolver.delete(uri, null, null); - }); - if (intent.getBooleanExtra(EXTRA_SMART_ACTIONS_ENABLED, false)) { - mScreenshotSmartActions.notifyScreenshotAction( - intent.getStringExtra(EXTRA_ID), ACTION_TYPE_DELETE, false, null); - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 8b791de429ed..975e146f3940 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -71,6 +71,8 @@ import android.util.IndentingPrintWriter; import android.util.Log; import android.util.MathUtils; import android.view.HapticFeedbackConstants; +import android.view.InputDevice; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.VelocityTracker; @@ -355,6 +357,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private final QuickSettingsControllerImpl mQsController; private final NaturalScrollingSettingObserver mNaturalScrollingSettingObserver; private final TouchHandler mTouchHandler = new TouchHandler(); + private final KeyHandler mKeyHandler = new KeyHandler(); private long mDownTime; private boolean mTouchSlopExceededBeforeDown; @@ -816,6 +819,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mView.addOnLayoutChangeListener(new ShadeLayoutChangeListener()); mView.setOnTouchListener(getTouchHandler()); + mView.setOnKeyListener(getKeyHandler()); mView.setOnConfigurationChangedListener(config -> loadDimens()); mResources = mView.getResources(); @@ -3590,6 +3594,11 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump return mTouchHandler; } + @VisibleForTesting + KeyHandler getKeyHandler() { + return mKeyHandler; + } + @Override public void disableHeader(int state1, int state2, boolean animated) { mShadeHeaderController.disable(state1, state2, animated); @@ -5242,6 +5251,21 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } } + /** Handles KeyEvents for the Shade. */ + public final class KeyHandler implements View.OnKeyListener { + @Override + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_DOWN) { + final InputDevice d = event.getDevice(); + // Trigger user activity if the event comes from a full external keyboard + if (d != null && d.isFullKeyboard() && d.isExternal()) { + mCentralSurfaces.userActivity(); + } + } + return false; + } + } + private final class HeadsUpNotificationViewControllerImpl implements HeadsUpTouchHelper.HeadsUpNotificationViewController { @Override diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java index fd68c56149db..817f0eae815b 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsControllerImpl.java @@ -982,8 +982,10 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum if (!FooterViewRefactor.isEnabled()) { mNotificationStackScrollLayoutController.setQsFullScreen(qsFullScreen); } - mNotificationStackScrollLayoutController.setScrollingEnabled( - mBarState != KEYGUARD && (!qsFullScreen || mExpansionFromOverscroll)); + if (!SceneContainerFlag.isEnabled()) { + mNotificationStackScrollLayoutController.setScrollingEnabled( + mBarState != KEYGUARD && (!qsFullScreen || mExpansionFromOverscroll)); + } if (mQsStateUpdateListener != null) { mQsStateUpdateListener.onQsStateUpdated(getExpanded(), mStackScrollerOverscrolling); diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt index 8197b660c2fc..db06c6b25500 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt @@ -31,12 +31,6 @@ import java.util.function.Consumer * @see NotificationPanelViewController */ interface ShadeViewController { - /** - * Returns whether the shade height is greater than zero or the shade is expecting a synthesized - * down event. - */ - val isPanelExpanded: Boolean - /** Returns whether the shade is tracking touches for expand/collapse of the shade or QS. */ val isTracking: Boolean diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractor.kt index 79ffe06f7923..60cb06142a4f 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractor.kt @@ -43,6 +43,12 @@ interface PanelExpansionInteractor { @Deprecated("Use SceneInteractor.currentScene instead.") val legacyPanelExpansion: Flow<Float> /** + * Returns whether the shade height is greater than zero or the shade is expecting a synthesized + * down event. + */ + @Deprecated("Use ShadeInteractor.isAnyExpanded instead.") val isPanelExpanded: Boolean + + /** * This method should not be used anymore, you should probably use [.isShadeFullyOpen] instead. * It was overused as indicating if shade is open or we're on keyguard/AOD. Moving forward we * should be explicit about the what state we're checking. diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractorImpl.kt index 3ad2b5607b9b..387767795127 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/PanelExpansionInteractorImpl.kt @@ -111,4 +111,6 @@ constructor( private fun SceneKey.isExpandable(): Boolean { return this == Scenes.Shade || this == Scenes.QuickSettings } + + override val isPanelExpanded = shadeInteractor.isAnyExpanded.value } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/domain/interactor/StatusBarKeyguardViewManagerInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/domain/interactor/StatusBarKeyguardViewManagerInteractor.kt index 1bebbfd34ff4..ca7308161e14 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/domain/interactor/StatusBarKeyguardViewManagerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/domain/interactor/StatusBarKeyguardViewManagerInteractor.kt @@ -18,12 +18,16 @@ package com.android.systemui.statusbar.domain.interactor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.domain.interactor.KeyguardOcclusionInteractor +import com.android.systemui.keyguard.domain.interactor.KeyguardSurfaceBehindInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor +import com.android.systemui.keyguard.domain.interactor.WindowManagerLockscreenVisibilityInteractor import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChangedBy import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map @@ -46,6 +50,8 @@ constructor( keyguardTransitionInteractor: KeyguardTransitionInteractor, keyguardOcclusionInteractor: KeyguardOcclusionInteractor, powerInteractor: PowerInteractor, + wmLockscreenVisibilityInteractor: WindowManagerLockscreenVisibilityInteractor, + surfaceBehindInteractor: KeyguardSurfaceBehindInteractor, ) { /** Occlusion state to apply whenever a keyguard transition is STARTED, if any. */ private val occlusionStateFromStartedStep: Flow<OccludedState> = @@ -98,11 +104,21 @@ constructor( OccludedState(occluded = occluded, animate = false) } - /** Occlusion state to apply to SKBVM's setOccluded call. */ + /** Occlusion state to apply to SBKVM's setOccluded call. */ val keyguardViewOcclusionState = merge(occlusionStateFromStartedStep, occlusionStateFromFinishedStep) .distinctUntilChangedBy { // Don't switch 'animate' values mid-transition. it.occluded } + + /** Visibility state to apply to SBKVM via show() and hide(). */ + val keyguardViewVisibility = + combine( + wmLockscreenVisibilityInteractor.lockscreenVisibility, + surfaceBehindInteractor.isAnimatingSurface, + ) { lockscreenVisible, animatingSurface -> + lockscreenVisible || animatingSurface + } + .distinctUntilChanged() } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java index 6548967c7462..e31e9c22e38e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java @@ -74,6 +74,8 @@ import com.android.systemui.statusbar.notification.interruption.VisualInterrupti import com.android.systemui.statusbar.notification.interruption.VisualInterruptionRefactor; import com.android.systemui.statusbar.notification.logging.NotificationPanelLogger; import com.android.systemui.statusbar.notification.logging.NotificationPanelLoggerImpl; +import com.android.systemui.statusbar.notification.row.NotificationEntryProcessorFactory; +import com.android.systemui.statusbar.notification.row.NotificationEntryProcessorFactoryLooperImpl; import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback; import com.android.systemui.statusbar.notification.row.ui.viewmodel.ActivatableNotificationViewModelModule; @@ -234,6 +236,11 @@ public interface NotificationsModule { /** */ @Binds + NotificationEntryProcessorFactory bindNotificationEntryProcessorFactory( + NotificationEntryProcessorFactoryLooperImpl factoryImpl); + + /** */ + @Binds ConversationIconManager bindConversationIconManager(IconManager iconManager); /** */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotifBindPipeline.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotifBindPipeline.java index ea564ddb9193..a6b6f0d2ee28 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotifBindPipeline.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotifBindPipeline.java @@ -16,9 +16,6 @@ package com.android.systemui.statusbar.notification.row; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; import android.util.ArrayMap; import android.util.ArraySet; import android.widget.FrameLayout; @@ -29,7 +26,6 @@ import androidx.annotation.Nullable; import androidx.core.os.CancellationSignal; import com.android.systemui.dagger.SysUISingleton; -import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder; import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; @@ -82,17 +78,17 @@ public final class NotifBindPipeline { private final Map<NotificationEntry, BindEntry> mBindEntries = new ArrayMap<>(); private final NotifBindPipelineLogger mLogger; private final List<BindCallback> mScratchCallbacksList = new ArrayList<>(); - private final Handler mMainHandler; + private final Processor<NotificationEntry> mStartProcessor; private BindStage mStage; @Inject NotifBindPipeline( CommonNotifCollection collection, NotifBindPipelineLogger logger, - @Main Looper mainLooper) { + NotificationEntryProcessorFactory processorFactory) { collection.addCollectionListener(mCollectionListener); mLogger = logger; - mMainHandler = new NotifBindPipelineHandler(mainLooper); + mStartProcessor = processorFactory.create(this::startPipeline); } /** @@ -167,10 +163,7 @@ public final class NotifBindPipeline { // Abort any existing pipeline run mStage.abortStage(entry, bindEntry.row); - if (!mMainHandler.hasMessages(START_PIPELINE_MSG, entry)) { - Message msg = Message.obtain(mMainHandler, START_PIPELINE_MSG, entry); - mMainHandler.sendMessage(msg); - } + mStartProcessor.request(entry); } /** @@ -223,7 +216,7 @@ public final class NotifBindPipeline { mStage.abortStage(entry, row); } mStage.deleteStageParams(entry); - mMainHandler.removeMessages(START_PIPELINE_MSG, entry); + mStartProcessor.cancel(entry); } }; @@ -247,25 +240,4 @@ public final class NotifBindPipeline { public final Set<BindCallback> callbacks = new ArraySet<>(); public boolean invalidated; } - - private static final int START_PIPELINE_MSG = 1; - - private class NotifBindPipelineHandler extends Handler { - - NotifBindPipelineHandler(Looper looper) { - super(looper); - } - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case START_PIPELINE_MSG: - NotificationEntry entry = (NotificationEntry) msg.obj; - startPipeline(entry); - break; - default: - throw new IllegalArgumentException("Unknown message type: " + msg.what); - } - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationEntryProcessorFactory.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationEntryProcessorFactory.kt new file mode 100644 index 000000000000..f32351300e99 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationEntryProcessorFactory.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.statusbar.notification.row + +import com.android.systemui.statusbar.notification.collection.NotificationEntry +import java.util.function.Consumer + +/** an interface for [NotifBindPipeline] to build a main thread message processor */ +interface NotificationEntryProcessorFactory { + /** Creates a [Processor] that will call the given consumer */ + fun create(consumer: Consumer<NotificationEntry>): Processor<NotificationEntry> +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationEntryProcessorFactoryExecutorImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationEntryProcessorFactoryExecutorImpl.kt new file mode 100644 index 000000000000..83b92a93b689 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationEntryProcessorFactoryExecutorImpl.kt @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.statusbar.notification.row + +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.util.concurrency.DelayableExecutor +import java.util.concurrent.ConcurrentHashMap +import java.util.function.Consumer +import javax.inject.Inject + +class NotificationEntryProcessorFactoryExecutorImpl +@Inject +constructor(@Main private val mMainExecutor: DelayableExecutor) : + NotificationEntryProcessorFactory { + override fun create(consumer: Consumer<NotificationEntry>): Processor<NotificationEntry> { + return ExecutorProcessor(mMainExecutor, consumer) + } + + private class ExecutorProcessor( + private val executor: DelayableExecutor, + private val consumer: Consumer<NotificationEntry>, + ) : Processor<NotificationEntry> { + val cancellationsByEntry = ConcurrentHashMap<NotificationEntry, Runnable>() + + override fun request(obj: NotificationEntry) { + cancellationsByEntry.computeIfAbsent(obj) { entry -> + executor.executeDelayed({ processEntry(entry) }, 0L) + } + } + + private fun processEntry(entry: NotificationEntry) { + val cancellation = cancellationsByEntry.remove(entry) + if (cancellation != null) { + consumer.accept(entry) + } + } + + override fun cancel(obj: NotificationEntry) { + cancellationsByEntry.remove(obj)?.run() + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationEntryProcessorFactoryLooperImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationEntryProcessorFactoryLooperImpl.kt new file mode 100644 index 000000000000..7f7a6c402f1a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationEntryProcessorFactoryLooperImpl.kt @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.statusbar.notification.row + +import android.os.Handler +import android.os.Looper +import android.os.Message +import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.statusbar.notification.collection.NotificationEntry +import java.util.function.Consumer +import javax.inject.Inject + +class NotificationEntryProcessorFactoryLooperImpl +@Inject +constructor(@Main private val mMainLooper: Looper) : NotificationEntryProcessorFactory { + override fun create(consumer: Consumer<NotificationEntry>): Processor<NotificationEntry> { + return HandlerProcessor(mMainLooper, consumer) + } + + private class HandlerProcessor( + looper: Looper, + private val consumer: Consumer<NotificationEntry>, + ) : Handler(looper), Processor<NotificationEntry> { + override fun handleMessage(msg: Message) { + if (msg.what == PROCESS_MSG) { + val entry = msg.obj as NotificationEntry + consumer.accept(entry) + } else { + throw IllegalArgumentException("Unknown message type: " + msg.what) + } + } + + override fun request(obj: NotificationEntry) { + if (!hasMessages(PROCESS_MSG, obj)) { + val msg = Message.obtain(this, PROCESS_MSG, obj) + sendMessage(msg) + } + } + + override fun cancel(obj: NotificationEntry) { + removeMessages(PROCESS_MSG, obj) + } + companion object { + private const val PROCESS_MSG = 1 + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/Processor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/Processor.kt new file mode 100644 index 000000000000..7ff9d7155ca5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/Processor.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.statusbar.notification.row + +/** A generic interface for requesting async processing of objects, as well as cancellation */ +interface Processor<T> { + /** request that the object be processed if it is not already waiting */ + fun request(obj: T) + + /** cancel a request to process the given object if one is still pending */ + fun cancel(obj: T) +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackAppearanceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackAppearanceViewBinder.kt index 8b1b06eb1453..f10e5f1ab022 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackAppearanceViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationStackAppearanceViewBinder.kt @@ -48,11 +48,13 @@ object NotificationStackAppearanceViewBinder { repeatOnLifecycle(Lifecycle.State.CREATED) { launch { viewModel.stackBounds.collect { bounds -> + val viewLeft = controller.view.left + val viewTop = controller.view.top controller.setRoundedClippingBounds( - bounds.left.roundToInt(), - bounds.top.roundToInt(), - bounds.right.roundToInt(), - bounds.bottom.roundToInt(), + bounds.left.roundToInt() - viewLeft, + bounds.top.roundToInt() - viewTop, + bounds.right.roundToInt() - viewLeft, + bounds.bottom.roundToInt() - viewTop, SCRIM_CORNER_RADIUS.dpToPx(context), 0, ) @@ -80,6 +82,8 @@ object NotificationStackAppearanceViewBinder { wasExpanding = nowExpanding } } + + launch { viewModel.isScrollable.collect { controller.setScrollingEnabled(it) } } } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt index 5b8b91c6a5fb..7c76ddbec105 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt @@ -28,7 +28,6 @@ import com.android.systemui.scene.shared.flag.SceneContainerFlags import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.notification.stack.NotificationStackSizeCalculator -import com.android.systemui.statusbar.notification.stack.shared.flexiNotifsEnabled import com.android.systemui.statusbar.notification.stack.ui.view.SharedNotificationContainer import com.android.systemui.statusbar.notification.stack.ui.viewmodel.SharedNotificationContainerViewModel import kotlinx.coroutines.CoroutineDispatcher @@ -136,7 +135,7 @@ object SharedNotificationContainerBinder { .collect { controller.setMaxDisplayedNotifications(it) } } - if (!sceneContainerFlags.flexiNotifsEnabled()) { + if (!sceneContainerFlags.isEnabled()) { launch { viewModel.bounds.collect { val animate = diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt index 8d1cdfac90c5..b6167e1ef0fb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModel.kt @@ -20,23 +20,28 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import com.android.compose.animation.scene.ObservableTransitionState import com.android.systemui.common.shared.model.NotificationContainerBounds import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dump.DumpManager import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.model.Scenes +import com.android.systemui.scene.shared.model.Scenes.Shade import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor import com.android.systemui.util.kotlin.FlowDumperImpl import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map /** ViewModel which represents the state of the NSSL/Controller in the world of flexiglass */ @SysUISingleton class NotificationStackAppearanceViewModel @Inject constructor( + @Application applicationScope: CoroutineScope, dumpManager: DumpManager, stackAppearanceInteractor: NotificationStackAppearanceInteractor, shadeInteractor: ShadeInteractor, @@ -83,4 +88,8 @@ constructor( /** The y-coordinate in px of top of the contents of the notification stack. */ val contentTop: StateFlow<Float> = stackAppearanceInteractor.contentTop.dumpValue("contentTop") + + /** Whether the notification stack is scrollable or not. */ + val isScrollable: Flow<Boolean> = + sceneInteractor.currentScene.map { it == Shade }.dumpWhileCollecting("isScrollable") } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt index 7ac5cd48f24a..9e2497d5bb41 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt @@ -21,11 +21,9 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FeatureFlagsClassic import com.android.systemui.flags.Flags import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor -import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.flag.SceneContainerFlags import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.NotificationStackAppearanceInteractor -import com.android.systemui.statusbar.notification.stack.shared.flexiNotifsEnabled import javax.inject.Inject import kotlinx.coroutines.flow.Flow @@ -43,15 +41,11 @@ constructor( featureFlags: FeatureFlagsClassic, private val keyguardInteractor: KeyguardInteractor, ) { - /** DEBUG: whether the placeholder "Notifications" text should be shown. */ - val isPlaceholderTextVisible: Boolean = - !flags.flexiNotifsEnabled() && SceneContainerFlag.isEnabled - /** DEBUG: whether the placeholder should be made slightly visible for positional debugging. */ val isVisualDebuggingEnabled: Boolean = featureFlags.isEnabled(Flags.NSSL_DEBUG_LINES) /** DEBUG: whether the debug logging should be output. */ - val isDebugLoggingEnabled: Boolean = flags.flexiNotifsEnabled() + val isDebugLoggingEnabled: Boolean = flags.isEnabled() /** * Notifies that the bounds of the notification placeholder have changed. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt index 2c4813aec99d..a38840b10b5f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModel.kt @@ -448,9 +448,12 @@ constructor( isOnGlanceableHubWithoutShade, isOnLockscreen, merge( - lockscreenToGlanceableHubTransitionViewModel.notificationAlpha, - glanceableHubToLockscreenTransitionViewModel.notificationAlpha, - ) + lockscreenToGlanceableHubTransitionViewModel.notificationAlpha, + glanceableHubToLockscreenTransitionViewModel.notificationAlpha, + ) + // Manually emit on start because [notificationAlpha] only starts emitting + // when transitions start. + .onStart { emit(1f) } ) { isOnGlanceableHubWithoutShade, isOnLockscreen, alpha, -> if (isOnGlanceableHubWithoutShade && !isOnLockscreen) { @@ -506,6 +509,12 @@ constructor( ) .dumpWhileCollecting("translationX") + private val availableHeight: Flow<Float> = + bounds + .map { it.bottom - it.top } + .distinctUntilChanged() + .dumpWhileCollecting("availableHeight") + /** * When on keyguard, there is limited space to display notifications so calculate how many could * be shown. Otherwise, there is no limit since the vertical space will be scrollable. @@ -527,19 +536,19 @@ constructor( showLimitedNotifications, showUnlimitedNotifications, shadeInteractor.isUserInteracting, - bounds, + availableHeight, interactor.notificationStackChanged.onStart { emit(Unit) }, interactor.useExtraShelfSpace, ) { flows -> val showLimitedNotifications = flows[0] as Boolean val showUnlimitedNotifications = flows[1] as Boolean val isUserInteracting = flows[2] as Boolean - val bounds = flows[3] as NotificationContainerBounds + val availableHeight = flows[3] as Float val useExtraShelfSpace = flows[5] as Boolean if (!isUserInteracting) { if (showLimitedNotifications) { - emit(calculateSpace(bounds.bottom - bounds.top, useExtraShelfSpace)) + emit(calculateSpace(availableHeight, useExtraShelfSpace)) } else if (showUnlimitedNotifications) { emit(-1) } 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 1faca0081155..1906b7c6bb01 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesCommandQueueCallbacks.java @@ -59,7 +59,6 @@ import com.android.systemui.shade.ShadeController; import com.android.systemui.shade.ShadeViewController; import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor; import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.disableflags.DisableFlagsLogger; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -97,7 +96,6 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba private final StatusBarHideIconsForBouncerManager mStatusBarHideIconsForBouncerManager; private final PowerManager mPowerManager; private final Optional<Vibrator> mVibratorOptional; - private final DisableFlagsLogger mDisableFlagsLogger; private final int mDisplayId; private final UserTracker mUserTracker; private final boolean mVibrateOnOpening; @@ -137,7 +135,6 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba StatusBarHideIconsForBouncerManager statusBarHideIconsForBouncerManager, PowerManager powerManager, Optional<Vibrator> vibratorOptional, - DisableFlagsLogger disableFlagsLogger, @DisplayId int displayId, Lazy<CameraLauncher> cameraLauncherLazy, UserTracker userTracker, @@ -165,7 +162,6 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba mStatusBarHideIconsForBouncerManager = statusBarHideIconsForBouncerManager; mPowerManager = powerManager; mVibratorOptional = vibratorOptional; - mDisableFlagsLogger = disableFlagsLogger; mDisplayId = displayId; mCameraLauncherLazy = cameraLauncherLazy; mUserTracker = userTracker; @@ -489,7 +485,7 @@ public class CentralSurfacesCommandQueueCallbacks implements CommandQueue.Callba @Override public void togglePanel() { - if (mShadeViewController.isPanelExpanded()) { + if (mPanelExpansionInteractor.isPanelExpanded()) { mShadeController.animateCollapseShade(); } else { mShadeController.animateExpandShade(); 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 14e934fab701..f99817aa4aad 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -23,7 +23,6 @@ import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConst import static com.android.systemui.plugins.ActivityStarter.OnDismissAction; import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK; import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING; -import static com.android.systemui.util.kotlin.JavaAdapterKt.combineFlows; import android.content.Context; import android.content.res.ColorStateList; @@ -107,8 +106,6 @@ import com.android.systemui.util.kotlin.JavaAdapter; import dagger.Lazy; -import kotlin.Unit; - import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashSet; @@ -118,6 +115,7 @@ import java.util.Set; import javax.inject.Inject; +import kotlin.Unit; import kotlinx.coroutines.CoroutineDispatcher; import kotlinx.coroutines.ExperimentalCoroutinesApi; import kotlinx.coroutines.Job; @@ -523,16 +521,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb if (KeyguardWmStateRefactor.isEnabled()) { // Show the keyguard views whenever we've told WM that the lockscreen is visible. mJavaAdapter.alwaysCollectFlow( - combineFlows( - mWmLockscreenVisibilityInteractor.get().getLockscreenVisibility(), - mSurfaceBehindInteractor.get().isAnimatingSurface(), - (lockscreenVis, animatingSurface) -> - // TODO(b/322546110): Waiting until we're not animating the - // surface is a workaround to avoid jank. We should actually - // fix the source of the jank, and then hide the keyguard - // view without waiting for the animation to end. - lockscreenVis || animatingSurface - ), + mStatusBarKeyguardViewManagerInteractor.getKeyguardViewVisibility(), this::consumeShowStatusBarKeyguardView); mJavaAdapter.alwaysCollectFlow( 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 88374d61d240..67d2299a9a3d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt @@ -12,16 +12,19 @@ import android.view.Display import android.view.Surface import android.view.View import android.view.WindowManager.fixScale +import com.android.app.animation.Interpolators +import com.android.app.tracing.namedRunnable 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.Flags.lightRevealMigration import com.android.systemui.Flags.migrateClocksToBlueprint import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.KeyguardViewMediator import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.shade.ShadeViewController +import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor import com.android.systemui.statusbar.CircleReveal import com.android.systemui.statusbar.LightRevealScrim import com.android.systemui.statusbar.NotificationShadeWindowController @@ -32,9 +35,8 @@ import com.android.systemui.statusbar.notification.PropertyAnimator import com.android.systemui.statusbar.notification.stack.AnimationProperties import com.android.systemui.statusbar.notification.stack.StackStateAnimator import com.android.systemui.statusbar.policy.KeyguardStateController -import com.android.systemui.Flags.lightRevealMigration -import com.android.app.tracing.namedRunnable import com.android.systemui.util.settings.GlobalSettings +import dagger.Lazy import javax.inject.Inject /** @@ -60,14 +62,15 @@ class UnlockedScreenOffAnimationController @Inject constructor( private val context: Context, private val wakefulnessLifecycle: WakefulnessLifecycle, private val statusBarStateControllerImpl: StatusBarStateControllerImpl, - private val keyguardViewMediatorLazy: dagger.Lazy<KeyguardViewMediator>, + private val keyguardViewMediatorLazy: Lazy<KeyguardViewMediator>, private val keyguardStateController: KeyguardStateController, - private val dozeParameters: dagger.Lazy<DozeParameters>, + private val dozeParameters: Lazy<DozeParameters>, private val globalSettings: GlobalSettings, - private val notifShadeWindowControllerLazy: dagger.Lazy<NotificationShadeWindowController>, + private val notifShadeWindowControllerLazy: Lazy<NotificationShadeWindowController>, private val interactionJankMonitor: InteractionJankMonitor, private val powerManager: PowerManager, - private val handler: Handler = Handler() + private val panelExpansionInteractorLazy: Lazy<PanelExpansionInteractor>, + private val handler: Handler = Handler(), ) : WakefulnessLifecycle.Observer, ScreenOffAnimation { private lateinit var centralSurfaces: CentralSurfaces private lateinit var shadeViewController: ShadeViewController @@ -346,7 +349,7 @@ class UnlockedScreenOffAnimationController @Inject constructor( // already expanded and showing notifications/QS, the animation looks really messy. For now, // disable it if the notification panel is expanded. if ((!this::centralSurfaces.isInitialized || - shadeViewController.isPanelExpanded) && + panelExpansionInteractorLazy.get().isPanelExpanded) && // Status bar might be expanded because we have started // playing the animation already !isAnimationPlaying() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt index 6aaf5d60ac0b..55a0f59bf461 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AvalancheController.kt @@ -131,21 +131,37 @@ class AvalancheController @Inject constructor() { } /** - * Returns true if given HeadsUpEntry is the last one tracked by AvalancheController. Used by - * BaseHeadsUpManager.HeadsUpEntry.calculateFinishTime to shorten display duration during active - * avalanche. + * Returns duration based on + * 1) Whether HeadsUpEntry is the last one tracked byAvalancheController + * 2) The priority of the top HUN in the next batch Used by + * BaseHeadsUpManager.HeadsUpEntry.calculateFinishTime to shorten display duration. */ - fun shortenDuration(entry: HeadsUpEntry): Boolean { + fun getDurationMs(entry: HeadsUpEntry, autoDismissMs: Int): Int { if (!NotificationThrottleHun.isEnabled) { - // Use default display duration, like we always did before AvalancheController existed - return false + // Use default duration, like we did before AvalancheController existed + return autoDismissMs } val showingList: MutableList<HeadsUpEntry> = mutableListOf() headsUpEntryShowing?.let { showingList.add(it) } - val allEntryList = showingList + nextList - // Shorten duration if not last entry - return allEntryList.indexOf(entry) != allEntryList.size - 1 + val entryList = showingList + nextList + if (entryList.indexOf(entry) == entryList.size - 1) { + // Use default duration if last entry + return autoDismissMs + } + + nextList.sort() + val nextEntry = nextList[0] + + if (nextEntry.compareNonTimeFields(entry) == -1) { + // Next entry is higher priority + return 500 + } else if (nextEntry.compareNonTimeFields(entry) == 0) { + // Next entry is same priority + return 1000 + } else { + return autoDismissMs + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BaseHeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BaseHeadsUpManager.java index 05cc73edd892..50de3cba6b59 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BaseHeadsUpManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BaseHeadsUpManager.java @@ -776,7 +776,7 @@ public abstract class BaseHeadsUpManager implements HeadsUpManager { return mEarliestRemovalTime < mSystemClock.elapsedRealtime(); } - public int compareTo(@NonNull HeadsUpEntry headsUpEntry) { + public int compareNonTimeFields(HeadsUpEntry headsUpEntry) { boolean isPinned = mEntry.isRowPinned(); boolean otherPinned = headsUpEntry.mEntry.isRowPinned(); if (isPinned && !otherPinned) { @@ -806,7 +806,14 @@ public abstract class BaseHeadsUpManager implements HeadsUpManager { } else if (!mRemoteInputActive && headsUpEntry.mRemoteInputActive) { return 1; } + return 0; + } + public int compareTo(@NonNull HeadsUpEntry headsUpEntry) { + int nonTimeCompareResult = compareNonTimeFields(headsUpEntry); + if (nonTimeCompareResult != 0) { + return nonTimeCompareResult; + } if (mPostTime > headsUpEntry.mPostTime) { return -1; } else if (mPostTime == headsUpEntry.mPostTime) { @@ -929,10 +936,8 @@ public abstract class BaseHeadsUpManager implements HeadsUpManager { int requestedTimeOutMs; if (isStickyForSomeTime()) { requestedTimeOutMs = mStickyForSomeTimeAutoDismissTime; - } else if (mAvalancheController.shortenDuration(this)) { - requestedTimeOutMs = 1000; } else { - requestedTimeOutMs = mAutoDismissTime; + requestedTimeOutMs = mAvalancheController.getDurationMs(this, mAutoDismissTime); } final long duration = getRecommendedHeadsUpTimeoutMs(requestedTimeOutMs); return mPostTime + duration; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java index 7ac3e9c2d94c..bf3347327440 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyConstants.java @@ -31,6 +31,8 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.util.DeviceConfigProxy; +import java.util.concurrent.Executor; + import javax.inject.Inject; @SysUISingleton @@ -60,18 +62,18 @@ public final class SmartReplyConstants { private volatile int mMaxNumActions; private volatile long mOnClickInitDelay; - private final Handler mHandler; + private final Executor mMainExecutor; private final Context mContext; private final DeviceConfigProxy mDeviceConfig; private final KeyValueListParser mParser = new KeyValueListParser(','); @Inject public SmartReplyConstants( - @Main Handler handler, + @Main Executor mainExecutor, Context context, DeviceConfigProxy deviceConfig ) { - mHandler = handler; + mMainExecutor = mainExecutor; mContext = context; final Resources resources = mContext.getResources(); mDefaultEnabled = resources.getBoolean( @@ -104,7 +106,7 @@ public final class SmartReplyConstants { } private void postToHandler(Runnable r) { - this.mHandler.post(r); + this.mMainExecutor.execute(r); } private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener = diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java index b5efc44cff39..aac18e365809 100644 --- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java +++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java @@ -86,15 +86,6 @@ import com.android.systemui.util.kotlin.JavaAdapter; import com.android.systemui.util.settings.SecureSettings; import com.google.ux.material.libmonet.dynamiccolor.MaterialDynamicColors; -import com.google.ux.material.libmonet.hct.Hct; -import com.google.ux.material.libmonet.scheme.DynamicScheme; -import com.google.ux.material.libmonet.scheme.SchemeExpressive; -import com.google.ux.material.libmonet.scheme.SchemeFruitSalad; -import com.google.ux.material.libmonet.scheme.SchemeMonochrome; -import com.google.ux.material.libmonet.scheme.SchemeNeutral; -import com.google.ux.material.libmonet.scheme.SchemeRainbow; -import com.google.ux.material.libmonet.scheme.SchemeTonalSpot; -import com.google.ux.material.libmonet.scheme.SchemeVibrant; import org.json.JSONException; import org.json.JSONObject; @@ -150,7 +141,7 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { // Dominant color extracted from wallpaper, NOT the color used on the overlay protected int mMainWallpaperColor = Color.TRANSPARENT; // UI contrast as reported by UiModeManager - private float mContrast = 0; + private double mContrast = 0.0; // Theme variant: Vibrant, Tonal, Expressive, etc @VisibleForTesting protected Style mThemeStyle = Style.TONAL_SPOT; @@ -170,8 +161,8 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { private final JavaAdapter mJavaAdapter; private final KeyguardTransitionInteractor mKeyguardTransitionInteractor; private final UiModeManager mUiModeManager; - private DynamicScheme mDynamicSchemeDark; - private DynamicScheme mDynamicSchemeLight; + private ColorScheme mDarkColorScheme; + private ColorScheme mLightColorScheme; // Defers changing themes until Setup Wizard is done. private boolean mDeferredThemeEvaluation; @@ -210,7 +201,7 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { boolean currentUser = userId == mUserTracker.getUserId(); boolean isAsleep = themeOverlayControllerWakefulnessDeprecation() ? mKeyguardTransitionInteractor.isFinishedInStateWhereValue( - state -> KeyguardState.Companion.deviceIsAsleepInState(state)) + KeyguardState.Companion::deviceIsAsleepInState) : mWakefulnessLifecycle.getWakefulness() != WAKEFULNESS_ASLEEP; if (currentUser && !mAcceptColorEvents && isAsleep) { @@ -483,19 +474,14 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { reevaluateSystemTheme(true /* forceReload */); }); + // All wallpaper color and keyguard logic only applies when Monet is enabled. if (!mIsMonetEnabled) { return; } mUserTracker.addCallback(mUserTrackerCallback, mMainExecutor); - mDeviceProvisionedController.addCallback(mDeviceProvisionedListener); - // All wallpaper color and keyguard logic only applies when Monet is enabled. - if (!mIsMonetEnabled) { - return; - } - // Upon boot, make sure we have the most up to date colors Runnable updateColors = () -> { WallpaperColors systemColor = mWallpaperManager.getWallpaperColors( @@ -589,29 +575,6 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { return ColorScheme.getSeedColor(wallpaperColors); } - private static DynamicScheme dynamicSchemeFromStyle(Style style, int color, - boolean isDark, double contrastLevel) { - Hct sourceColorHct = Hct.fromInt(color); - switch (style) { - case EXPRESSIVE: - return new SchemeExpressive(sourceColorHct, isDark, contrastLevel); - case SPRITZ: - return new SchemeNeutral(sourceColorHct, isDark, contrastLevel); - case TONAL_SPOT: - return new SchemeTonalSpot(sourceColorHct, isDark, contrastLevel); - case FRUIT_SALAD: - return new SchemeFruitSalad(sourceColorHct, isDark, contrastLevel); - case RAINBOW: - return new SchemeRainbow(sourceColorHct, isDark, contrastLevel); - case VIBRANT: - return new SchemeVibrant(sourceColorHct, isDark, contrastLevel); - case MONOCHROMATIC: - return new SchemeMonochrome(sourceColorHct, isDark, contrastLevel); - default: - return null; - } - } - @VisibleForTesting protected boolean isNightMode() { return (mResources.getConfiguration().uiMode @@ -626,22 +589,17 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { @VisibleForTesting protected boolean isPrivateProfile(UserHandle userHandle) { Context usercontext = mContext.createContextAsUser(userHandle,0); - if (usercontext.getSystemService(UserManager.class).isPrivateProfile()) { - return true; - } - return false; + return usercontext.getSystemService(UserManager.class).isPrivateProfile(); } private void createOverlays(int color) { - boolean nightMode = isNightMode(); - mColorScheme = new ColorScheme(color, nightMode, mThemeStyle); + mDarkColorScheme = new ColorScheme(color, true /* isDark */, mThemeStyle, mContrast); + mLightColorScheme = new ColorScheme(color, false /* isDark */, mThemeStyle, mContrast); + mColorScheme = isNightMode() ? mDarkColorScheme : mLightColorScheme; + mNeutralOverlay = createNeutralOverlay(); mSecondaryOverlay = createAccentOverlay(); - mDynamicSchemeDark = dynamicSchemeFromStyle( - mThemeStyle, color, true /* isDark */, mContrast); - mDynamicSchemeLight = dynamicSchemeFromStyle( - mThemeStyle, color, false /* isDark */, mContrast); mDynamicOverlay = createDynamicOverlay(); } @@ -682,10 +640,10 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { private void assignDynamicPaletteToOverlay(FabricatedOverlay overlay, boolean isDark) { String suffix = isDark ? "dark" : "light"; - DynamicScheme scheme = isDark ? mDynamicSchemeDark : mDynamicSchemeLight; + ColorScheme scheme = isDark ? mDarkColorScheme : mLightColorScheme; DynamicColors.allDynamicColorsMapped(mIsFidelityEnabled).forEach(p -> { String resourceName = "android:color/system_" + p.first + "_" + suffix; - int colorValue = p.second.getArgb(scheme); + int colorValue = p.second.getArgb(scheme.getMaterialScheme()); overlay.setResourceValue(resourceName, TYPE_INT_COLOR_ARGB8, colorValue, null /* configuration */); }); @@ -694,7 +652,7 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { private void assignFixedColorsToOverlay(FabricatedOverlay overlay) { DynamicColors.getFixedColorsMapped(mIsFidelityEnabled).forEach(p -> { String resourceName = "android:color/system_" + p.first; - int colorValue = p.second.getArgb(mDynamicSchemeLight); + int colorValue = p.second.getArgb(mLightColorScheme.getMaterialScheme()); overlay.setResourceValue(resourceName, TYPE_INT_COLOR_ARGB8, colorValue, null /* configuration */); }); @@ -702,6 +660,7 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { /** * Checks if the color scheme in mColorScheme matches the current system palettes. + * * @param managedProfiles List of managed profiles for this user. */ private boolean colorSchemeIsApplied(Set<UserHandle> managedProfiles) { @@ -723,15 +682,18 @@ public class ThemeOverlayController implements CoreStartable, Dumpable { && res.getColor(android.R.color.system_neutral2_500, theme) == mColorScheme.getNeutral2().getS500() && res.getColor(android.R.color.system_outline_variant_dark, theme) - == dynamicColors.outlineVariant().getArgb(mDynamicSchemeDark) + == dynamicColors.outlineVariant().getArgb(mDarkColorScheme.getMaterialScheme()) && res.getColor(android.R.color.system_outline_variant_light, theme) - == dynamicColors.outlineVariant().getArgb(mDynamicSchemeLight) + == dynamicColors.outlineVariant().getArgb(mLightColorScheme.getMaterialScheme()) && res.getColor(android.R.color.system_primary_container_dark, theme) - == dynamicColors.primaryContainer().getArgb(mDynamicSchemeDark) + == dynamicColors.primaryContainer().getArgb( + mDarkColorScheme.getMaterialScheme()) && res.getColor(android.R.color.system_primary_container_light, theme) - == dynamicColors.primaryContainer().getArgb(mDynamicSchemeLight) + == dynamicColors.primaryContainer().getArgb( + mLightColorScheme.getMaterialScheme()) && res.getColor(android.R.color.system_primary_fixed, theme) - == dynamicColors.primaryFixed().getArgb(mDynamicSchemeLight))) { + == dynamicColors.primaryFixed().getArgb( + mLightColorScheme.getMaterialScheme()))) { return false; } } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index c294bd8e8f63..7931fab91f46 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -21,7 +21,6 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_B import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_MANAGE_MENU_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DIALOG_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_FREEFORM_ACTIVE_IN_DESKTOP_MODE; -import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DISABLE_GESTURE_SPLIT_INVOCATION; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_ONE_HANDED_ACTIVE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED; @@ -266,13 +265,6 @@ public final class WMShell implements splitScreen.setSplitscreenFocus(leftOrTop); } }); - splitScreen.registerSplitAnimationListener(new SplitScreen.SplitInvocationListener() { - @Override - public void onSplitAnimationInvoked(boolean animationRunning) { - mSysUiState.setFlag(SYSUI_STATE_DISABLE_GESTURE_SPLIT_INVOCATION, animationRunning) - .commitUpdate(mDisplayTracker.getDefaultDisplayId()); - } - }, mSysUiMainExecutor); } @VisibleForTesting diff --git a/packages/SystemUI/tests/AndroidTest.xml b/packages/SystemUI/tests/AndroidTest.xml index 31e7bd2614d6..cd2a62de1acc 100644 --- a/packages/SystemUI/tests/AndroidTest.xml +++ b/packages/SystemUI/tests/AndroidTest.xml @@ -32,4 +32,11 @@ <option name="test-filter-dir" value="/data/data/com.android.systemui.tests" /> <option name="hidden-api-checks" value="false"/> </test> + + <metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector"> + <option name="directory-keys" + value="/data/user/0/com.android.systemui.tests/files"/> + <option name="collect-on-run-ended-only" value="true"/> + <option name="clean-up" value="true"/> + </metrics_collector> </configuration> diff --git a/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerBaseTest.java index d742da743a12..1c773512e590 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerBaseTest.java @@ -147,6 +147,7 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase { when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD); mSetFlagsRule.disableFlags(Flags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR); + mSetFlagsRule.disableFlags(Flags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT); mFeatureFlags = new FakeFeatureFlags(); mFeatureFlags.set(LOCKSCREEN_WALLPAPER_DREAM_ENABLED, false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/SystemActionsTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/SystemActionsTest.java index b478d5cc9d50..c67429492180 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/SystemActionsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/SystemActionsTest.java @@ -17,6 +17,7 @@ package com.android.systemui.accessibility; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doAnswer; @@ -38,7 +39,7 @@ import com.android.systemui.recents.Recents; import com.android.systemui.settings.FakeDisplayTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.ShadeController; -import com.android.systemui.shade.ShadeViewController; +import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -65,7 +66,7 @@ public class SystemActionsTest extends SysuiTestCase { @Mock private ShadeController mShadeController; @Mock - private ShadeViewController mShadeViewController; + private PanelExpansionInteractor mPanelExpansionInteractor; @Mock private Optional<Recents> mRecentsOptional; @Mock @@ -87,7 +88,7 @@ public class SystemActionsTest extends SysuiTestCase { mNotificationShadeController, mKeyguardStateController, mShadeController, - () -> mShadeViewController, + () -> mPanelExpansionInteractor, mRecentsOptional, mDisplayTracker); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java index 64936862bc20..69cd592d8f50 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java @@ -476,12 +476,18 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase { mValueAnimator.end(); }); - verify(mSpyController).enableWindowMagnificationInternal( + // Verify the method is called in + // {@link ValueAnimator.AnimatorUpdateListener#onAnimationUpdate} once and + // {@link Animator.AnimatorListener#onAnimationEnd} once in {@link ValueAnimator#end()} + verify(mSpyController, times(2)).enableWindowMagnificationInternal( mScaleCaptor.capture(), mCenterXCaptor.capture(), mCenterYCaptor.capture(), mOffsetXCaptor.capture(), mOffsetYCaptor.capture()); - //Animating in reverse, so we only check if the start values are greater than current. + + // The animation is playing forwards, so we only check the animated values are greater than + // the current one. (Asserting the first captured scale) assertTrue(mScaleCaptor.getAllValues().get(0) > mCurrentScale.get()); + // The last captured scale equalsto the targetScale when we enable window magnification. assertEquals(targetScale, mScaleCaptor.getValue(), 0f); assertTrue(mCenterXCaptor.getAllValues().get(0) > mCurrentCenterX.get()); assertEquals(targetCenterX, mCenterXCaptor.getValue(), 0f); @@ -588,10 +594,10 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase { final float expectedY = (int) (windowBounds.exactCenterY() + expectedOffset - defaultMagnificationWindowSize / 2); - // This is called 4 times when (1) first creating WindowlessMirrorWindow (2) SurfaceView is + // This is called 5 times when (1) first creating WindowlessMirrorWindow (2) SurfaceView is // created and we place the mirrored content as a child of the SurfaceView - // (3) the animation starts (4) the animation updates - verify(mTransaction, times(4)) + // (3) the animation starts (4) the animation updates (5) the animation ends + verify(mTransaction, times(5)) .setPosition(any(SurfaceControl.class), eq(expectedX), eq(expectedY)); } @@ -781,16 +787,18 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase { // wait for animation returns waitForIdleSync(); - // {@link ValueAnimator.AnimatorUpdateListener#onAnimationUpdate(ValueAnimator)} will only - // be triggered once in {@link ValueAnimator#end()} - verify(mSpyController).enableWindowMagnificationInternal( + // Verify the method is called in + // {@link ValueAnimator.AnimatorUpdateListener#onAnimationUpdate} once and + // {@link Animator.AnimatorListener#onAnimationEnd} once in {@link ValueAnimator#end()} + verify(mSpyController, times(2)).enableWindowMagnificationInternal( mScaleCaptor.capture(), mCenterXCaptor.capture(), mCenterYCaptor.capture(), mOffsetXCaptor.capture(), mOffsetYCaptor.capture()); - //The animation is in verse, so we only check the start values should no be greater than - // the current one. + // The animation is playing backwards, so we only check the animated values should not be + // greater than the current one. (Asserting the first captured scale) assertTrue(mScaleCaptor.getAllValues().get(0) <= mCurrentScale.get()); + // The last captured scale is 1.0 when we delete window magnification. assertEquals(1.0f, mScaleCaptor.getValue(), 0f); verifyStartValue(mCenterXCaptor, Float.NaN); verifyStartValue(mCenterYCaptor, Float.NaN); @@ -823,10 +831,15 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase { resetMockObjects(); deleteWindowMagnificationAndWaitAnimating(mWaitAnimationDuration, mAnimationCallback2); - verify(mSpyController).enableWindowMagnificationInternal( + // Verify the method is called in + // {@link ValueAnimator.AnimatorUpdateListener#onAnimationUpdate} once and + // {@link Animator.AnimatorListener#onAnimationEnd} once when running the animation at + // the final duration time. + verify(mSpyController, times(2)).enableWindowMagnificationInternal( mScaleCaptor.capture(), mCenterXCaptor.capture(), mCenterYCaptor.capture(), mOffsetXCaptor.capture(), mOffsetYCaptor.capture()); + // The last captured scale is 1.0 when we delete window magnification. assertEquals(1.0f, mScaleCaptor.getValue(), 0f); verifyStartValue(mOffsetXCaptor, 0f); verifyStartValue(mOffsetYCaptor, 0f); diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerWindowlessMagnifierTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerWindowlessMagnifierTest.java index 08b49e7d2745..cbdc69608367 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerWindowlessMagnifierTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationControllerWindowlessMagnifierTest.java @@ -132,7 +132,8 @@ import java.util.function.Supplier; public class WindowMagnificationControllerWindowlessMagnifierTest extends SysuiTestCase { @Rule - public final AnimatorTestRule mAnimatorTestRule = new AnimatorTestRule(this); + // NOTE: pass 'null' to allow this test advances time on the main thread. + public final AnimatorTestRule mAnimatorTestRule = new AnimatorTestRule(/* test= */ null); @Rule public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt index 7ee8963aaa15..1839d8d15b0c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt @@ -37,8 +37,6 @@ import com.android.systemui.kosmos.testScope import com.android.systemui.testKosmos import com.android.systemui.user.domain.interactor.selectedUserInteractor import junit.framework.Assert.assertEquals -import junit.framework.Assert.assertTrue -import junit.framework.Assert.fail import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runCurrent @@ -144,73 +142,6 @@ class FromPrimaryBouncerTransitionInteractorTest : SysuiTestCase() { } @Test - fun testSurfaceBehindModel() = - testScope.runTest { - val values by collectValues(underTest.surfaceBehindModel) - - transitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.STARTED, - from = KeyguardState.PRIMARY_BOUNCER, - to = KeyguardState.LOCKSCREEN, - ) - ) - runCurrent() - - assertEquals( - listOf( - null, // PRIMARY_BOUNCER -> LOCKSCREEN does not have specific view params. - ), - values - ) - - transitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.STARTED, - from = KeyguardState.PRIMARY_BOUNCER, - to = KeyguardState.GONE, - ) - ) - runCurrent() - - transitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.RUNNING, - from = KeyguardState.PRIMARY_BOUNCER, - to = KeyguardState.GONE, - value = 0.01f, - ) - ) - runCurrent() - - transitionRepository.sendTransitionStep( - TransitionStep( - transitionState = TransitionState.RUNNING, - from = KeyguardState.PRIMARY_BOUNCER, - to = KeyguardState.GONE, - value = 0.99f, - ) - ) - runCurrent() - - assertEquals(3, values.size) - val model1percent = values[1] - val model99percent = values[2] - - try { - // We should initially have an alpha of 0f when unlocking, so the surface is not - // visible - // while lockscreen UI animates out. - assertEquals(0f, model1percent!!.alpha) - - // By the end it should probably be visible. - assertTrue(model99percent!!.alpha > 0f) - } catch (e: NullPointerException) { - fail("surfaceBehindModel was unexpectedly null.") - } - } - - @Test @EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR) fun testReturnToLockscreen_whenBouncerHides() = testScope.runTest { diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractorTest.kt index 170d3486decb..b6b457142a3f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractorTest.kt @@ -17,6 +17,8 @@ package com.android.systemui.keyguard.domain.interactor +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags @@ -76,6 +78,7 @@ class KeyguardBlueprintInteractorTest : SysuiTestCase() { } @Test + @DisableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) fun testAppliesSplitShadeBlueprint() { testScope.runTest { val blueprint by collectLastValue(underTest.blueprint) @@ -88,6 +91,7 @@ class KeyguardBlueprintInteractorTest : SysuiTestCase() { } @Test + @DisableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) fun fingerprintPropertyInitialized_updatesBlueprint() { testScope.runTest { val blueprint by collectLastValue(underTest.blueprint) @@ -99,9 +103,9 @@ class KeyguardBlueprintInteractorTest : SysuiTestCase() { } @Test + @DisableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) fun composeLockscreenOff_DoesAppliesSplitShadeWeatherClockBlueprint() { testScope.runTest { - mSetFlagsRule.disableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) val blueprint by collectLastValue(underTest.blueprint) whenever(clockController.config) .thenReturn( @@ -121,9 +125,9 @@ class KeyguardBlueprintInteractorTest : SysuiTestCase() { } @Test + @EnableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) fun testDoesAppliesSplitShadeWeatherClockBlueprint() { testScope.runTest { - mSetFlagsRule.enableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) val blueprint by collectLastValue(underTest.blueprint) whenever(clockController.config) .thenReturn( @@ -143,9 +147,9 @@ class KeyguardBlueprintInteractorTest : SysuiTestCase() { } @Test + @EnableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) fun testAppliesWeatherClockBlueprint() { testScope.runTest { - mSetFlagsRule.enableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) val blueprint by collectLastValue(underTest.blueprint) whenever(clockController.config) .thenReturn( @@ -163,4 +167,18 @@ class KeyguardBlueprintInteractorTest : SysuiTestCase() { assertThat(blueprint?.id).isEqualTo(WEATHER_CLOCK_BLUEPRINT_ID) } } + + @Test + @EnableFlags(Flags.FLAG_COMPOSE_LOCKSCREEN) + fun testDoesNotApplySplitShadeBlueprint() { + testScope.runTest { + overrideResource(R.bool.config_use_split_notification_shade, true) + val blueprint by collectLastValue(underTest.blueprint) + clockRepository.setCurrentClock(clockController) + configurationRepository.onConfigurationChange() + runCurrent() + + assertThat(blueprint?.id).isEqualTo(DefaultKeyguardBlueprint.DEFAULT) + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt index 09c56b09bb91..58273d6805b9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/DefaultDeviceEntrySectionTest.kt @@ -107,6 +107,7 @@ class DefaultDeviceEntrySectionTest : SysuiTestCase() { @Test fun addViewsConditionally_migrateFlagOff() { + mSetFlagsRule.disableFlags(AConfigFlags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT) mSetFlagsRule.disableFlags(AConfigFlags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR) mSetFlagsRule.disableFlags(AConfigFlags.FLAG_DEVICE_ENTRY_UDFPS_REFACTOR) val constraintLayout = ConstraintLayout(context, null) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt index f252163ee332..0322301b3d6b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelTest.kt @@ -33,6 +33,8 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory import com.android.systemui.plugins.clocks.ClockController import com.android.systemui.plugins.clocks.ClockFaceConfig import com.android.systemui.plugins.clocks.ClockFaceController +import com.android.systemui.shade.domain.interactor.ShadeInteractor +import com.android.systemui.shade.shared.model.ShadeMode import com.android.systemui.shared.clocks.ClockRegistry import com.android.systemui.statusbar.notification.domain.interactor.NotificationsKeyguardInteractor import com.android.systemui.statusbar.policy.SplitShadeStateController @@ -42,6 +44,7 @@ import com.google.common.truth.Truth.assertThat import kotlin.test.Test import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestCoroutineScheduler import kotlinx.coroutines.test.TestScope @@ -72,6 +75,7 @@ class KeyguardClockViewModelTest : SysuiTestCase() { @Mock private lateinit var splitShadeStateController: SplitShadeStateController @Mock private lateinit var notifsKeyguardInteractor: NotificationsKeyguardInteractor @Mock private lateinit var areNotificationsFullyHidden: Flow<Boolean> + @Mock private lateinit var shadeInteractor: ShadeInteractor @Before fun setup() { @@ -96,13 +100,14 @@ class KeyguardClockViewModelTest : SysuiTestCase() { keyguardClockInteractor = KeyguardClockInteractor(keyguardClockRepository) whenever(notifsKeyguardInteractor.areNotificationsFullyHidden) .thenReturn(areNotificationsFullyHidden) + whenever(shadeInteractor.shadeMode).thenReturn(MutableStateFlow(ShadeMode.Single)) underTest = KeyguardClockViewModel( keyguardInteractor, keyguardClockInteractor, scope.backgroundScope, - splitShadeStateController, - notifsKeyguardInteractor + notifsKeyguardInteractor, + shadeInteractor, ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelWithKosmosTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelWithKosmosTest.kt new file mode 100644 index 000000000000..e53cd11ebe48 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelWithKosmosTest.kt @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.viewmodel + +import androidx.test.filters.SmallTest +import com.android.keyguard.KeyguardClockSwitch +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.keyguard.data.repository.keyguardClockRepository +import com.android.systemui.keyguard.data.repository.keyguardRepository +import com.android.systemui.kosmos.testScope +import com.android.systemui.shade.data.repository.shadeRepository +import com.android.systemui.shade.shared.model.ShadeMode +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlin.test.Test +import kotlinx.coroutines.test.runTest +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 + +@SmallTest +@RunWith(JUnit4::class) +class KeyguardClockViewModelWithKosmosTest : SysuiTestCase() { + private val kosmos = testKosmos() + private val underTest = kosmos.keyguardClockViewModel + private val testScope = kosmos.testScope + + @Test + fun currentClockLayout_splitShadeOn_clockCentered_largeClock() = + testScope.runTest { + with(kosmos) { + shadeRepository.setShadeMode(ShadeMode.Split) + keyguardRepository.setClockShouldBeCentered(true) + keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) + } + val currentClockLayout by collectLastValue(underTest.currentClockLayout) + assertThat(currentClockLayout).isEqualTo(KeyguardClockViewModel.ClockLayout.LARGE_CLOCK) + } + + @Test + fun currentClockLayout_splitShadeOn_clockNotCentered_largeClock_splitShadeLargeClock() = + testScope.runTest { + with(kosmos) { + shadeRepository.setShadeMode(ShadeMode.Split) + keyguardRepository.setClockShouldBeCentered(false) + keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) + } + val currentClockLayout by collectLastValue(underTest.currentClockLayout) + assertThat(currentClockLayout) + .isEqualTo(KeyguardClockViewModel.ClockLayout.SPLIT_SHADE_LARGE_CLOCK) + } + + @Test + fun currentClockLayout_splitShadeOn_clockNotCentered_smallClock_splitShadeSmallClock() = + testScope.runTest { + with(kosmos) { + shadeRepository.setShadeMode(ShadeMode.Split) + keyguardRepository.setClockShouldBeCentered(false) + keyguardClockRepository.setClockSize(KeyguardClockSwitch.SMALL) + } + val currentClockLayout by collectLastValue(underTest.currentClockLayout) + assertThat(currentClockLayout) + .isEqualTo(KeyguardClockViewModel.ClockLayout.SPLIT_SHADE_SMALL_CLOCK) + } + + @Test + fun currentClockLayout_singleShade_smallClock_smallClock() = + testScope.runTest { + with(kosmos) { + shadeRepository.setShadeMode(ShadeMode.Single) + keyguardClockRepository.setClockSize(KeyguardClockSwitch.SMALL) + } + val currentClockLayout by collectLastValue(underTest.currentClockLayout) + assertThat(currentClockLayout).isEqualTo(KeyguardClockViewModel.ClockLayout.SMALL_CLOCK) + } + + @Test + fun currentClockLayout_singleShade_largeClock_largeClock() = + testScope.runTest { + with(kosmos) { + shadeRepository.setShadeMode(ShadeMode.Single) + keyguardClockRepository.setClockSize(KeyguardClockSwitch.LARGE) + } + val currentClockLayout by collectLastValue(underTest.currentClockLayout) + assertThat(currentClockLayout).isEqualTo(KeyguardClockViewModel.ClockLayout.LARGE_CLOCK) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt index 29820f7a7249..5f7c3869fee7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt @@ -24,14 +24,13 @@ import android.view.ViewGroup import android.widget.FrameLayout import androidx.test.filters.SmallTest import com.android.keyguard.KeyguardViewController -import com.android.systemui.Flags import com.android.systemui.SysuiTestCase -import com.android.systemui.communal.domain.interactor.communalInteractor -import com.android.systemui.communal.domain.interactor.setCommunalAvailable -import com.android.systemui.communal.shared.model.CommunalScenes +import com.android.systemui.communal.ui.viewmodel.communalTransitionViewModel import com.android.systemui.controls.controller.ControlsControllerImplTest.Companion.eq import com.android.systemui.dreams.DreamOverlayStateController import com.android.systemui.keyguard.WakefulnessLifecycle +import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository +import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.kosmos.testScope import com.android.systemui.media.controls.domain.pipeline.MediaDataManager import com.android.systemui.media.controls.ui.view.MediaCarouselScrollHandler @@ -115,10 +114,10 @@ class MediaHierarchyManagerTest : SysuiTestCase() { private lateinit var isQsBypassingShade: MutableStateFlow<Boolean> private lateinit var mediaFrame: ViewGroup private val configurationController = FakeConfigurationController() - private val communalInteractor = kosmos.communalInteractor private val settings = FakeSettings() private lateinit var testableLooper: TestableLooper private lateinit var fakeHandler: FakeHandler + private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository @Before fun setup() { @@ -142,7 +141,7 @@ class MediaHierarchyManagerTest : SysuiTestCase() { mediaDataManager, keyguardViewController, dreamOverlayStateController, - communalInteractor, + kosmos.communalTransitionViewModel, configurationController, wakefulnessLifecycle, shadeInteractor, @@ -510,12 +509,11 @@ class MediaHierarchyManagerTest : SysuiTestCase() { @Test fun testCommunalLocation() = testScope.runTest { - mSetFlagsRule.enableFlags(Flags.FLAG_COMMUNAL_HUB) - kosmos.setCommunalAvailable(true) - runCurrent() - - communalInteractor.onSceneChanged(CommunalScenes.Communal) - runCurrent() + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.LOCKSCREEN, + to = KeyguardState.GLANCEABLE_HUB, + testScope = testScope, + ) verify(mediaCarouselController) .onDesiredLocationChanged( eq(MediaHierarchyManager.LOCATION_COMMUNAL_HUB), @@ -526,8 +524,11 @@ class MediaHierarchyManagerTest : SysuiTestCase() { ) clearInvocations(mediaCarouselController) - communalInteractor.onSceneChanged(CommunalScenes.Blank) - runCurrent() + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.GLANCEABLE_HUB, + to = KeyguardState.LOCKSCREEN, + testScope = testScope, + ) verify(mediaCarouselController) .onDesiredLocationChanged( eq(MediaHierarchyManager.LOCATION_QQS), @@ -541,16 +542,15 @@ class MediaHierarchyManagerTest : SysuiTestCase() { @Test fun testCommunalLocation_showsOverLockscreen() = testScope.runTest { - mSetFlagsRule.enableFlags(Flags.FLAG_COMMUNAL_HUB) - kosmos.setCommunalAvailable(true) - runCurrent() - // Device is on lock screen. whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) - // UMO goes to communal even over the lock screen. - communalInteractor.onSceneChanged(CommunalScenes.Communal) - runCurrent() + // UMO goes to communal from the lock screen. + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.LOCKSCREEN, + to = KeyguardState.GLANCEABLE_HUB, + testScope = testScope, + ) verify(mediaCarouselController) .onDesiredLocationChanged( eq(MediaHierarchyManager.LOCATION_COMMUNAL_HUB), @@ -564,15 +564,14 @@ class MediaHierarchyManagerTest : SysuiTestCase() { @Test fun testCommunalLocation_showsUntilQsExpands() = testScope.runTest { - mSetFlagsRule.enableFlags(Flags.FLAG_COMMUNAL_HUB) - kosmos.setCommunalAvailable(true) - runCurrent() - // Device is on lock screen. whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) - communalInteractor.onSceneChanged(CommunalScenes.Communal) - runCurrent() + keyguardTransitionRepository.sendTransitionSteps( + from = KeyguardState.LOCKSCREEN, + to = KeyguardState.GLANCEABLE_HUB, + testScope = testScope, + ) verify(mediaCarouselController) .onDesiredLocationChanged( eq(MediaHierarchyManager.LOCATION_COMMUNAL_HUB), diff --git a/packages/SystemUI/tests/src/com/android/systemui/monet/ColorSchemeTest.kt b/packages/SystemUI/tests/src/com/android/systemui/monet/ColorSchemeTest.kt new file mode 100644 index 000000000000..261e8c02eba6 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/monet/ColorSchemeTest.kt @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2021 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.monet + +import android.test.suitebuilder.annotation.SmallTest +import android.testing.AndroidTestingRunner +import android.util.Log +import com.android.systemui.SysuiTestCase +import com.android.systemui.theme.DynamicColors +import com.google.ux.material.libmonet.hct.Hct +import com.google.ux.material.libmonet.scheme.SchemeTonalSpot +import java.io.File +import java.io.FileWriter +import java.io.StringWriter +import javax.xml.parsers.DocumentBuilderFactory +import javax.xml.transform.OutputKeys +import javax.xml.transform.TransformerException +import javax.xml.transform.TransformerFactory +import javax.xml.transform.dom.DOMSource +import javax.xml.transform.stream.StreamResult +import kotlin.math.abs +import org.junit.Test +import org.junit.runner.RunWith +import org.w3c.dom.Document +import org.w3c.dom.Element +import org.w3c.dom.Node + +private const val fileHeader = + """ + ~ 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. +""" + +private fun testName(name: String): String { + return "Auto generated by: atest ColorSchemeTest#$name" +} + +private const val commentRoles = + "Colors used in Android system, from design system. These " + + "values can be overlaid at runtime by OverlayManager RROs." + +private const val commentOverlay = "This value can be overlaid at runtime by OverlayManager RROs." + +private fun commentWhite(paletteName: String): String { + return "Lightest shade of the $paletteName color used by the system. White. $commentOverlay" +} + +private fun commentBlack(paletteName: String): String { + return "Darkest shade of the $paletteName color used by the system. Black. $commentOverlay" +} + +private fun commentShade(paletteName: String, tone: Int): String { + return "Shade of the $paletteName system color at $tone% perceptual luminance (L* in L*a*b* " + + "color space). $commentOverlay" +} + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class ColorSchemeTest : SysuiTestCase() { + @Test + fun generateThemeStyles() { + val document = buildDoc<Any>() + + val themes = document.createElement("themes") + document.appendWithBreak(themes) + + var hue = 0.0 + while (hue < 360) { + val sourceColor = Hct.from(hue, 50.0, 50.0) + val sourceColorHex = sourceColor.toInt().toRGBHex() + + val theme = document.createElement("theme") + theme.setAttribute("color", sourceColorHex) + themes.appendChild(theme) + + for (styleValue in Style.entries) { + if ( + styleValue == Style.CLOCK || + styleValue == Style.CLOCK_VIBRANT || + styleValue == Style.CONTENT + ) { + continue + } + + val style = document.createElement(styleValue.name.lowercase()) + val colorScheme = ColorScheme(sourceColor.toInt(), false, styleValue) + + style.appendChild( + document.createTextNode( + listOf( + colorScheme.accent1, + colorScheme.accent2, + colorScheme.accent3, + colorScheme.neutral1, + colorScheme.neutral2 + ) + .flatMap { a -> listOf(*a.allShades.toTypedArray()) } + .joinToString(",", transform = Int::toRGBHex) + ) + ) + theme.appendChild(style) + } + + hue += 60 + } + + saveFile(document, "current_themes.xml") + } + + @Test + fun generateDefaultValues() { + val document = buildDoc<Any>() + + val resources = document.createElement("resources") + document.appendWithBreak(resources) + + // shade colors + val colorScheme = ColorScheme(GOOGLE_BLUE, false) + arrayOf( + Triple("accent1", "Primary", colorScheme.accent1), + Triple("accent2", "Secondary", colorScheme.accent2), + Triple("accent3", "Tertiary", colorScheme.accent3), + Triple("neutral1", "Neutral", colorScheme.neutral1), + Triple("neutral2", "Secondary Neutral", colorScheme.neutral2) + ) + .forEach { + val (paletteName, readable, palette) = it + palette.allShadesMapped.entries.forEachIndexed { index, (shade, colorValue) -> + val comment = + when (index) { + 0 -> commentWhite(readable) + palette.allShadesMapped.entries.size - 1 -> commentBlack(readable) + else -> commentShade(readable, abs(shade / 10 - 100)) + } + resources.createColorEntry("system_${paletteName}_$shade", colorValue, comment) + } + } + + resources.appendWithBreak(document.createComment(commentRoles), 2) + + // dynamic colors + arrayOf(false, true).forEach { isDark -> + val suffix = if (isDark) "_dark" else "_light" + val dynamicScheme = SchemeTonalSpot(Hct.fromInt(GOOGLE_BLUE), isDark, 0.5) + DynamicColors.allDynamicColorsMapped(false).forEach { + resources.createColorEntry( + "system_${it.first}$suffix", + it.second.getArgb(dynamicScheme) + ) + } + } + + // fixed colors + val dynamicScheme = SchemeTonalSpot(Hct.fromInt(GOOGLE_BLUE), false, 0.5) + DynamicColors.getFixedColorsMapped(false).forEach { + resources.createColorEntry("system_${it.first}", it.second.getArgb(dynamicScheme)) + } + + saveFile(document, "role_values.xml") + } + + // Helper Functions + + private inline fun <reified T> buildDoc(): Document { + val functionName = T::class.simpleName + "" + val factory = DocumentBuilderFactory.newInstance() + val builder = factory.newDocumentBuilder() + val document = builder.newDocument() + + document.appendWithBreak(document.createComment(fileHeader)) + document.appendWithBreak(document.createComment(testName(functionName))) + + return document + } + + private fun documentToString(document: Document): String { + try { + val transformerFactory = TransformerFactory.newInstance() + val transformer = transformerFactory.newTransformer() + transformer.setOutputProperty(OutputKeys.MEDIA_TYPE, "application/xml") + transformer.setOutputProperty(OutputKeys.METHOD, "xml") + transformer.setOutputProperty(OutputKeys.INDENT, "yes") + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4") + + val stringWriter = StringWriter() + transformer.transform(DOMSource(document), StreamResult(stringWriter)) + return stringWriter.toString() + } catch (e: TransformerException) { + throw RuntimeException("Error transforming XML", e) + } + } + + private fun saveFile(document: Document, fileName: String) { + val outPath = context.filesDir.path + "/" + fileName + Log.d("ColorSchemeXml", "Artifact $fileName created") + val writer = FileWriter(File(outPath)) + writer.write(documentToString(document)) + writer.close() + } +} + +private fun Element.createColorEntry(name: String, value: Int, comment: String? = null) { + val doc = this.ownerDocument + + if (comment != null) { + this.appendChild(doc.createComment(comment)) + } + + val color = doc.createElement("color") + this.appendChild(color) + + color.setAttribute("name", name) + color.appendChild(doc.createTextNode("#" + value.toRGBHex())) +} + +private fun Node.appendWithBreak(child: Node, lineBreaks: Int = 1): Node { + val doc = if (this is Document) this else this.ownerDocument + val node = doc.createTextNode("\n".repeat(lineBreaks)) + this.appendChild(node) + return this.appendChild(child) +} + +private fun Int.toRGBHex(): String { + return "%06X".format(0xFFFFFF and this) +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java index d1d9efc10ea7..a63b2211f71a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java @@ -101,12 +101,11 @@ import android.text.TextUtils; import androidx.preference.PreferenceManager; import androidx.test.filters.SmallTest; +import com.android.systemui.res.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.people.PeopleBackupFollowUpJob; import com.android.systemui.people.PeopleSpaceUtils; import com.android.systemui.people.SharedPreferencesHelper; -import com.android.systemui.res.R; -import com.android.systemui.settings.FakeUserTracker; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationListener.NotificationHandler; import com.android.systemui.statusbar.SbnBuilder; @@ -266,8 +265,6 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase { private final FakeExecutor mFakeExecutor = new FakeExecutor(mClock); - private final FakeUserTracker mUserTracker = new FakeUserTracker(); - @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); @@ -275,7 +272,7 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase { mManager = new PeopleSpaceWidgetManager(mContext, mAppWidgetManager, mIPeopleManager, mPeopleManager, mLauncherApps, mNotifCollection, mPackageManager, Optional.of(mBubbles), mUserManager, mBackupManager, mINotificationManager, - mNotificationManager, mFakeExecutor, mUserTracker); + mNotificationManager, mFakeExecutor); mManager.attach(mListenerService); verify(mListenerService).addNotificationHandler(mListenerCaptor.capture()); @@ -1565,43 +1562,6 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase { String.valueOf(WIDGET_ID_WITH_KEY_IN_OPTIONS)); } - @Test - public void testUpdateGeneratedPreview_flagDisabled() { - mSetFlagsRule.disableFlags(android.appwidget.flags.Flags.FLAG_GENERATED_PREVIEWS); - mManager.updateGeneratedPreviewForUser(mUserTracker.getUserHandle()); - verify(mAppWidgetManager, times(0)).setWidgetPreview(any(), anyInt(), any()); - } - - @Test - public void testUpdateGeneratedPreview_userLocked() { - mSetFlagsRule.enableFlags(android.appwidget.flags.Flags.FLAG_GENERATED_PREVIEWS); - when(mUserManager.isUserUnlocked(mUserTracker.getUserHandle())).thenReturn(false); - - mManager.updateGeneratedPreviewForUser(mUserTracker.getUserHandle()); - verify(mAppWidgetManager, times(0)).setWidgetPreview(any(), anyInt(), any()); - } - - @Test - public void testUpdateGeneratedPreview_userUnlocked() { - mSetFlagsRule.enableFlags(android.appwidget.flags.Flags.FLAG_GENERATED_PREVIEWS); - when(mUserManager.isUserUnlocked(mUserTracker.getUserHandle())).thenReturn(true); - when(mAppWidgetManager.setWidgetPreview(any(), anyInt(), any())).thenReturn(true); - - mManager.updateGeneratedPreviewForUser(mUserTracker.getUserHandle()); - verify(mAppWidgetManager, times(1)).setWidgetPreview(any(), anyInt(), any()); - } - - @Test - public void testUpdateGeneratedPreview_doesNotSetTwice() { - mSetFlagsRule.enableFlags(android.appwidget.flags.Flags.FLAG_GENERATED_PREVIEWS); - when(mUserManager.isUserUnlocked(mUserTracker.getUserHandle())).thenReturn(true); - when(mAppWidgetManager.setWidgetPreview(any(), anyInt(), any())).thenReturn(true); - - mManager.updateGeneratedPreviewForUser(mUserTracker.getUserHandle()); - mManager.updateGeneratedPreviewForUser(mUserTracker.getUserHandle()); - verify(mAppWidgetManager, times(1)).setWidgetPreview(any(), anyInt(), any()); - } - private void setFinalField(String fieldName, int value) { try { Field field = NotificationManager.Policy.class.getDeclaredField(fieldName); diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java deleted file mode 100644 index 9ea30d676dc5..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ActionProxyReceiverTest.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2020 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.screenshot; - -import static com.android.systemui.screenshot.ScreenshotController.ACTION_TYPE_SHARE; -import static com.android.systemui.screenshot.ScreenshotController.EXTRA_ID; -import static com.android.systemui.screenshot.ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED; -import static com.android.systemui.statusbar.phone.CentralSurfaces.SYSTEM_DIALOG_REASON_SCREENSHOT; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isNull; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; - -import android.app.PendingIntent; -import android.content.Intent; -import android.os.Bundle; -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 org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.stubbing.Answer; - -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeoutException; - -@RunWith(AndroidTestingRunner.class) -@SmallTest -public class ActionProxyReceiverTest extends SysuiTestCase { - @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); - - @Before - public void setup() throws InterruptedException, ExecutionException, TimeoutException { - MockitoAnnotations.initMocks(this); - mIntent = new Intent(mContext, ActionProxyReceiver.class) - .putExtra(ScreenshotController.EXTRA_ACTION_INTENT, mMockPendingIntent); - } - - @Test - public void testPendingIntentSentWithStatusBar() throws PendingIntent.CanceledException { - ActionProxyReceiver actionProxyReceiver = constructActionProxyReceiver(); - // ensure that the pending intent call is passed through - doAnswer((Answer<Object>) invocation -> { - ((Runnable) invocation.getArgument(0)).run(); - return null; - }).when(mActivityStarter).executeRunnableDismissingKeyguard( - any(Runnable.class), isNull(), anyBoolean(), anyBoolean(), anyBoolean()); - - actionProxyReceiver.onReceive(mContext, mIntent); - - verify(mMockActivityManagerWrapper).closeSystemWindows(SYSTEM_DIALOG_REASON_SCREENSHOT); - 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)); - } - - @Test - public void testSmartActionsNotNotifiedByDefault() { - ActionProxyReceiver actionProxyReceiver = constructActionProxyReceiver(); - - actionProxyReceiver.onReceive(mContext, mIntent); - - verify(mMockScreenshotSmartActions, never()) - .notifyScreenshotAction(anyString(), anyString(), anyBoolean(), - any(Intent.class)); - } - - @Test - public void testSmartActionsNotifiedIfEnabled() { - ActionProxyReceiver actionProxyReceiver = constructActionProxyReceiver(); - mIntent.putExtra(EXTRA_SMART_ACTIONS_ENABLED, true); - String testId = "testID"; - mIntent.putExtra(EXTRA_ID, testId); - - actionProxyReceiver.onReceive(mContext, mIntent); - - verify(mMockScreenshotSmartActions).notifyScreenshotAction( - testId, ACTION_TYPE_SHARE, false, null); - } - - private ActionProxyReceiver constructActionProxyReceiver() { - return new ActionProxyReceiver( - mMockActivityManagerWrapper, - mMockScreenshotSmartActions, - mDisplayTracker, - mActivityStarter - ); - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/DeleteScreenshotReceiverTest.java b/packages/SystemUI/tests/src/com/android/systemui/screenshot/DeleteScreenshotReceiverTest.java deleted file mode 100644 index d58f47a0469a..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/DeleteScreenshotReceiverTest.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (C) 2020 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.screenshot; - -import static com.android.systemui.screenshot.ScreenshotController.ACTION_TYPE_DELETE; -import static com.android.systemui.screenshot.ScreenshotController.EXTRA_ID; -import static com.android.systemui.screenshot.ScreenshotController.EXTRA_SMART_ACTIONS_ENABLED; -import static com.android.systemui.screenshot.ScreenshotController.SCREENSHOT_URI_ID; - -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertNotNull; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; - -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Intent; -import android.database.Cursor; -import android.net.Uri; -import android.os.Environment; -import android.provider.MediaStore; -import android.testing.AndroidTestingRunner; - -import androidx.test.filters.SmallTest; - -import com.android.systemui.SysuiTestCase; -import com.android.systemui.util.concurrency.FakeExecutor; -import com.android.systemui.util.time.FakeSystemClock; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.io.File; -import java.util.concurrent.Executor; - -@RunWith(AndroidTestingRunner.class) -@SmallTest -public class DeleteScreenshotReceiverTest extends SysuiTestCase { - - @Mock - private ScreenshotSmartActions mMockScreenshotSmartActions; - @Mock - private Executor mMockExecutor; - - private DeleteScreenshotReceiver mDeleteScreenshotReceiver; - private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); - - @Before - public void setup() { - MockitoAnnotations.initMocks(this); - mDeleteScreenshotReceiver = - new DeleteScreenshotReceiver(mMockScreenshotSmartActions, mMockExecutor); - } - - @Test - public void testNoUriProvided() { - Intent intent = new Intent(mContext, DeleteScreenshotReceiver.class); - - mDeleteScreenshotReceiver.onReceive(mContext, intent); - - verify(mMockExecutor, never()).execute(any(Runnable.class)); - verify(mMockScreenshotSmartActions, never()).notifyScreenshotAction( - any(String.class), any(String.class), anyBoolean(), - any(Intent.class)); - } - - @Test - public void testFileDeleted() { - DeleteScreenshotReceiver deleteScreenshotReceiver = - new DeleteScreenshotReceiver(mMockScreenshotSmartActions, mFakeExecutor); - ContentResolver contentResolver = mContext.getContentResolver(); - final Uri testUri = contentResolver.insert( - MediaStore.Images.Media.EXTERNAL_CONTENT_URI, getFakeContentValues()); - assertNotNull(testUri); - - try { - Cursor cursor = - contentResolver.query(testUri, null, null, null, null); - assertEquals(1, cursor.getCount()); - Intent intent = new Intent(mContext, DeleteScreenshotReceiver.class) - .putExtra(SCREENSHOT_URI_ID, testUri.toString()); - - deleteScreenshotReceiver.onReceive(mContext, intent); - int runCount = mFakeExecutor.runAllReady(); - - assertEquals(1, runCount); - cursor = - contentResolver.query(testUri, null, null, null, null); - assertEquals(0, cursor.getCount()); - } finally { - contentResolver.delete(testUri, null, null); - } - - // ensure smart actions not called by default - verify(mMockScreenshotSmartActions, never()).notifyScreenshotAction( - any(String.class), any(String.class), anyBoolean(), any(Intent.class)); - } - - @Test - public void testNotifyScreenshotAction() { - Intent intent = new Intent(mContext, DeleteScreenshotReceiver.class); - String uriString = "testUri"; - String testId = "testID"; - intent.putExtra(SCREENSHOT_URI_ID, uriString); - intent.putExtra(EXTRA_ID, testId); - intent.putExtra(EXTRA_SMART_ACTIONS_ENABLED, true); - - mDeleteScreenshotReceiver.onReceive(mContext, intent); - - verify(mMockExecutor).execute(any(Runnable.class)); - verify(mMockScreenshotSmartActions).notifyScreenshotAction(testId, - ACTION_TYPE_DELETE, false, null); - } - - private static ContentValues getFakeContentValues() { - final ContentValues values = new ContentValues(); - values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES - + File.separator + Environment.DIRECTORY_SCREENSHOTS); - values.put(MediaStore.MediaColumns.DISPLAY_NAME, "test_screenshot"); - values.put(MediaStore.MediaColumns.MIME_TYPE, "image/png"); - values.put(MediaStore.MediaColumns.DATE_ADDED, 0); - values.put(MediaStore.MediaColumns.DATE_MODIFIED, 0); - return values; - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotifBindPipelineTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotifBindPipelineTest.java index 6faebf6ce335..25172deb67a7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotifBindPipelineTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotifBindPipelineTest.java @@ -34,6 +34,8 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener; import com.android.systemui.statusbar.notification.row.NotifBindPipeline.BindCallback; +import com.android.systemui.util.concurrency.FakeExecutor; +import com.android.systemui.util.time.FakeSystemClock; import org.junit.Before; import org.junit.Test; @@ -51,7 +53,8 @@ import java.util.List; public class NotifBindPipelineTest extends SysuiTestCase { private NotifBindPipeline mBindPipeline; - private TestBindStage mStage = new TestBindStage(); + private final TestBindStage mStage = new TestBindStage(); + private final FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); @Mock private NotificationEntry mEntry; @Mock private ExpandableNotificationRow mRow; @@ -64,7 +67,7 @@ public class NotifBindPipelineTest extends SysuiTestCase { mBindPipeline = new NotifBindPipeline( collection, new NotifBindPipelineLogger(logcatLogBuffer()), - TestableLooper.get(this).getLooper()); + new NotificationEntryProcessorFactoryExecutorImpl(mFakeExecutor)); mBindPipeline.setStage(mStage); ArgumentCaptor<NotifCollectionListener> collectionListenerCaptor = @@ -83,7 +86,7 @@ public class NotifBindPipelineTest extends SysuiTestCase { // WHEN content is invalidated BindCallback callback = mock(BindCallback.class); mStage.requestRebind(mEntry, callback); - TestableLooper.get(this).processAllMessages(); + mFakeExecutor.runAllReady(); // WHEN stage finishes its work mStage.doWorkSynchronously(); @@ -100,7 +103,7 @@ public class NotifBindPipelineTest extends SysuiTestCase { // GIVEN an in-progress pipeline run BindCallback callback = mock(BindCallback.class); CancellationSignal signal = mStage.requestRebind(mEntry, callback); - TestableLooper.get(this).processAllMessages(); + mFakeExecutor.runAllReady(); // WHEN the callback is cancelled. signal.cancel(); @@ -120,12 +123,12 @@ public class NotifBindPipelineTest extends SysuiTestCase { // WHEN the pipeline is invalidated. BindCallback callback = mock(BindCallback.class); mStage.requestRebind(mEntry, callback); - TestableLooper.get(this).processAllMessages(); + mFakeExecutor.runAllReady(); // WHEN the pipeline is invalidated again before the work completes. BindCallback callback2 = mock(BindCallback.class); mStage.requestRebind(mEntry, callback2); - TestableLooper.get(this).processAllMessages(); + mFakeExecutor.runAllReady(); // WHEN the stage finishes all work. mStage.doWorkSynchronously(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java index 3b78b7e492f5..09a3eb480a49 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationTestHelper.java @@ -23,6 +23,7 @@ import static android.app.NotificationManager.IMPORTANCE_HIGH; import static com.android.systemui.log.LogBufferHelperKt.logcatLogBuffer; import static com.android.systemui.statusbar.NotificationEntryHelper.modifyRanking; +import static com.android.systemui.util.Assert.runWithCurrentThreadAsMainThread; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -42,6 +43,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.LauncherApps; import android.graphics.drawable.Icon; +import android.os.Looper; import android.os.UserHandle; import android.service.notification.StatusBarNotification; import android.testing.TestableLooper; @@ -90,6 +92,8 @@ import com.android.systemui.statusbar.policy.InflatedSmartReplyViewHolder; import com.android.systemui.statusbar.policy.SmartReplyConstants; import com.android.systemui.statusbar.policy.SmartReplyStateInflater; import com.android.systemui.statusbar.policy.dagger.RemoteInputViewSubcomponent; +import com.android.systemui.util.concurrency.FakeExecutor; +import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.util.time.SystemClock; import com.android.systemui.util.time.SystemClockImpl; import com.android.systemui.wmshell.BubblesManager; @@ -123,7 +127,7 @@ public class NotificationTestHelper { private static final String APP_NAME = "appName"; private final Context mContext; - private final TestableLooper mTestLooper; + private final Runnable mBindPipelineAdvancement; private int mId; private final ExpandableNotificationRowLogger mMockLogger; private final GroupMembershipManager mGroupMembershipManager; @@ -151,18 +155,23 @@ public class NotificationTestHelper { public NotificationTestHelper( Context context, + TestableDependency dependency) { + this(context, dependency, null); + } + + public NotificationTestHelper( + Context context, TestableDependency dependency, - TestableLooper testLooper) { + @Nullable TestableLooper testLooper) { this(context, dependency, testLooper, new FakeFeatureFlags()); } public NotificationTestHelper( Context context, TestableDependency dependency, - TestableLooper testLooper, + @Nullable TestableLooper testLooper, @NonNull FakeFeatureFlags featureFlags) { mContext = context; - mTestLooper = testLooper; mFeatureFlags = Objects.requireNonNull(featureFlags); dependency.injectTestDependency(FeatureFlags.class, mFeatureFlags); dependency.injectMockDependency(NotificationMediaManager.class); @@ -198,10 +207,27 @@ public class NotificationTestHelper { CommonNotifCollection collection = mock(CommonNotifCollection.class); + // NOTE: This helper supports using either a TestableLooper or its own private FakeExecutor. + final Runnable processorAdvancement; + final NotificationEntryProcessorFactory processorFactory; + if (testLooper == null) { + FakeExecutor fakeExecutor = new FakeExecutor(new FakeSystemClock()); + processorAdvancement = () -> { + runWithCurrentThreadAsMainThread(fakeExecutor::runAllReady); + }; + processorFactory = new NotificationEntryProcessorFactoryExecutorImpl(fakeExecutor); + } else { + Looper looper = testLooper.getLooper(); + processorAdvancement = () -> { + runWithCurrentThreadAsMainThread(testLooper::processAllMessages); + }; + processorFactory = new NotificationEntryProcessorFactoryLooperImpl(looper); + } + mBindPipelineAdvancement = processorAdvancement; mBindPipeline = new NotifBindPipeline( collection, new NotifBindPipelineLogger(logcatLogBuffer()), - mTestLooper.getLooper()); + processorFactory); mBindPipeline.setStage(mBindStage); ArgumentCaptor<NotifCollectionListener> collectionListenerCaptor = @@ -643,7 +669,7 @@ public class NotificationTestHelper { private void inflateAndWait(NotificationEntry entry) throws Exception { CountDownLatch countDownLatch = new CountDownLatch(1); mBindStage.requestRebind(entry, en -> countDownLatch.countDown()); - mTestLooper.processAllMessages(); + mBindPipelineAdvancement.run(); assertTrue(countDownLatch.await(500, TimeUnit.MILLISECONDS)); } 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 dcbb93aa496b..d5c40538586e 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 @@ -49,9 +49,8 @@ import com.android.systemui.shade.CameraLauncher; import com.android.systemui.shade.QuickSettingsController; import com.android.systemui.shade.ShadeController; import com.android.systemui.shade.ShadeViewController; -import com.android.systemui.shade.domain.interactor.PanelExpansionInteractorImpl; +import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor; import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.disableflags.DisableFlagsLogger; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -79,7 +78,7 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { @Mock private CommandQueue mCommandQueue; @Mock private QuickSettingsController mQuickSettingsController; @Mock private ShadeViewController mShadeViewController; - @Mock private PanelExpansionInteractorImpl mPanelExpansionInteractor; + @Mock private PanelExpansionInteractor mPanelExpansionInteractor; @Mock private RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler; private final MetricsLogger mMetricsLogger = new FakeMetricsLogger(); @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; @@ -129,7 +128,6 @@ public class CentralSurfacesCommandQueueCallbacksTest extends SysuiTestCase { mStatusBarHideIconsForBouncerManager, mPowerManager, Optional.of(mVibrator), - new DisableFlagsLogger(), DEFAULT_DISPLAY, mCameraLauncherLazy, mUserTracker, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationControllerTest.kt index 57a89b29b77c..de1891355f29 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationControllerTest.kt @@ -27,6 +27,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.keyguard.KeyguardViewMediator import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.shade.ShadeViewController +import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor import com.android.systemui.statusbar.LightRevealScrim import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.StatusBarStateControllerImpl @@ -67,6 +68,8 @@ class UnlockedScreenOffAnimationControllerTest : SysuiTestCase() { @Mock private lateinit var shadeViewController: ShadeViewController @Mock + private lateinit var panelExpansionInteractor: PanelExpansionInteractor + @Mock private lateinit var notifShadeWindowController: NotificationShadeWindowController @Mock private lateinit var lightRevealScrim: LightRevealScrim @@ -87,17 +90,18 @@ class UnlockedScreenOffAnimationControllerTest : SysuiTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) controller = UnlockedScreenOffAnimationController( - context, - wakefulnessLifecycle, - statusBarStateController, - { keyguardViewMediator }, - keyguardStateController, - { dozeParameters }, - globalSettings, - { notifShadeWindowController }, - interactionJankMonitor, - powerManager, - handler = handler + context, + wakefulnessLifecycle, + statusBarStateController, + { keyguardViewMediator }, + keyguardStateController, + { dozeParameters }, + globalSettings, + { notifShadeWindowController }, + interactionJankMonitor, + powerManager, + { panelExpansionInteractor }, + handler, ) controller.initialize(centralSurfaces, shadeViewController, lightRevealScrim) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java index 3555a7415435..dc0d07cab92d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyConstantsTest.java @@ -32,6 +32,8 @@ import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.systemui.res.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.util.DeviceConfigProxyFake; +import com.android.systemui.util.concurrency.FakeExecutor; +import com.android.systemui.util.time.FakeSystemClock; import org.junit.Before; import org.junit.Test; @@ -43,7 +45,8 @@ import org.junit.runner.RunWith; public class SmartReplyConstantsTest extends SysuiTestCase { private SmartReplyConstants mConstants; private DeviceConfigProxyFake mDeviceConfig; - private TestableLooper mTestableLooper; + private final FakeSystemClock mFakeSystemClock = new FakeSystemClock(); + private final FakeExecutor mFakeExecutor = new FakeExecutor(mFakeSystemClock); @Before public void setUp() { @@ -60,9 +63,8 @@ public class SmartReplyConstantsTest extends SysuiTestCase { 2); resources.addOverride( R.integer.config_smart_replies_in_notifications_max_num_actions, -1); - mTestableLooper = TestableLooper.get(this); mConstants = new SmartReplyConstants( - new Handler(mTestableLooper.getLooper()), + mFakeExecutor, mContext, mDeviceConfig ); @@ -210,6 +212,6 @@ public class SmartReplyConstantsTest extends SysuiTestCase { private void overrideSetting(String propertyName, String value) { mDeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, propertyName, value, false /* makeDefault */); - mTestableLooper.processAllMessages(); + mFakeExecutor.runAllReady(); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java index ab28a2fc830f..ed7c9568a9db 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java @@ -985,7 +985,7 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { FabricatedOverlay neutrals = overlays[1]; FabricatedOverlay dynamic = overlays[2]; - final int colorsPerPalette = 12; + final int colorsPerPalette = 13; // Color resources were added for all 3 accent palettes verify(accents, times(colorsPerPalette * 3)) diff --git a/packages/SystemUI/tests/utils/src/android/animation/AnimatorTestRule.java b/packages/SystemUI/tests/utils/src/android/animation/AnimatorTestRule.java index 5860c2dd4cdc..3b39e1fc6bc7 100644 --- a/packages/SystemUI/tests/utils/src/android/animation/AnimatorTestRule.java +++ b/packages/SystemUI/tests/utils/src/android/animation/AnimatorTestRule.java @@ -16,8 +16,6 @@ package android.animation; -import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; - import android.animation.AnimationHandler.AnimationFrameCallback; import android.annotation.NonNull; import android.annotation.Nullable; @@ -34,6 +32,7 @@ import androidx.test.platform.app.InstrumentationRegistry; import com.android.internal.util.Preconditions; +import org.junit.AssumptionViolatedException; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; @@ -204,7 +203,8 @@ public final class AnimatorTestRule implements TestRule { } long outputTime = AnimationUtils.currentAnimationTimeMillis(); if (outputTime != desiredTime) { - throw new AssertionError("currentAnimationTimeMillis() is " + outputTime + // Skip the test (rather than fail it) if there's a clock issue + throw new AssumptionViolatedException("currentAnimationTimeMillis() is " + outputTime + " after locking to " + desiredTime); } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelKosmos.kt new file mode 100644 index 000000000000..23967224e43a --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/communal/ui/viewmodel/CommunalTransitionViewModelKosmos.kt @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.ui.viewmodel + +import com.android.systemui.keyguard.ui.viewmodel.dreamingToGlanceableHubTransitionViewModel +import com.android.systemui.keyguard.ui.viewmodel.glanceableHubToDreamingTransitionViewModel +import com.android.systemui.keyguard.ui.viewmodel.glanceableHubToLockscreenTransitionViewModel +import com.android.systemui.keyguard.ui.viewmodel.lockscreenToGlanceableHubTransitionViewModel +import com.android.systemui.kosmos.Kosmos +import kotlinx.coroutines.ExperimentalCoroutinesApi + +@OptIn(ExperimentalCoroutinesApi::class) +val Kosmos.communalTransitionViewModel by + Kosmos.Fixture { + CommunalTransitionViewModel( + glanceableHubToLockscreenTransitionViewModel, + lockscreenToGlanceableHubTransitionViewModel, + dreamingToGlanceableHubTransitionViewModel, + glanceableHubToDreamingTransitionViewModel, + ) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/EnableSceneContainer.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/EnableSceneContainer.kt index cceb3ffab282..f65c74fcebc8 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/flags/EnableSceneContainer.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/flags/EnableSceneContainer.kt @@ -19,6 +19,7 @@ package com.android.systemui.flags import android.platform.test.annotations.EnableFlags import com.android.systemui.Flags.FLAG_COMPOSE_LOCKSCREEN import com.android.systemui.Flags.FLAG_KEYGUARD_BOTTOM_AREA_REFACTOR +import com.android.systemui.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR import com.android.systemui.Flags.FLAG_MEDIA_IN_SCENE_CONTAINER import com.android.systemui.Flags.FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT import com.android.systemui.Flags.FLAG_SCENE_CONTAINER @@ -33,6 +34,7 @@ import com.android.systemui.Flags.FLAG_SCENE_CONTAINER FLAG_MIGRATE_CLOCKS_TO_BLUEPRINT, FLAG_COMPOSE_LOCKSCREEN, FLAG_MEDIA_IN_SCENE_CONTAINER, + FLAG_KEYGUARD_WM_STATE_REFACTOR, ) @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractorKosmos.kt index d84988da7cc3..29167d64d1f1 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractorKosmos.kt @@ -27,6 +27,7 @@ val Kosmos.windowManagerLockscreenVisibilityInteractor by surfaceBehindInteractor = keyguardSurfaceBehindInteractor, fromLockscreenInteractor = fromLockscreenTransitionInteractor, fromBouncerInteractor = fromPrimaryBouncerTransitionInteractor, + fromAlternateBouncerInteractor = fromAlternateBouncerTransitionInteractor, notificationLaunchAnimationInteractor = notificationLaunchAnimationInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt index 4a85909ae996..60dd48aeaf61 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardClockViewModelKosmos.kt @@ -20,8 +20,8 @@ import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationsKeyguardInteractor -import com.android.systemui.statusbar.policy.splitShadeStateController val Kosmos.keyguardClockViewModel by Kosmos.Fixture { @@ -29,7 +29,7 @@ val Kosmos.keyguardClockViewModel by keyguardInteractor = keyguardInteractor, keyguardClockInteractor = keyguardClockInteractor, applicationScope = applicationCoroutineScope, - splitShadeStateController = splitShadeStateController, notifsKeyguardInteractor = notificationsKeyguardInteractor, + shadeInteractor = shadeInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelKosmos.kt index 8da5dd46b62a..f0fedd2ed479 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModelKosmos.kt @@ -20,7 +20,7 @@ import com.android.systemui.biometrics.authController import com.android.systemui.keyguard.domain.interactor.keyguardBlueprintInteractor import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor import com.android.systemui.kosmos.Kosmos -import com.android.systemui.statusbar.policy.splitShadeStateController +import com.android.systemui.shade.domain.interactor.shadeInteractor val Kosmos.lockscreenContentViewModel by Kosmos.Fixture { @@ -29,6 +29,6 @@ val Kosmos.lockscreenContentViewModel by interactor = keyguardBlueprintInteractor, authController = authController, longPress = keyguardLongPressViewModel, - splitShadeStateController = splitShadeStateController, + shadeInteractor = shadeInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/domain/interactor/KeyguardViewOcclusionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/domain/interactor/StatusBarKeyguardViewManagerInteractorKosmos.kt index 9e34fe8d7c61..2ed56ce0bf24 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/domain/interactor/KeyguardViewOcclusionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/domain/interactor/StatusBarKeyguardViewManagerInteractorKosmos.kt @@ -16,7 +16,9 @@ package com.android.systemui.statusbar.domain.interactor +import com.android.systemui.keyguard.domain.interactor.keyguardSurfaceBehindInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor +import com.android.systemui.keyguard.domain.interactor.windowManagerLockscreenVisibilityInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.power.domain.interactor.powerInteractor @@ -26,5 +28,7 @@ val Kosmos.statusBarKeyguardViewManagerInteractor by keyguardTransitionInteractor = this.keyguardTransitionInteractor, keyguardOcclusionInteractor = this.keyguardOcclusionInteractor, powerInteractor = this.powerInteractor, + wmLockscreenVisibilityInteractor = windowManagerLockscreenVisibilityInteractor, + surfaceBehindInteractor = keyguardSurfaceBehindInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt index bada2a61995d..7e63eaaf9ec9 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationStackAppearanceViewModelKosmos.kt @@ -19,12 +19,14 @@ package com.android.systemui.statusbar.notification.stack.ui.viewmodel import com.android.systemui.dump.dumpManager import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture +import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationStackAppearanceInteractor val Kosmos.notificationStackAppearanceViewModel by Fixture { NotificationStackAppearanceViewModel( + applicationScope = applicationCoroutineScope, dumpManager = dumpManager, stackAppearanceInteractor = notificationStackAppearanceInteractor, shadeInteractor = shadeInteractor, diff --git a/services/Android.bp b/services/Android.bp index 87096928af7c..98a7979de30a 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -119,6 +119,7 @@ filegroup { ":services.companion-sources", ":services.contentcapture-sources", ":services.contentsuggestions-sources", + ":services.contextualsearch-sources", ":services.coverage-sources", ":services.credentials-sources", ":services.devicepolicy-sources", @@ -208,6 +209,7 @@ java_library { "services.companion", "services.contentcapture", "services.contentsuggestions", + "services.contextualsearch", "services.coverage", "services.credentials", "services.devicepolicy", diff --git a/services/accessibility/OWNERS b/services/accessibility/OWNERS index 6e76a207e06f..0e35a409c82c 100644 --- a/services/accessibility/OWNERS +++ b/services/accessibility/OWNERS @@ -1,6 +1,13 @@ -pweaver@google.com -sallyyuen@google.com -ryanlwlin@google.com -fuego@google.com +# Bug component: 44215 + +# Android Accessibility Framework owners danielnorman@google.com aarmaly@google.com +chunkulin@google.com +fuego@google.com +sallyyuen@google.com + +# Android Accessibility members who have OWNERS but should not be sent +# day-to-day changes for code review: +pweaver@google.com #{LAST_RESORT_SUGGESTION} +ryanlwlin@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index f3e53fe301d4..4e14dee8acba 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -935,34 +935,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } final AccessibilityUserState userState = getUserStateLocked(userId); - if (Flags.disableContinuousShortcutOnForceStop()) { - if (doit && onPackagesForceStoppedLocked(packages, userState)) { - onUserStateChangedLocked(userState); - return false; - } else { - return true; - } - } else { - final Iterator<ComponentName> it = userState.mEnabledServices.iterator(); - while (it.hasNext()) { - final ComponentName comp = it.next(); - final String compPkg = comp.getPackageName(); - for (String pkg : packages) { - if (compPkg.equals(pkg)) { - if (!doit) { - return true; - } - it.remove(); - userState.getBindingServicesLocked().remove(comp); - userState.getCrashedServicesLocked().remove(comp); - persistComponentNamesToSettingLocked( - Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, - userState.mEnabledServices, userId); - onUserStateChangedLocked(userState); - } - } - } + if (doit && onPackagesForceStoppedLocked(packages, userState)) { + onUserStateChangedLocked(userState); return false; + } else { + return true; } } } diff --git a/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java index 6aa4702ec7d5..b77b2bef57a2 100644 --- a/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/ProxyAccessibilityServiceConnection.java @@ -126,7 +126,7 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon * @param infos the list of enabled and installed services. */ @Override - public void setInstalledAndEnabledServices(List<AccessibilityServiceInfo> infos) { + public void setInstalledAndEnabledServices(@NonNull List<AccessibilityServiceInfo> infos) { final long identity = Binder.clearCallingIdentity(); try { synchronized (mLock) { @@ -216,9 +216,11 @@ public class ProxyAccessibilityServiceConnection extends AccessibilityServiceCon } @Override + @NonNull public List<AccessibilityServiceInfo> getInstalledAndEnabledServices() { synchronized (mLock) { - return mInstalledAndEnabledServices; + return mInstalledAndEnabledServices != null + ? mInstalledAndEnabledServices : Collections.emptyList(); } } diff --git a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java index 1f8736b770e2..c3d97904e430 100644 --- a/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java +++ b/services/backup/java/com/android/server/backup/PackageManagerBackupAgent.java @@ -99,6 +99,9 @@ public class PackageManagerBackupAgent extends BackupAgent { // The version info of each backed-up app as read from the state file private HashMap<String, Metadata> mStateVersions = new HashMap<String, Metadata>(); + // The ancestral record version as read from the state file + private int mStoredAncestralRecordVersion; + private final HashSet<String> mExisting = new HashSet<String>(); private int mStoredSdkVersion; private String mStoredIncrementalVersion; @@ -233,17 +236,32 @@ public class PackageManagerBackupAgent extends BackupAgent { * int ancestralRecordVersion -- the version of the format in which this backup set is * produced */ + boolean upgradingAncestralRecordVersion = false; try { - if (DEBUG) Slog.v(TAG, "Storing ancestral record version key"); - outputBufferStream.writeInt(ANCESTRAL_RECORD_VERSION); - writeEntity(data, ANCESTRAL_RECORD_KEY, outputBuffer.toByteArray()); - } catch (IOException e) { - // Real error writing data - Slog.e(TAG, "Unable to write package backup data file!"); - return; - } + if (!mExisting.contains(ANCESTRAL_RECORD_KEY)) { + // The old state does not store info on ancestral record + Slog.v( + TAG, + "No ancestral record version in the old state. Storing " + + "ancestral record version key"); + outputBufferStream.writeInt(ANCESTRAL_RECORD_VERSION); + writeEntity(data, ANCESTRAL_RECORD_KEY, outputBuffer.toByteArray()); + upgradingAncestralRecordVersion = true; + } else if (mStoredAncestralRecordVersion != ANCESTRAL_RECORD_VERSION) { + // The current ancestral record version has changed from the old state + Slog.v( + TAG, + "Ancestral record version has changed from old state. Storing" + + "ancestral record version key"); + outputBufferStream.writeInt(ANCESTRAL_RECORD_VERSION); + writeEntity(data, ANCESTRAL_RECORD_KEY, outputBuffer.toByteArray()); + upgradingAncestralRecordVersion = true; + mExisting.remove(ANCESTRAL_RECORD_KEY); + } else { + if (DEBUG) Slog.v(TAG, "Ancestral record version has not changed"); + mExisting.remove(ANCESTRAL_RECORD_KEY); + } - try { /* * Global metadata: * @@ -286,13 +304,16 @@ public class PackageManagerBackupAgent extends BackupAgent { } if (mExisting.contains(packName)) { - // We have backed up this app before. Check whether the version - // of the backup matches the version of the current app; if they + // We have backed up this app before. If the current ancestral record + // version is the same as what is in the old state, check whether the + // version of the backup matches the version of the current app; if they // don't match, the app has been updated and we need to store its // metadata again. In either case, take it out of mExisting so that // we don't consider it deleted later. mExisting.remove(packName); - if (info.getLongVersionCode() == mStateVersions.get(packName).versionCode) { + if (!upgradingAncestralRecordVersion + && info.getLongVersionCode() + == mStateVersions.get(packName).versionCode) { continue; } } @@ -346,18 +367,35 @@ public class PackageManagerBackupAgent extends BackupAgent { // At this point, the only entries in 'existing' are apps that were // mentioned in the saved state file, but appear to no longer be present - // on the device. We want to preserve the entry for them, however, - // because we want the right thing to happen if the user goes through - // a backup / uninstall / backup / reinstall sequence. - if (DEBUG) { - if (mExisting.size() > 0) { - StringBuilder sb = new StringBuilder(64); - sb.append("Preserving metadata for deleted packages:"); - for (String app : mExisting) { - sb.append(' '); - sb.append(app); + // on the device. + if (!mExisting.isEmpty()) { + // If the ancestral record version has changed from the previous state we delete the + // existing keys for apps that are no longer installed. We should do this, otherwise + // we'd leave a key/value pair behind in the old format which could cause problems. + if (upgradingAncestralRecordVersion) { + for (String pkgName : mExisting) { + Slog.i( + TAG, + "Ancestral state updated - Deleting uninstalled package: " + + pkgName + + " from existing backup"); + data.writeEntityHeader(pkgName, -1); + } + mExisting.clear(); + } else { + // If the ancestral record version is unchanged from the previous state, we + // don't to anything to preserve the key/value entry for them. We do this + // because we want the right thing to happen if the user goes through a + // backup / uninstall / backup / reinstall sequence. + if (DEBUG) { + StringBuilder sb = new StringBuilder(64); + sb.append("Preserving metadata for deleted packages:"); + for (String app : mExisting) { + sb.append(' '); + sb.append(app); + } + Slog.v(TAG, sb.toString()); } - Slog.v(TAG, sb.toString()); } } } catch (IOException e) { @@ -506,6 +544,7 @@ public class PackageManagerBackupAgent extends BackupAgent { mStoredHomeComponent = null; mStoredHomeVersion = 0; mStoredHomeSigHashes = null; + mStoredAncestralRecordVersion = UNDEFINED_ANCESTRAL_RECORD_VERSION; // The state file is just the list of app names we have stored signatures for // with the exception of the metadata block, to which is also appended the @@ -541,7 +580,25 @@ public class PackageManagerBackupAgent extends BackupAgent { ignoreExisting = true; } - // First comes the preferred home app data, if any, headed by the DEFAULT_HOME_KEY tag + // First comes the ancestral record block headed by the ANCESTRAL_RECORD_KEY tag + if (pkg.equals(ANCESTRAL_RECORD_KEY)) { + mStoredAncestralRecordVersion = in.readInt(); + if (!ignoreExisting) { + mExisting.add(ANCESTRAL_RECORD_KEY); + } + pkg = in.readUTF(); // set up for the next block of state + } else { + // This is an old version of the state file in which ANCESTRAL_RECORD_KEY is not + // stored. In this case onBackup will write the ANCESTRAL_KEY_VALUE to the new + // state. + Slog.i( + TAG, + "Older version of saved state - does not contain ancestral record " + + "version"); + } + + // Then comes the preferred home app data, if any, headed by the DEFAULT_HOME_KEY tag + // Note that Default home app data is no longer backed up by this agent. if (pkg.equals(DEFAULT_HOME_KEY)) { // flattened component name, version, signature of the home app mStoredHomeComponent = ComponentName.unflattenFromString(in.readUTF()); @@ -606,6 +663,10 @@ public class PackageManagerBackupAgent extends BackupAgent { out.writeUTF(STATE_FILE_HEADER); out.writeInt(STATE_FILE_VERSION); + // Record the ancestral record + out.writeUTF(ANCESTRAL_RECORD_KEY); + out.writeInt(ANCESTRAL_RECORD_VERSION); + // Conclude with the metadata block out.writeUTF(GLOBAL_METADATA_KEY); out.writeInt(Build.VERSION.SDK_INT); diff --git a/services/companion/java/com/android/server/companion/BackupRestoreProcessor.java b/services/companion/java/com/android/server/companion/BackupRestoreProcessor.java index 5e52e06248cb..f2409fb8843e 100644 --- a/services/companion/java/com/android/server/companion/BackupRestoreProcessor.java +++ b/services/companion/java/com/android/server/companion/BackupRestoreProcessor.java @@ -18,8 +18,7 @@ package com.android.server.companion; import static android.os.UserHandle.getCallingUserId; -import static com.android.server.companion.association.AssociationDiskStore.readAssociationsFromPayload; -import static com.android.server.companion.utils.RolesUtils.addRoleHolderForAssociation; +import static com.android.server.companion.CompanionDeviceManagerService.PerUserAssociationSet; import android.annotation.NonNull; import android.annotation.SuppressLint; @@ -27,50 +26,62 @@ import android.annotation.UserIdInt; import android.companion.AssociationInfo; import android.companion.Flags; import android.companion.datatransfer.SystemDataTransferRequest; -import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManagerInternal; +import android.util.ArraySet; +import android.util.Log; import android.util.Slog; +import com.android.internal.annotations.GuardedBy; import com.android.internal.util.CollectionUtils; import com.android.server.companion.association.AssociationDiskStore; import com.android.server.companion.association.AssociationRequestsProcessor; import com.android.server.companion.association.AssociationStore; -import com.android.server.companion.association.Associations; import com.android.server.companion.datatransfer.SystemDataTransferRequestStore; import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.function.Predicate; @SuppressLint("LongLogTag") class BackupRestoreProcessor { - private static final String TAG = "CDM_BackupRestoreProcessor"; + static final String TAG = "CDM_BackupRestoreProcessor"; private static final int BACKUP_AND_RESTORE_VERSION = 0; - private final Context mContext; @NonNull - private final PackageManagerInternal mPackageManagerInternal; + private final CompanionDeviceManagerService mService; + @NonNull + private final PackageManagerInternal mPackageManager; @NonNull private final AssociationStore mAssociationStore; @NonNull - private final AssociationDiskStore mAssociationDiskStore; + private final AssociationDiskStore mPersistentStore; @NonNull private final SystemDataTransferRequestStore mSystemDataTransferRequestStore; @NonNull private final AssociationRequestsProcessor mAssociationRequestsProcessor; - BackupRestoreProcessor(@NonNull Context context, - @NonNull PackageManagerInternal packageManagerInternal, + /** + * A structure that consists of a set of restored associations that are pending corresponding + * companion app to be installed. + */ + @GuardedBy("mAssociationsPendingAppInstall") + private final PerUserAssociationSet mAssociationsPendingAppInstall = + new PerUserAssociationSet(); + + BackupRestoreProcessor(@NonNull CompanionDeviceManagerService service, @NonNull AssociationStore associationStore, - @NonNull AssociationDiskStore associationDiskStore, + @NonNull AssociationDiskStore persistentStore, @NonNull SystemDataTransferRequestStore systemDataTransferRequestStore, @NonNull AssociationRequestsProcessor associationRequestsProcessor) { - mContext = context; - mPackageManagerInternal = packageManagerInternal; + mService = service; + mPackageManager = service.mPackageManagerInternal; mAssociationStore = associationStore; - mAssociationDiskStore = associationDiskStore; + mPersistentStore = persistentStore; mSystemDataTransferRequestStore = systemDataTransferRequestStore; mAssociationRequestsProcessor = associationRequestsProcessor; } @@ -82,9 +93,9 @@ class BackupRestoreProcessor { * | (4) SystemDataTransferRequest length | SystemDataTransferRequest XML (without userId)| */ byte[] getBackupPayload(int userId) { - Slog.i(TAG, "getBackupPayload() userId=[" + userId + "]."); - - byte[] associationsPayload = mAssociationDiskStore.getBackupPayload(userId); + // Persist state first to generate an up-to-date XML file + mService.persistStateForUser(userId); + byte[] associationsPayload = mPersistentStore.getBackupPayload(userId); int associationsPayloadLength = associationsPayload.length; // System data transfer requests are persisted up-to-date already @@ -108,9 +119,6 @@ class BackupRestoreProcessor { * Create new associations and system data transfer request consents using backed up payload. */ void applyRestoredPayload(byte[] payload, int userId) { - Slog.i(TAG, "applyRestoredPayload() userId=[" + userId + "], payload size=[" - + payload.length + "]."); - ByteBuffer buffer = ByteBuffer.wrap(payload); // Make sure that payload version matches current version to ensure proper deserialization @@ -123,8 +131,9 @@ class BackupRestoreProcessor { // Read the bytes containing backed-up associations byte[] associationsPayload = new byte[buffer.getInt()]; buffer.get(associationsPayload); - final Associations restoredAssociations = readAssociationsFromPayload( - associationsPayload, userId); + final Set<AssociationInfo> restoredAssociations = new HashSet<>(); + mPersistentStore.readStateFromPayload(associationsPayload, userId, + restoredAssociations, new HashMap<>()); // Read the bytes containing backed-up system data transfer requests user consent byte[] requestsPayload = new byte[buffer.getInt()]; @@ -133,13 +142,13 @@ class BackupRestoreProcessor { mSystemDataTransferRequestStore.readRequestsFromPayload(requestsPayload, userId); // Get a list of installed packages ahead of time. - List<ApplicationInfo> installedApps = mPackageManagerInternal.getInstalledApplications( + List<ApplicationInfo> installedApps = mPackageManager.getInstalledApplications( 0, userId, getCallingUserId()); // Restored device may have a different user ID than the backed-up user's user-ID. Since // association ID is dependent on the user ID, restored associations must account for // this potential difference on their association IDs. - for (AssociationInfo restored : restoredAssociations.getAssociations()) { + for (AssociationInfo restored : restoredAssociations) { // Don't restore a revoked association. Since they weren't added to the device being // restored in the first place, there is no need to worry about revoking a role that // was never granted either. @@ -159,9 +168,10 @@ class BackupRestoreProcessor { // Create a new association reassigned to this user and a valid association ID final String packageName = restored.getPackageName(); - final int newId = mAssociationStore.getNextId(userId); - AssociationInfo newAssociation = new AssociationInfo.Builder(newId, userId, packageName, - restored).build(); + final int newId = mService.getNewAssociationIdForPackage(userId, packageName); + AssociationInfo newAssociation = + new AssociationInfo.Builder(newId, userId, packageName, restored) + .build(); // Check if the companion app for this association is already installed, then do one // of the following: @@ -169,15 +179,13 @@ class BackupRestoreProcessor { // the role attached to this association to the app. // (2) If the app isn't yet installed, then add this association to the list of pending // associations to be added when the package is installed in the future. - boolean isPackageInstalled = installedApps.stream().anyMatch( - app -> packageName.equals(app.packageName)); + boolean isPackageInstalled = installedApps.stream() + .anyMatch(app -> packageName.equals(app.packageName)); if (isPackageInstalled) { mAssociationRequestsProcessor.maybeGrantRoleAndStoreAssociation(newAssociation, null, null); } else { - newAssociation = (new AssociationInfo.Builder(newAssociation)).setPending(true) - .build(); - mAssociationStore.addAssociation(newAssociation); + addToPendingAppInstall(newAssociation); } // Re-map restored system data transfer requests to newly created associations @@ -187,27 +195,32 @@ class BackupRestoreProcessor { mSystemDataTransferRequestStore.writeRequest(userId, newRequest); } } + + // Persist restored state. + mService.persistStateForUser(userId); + } + + void addToPendingAppInstall(@NonNull AssociationInfo association) { + association = (new AssociationInfo.Builder(association)) + .setPending(true) + .build(); + + synchronized (mAssociationsPendingAppInstall) { + mAssociationsPendingAppInstall.forUser(association.getUserId()).add(association); + } } - public void restorePendingAssociations(int userId, String packageName) { - List<AssociationInfo> pendingAssociations = mAssociationStore.getPendingAssociations(userId, - packageName); - if (!pendingAssociations.isEmpty()) { - Slog.i(TAG, "Found pending associations for package=[" + packageName - + "]. Restoring..."); + void removeFromPendingAppInstall(@NonNull AssociationInfo association) { + synchronized (mAssociationsPendingAppInstall) { + mAssociationsPendingAppInstall.forUser(association.getUserId()).remove(association); } - for (AssociationInfo association : pendingAssociations) { - AssociationInfo newAssociation = new AssociationInfo.Builder(association) - .setPending(false) - .build(); - addRoleHolderForAssociation(mContext, newAssociation, success -> { - if (success) { - mAssociationStore.updateAssociation(newAssociation); - Slog.i(TAG, "Association=[" + association + "] is restored."); - } else { - Slog.e(TAG, "Failed to restore association=[" + association + "]."); - } - }); + } + + @NonNull + Set<AssociationInfo> getAssociationsPendingAppInstallForUser(@UserIdInt int userId) { + synchronized (mAssociationsPendingAppInstall) { + // Return a copy. + return new ArraySet<>(mAssociationsPendingAppInstall.forUser(userId)); } } @@ -218,7 +231,7 @@ class BackupRestoreProcessor { private boolean handleCollision(@UserIdInt int userId, AssociationInfo restored, List<SystemDataTransferRequest> restoredRequests) { - List<AssociationInfo> localAssociations = mAssociationStore.getActiveAssociationsByPackage( + List<AssociationInfo> localAssociations = mAssociationStore.getAssociationsForPackage( restored.getUserId(), restored.getPackageName()); Predicate<AssociationInfo> isSameDevice = associationInfo -> { boolean matchesMacAddress = Objects.equals( @@ -235,7 +248,7 @@ class BackupRestoreProcessor { return false; } - Slog.d(TAG, "Conflict detected with association id=" + local.getId() + Log.d(TAG, "Conflict detected with association id=" + local.getId() + " while restoring CDM backup. Keeping local association."); List<SystemDataTransferRequest> localRequests = mSystemDataTransferRequestStore @@ -253,8 +266,8 @@ class BackupRestoreProcessor { continue; } - Slog.d(TAG, "Restoring " + restoredRequest.getClass().getSimpleName() - + " to an existing association id=[" + local.getId() + "]."); + Log.d(TAG, "Restoring " + restoredRequest.getClass().getSimpleName() + + " to an existing association id=" + local.getId() + "."); SystemDataTransferRequest newRequest = restoredRequest.copyWithNewId(local.getId()); diff --git a/services/companion/java/com/android/server/companion/CompanionApplicationController.java b/services/companion/java/com/android/server/companion/CompanionApplicationController.java index 0a4148535451..c801489ce963 100644 --- a/services/companion/java/com/android/server/companion/CompanionApplicationController.java +++ b/services/companion/java/com/android/server/companion/CompanionApplicationController.java @@ -397,7 +397,7 @@ public class CompanionApplicationController { // First, disable hint mode for Auto profile and mark not BOUND for primary service ONLY. if (isPrimary) { final List<AssociationInfo> associations = - mAssociationStore.getActiveAssociationsByPackage(userId, packageName); + mAssociationStore.getAssociationsForPackage(userId, packageName); for (AssociationInfo association : associations) { final String deviceProfile = association.getDeviceProfile(); @@ -442,7 +442,7 @@ public class CompanionApplicationController { mObservableUuidStore.getObservableUuidsForPackage(userId, packageName); for (AssociationInfo ai : - mAssociationStore.getActiveAssociationsByPackage(userId, packageName)) { + mAssociationStore.getAssociationsForPackage(userId, packageName)) { final int associationId = ai.getId(); stillAssociated = true; if (ai.isSelfManaged()) { diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index 73ebbc781c74..3846e981cbab 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -37,9 +37,12 @@ import static android.os.UserHandle.getCallingUserId; import static com.android.internal.util.CollectionUtils.any; import static com.android.internal.util.Preconditions.checkState; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; +import static com.android.server.companion.association.AssociationStore.CHANGE_TYPE_UPDATED_ADDRESS_UNCHANGED; +import static com.android.server.companion.utils.AssociationUtils.getFirstAssociationIdForUser; +import static com.android.server.companion.utils.AssociationUtils.getLastAssociationIdForUser; +import static com.android.server.companion.utils.PackageUtils.isRestrictedSettingsAllowed; import static com.android.server.companion.utils.PackageUtils.enforceUsesCompanionDeviceFeature; import static com.android.server.companion.utils.PackageUtils.getPackageInfo; -import static com.android.server.companion.utils.PackageUtils.isRestrictedSettingsAllowed; import static com.android.server.companion.utils.PermissionsUtils.checkCallerCanManageCompanionDevice; import static com.android.server.companion.utils.PermissionsUtils.enforceCallerCanManageAssociationsForPackage; import static com.android.server.companion.utils.PermissionsUtils.enforceCallerCanObservingDevicePresenceByUuid; @@ -79,16 +82,20 @@ import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; +import android.content.pm.UserInfo; import android.hardware.power.Mode; import android.net.MacAddress; import android.net.NetworkPolicyManager; import android.os.Binder; import android.os.Environment; +import android.os.Handler; +import android.os.Message; import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.os.ParcelUuid; -import android.os.PowerExemptionManager; import android.os.PowerManagerInternal; +import android.os.PowerWhitelistManager; +import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; @@ -98,9 +105,13 @@ import android.util.ArraySet; import android.util.ExceptionUtils; import android.util.Log; import android.util.Slog; +import android.util.SparseArray; +import android.util.SparseBooleanArray; +import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IAppOpsService; import com.android.internal.content.PackageMonitor; +import com.android.internal.infra.PerUser; import com.android.internal.notification.NotificationAccessConfirmationActivityContract; import com.android.internal.os.BackgroundThread; import com.android.internal.util.ArrayUtils; @@ -110,8 +121,8 @@ import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.companion.association.AssociationDiskStore; import com.android.server.companion.association.AssociationRequestsProcessor; +import com.android.server.companion.association.AssociationRevokeProcessor; import com.android.server.companion.association.AssociationStore; -import com.android.server.companion.association.DisassociationProcessor; import com.android.server.companion.association.InactiveAssociationsRemovalService; import com.android.server.companion.datatransfer.SystemDataTransferProcessor; import com.android.server.companion.datatransfer.SystemDataTransferRequestStore; @@ -128,6 +139,7 @@ import com.android.server.wm.ActivityTaskManagerInternal; import java.io.File; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -152,51 +164,80 @@ public class CompanionDeviceManagerService extends SystemService { private static final long ASSOCIATION_REMOVAL_TIME_WINDOW_DEFAULT = DAYS.toMillis(90); private static final int MAX_CN_LENGTH = 500; + private final ActivityManager mActivityManager; + private AssociationDiskStore mAssociationDiskStore; + private final PersistUserStateHandler mUserPersistenceHandler; + + private final AssociationStore mAssociationStore; + private final SystemDataTransferRequestStore mSystemDataTransferRequestStore; + private AssociationRequestsProcessor mAssociationRequestsProcessor; + private SystemDataTransferProcessor mSystemDataTransferProcessor; + private BackupRestoreProcessor mBackupRestoreProcessor; + private CompanionDevicePresenceMonitor mDevicePresenceMonitor; + private CompanionApplicationController mCompanionAppController; + private CompanionTransportManager mTransportManager; + private AssociationRevokeProcessor mAssociationRevokeProcessor; + private final ActivityTaskManagerInternal mAtmInternal; private final ActivityManagerInternal mAmInternal; private final IAppOpsService mAppOpsManager; - private final PowerExemptionManager mPowerExemptionManager; - private final PackageManagerInternal mPackageManagerInternal; + private final PowerWhitelistManager mPowerWhitelistManager; + private final UserManager mUserManager; + public final PackageManagerInternal mPackageManagerInternal; private final PowerManagerInternal mPowerManagerInternal; - private final AssociationStore mAssociationStore; - private final SystemDataTransferRequestStore mSystemDataTransferRequestStore; - private final ObservableUuidStore mObservableUuidStore; - private final AssociationRequestsProcessor mAssociationRequestsProcessor; - private final SystemDataTransferProcessor mSystemDataTransferProcessor; - private final BackupRestoreProcessor mBackupRestoreProcessor; - private final CompanionDevicePresenceMonitor mDevicePresenceMonitor; - private final CompanionApplicationController mCompanionAppController; - private final CompanionTransportManager mTransportManager; - private final DisassociationProcessor mDisassociationProcessor; - private final CrossDeviceSyncController mCrossDeviceSyncController; + /** + * A structure that consists of two nested maps, and effectively maps (userId + packageName) to + * a list of IDs that have been previously assigned to associations for that package. + * We maintain this structure so that we never re-use association IDs for the same package + * (until it's uninstalled). + */ + @GuardedBy("mPreviouslyUsedIds") + private final SparseArray<Map<String, Set<Integer>>> mPreviouslyUsedIds = new SparseArray<>(); + + private final RemoteCallbackList<IOnAssociationsChangedListener> mListeners = + new RemoteCallbackList<>(); + + private CrossDeviceSyncController mCrossDeviceSyncController; + + private ObservableUuidStore mObservableUuidStore; public CompanionDeviceManagerService(Context context) { super(context); - final ActivityManager activityManager = context.getSystemService(ActivityManager.class); - mPowerExemptionManager = context.getSystemService(PowerExemptionManager.class); + mActivityManager = context.getSystemService(ActivityManager.class); + mPowerWhitelistManager = context.getSystemService(PowerWhitelistManager.class); mAppOpsManager = IAppOpsService.Stub.asInterface( ServiceManager.getService(Context.APP_OPS_SERVICE)); mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class); mAmInternal = LocalServices.getService(ActivityManagerInternal.class); mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); - final UserManager userManager = context.getSystemService(UserManager.class); - mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); + mUserManager = context.getSystemService(UserManager.class); - final AssociationDiskStore associationDiskStore = new AssociationDiskStore(); - mAssociationStore = new AssociationStore(userManager, associationDiskStore); + mUserPersistenceHandler = new PersistUserStateHandler(); + mAssociationStore = new AssociationStore(); mSystemDataTransferRequestStore = new SystemDataTransferRequestStore(); + + mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); mObservableUuidStore = new ObservableUuidStore(); + } + + @Override + public void onStart() { + final Context context = getContext(); - // Init processors - mAssociationRequestsProcessor = new AssociationRequestsProcessor(context, - mPackageManagerInternal, mAssociationStore); - mBackupRestoreProcessor = new BackupRestoreProcessor(context, mPackageManagerInternal, - mAssociationStore, associationDiskStore, mSystemDataTransferRequestStore, - mAssociationRequestsProcessor); + mAssociationDiskStore = new AssociationDiskStore(); + mAssociationRequestsProcessor = new AssociationRequestsProcessor( + /* cdmService */ this, mAssociationStore); + mBackupRestoreProcessor = new BackupRestoreProcessor( + /* cdmService */ this, mAssociationStore, mAssociationDiskStore, + mSystemDataTransferRequestStore, mAssociationRequestsProcessor); + + mObservableUuidStore.getObservableUuidsForUser(getContext().getUserId()); - mDevicePresenceMonitor = new CompanionDevicePresenceMonitor(userManager, + mAssociationStore.registerListener(mAssociationStoreChangeListener); + + mDevicePresenceMonitor = new CompanionDevicePresenceMonitor(mUserManager, mAssociationStore, mObservableUuidStore, mDevicePresenceCallback); mCompanionAppController = new CompanionApplicationController( @@ -205,9 +246,11 @@ public class CompanionDeviceManagerService extends SystemService { mTransportManager = new CompanionTransportManager(context, mAssociationStore); - mDisassociationProcessor = new DisassociationProcessor(context, activityManager, - mAssociationStore, mPackageManagerInternal, mDevicePresenceMonitor, - mCompanionAppController, mSystemDataTransferRequestStore, mTransportManager); + mAssociationRevokeProcessor = new AssociationRevokeProcessor(this, mAssociationStore, + mPackageManagerInternal, mDevicePresenceMonitor, mCompanionAppController, + mSystemDataTransferRequestStore, mTransportManager); + + loadAssociationsFromDisk(); mSystemDataTransferProcessor = new SystemDataTransferProcessor(this, mPackageManagerInternal, mAssociationStore, @@ -215,16 +258,6 @@ public class CompanionDeviceManagerService extends SystemService { // TODO(b/279663946): move context sync to a dedicated system service mCrossDeviceSyncController = new CrossDeviceSyncController(getContext(), mTransportManager); - } - - @Override - public void onStart() { - // Init association stores - mAssociationStore.refreshCache(); - mAssociationStore.registerLocalListener(mAssociationStoreChangeListener); - - // Init UUID store - mObservableUuidStore.getObservableUuidsForUser(getContext().getUserId()); // Publish "binder" service. final CompanionDeviceManagerImpl impl = new CompanionDeviceManagerImpl(); @@ -234,6 +267,50 @@ public class CompanionDeviceManagerService extends SystemService { LocalServices.addService(CompanionDeviceManagerServiceInternal.class, new LocalService()); } + void loadAssociationsFromDisk() { + final Set<AssociationInfo> allAssociations = new ArraySet<>(); + synchronized (mPreviouslyUsedIds) { + List<Integer> userIds = new ArrayList<>(); + for (UserInfo user : mUserManager.getAliveUsers()) { + userIds.add(user.id); + } + // The data is stored in DE directories, so we can read the data for all users now + // (which would not be possible if the data was stored to CE directories). + mAssociationDiskStore.readStateForUsers(userIds, allAssociations, mPreviouslyUsedIds); + } + + final Set<AssociationInfo> activeAssociations = + new ArraySet<>(/* capacity */ allAssociations.size()); + // A set contains the userIds that need to persist state after remove the app + // from the list of role holders. + final Set<Integer> usersToPersistStateFor = new ArraySet<>(); + + for (AssociationInfo association : allAssociations) { + if (association.isPending()) { + mBackupRestoreProcessor.addToPendingAppInstall(association); + } else if (!association.isRevoked()) { + activeAssociations.add(association); + } else if (mAssociationRevokeProcessor.maybeRemoveRoleHolderForAssociation( + association)) { + // Nothing more to do here, but we'll need to persist all the associations to the + // disk afterwards. + usersToPersistStateFor.add(association.getUserId()); + } else { + mAssociationRevokeProcessor.addToPendingRoleHolderRemoval(association); + } + } + + mAssociationStore.setAssociationsToCache(activeAssociations); + + // IMPORTANT: only do this AFTER mAssociationStore.setAssociations(), because + // persistStateForUser() queries AssociationStore. + // (If persistStateForUser() is invoked before mAssociationStore.setAssociations() it + // would effectively just clear-out all the persisted associations). + for (int userId : usersToPersistStateFor) { + persistStateForUser(userId); + } + } + @Override public void onBootPhase(int phase) { final Context context = getContext(); @@ -252,10 +329,8 @@ public class CompanionDeviceManagerService extends SystemService { @Override public void onUserUnlocking(@NonNull TargetUser user) { - Slog.d(TAG, "onUserUnlocking..."); final int userId = user.getUserIdentifier(); - final List<AssociationInfo> associations = mAssociationStore.getActiveAssociationsByUser( - userId); + final List<AssociationInfo> associations = mAssociationStore.getAssociationsForUser(userId); if (associations.isEmpty()) return; @@ -284,8 +359,7 @@ public class CompanionDeviceManagerService extends SystemService { ? Collections.emptyList() : Arrays.asList(bluetoothDeviceUuids); for (AssociationInfo ai : - mAssociationStore.getActiveAssociationsByAddress( - bluetoothDevice.getAddress())) { + mAssociationStore.getAssociationsByAddress(bluetoothDevice.getAddress())) { Slog.i(TAG, "onUserUnlocked, device id( " + ai.getId() + " ) is connected"); mDevicePresenceMonitor.onBluetoothCompanionDeviceConnected(ai.getId()); } @@ -305,7 +379,7 @@ public class CompanionDeviceManagerService extends SystemService { @NonNull AssociationInfo getAssociationWithCallerChecks( @UserIdInt int userId, @NonNull String packageName, @NonNull String macAddress) { - AssociationInfo association = mAssociationStore.getFirstAssociationByAddress( + AssociationInfo association = mAssociationStore.getAssociationsForPackageWithAddress( userId, packageName, macAddress); association = sanitizeWithCallerChecks(getContext(), association); if (association != null) { @@ -459,7 +533,7 @@ public class CompanionDeviceManagerService extends SystemService { */ private boolean shouldBindPackage(@UserIdInt int userId, @NonNull String packageName) { final List<AssociationInfo> packageAssociations = - mAssociationStore.getActiveAssociationsByPackage(userId, packageName); + mAssociationStore.getAssociationsForPackage(userId, packageName); final List<ObservableUuid> observableUuids = mObservableUuidStore.getObservableUuidsForPackage(userId, packageName); @@ -477,6 +551,77 @@ public class CompanionDeviceManagerService extends SystemService { return false; } + private void onAssociationChangedInternal( + @AssociationStore.ChangeType int changeType, AssociationInfo association) { + final int id = association.getId(); + final int userId = association.getUserId(); + final String packageName = association.getPackageName(); + + if (changeType == AssociationStore.CHANGE_TYPE_REMOVED) { + markIdAsPreviouslyUsedForPackage(id, userId, packageName); + } + + final List<AssociationInfo> updatedAssociations = + mAssociationStore.getAssociationsForUser(userId); + + mUserPersistenceHandler.postPersistUserState(userId); + + // Notify listeners if ADDED, REMOVED or UPDATED_ADDRESS_CHANGED. + // Do NOT notify when UPDATED_ADDRESS_UNCHANGED, which means a minor tweak in association's + // configs, which "listeners" won't (and shouldn't) be able to see. + if (changeType != CHANGE_TYPE_UPDATED_ADDRESS_UNCHANGED) { + notifyListeners(userId, updatedAssociations); + } + updateAtm(userId, updatedAssociations); + } + + void persistStateForUser(@UserIdInt int userId) { + // We want to store both active associations and the revoked (removed) association that we + // are keeping around for the final clean-up (delayed role holder removal). + final List<AssociationInfo> allAssociations; + // Start with the active associations - these we can get from the AssociationStore. + allAssociations = new ArrayList<>( + mAssociationStore.getAssociationsForUser(userId)); + // ... and add the revoked (removed) association, that are yet to be permanently removed. + allAssociations.addAll( + mAssociationRevokeProcessor.getPendingRoleHolderRemovalAssociationsForUser(userId)); + // ... and add the restored associations that are pending missing package installation. + allAssociations.addAll(mBackupRestoreProcessor + .getAssociationsPendingAppInstallForUser(userId)); + + final Map<String, Set<Integer>> usedIdsForUser = getPreviouslyUsedIdsForUser(userId); + + mAssociationDiskStore.persistStateForUser(userId, allAssociations, usedIdsForUser); + } + + private void notifyListeners( + @UserIdInt int userId, @NonNull List<AssociationInfo> associations) { + mListeners.broadcast((listener, callbackUserId) -> { + int listenerUserId = (int) callbackUserId; + if (listenerUserId == userId || listenerUserId == UserHandle.USER_ALL) { + try { + listener.onAssociationsChanged(associations); + } catch (RemoteException ignored) { + } + } + }); + } + + private void markIdAsPreviouslyUsedForPackage( + int associationId, @UserIdInt int userId, @NonNull String packageName) { + synchronized (mPreviouslyUsedIds) { + Map<String, Set<Integer>> usedIdsForUser = mPreviouslyUsedIds.get(userId); + if (usedIdsForUser == null) { + usedIdsForUser = new HashMap<>(); + mPreviouslyUsedIds.put(userId, usedIdsForUser); + } + + final Set<Integer> usedIdsForPackage = + usedIdsForUser.computeIfAbsent(packageName, it -> new HashSet<>()); + usedIdsForPackage.add(associationId); + } + } + private void onPackageRemoveOrDataClearedInternal( @UserIdInt int userId, @NonNull String packageName) { if (DEBUG) { @@ -484,20 +629,19 @@ public class CompanionDeviceManagerService extends SystemService { + packageName); } - // Clear all associations for the package. + // Clear associations. final List<AssociationInfo> associationsForPackage = - mAssociationStore.getAssociationsByPackage(userId, packageName); - if (!associationsForPackage.isEmpty()) { - Slog.i(TAG, "Package removed or data cleared for user=[" + userId + "], package=[" - + packageName + "]. Cleaning up CDM data..."); + mAssociationStore.getAssociationsForPackage(userId, packageName); + final List<ObservableUuid> uuidsTobeObserved = + mObservableUuidStore.getObservableUuidsForPackage(userId, packageName); + for (AssociationInfo association : associationsForPackage) { + mAssociationStore.removeAssociation(association.getId()); } + // Clear role holders for (AssociationInfo association : associationsForPackage) { - mDisassociationProcessor.disassociate(association.getId()); + mAssociationRevokeProcessor.maybeRemoveRoleHolderForAssociation(association); } - - // Clear observable UUIDs for the package. - final List<ObservableUuid> uuidsTobeObserved = - mObservableUuidStore.getObservableUuidsForPackage(userId, packageName); + // Clear the uuids to be observed. for (ObservableUuid uuid : uuidsTobeObserved) { mObservableUuidStore.removeObservableUuid(userId, uuid.getUuid(), packageName); } @@ -508,13 +652,31 @@ public class CompanionDeviceManagerService extends SystemService { private void onPackageModifiedInternal(@UserIdInt int userId, @NonNull String packageName) { if (DEBUG) Log.i(TAG, "onPackageModified() u" + userId + "/" + packageName); - updateSpecialAccessPermissionForAssociatedPackage(userId, packageName); + final List<AssociationInfo> associationsForPackage = + mAssociationStore.getAssociationsForPackage(userId, packageName); + for (AssociationInfo association : associationsForPackage) { + updateSpecialAccessPermissionForAssociatedPackage(association.getUserId(), + association.getPackageName()); + } mCompanionAppController.onPackagesChanged(userId); } private void onPackageAddedInternal(@UserIdInt int userId, @NonNull String packageName) { - mBackupRestoreProcessor.restorePendingAssociations(userId, packageName); + if (DEBUG) Log.i(TAG, "onPackageAddedInternal() u" + userId + "/" + packageName); + + Set<AssociationInfo> associationsPendingAppInstall = mBackupRestoreProcessor + .getAssociationsPendingAppInstallForUser(userId); + for (AssociationInfo association : associationsPendingAppInstall) { + if (!packageName.equals(association.getPackageName())) continue; + + AssociationInfo newAssociation = new AssociationInfo.Builder(association) + .setPending(false) + .build(); + mAssociationRequestsProcessor.maybeGrantRoleAndStoreAssociation(newAssociation, + null, null); + mBackupRestoreProcessor.removeFromPendingAppInstall(association); + } } // Revoke associations if the selfManaged companion device does not connect for 3 months. @@ -536,7 +698,7 @@ public class CompanionDeviceManagerService extends SystemService { final int id = association.getId(); Slog.i(TAG, "Removing inactive self-managed association id=" + id); - mDisassociationProcessor.disassociate(id); + mAssociationRevokeProcessor.disassociateInternal(id); } } @@ -588,7 +750,7 @@ public class CompanionDeviceManagerService extends SystemService { enforceUsesCompanionDeviceFeature(getContext(), userId, packageName); } - return mAssociationStore.getActiveAssociationsByPackage(userId, packageName); + return mAssociationStore.getAssociationsForPackage(userId, packageName); } @Override @@ -599,9 +761,9 @@ public class CompanionDeviceManagerService extends SystemService { enforceCallerIsSystemOrCanInteractWithUserId(getContext(), userId); if (userId == UserHandle.USER_ALL) { - return mAssociationStore.getActiveAssociations(); + return List.copyOf(mAssociationStore.getAssociations()); } - return mAssociationStore.getActiveAssociationsByUser(userId); + return mAssociationStore.getAssociationsForUser(userId); } @Override @@ -611,8 +773,7 @@ public class CompanionDeviceManagerService extends SystemService { addOnAssociationsChangedListener_enforcePermission(); enforceCallerIsSystemOrCanInteractWithUserId(getContext(), userId); - - mAssociationStore.registerRemoteListener(listener, userId); + mListeners.register(listener, userId); } @Override @@ -623,7 +784,7 @@ public class CompanionDeviceManagerService extends SystemService { enforceCallerIsSystemOrCanInteractWithUserId(getContext(), userId); - mAssociationStore.unregisterRemoteListener(listener); + mListeners.unregister(listener); } @Override @@ -682,16 +843,16 @@ public class CompanionDeviceManagerService extends SystemService { final AssociationInfo association = getAssociationWithCallerChecks(userId, packageName, deviceMacAddress); - mDisassociationProcessor.disassociate(association.getId()); + mAssociationRevokeProcessor.disassociateInternal(association.getId()); } @Override public void disassociate(int associationId) { - Slog.i(TAG, "disassociate() associationId=" + associationId); + Log.i(TAG, "disassociate() associationId=" + associationId); final AssociationInfo association = getAssociationWithCallerChecks(associationId); - mDisassociationProcessor.disassociate(association.getId()); + mAssociationRevokeProcessor.disassociateInternal(association.getId()); } @Override @@ -706,7 +867,8 @@ public class CompanionDeviceManagerService extends SystemService { throw new IllegalArgumentException("Component name is too long."); } - return Binder.withCleanCallingIdentity(() -> { + final long identity = Binder.clearCallingIdentity(); + try { if (!isRestrictedSettingsAllowed(getContext(), callingPackage, callingUid)) { Slog.e(TAG, "Side loaded app must enable restricted " + "setting before request the notification access"); @@ -720,7 +882,9 @@ public class CompanionDeviceManagerService extends SystemService { | PendingIntent.FLAG_CANCEL_CURRENT, null /* options */, new UserHandle(userId)); - }); + } finally { + Binder.restoreCallingIdentity(identity); + } } /** @@ -748,7 +912,7 @@ public class CompanionDeviceManagerService extends SystemService { return true; } - return any(mAssociationStore.getActiveAssociationsByPackage(userId, packageName), + return any(mAssociationStore.getAssociationsForPackage(userId, packageName), a -> a.isLinkedTo(macAddress)); } @@ -1002,7 +1166,7 @@ public class CompanionDeviceManagerService extends SystemService { final int userId = getCallingUserId(); enforceCallerIsSystemOr(userId, packageName); - AssociationInfo association = mAssociationStore.getFirstAssociationByAddress( + AssociationInfo association = mAssociationStore.getAssociationsForPackageWithAddress( userId, packageName, deviceAddress); if (association == null) { @@ -1075,15 +1239,14 @@ public class CompanionDeviceManagerService extends SystemService { enforceUsesCompanionDeviceFeature(getContext(), userId, callingPackage); checkState(!ArrayUtils.isEmpty( - mAssociationStore.getActiveAssociationsByPackage(userId, - callingPackage)), + mAssociationStore.getAssociationsForPackage(userId, callingPackage)), "App must have an association before calling this API"); } @Override public boolean canPairWithoutPrompt(String packageName, String macAddress, int userId) { final AssociationInfo association = - mAssociationStore.getFirstAssociationByAddress( + mAssociationStore.getAssociationsForPackageWithAddress( userId, packageName, macAddress); if (association == null) { return false; @@ -1106,11 +1269,13 @@ public class CompanionDeviceManagerService extends SystemService { @Override public byte[] getBackupPayload(int userId) { + Log.i(TAG, "getBackupPayload() userId=" + userId); return mBackupRestoreProcessor.getBackupPayload(userId); } @Override public void applyRestoredPayload(byte[] payload, int userId) { + Log.i(TAG, "applyRestoredPayload() userId=" + userId); mBackupRestoreProcessor.applyRestoredPayload(payload, userId); } @@ -1121,7 +1286,7 @@ public class CompanionDeviceManagerService extends SystemService { return new CompanionDeviceShellCommand(CompanionDeviceManagerService.this, mAssociationStore, mDevicePresenceMonitor, mTransportManager, mSystemDataTransferProcessor, mAssociationRequestsProcessor, - mBackupRestoreProcessor, mDisassociationProcessor) + mBackupRestoreProcessor, mAssociationRevokeProcessor) .exec(this, in.getFileDescriptor(), out.getFileDescriptor(), err.getFileDescriptor(), args); } @@ -1149,6 +1314,88 @@ public class CompanionDeviceManagerService extends SystemService { /* callback */ null, /* resultReceiver */ null); } + @NonNull + private Map<String, Set<Integer>> getPreviouslyUsedIdsForUser(@UserIdInt int userId) { + synchronized (mPreviouslyUsedIds) { + return getPreviouslyUsedIdsForUserLocked(userId); + } + } + + @GuardedBy("mPreviouslyUsedIds") + @NonNull + private Map<String, Set<Integer>> getPreviouslyUsedIdsForUserLocked(@UserIdInt int userId) { + final Map<String, Set<Integer>> usedIdsForUser = mPreviouslyUsedIds.get(userId); + if (usedIdsForUser == null) { + return Collections.emptyMap(); + } + return deepUnmodifiableCopy(usedIdsForUser); + } + + @GuardedBy("mPreviouslyUsedIds") + @NonNull + private Set<Integer> getPreviouslyUsedIdsForPackageLocked( + @UserIdInt int userId, @NonNull String packageName) { + // "Deeply unmodifiable" map: the map itself and the Set<Integer> values it contains are all + // unmodifiable. + final Map<String, Set<Integer>> usedIdsForUser = getPreviouslyUsedIdsForUserLocked(userId); + final Set<Integer> usedIdsForPackage = usedIdsForUser.get(packageName); + + if (usedIdsForPackage == null) { + return Collections.emptySet(); + } + + //The set is already unmodifiable. + return usedIdsForPackage; + } + + /** + * Get a new association id for the package. + */ + public int getNewAssociationIdForPackage(@UserIdInt int userId, @NonNull String packageName) { + synchronized (mPreviouslyUsedIds) { + // First: collect all IDs currently in use for this user's Associations. + final SparseBooleanArray usedIds = new SparseBooleanArray(); + + // We should really only be checking associations for the given user (i.e.: + // mAssociationStore.getAssociationsForUser(userId)), BUT in the past we've got in a + // state where association IDs were not assigned correctly in regard to + // user-to-association-ids-range (e.g. associations with IDs from 1 to 100,000 should + // always belong to u0), so let's check all the associations. + for (AssociationInfo it : mAssociationStore.getAssociations()) { + usedIds.put(it.getId(), true); + } + + // Some IDs may be reserved by associations that aren't stored yet due to missing + // package after a backup restoration. We don't want the ID to have been taken by + // another association by the time when it is activated from the package installation. + final Set<AssociationInfo> pendingAssociations = mBackupRestoreProcessor + .getAssociationsPendingAppInstallForUser(userId); + for (AssociationInfo it : pendingAssociations) { + usedIds.put(it.getId(), true); + } + + // Second: collect all IDs that have been previously used for this package (and user). + final Set<Integer> previouslyUsedIds = + getPreviouslyUsedIdsForPackageLocked(userId, packageName); + + int id = getFirstAssociationIdForUser(userId); + final int lastAvailableIdForUser = getLastAssociationIdForUser(userId); + + // Find first ID that isn't used now AND has never been used for the given package. + while (usedIds.get(id) || previouslyUsedIds.contains(id)) { + // Increment and try again + id++; + // ... but first check if the ID is valid (within the range allocated to the user). + if (id > lastAvailableIdForUser) { + throw new RuntimeException("Cannot create a new Association ID for " + + packageName + " for user " + userId); + } + } + + return id; + } + } + /** * Update special access for the association's package */ @@ -1156,27 +1403,20 @@ public class CompanionDeviceManagerService extends SystemService { final PackageInfo packageInfo = getPackageInfo(getContext(), userId, packageName); - Binder.withCleanCallingIdentity(() -> updateSpecialAccessPermissionAsSystem(packageInfo, - userId, packageName)); + Binder.withCleanCallingIdentity(() -> updateSpecialAccessPermissionAsSystem(packageInfo)); } - private void updateSpecialAccessPermissionAsSystem(PackageInfo packageInfo, int userId, - String packageName) { + private void updateSpecialAccessPermissionAsSystem(PackageInfo packageInfo) { if (packageInfo == null) { return; } - - List<AssociationInfo> associations = mAssociationStore.getActiveAssociationsByPackage( - userId, packageName); - if (containsEither(packageInfo.requestedPermissions, android.Manifest.permission.RUN_IN_BACKGROUND, - android.Manifest.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND) - && !associations.isEmpty()) { - mPowerExemptionManager.addToPermanentAllowList(packageInfo.packageName); + android.Manifest.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND)) { + mPowerWhitelistManager.addToWhitelist(packageInfo.packageName); } else { try { - mPowerExemptionManager.removeFromPermanentAllowList(packageInfo.packageName); + mPowerWhitelistManager.removeFromWhitelist(packageInfo.packageName); } catch (UnsupportedOperationException e) { Slog.w(TAG, packageInfo.packageName + " can't be removed from power save" + " whitelist. It might due to the package is whitelisted by the system."); @@ -1187,8 +1427,7 @@ public class CompanionDeviceManagerService extends SystemService { try { if (containsEither(packageInfo.requestedPermissions, android.Manifest.permission.USE_DATA_IN_BACKGROUND, - android.Manifest.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND) - && !associations.isEmpty()) { + android.Manifest.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND)) { networkPolicyManager.addUidPolicy( packageInfo.applicationInfo.uid, NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND); @@ -1248,7 +1487,7 @@ public class CompanionDeviceManagerService extends SystemService { try { final List<AssociationInfo> associations = - mAssociationStore.getActiveAssociationsByUser(userId); + mAssociationStore.getAssociationsForUser(userId); for (AssociationInfo a : associations) { try { int uid = pm.getPackageUidAsUser(a.getPackageName(), userId); @@ -1267,16 +1506,7 @@ public class CompanionDeviceManagerService extends SystemService { new AssociationStore.OnChangeListener() { @Override public void onAssociationChanged(int changeType, AssociationInfo association) { - Slog.d(TAG, "onAssociationChanged changeType=[" + changeType - + "], association=[" + association); - - final int userId = association.getUserId(); - final List<AssociationInfo> updatedAssociations = - mAssociationStore.getActiveAssociationsByUser(userId); - - updateAtm(userId, updatedAssociations); - updateSpecialAccessPermissionForAssociatedPackage(association.getUserId(), - association.getPackageName()); + onAssociationChangedInternal(changeType, association); } }; @@ -1404,4 +1634,64 @@ public class CompanionDeviceManagerService extends SystemService { } } } + + /** + * This method must only be called from {@link CompanionDeviceShellCommand} for testing + * purposes only! + */ + void persistState() { + mUserPersistenceHandler.clearMessages(); + for (UserInfo user : mUserManager.getAliveUsers()) { + persistStateForUser(user.id); + } + } + + /** + * This class is dedicated to handling requests to persist user state. + */ + @SuppressLint("HandlerLeak") + private class PersistUserStateHandler extends Handler { + PersistUserStateHandler() { + super(BackgroundThread.get().getLooper()); + } + + /** + * Persists user state unless there is already an outstanding request for the given user. + */ + synchronized void postPersistUserState(@UserIdInt int userId) { + if (!hasMessages(userId)) { + sendMessage(obtainMessage(userId)); + } + } + + /** + * Clears *ALL* outstanding persist requests for *ALL* users. + */ + synchronized void clearMessages() { + removeCallbacksAndMessages(null); + } + + @Override + public void handleMessage(@NonNull Message msg) { + final int userId = msg.what; + persistStateForUser(userId); + } + } + + /** + * Persist associations + */ + public void postPersistUserState(@UserIdInt int userId) { + mUserPersistenceHandler.postPersistUserState(userId); + } + + /** + * Set to store associations + */ + public static class PerUserAssociationSet extends PerUser<Set<AssociationInfo>> { + @Override + protected @NonNull Set<AssociationInfo> create(int userId) { + return new ArraySet<>(); + } + } } diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java b/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java index a7a73cb6bddb..16877dcaf183 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceShellCommand.java @@ -33,8 +33,8 @@ import android.util.Base64; import android.util.proto.ProtoOutputStream; import com.android.server.companion.association.AssociationRequestsProcessor; +import com.android.server.companion.association.AssociationRevokeProcessor; import com.android.server.companion.association.AssociationStore; -import com.android.server.companion.association.DisassociationProcessor; import com.android.server.companion.datatransfer.SystemDataTransferProcessor; import com.android.server.companion.datatransfer.contextsync.BitmapUtils; import com.android.server.companion.datatransfer.contextsync.CrossDeviceSyncController; @@ -49,7 +49,7 @@ class CompanionDeviceShellCommand extends ShellCommand { private static final String TAG = "CDM_CompanionDeviceShellCommand"; private final CompanionDeviceManagerService mService; - private final DisassociationProcessor mDisassociationProcessor; + private final AssociationRevokeProcessor mRevokeProcessor; private final AssociationStore mAssociationStore; private final CompanionDevicePresenceMonitor mDevicePresenceMonitor; private final CompanionTransportManager mTransportManager; @@ -65,7 +65,7 @@ class CompanionDeviceShellCommand extends ShellCommand { SystemDataTransferProcessor systemDataTransferProcessor, AssociationRequestsProcessor associationRequestsProcessor, BackupRestoreProcessor backupRestoreProcessor, - DisassociationProcessor disassociationProcessor) { + AssociationRevokeProcessor revokeProcessor) { mService = service; mAssociationStore = associationStore; mDevicePresenceMonitor = devicePresenceMonitor; @@ -73,7 +73,7 @@ class CompanionDeviceShellCommand extends ShellCommand { mSystemDataTransferProcessor = systemDataTransferProcessor; mAssociationRequestsProcessor = associationRequestsProcessor; mBackupRestoreProcessor = backupRestoreProcessor; - mDisassociationProcessor = disassociationProcessor; + mRevokeProcessor = revokeProcessor; } @Override @@ -105,15 +105,12 @@ class CompanionDeviceShellCommand extends ShellCommand { case "list": { final int userId = getNextIntArgRequired(); final List<AssociationInfo> associationsForUser = - mAssociationStore.getActiveAssociationsByUser(userId); - final int maxId = mAssociationStore.getMaxId(userId); - out.println("Max ID: " + maxId); - out.println("Association ID | Package Name | Mac Address"); + mAssociationStore.getAssociationsForUser(userId); for (AssociationInfo association : associationsForUser) { // TODO(b/212535524): use AssociationInfo.toShortString(), once it's not // longer referenced in tests. - out.println(association.getId() + " | " + association.getPackageName() - + " | " + association.getDeviceMacAddress()); + out.println(association.getPackageName() + " " + + association.getDeviceMacAddress() + " " + association.getId()); } } break; @@ -135,24 +132,28 @@ class CompanionDeviceShellCommand extends ShellCommand { final String address = getNextArgRequired(); final AssociationInfo association = mService.getAssociationWithCallerChecks(userId, packageName, address); - mDisassociationProcessor.disassociate(association.getId()); + if (association != null) { + mRevokeProcessor.disassociateInternal(association.getId()); + } } break; case "disassociate-all": { final int userId = getNextIntArgRequired(); + final String packageName = getNextArgRequired(); final List<AssociationInfo> userAssociations = - mAssociationStore.getAssociationsByUser(userId); + mAssociationStore.getAssociationsForPackage(userId, packageName); for (AssociationInfo association : userAssociations) { if (sanitizeWithCallerChecks(mService.getContext(), association) != null) { - mDisassociationProcessor.disassociate(association.getId()); + mRevokeProcessor.disassociateInternal(association.getId()); } } } break; - case "refresh-cache": - mAssociationStore.refreshCache(); + case "clear-association-memory-cache": + mService.persistState(); + mService.loadAssociationsFromDisk(); break; case "simulate-device-appeared": diff --git a/services/companion/java/com/android/server/companion/association/AssociationDiskStore.java b/services/companion/java/com/android/server/companion/association/AssociationDiskStore.java index 46d60f9c8504..75cb12058247 100644 --- a/services/companion/java/com/android/server/companion/association/AssociationDiskStore.java +++ b/services/companion/java/com/android/server/companion/association/AssociationDiskStore.java @@ -16,6 +16,7 @@ package com.android.server.companion.association; +import static com.android.internal.util.CollectionUtils.forEach; import static com.android.internal.util.XmlUtils.readBooleanAttribute; import static com.android.internal.util.XmlUtils.readIntAttribute; import static com.android.internal.util.XmlUtils.readLongAttribute; @@ -25,6 +26,7 @@ import static com.android.internal.util.XmlUtils.writeIntAttribute; import static com.android.internal.util.XmlUtils.writeLongAttribute; import static com.android.internal.util.XmlUtils.writeStringAttribute; import static com.android.server.companion.utils.AssociationUtils.getFirstAssociationIdForUser; +import static com.android.server.companion.utils.AssociationUtils.getLastAssociationIdForUser; import static com.android.server.companion.utils.DataStoreUtils.createStorageFileForUser; import static com.android.server.companion.utils.DataStoreUtils.fileToByteArray; import static com.android.server.companion.utils.DataStoreUtils.isEndOfTag; @@ -38,8 +40,10 @@ import android.annotation.UserIdInt; import android.companion.AssociationInfo; import android.net.MacAddress; import android.os.Environment; +import android.util.ArrayMap; import android.util.AtomicFile; import android.util.Slog; +import android.util.SparseArray; import android.util.Xml; import com.android.internal.util.XmlUtils; @@ -55,9 +59,11 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.HashMap; +import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -76,8 +82,8 @@ import java.util.concurrent.ConcurrentMap; * <p> * Before Android T the data was stored using the v0 schema. See: * <ul> - * <li>{@link #readAssociationsV0(TypedXmlPullParser, int) readAssociationsV0()}. - * <li>{@link #readAssociationV0(TypedXmlPullParser, int, int) readAssociationV0()}. + * <li>{@link #readAssociationsV0(TypedXmlPullParser, int, Collection) readAssociationsV0()}. + * <li>{@link #readAssociationV0(TypedXmlPullParser, int, int, Collection) readAssociationV0()}. * </ul> * * The following snippet is a sample of a file that is using v0 schema. @@ -110,14 +116,15 @@ import java.util.concurrent.ConcurrentMap; * optional. * <ul> * <li> {@link #CURRENT_PERSISTENCE_VERSION} - * <li> {@link #readAssociationsV1(TypedXmlPullParser, int) readAssociationsV1()} - * <li> {@link #readAssociationV1(TypedXmlPullParser, int) readAssociationV1()} + * <li> {@link #readAssociationsV1(TypedXmlPullParser, int, Collection) readAssociationsV1()} + * <li> {@link #readAssociationV1(TypedXmlPullParser, int, Collection) readAssociationV1()} + * <li> {@link #readPreviouslyUsedIdsV1(TypedXmlPullParser, Map) readPreviouslyUsedIdsV1()} * </ul> * * The following snippet is a sample of a file that is using v1 schema. * <pre>{@code * <state persistence-version="1"> - * <associations max-id="3"> + * <associations> * <association * id="1" * package="com.sample.companion.app" @@ -141,12 +148,18 @@ import java.util.concurrent.ConcurrentMap; * time_approved="1634641160229" * system_data_sync_flags="1"/> * </associations> + * + * <previously-used-ids> + * <package package_name="com.sample.companion.app"> + * <id>2</id> + * </package> + * </previously-used-ids> * </state> * }</pre> */ @SuppressLint("LongLogTag") public final class AssociationDiskStore { - private static final String TAG = "CDM_AssociationDiskStore"; + private static final String TAG = "CompanionDevice_AssociationDiskStore"; private static final int CURRENT_PERSISTENCE_VERSION = 1; @@ -156,11 +169,16 @@ public final class AssociationDiskStore { private static final String XML_TAG_STATE = "state"; private static final String XML_TAG_ASSOCIATIONS = "associations"; private static final String XML_TAG_ASSOCIATION = "association"; + private static final String XML_TAG_PREVIOUSLY_USED_IDS = "previously-used-ids"; + private static final String XML_TAG_PACKAGE = "package"; private static final String XML_TAG_TAG = "tag"; + private static final String XML_TAG_ID = "id"; private static final String XML_ATTR_PERSISTENCE_VERSION = "persistence-version"; - private static final String XML_ATTR_MAX_ID = "max-id"; private static final String XML_ATTR_ID = "id"; + // Used in <package> elements, nested within <previously-used-ids> elements. + private static final String XML_ATTR_PACKAGE_NAME = "package_name"; + // Used in <association> elements, nested within <associations> elements. private static final String XML_ATTR_PACKAGE = "package"; private static final String XML_ATTR_MAC_ADDRESS = "mac_address"; private static final String XML_ATTR_DISPLAY_NAME = "display_name"; @@ -181,12 +199,38 @@ public final class AssociationDiskStore { /** * Read all associations for given users */ - public Map<Integer, Associations> readAssociationsByUsers(@NonNull List<Integer> userIds) { - Map<Integer, Associations> userToAssociationsMap = new HashMap<>(); + public void readStateForUsers(@NonNull List<Integer> userIds, + @NonNull Set<AssociationInfo> allAssociationsOut, + @NonNull SparseArray<Map<String, Set<Integer>>> previouslyUsedIdsPerUserOut) { for (int userId : userIds) { - userToAssociationsMap.put(userId, readAssociationsByUser(userId)); + // Previously used IDs are stored in the "out" collection per-user. + final Map<String, Set<Integer>> previouslyUsedIds = new ArrayMap<>(); + + // Associations for all users are stored in a single "flat" set: so we read directly + // into it. + final Set<AssociationInfo> associationsForUser = new HashSet<>(); + readStateForUser(userId, associationsForUser, previouslyUsedIds); + + // Go through all the associations for the user and check if their IDs are within + // the allowed range (for the user). + final int firstAllowedId = getFirstAssociationIdForUser(userId); + final int lastAllowedId = getLastAssociationIdForUser(userId); + for (AssociationInfo association : associationsForUser) { + final int id = association.getId(); + if (id < firstAllowedId || id > lastAllowedId) { + Slog.e(TAG, "Wrong association ID assignment: " + id + ". " + + "Association belongs to u" + userId + " and thus its ID should be " + + "within [" + firstAllowedId + ", " + lastAllowedId + "] range."); + // TODO(b/224736262): try fixing (re-assigning) the ID? + } + } + + // Add user's association to the "output" set. + allAssociationsOut.addAll(associationsForUser); + + // Save previously used IDs for this user into the "out" structure. + previouslyUsedIdsPerUserOut.append(userId, previouslyUsedIds); } - return userToAssociationsMap; } /** @@ -196,12 +240,16 @@ public final class AssociationDiskStore { * retrieval from this datastore because it is not persisted (by design). This means that * persisted data is not guaranteed to be identical to the initial data that was stored at the * time of association. + * + * @param userId Android UserID + * @param associationsOut a container to read the {@link AssociationInfo}s "into". + * @param previouslyUsedIdsPerPackageOut a container to read the used IDs "into". */ - @NonNull - private Associations readAssociationsByUser(@UserIdInt int userId) { - Slog.i(TAG, "Reading associations for user " + userId + " from disk."); + private void readStateForUser(@UserIdInt int userId, + @NonNull Collection<AssociationInfo> associationsOut, + @NonNull Map<String, Set<Integer>> previouslyUsedIdsPerPackageOut) { + Slog.i(TAG, "Reading associations for user " + userId + " from disk"); final AtomicFile file = getStorageFileForUser(userId); - Associations associations; // getStorageFileForUser() ALWAYS returns the SAME OBJECT, which allows us to synchronize // accesses to the file on the file system using this AtomicFile object. @@ -212,7 +260,7 @@ public final class AssociationDiskStore { if (!file.getBaseFile().exists()) { legacyBaseFile = getBaseLegacyStorageFileForUser(userId); if (!legacyBaseFile.exists()) { - return new Associations(); + return; } readFrom = new AtomicFile(legacyBaseFile); @@ -222,12 +270,13 @@ public final class AssociationDiskStore { rootTag = XML_TAG_STATE; } - associations = readAssociationsFromFile(userId, readFrom, rootTag); + final int version = readStateFromFileLocked(userId, readFrom, rootTag, + associationsOut, previouslyUsedIdsPerPackageOut); - if (legacyBaseFile != null || associations.getVersion() < CURRENT_PERSISTENCE_VERSION) { + if (legacyBaseFile != null || version < CURRENT_PERSISTENCE_VERSION) { // The data is either in the legacy file or in the legacy format, or both. // Save the data to right file in using the current format. - writeAssociationsToFile(file, associations); + persistStateToFileLocked(file, associationsOut, previouslyUsedIdsPerPackageOut); if (legacyBaseFile != null) { // We saved the data to the right file, can delete the old file now. @@ -235,75 +284,89 @@ public final class AssociationDiskStore { } } } - return associations; } /** - * Write associations to disk for the user. + * Persisted data to the disk. + * + * Note that associatedDevice field in {@link AssociationInfo} is not persisted by this + * datastore implementation. + * + * @param userId Android UserID + * @param associations a set of user's associations. + * @param previouslyUsedIdsPerPackage a set previously used Association IDs for the user. */ - public void writeAssociationsForUser(@UserIdInt int userId, - @NonNull Associations associations) { + public void persistStateForUser(@UserIdInt int userId, + @NonNull Collection<AssociationInfo> associations, + @NonNull Map<String, Set<Integer>> previouslyUsedIdsPerPackage) { Slog.i(TAG, "Writing associations for user " + userId + " to disk"); final AtomicFile file = getStorageFileForUser(userId); // getStorageFileForUser() ALWAYS returns the SAME OBJECT, which allows us to synchronize // accesses to the file on the file system using this AtomicFile object. synchronized (file) { - writeAssociationsToFile(file, associations); + persistStateToFileLocked(file, associations, previouslyUsedIdsPerPackage); } } - @NonNull - private static Associations readAssociationsFromFile(@UserIdInt int userId, - @NonNull AtomicFile file, @NonNull String rootTag) { + private int readStateFromFileLocked(@UserIdInt int userId, @NonNull AtomicFile file, + @NonNull String rootTag, @Nullable Collection<AssociationInfo> associationsOut, + @NonNull Map<String, Set<Integer>> previouslyUsedIdsPerPackageOut) { try (FileInputStream in = file.openRead()) { - return readAssociationsFromInputStream(userId, in, rootTag); + return readStateFromInputStream(userId, in, rootTag, associationsOut, + previouslyUsedIdsPerPackageOut); } catch (XmlPullParserException | IOException e) { Slog.e(TAG, "Error while reading associations file", e); - return new Associations(); + return -1; } } - @NonNull - private static Associations readAssociationsFromInputStream(@UserIdInt int userId, - @NonNull InputStream in, @NonNull String rootTag) + private int readStateFromInputStream(@UserIdInt int userId, @NonNull InputStream in, + @NonNull String rootTag, @Nullable Collection<AssociationInfo> associationsOut, + @NonNull Map<String, Set<Integer>> previouslyUsedIdsPerPackageOut) throws XmlPullParserException, IOException { final TypedXmlPullParser parser = Xml.resolvePullParser(in); - XmlUtils.beginDocument(parser, rootTag); + XmlUtils.beginDocument(parser, rootTag); final int version = readIntAttribute(parser, XML_ATTR_PERSISTENCE_VERSION, 0); - Associations associations = new Associations(); - switch (version) { case 0: - associations = readAssociationsV0(parser, userId); + readAssociationsV0(parser, userId, associationsOut); break; case 1: while (true) { parser.nextTag(); if (isStartOfTag(parser, XML_TAG_ASSOCIATIONS)) { - associations = readAssociationsV1(parser, userId); + readAssociationsV1(parser, userId, associationsOut); + } else if (isStartOfTag(parser, XML_TAG_PREVIOUSLY_USED_IDS)) { + readPreviouslyUsedIdsV1(parser, previouslyUsedIdsPerPackageOut); } else if (isEndOfTag(parser, rootTag)) { break; } } break; } - return associations; + return version; } - private void writeAssociationsToFile(@NonNull AtomicFile file, - @NonNull Associations associations) { + private void persistStateToFileLocked(@NonNull AtomicFile file, + @Nullable Collection<AssociationInfo> associations, + @NonNull Map<String, Set<Integer>> previouslyUsedIdsPerPackage) { // Writing to file could fail, for example, if the user has been recently removed and so was // their DE (/data/system_de/<user-id>/) directory. writeToFileSafely(file, out -> { final TypedXmlSerializer serializer = Xml.resolveSerializer(out); - serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); + serializer.setFeature( + "http://xmlpull.org/v1/doc/features.html#indent-output", true); + serializer.startDocument(null, true); serializer.startTag(null, XML_TAG_STATE); writeIntAttribute(serializer, XML_ATTR_PERSISTENCE_VERSION, CURRENT_PERSISTENCE_VERSION); + writeAssociations(serializer, associations); + writePreviouslyUsedIds(serializer, previouslyUsedIdsPerPackage); + serializer.endTag(null, XML_TAG_STATE); serializer.endDocument(); }); @@ -316,8 +379,7 @@ public final class AssociationDiskStore { * IMPORTANT: the method will ALWAYS return the same {@link AtomicFile} object, which makes it * possible to synchronize reads and writes to the file using the returned object. */ - @NonNull - private AtomicFile getStorageFileForUser(@UserIdInt int userId) { + private @NonNull AtomicFile getStorageFileForUser(@UserIdInt int userId) { return mUserIdToStorageFile.computeIfAbsent(userId, u -> createStorageFileForUser(userId, FILE_NAME)); } @@ -337,12 +399,14 @@ public final class AssociationDiskStore { /** * Convert payload to a set of associations */ - public static Associations readAssociationsFromPayload(byte[] payload, @UserIdInt int userId) { + public void readStateFromPayload(byte[] payload, @UserIdInt int userId, + @NonNull Set<AssociationInfo> associationsOut, + @NonNull Map<String, Set<Integer>> previouslyUsedIdsPerPackageOut) { try (ByteArrayInputStream in = new ByteArrayInputStream(payload)) { - return readAssociationsFromInputStream(userId, in, XML_TAG_STATE); + readStateFromInputStream(userId, in, XML_TAG_STATE, associationsOut, + previouslyUsedIdsPerPackageOut); } catch (XmlPullParserException | IOException e) { Slog.e(TAG, "Error while reading associations file", e); - return new Associations(); } } @@ -350,8 +414,8 @@ public final class AssociationDiskStore { return new File(Environment.getUserSystemDirectory(userId), FILE_NAME_LEGACY); } - private static Associations readAssociationsV0(@NonNull TypedXmlPullParser parser, - @UserIdInt int userId) + private static void readAssociationsV0(@NonNull TypedXmlPullParser parser, + @UserIdInt int userId, @NonNull Collection<AssociationInfo> out) throws XmlPullParserException, IOException { requireStartOfTag(parser, XML_TAG_ASSOCIATIONS); @@ -362,70 +426,52 @@ public final class AssociationDiskStore { // means that CDM hasn't assigned any IDs yet, so we can just start from the first available // id for each user (eg. 1 for user 0; 100 001 - for user 1; 200 001 - for user 2; etc). int associationId = getFirstAssociationIdForUser(userId); - Associations associations = new Associations(); - associations.setVersion(0); - while (true) { parser.nextTag(); if (isEndOfTag(parser, XML_TAG_ASSOCIATIONS)) break; if (!isStartOfTag(parser, XML_TAG_ASSOCIATION)) continue; - associations.addAssociation(readAssociationV0(parser, userId, associationId++)); + readAssociationV0(parser, userId, associationId++, out); } - - associations.setMaxId(associationId - 1); - - return associations; } - private static AssociationInfo readAssociationV0(@NonNull TypedXmlPullParser parser, - @UserIdInt int userId, int associationId) + private static void readAssociationV0(@NonNull TypedXmlPullParser parser, @UserIdInt int userId, + int associationId, @NonNull Collection<AssociationInfo> out) throws XmlPullParserException { requireStartOfTag(parser, XML_TAG_ASSOCIATION); final String appPackage = readStringAttribute(parser, XML_ATTR_PACKAGE); final String tag = readStringAttribute(parser, XML_TAG_TAG); final String deviceAddress = readStringAttribute(parser, LEGACY_XML_ATTR_DEVICE); + + if (appPackage == null || deviceAddress == null) return; + final String profile = readStringAttribute(parser, XML_ATTR_PROFILE); final boolean notify = readBooleanAttribute(parser, XML_ATTR_NOTIFY_DEVICE_NEARBY); final long timeApproved = readLongAttribute(parser, XML_ATTR_TIME_APPROVED, 0L); - return new AssociationInfo(associationId, userId, appPackage, tag, + out.add(new AssociationInfo(associationId, userId, appPackage, tag, MacAddress.fromString(deviceAddress), null, profile, null, /* managedByCompanionApp */ false, notify, /* revoked */ false, /* pending */ false, - timeApproved, Long.MAX_VALUE, /* systemDataSyncFlags */ 0); + timeApproved, Long.MAX_VALUE, /* systemDataSyncFlags */ 0)); } - private static Associations readAssociationsV1(@NonNull TypedXmlPullParser parser, - @UserIdInt int userId) + private static void readAssociationsV1(@NonNull TypedXmlPullParser parser, + @UserIdInt int userId, @NonNull Collection<AssociationInfo> out) throws XmlPullParserException, IOException { requireStartOfTag(parser, XML_TAG_ASSOCIATIONS); - // For old builds that don't have max-id attr, - // default maxId to 0 and get the maxId out of all association ids. - int maxId = readIntAttribute(parser, XML_ATTR_MAX_ID, 0); - Associations associations = new Associations(); - associations.setVersion(1); - while (true) { parser.nextTag(); if (isEndOfTag(parser, XML_TAG_ASSOCIATIONS)) break; if (!isStartOfTag(parser, XML_TAG_ASSOCIATION)) continue; - AssociationInfo association = readAssociationV1(parser, userId); - associations.addAssociation(association); - - maxId = Math.max(maxId, association.getId()); + readAssociationV1(parser, userId, out); } - - associations.setMaxId(maxId); - - return associations; } - private static AssociationInfo readAssociationV1(@NonNull TypedXmlPullParser parser, - @UserIdInt int userId) - throws XmlPullParserException, IOException { + private static void readAssociationV1(@NonNull TypedXmlPullParser parser, @UserIdInt int userId, + @NonNull Collection<AssociationInfo> out) throws XmlPullParserException, IOException { requireStartOfTag(parser, XML_TAG_ASSOCIATION); final int associationId = readIntAttribute(parser, XML_ATTR_ID); @@ -445,19 +491,46 @@ public final class AssociationDiskStore { final int systemDataSyncFlags = readIntAttribute(parser, XML_ATTR_SYSTEM_DATA_SYNC_FLAGS, 0); - return new AssociationInfo(associationId, userId, appPackage, tag, macAddress, displayName, - profile, null, selfManaged, notify, revoked, pending, timeApproved, - lastTimeConnected, systemDataSyncFlags); + final AssociationInfo associationInfo = createAssociationInfoNoThrow(associationId, userId, + appPackage, tag, macAddress, displayName, profile, selfManaged, notify, revoked, + pending, timeApproved, lastTimeConnected, systemDataSyncFlags); + if (associationInfo != null) { + out.add(associationInfo); + } + } + + private static void readPreviouslyUsedIdsV1(@NonNull TypedXmlPullParser parser, + @NonNull Map<String, Set<Integer>> out) throws XmlPullParserException, IOException { + requireStartOfTag(parser, XML_TAG_PREVIOUSLY_USED_IDS); + + while (true) { + parser.nextTag(); + if (isEndOfTag(parser, XML_TAG_PREVIOUSLY_USED_IDS)) break; + if (!isStartOfTag(parser, XML_TAG_PACKAGE)) continue; + + final String packageName = readStringAttribute(parser, XML_ATTR_PACKAGE_NAME); + final Set<Integer> usedIds = new HashSet<>(); + + while (true) { + parser.nextTag(); + if (isEndOfTag(parser, XML_TAG_PACKAGE)) break; + if (!isStartOfTag(parser, XML_TAG_ID)) continue; + + parser.nextToken(); + final int id = Integer.parseInt(parser.getText()); + usedIds.add(id); + } + + out.put(packageName, usedIds); + } } private static void writeAssociations(@NonNull XmlSerializer parent, - @NonNull Associations associations) - throws IOException { + @Nullable Collection<AssociationInfo> associations) throws IOException { final XmlSerializer serializer = parent.startTag(null, XML_TAG_ASSOCIATIONS); - for (AssociationInfo association : associations.getAssociations()) { + for (AssociationInfo association : associations) { writeAssociation(serializer, association); } - writeIntAttribute(serializer, XML_ATTR_MAX_ID, associations.getMaxId()); serializer.endTag(null, XML_TAG_ASSOCIATIONS); } @@ -484,6 +557,26 @@ public final class AssociationDiskStore { serializer.endTag(null, XML_TAG_ASSOCIATION); } + private static void writePreviouslyUsedIds(@NonNull XmlSerializer parent, + @NonNull Map<String, Set<Integer>> previouslyUsedIdsPerPackage) throws IOException { + final XmlSerializer serializer = parent.startTag(null, XML_TAG_PREVIOUSLY_USED_IDS); + for (Map.Entry<String, Set<Integer>> entry : previouslyUsedIdsPerPackage.entrySet()) { + writePreviouslyUsedIdsForPackage(serializer, entry.getKey(), entry.getValue()); + } + serializer.endTag(null, XML_TAG_PREVIOUSLY_USED_IDS); + } + + private static void writePreviouslyUsedIdsForPackage(@NonNull XmlSerializer parent, + @NonNull String packageName, @NonNull Set<Integer> previouslyUsedIds) + throws IOException { + final XmlSerializer serializer = parent.startTag(null, XML_TAG_PACKAGE); + writeStringAttribute(serializer, XML_ATTR_PACKAGE_NAME, packageName); + forEach(previouslyUsedIds, id -> serializer.startTag(null, XML_TAG_ID) + .text(Integer.toString(id)) + .endTag(null, XML_TAG_ID)); + serializer.endTag(null, XML_TAG_PACKAGE); + } + private static void requireStartOfTag(@NonNull XmlPullParser parser, @NonNull String tag) throws XmlPullParserException { if (isStartOfTag(parser, tag)) return; @@ -494,4 +587,22 @@ public final class AssociationDiskStore { private static @Nullable MacAddress stringToMacAddress(@Nullable String address) { return address != null ? MacAddress.fromString(address) : null; } + + private static AssociationInfo createAssociationInfoNoThrow(int associationId, + @UserIdInt int userId, @NonNull String appPackage, @Nullable String tag, + @Nullable MacAddress macAddress, @Nullable CharSequence displayName, + @Nullable String profile, boolean selfManaged, boolean notify, boolean revoked, + boolean pending, long timeApproved, long lastTimeConnected, int systemDataSyncFlags) { + AssociationInfo associationInfo = null; + try { + // We do not persist AssociatedDevice, which means that AssociationInfo retrieved from + // datastore is not guaranteed to be identical to the one from initial association. + associationInfo = new AssociationInfo(associationId, userId, appPackage, tag, + macAddress, displayName, profile, null, selfManaged, notify, + revoked, pending, timeApproved, lastTimeConnected, systemDataSyncFlags); + } catch (Exception e) { + Slog.e(TAG, "Could not create AssociationInfo", e); + } + return associationInfo; + } } diff --git a/services/companion/java/com/android/server/companion/association/AssociationRequestsProcessor.java b/services/companion/java/com/android/server/companion/association/AssociationRequestsProcessor.java index a02d9f912bcd..29ec7c2c9743 100644 --- a/services/companion/java/com/android/server/companion/association/AssociationRequestsProcessor.java +++ b/services/companion/java/com/android/server/companion/association/AssociationRequestsProcessor.java @@ -24,6 +24,7 @@ import static android.companion.CompanionDeviceManager.RESULT_INTERNAL_ERROR; import static android.content.ComponentName.createRelative; import static android.content.pm.PackageManager.FEATURE_WATCH; +import static com.android.server.companion.utils.MetricUtils.logCreateAssociation; import static com.android.server.companion.utils.PackageUtils.enforceUsesCompanionDeviceFeature; import static com.android.server.companion.utils.PermissionsUtils.enforcePermissionForCreatingAssociation; import static com.android.server.companion.utils.RolesUtils.addRoleHolderForAssociation; @@ -127,16 +128,17 @@ public class AssociationRequestsProcessor { private static final long ASSOCIATE_WITHOUT_PROMPT_WINDOW_MS = 60 * 60 * 1000; // 60 min; private final @NonNull Context mContext; - private final @NonNull PackageManagerInternal mPackageManagerInternal; + private final @NonNull CompanionDeviceManagerService mService; + private final @NonNull PackageManagerInternal mPackageManager; private final @NonNull AssociationStore mAssociationStore; @NonNull private final ComponentName mCompanionDeviceActivity; - public AssociationRequestsProcessor(@NonNull Context context, - @NonNull PackageManagerInternal packageManagerInternal, + public AssociationRequestsProcessor(@NonNull CompanionDeviceManagerService service, @NonNull AssociationStore associationStore) { - mContext = context; - mPackageManagerInternal = packageManagerInternal; + mContext = service.getContext(); + mService = service; + mPackageManager = service.mPackageManagerInternal; mAssociationStore = associationStore; mCompanionDeviceActivity = createRelative( mContext.getString(R.string.config_companionDeviceManagerPackage), @@ -158,7 +160,7 @@ public class AssociationRequestsProcessor { requireNonNull(packageName, "Package name MUST NOT be null"); requireNonNull(callback, "Callback MUST NOT be null"); - final int packageUid = mPackageManagerInternal.getPackageUid(packageName, 0, userId); + final int packageUid = mPackageManager.getPackageUid(packageName, 0, userId); Slog.d(TAG, "processNewAssociationRequest() " + "request=" + request + ", " + "package=u" + userId + "/" + packageName + " (uid=" + packageUid + ")"); @@ -224,7 +226,7 @@ public class AssociationRequestsProcessor { enforceUsesCompanionDeviceFeature(mContext, userId, packageName); - final int packageUid = mPackageManagerInternal.getPackageUid(packageName, 0, userId); + final int packageUid = mPackageManager.getPackageUid(packageName, 0, userId); final Bundle extras = new Bundle(); extras.putBoolean(EXTRA_FORCE_CANCEL_CONFIRMATION, true); @@ -241,7 +243,7 @@ public class AssociationRequestsProcessor { @NonNull ResultReceiver resultReceiver, @Nullable MacAddress macAddress) { final String packageName = request.getPackageName(); final int userId = request.getUserId(); - final int packageUid = mPackageManagerInternal.getPackageUid(packageName, 0, userId); + final int packageUid = mPackageManager.getPackageUid(packageName, 0, userId); // 1. Need to check permissions again in case something changed, since we first received // this request. @@ -265,12 +267,15 @@ public class AssociationRequestsProcessor { @NonNull AssociationRequest request, @NonNull String packageName, @UserIdInt int userId, @Nullable MacAddress macAddress, @NonNull IAssociationRequestCallback callback, @NonNull ResultReceiver resultReceiver) { - Binder.withCleanCallingIdentity(() -> { + final long callingIdentity = Binder.clearCallingIdentity(); + try { createAssociation(userId, packageName, macAddress, request.getDisplayName(), request.getDeviceProfile(), request.getAssociatedDevice(), request.isSelfManaged(), callback, resultReceiver); - }); + } finally { + Binder.restoreCallingIdentity(callingIdentity); + } } /** @@ -281,7 +286,7 @@ public class AssociationRequestsProcessor { @Nullable String deviceProfile, @Nullable AssociatedDevice associatedDevice, boolean selfManaged, @Nullable IAssociationRequestCallback callback, @Nullable ResultReceiver resultReceiver) { - final int id = mAssociationStore.getNextId(userId); + final int id = mService.getNewAssociationIdForPackage(userId, packageName); final long timestamp = System.currentTimeMillis(); final AssociationInfo association = new AssociationInfo(id, userId, packageName, @@ -291,6 +296,10 @@ public class AssociationRequestsProcessor { // Add role holder for association (if specified) and add new association to store. maybeGrantRoleAndStoreAssociation(association, callback, resultReceiver); + + // Don't need to update the mRevokedAssociationsPendingRoleHolderRemoval since + // maybeRemoveRoleHolderForAssociation in PackageInactivityListener will handle the case + // that there are other devices with the same profile, so the role holder won't be removed. } /** @@ -302,12 +311,12 @@ public class AssociationRequestsProcessor { // If the "Device Profile" is specified, make the companion application a holder of the // corresponding role. // If it is null, then the operation will succeed without granting any role. - addRoleHolderForAssociation(mContext, association, success -> { + addRoleHolderForAssociation(mService.getContext(), association, success -> { if (success) { Slog.i(TAG, "Added " + association.getDeviceProfile() + " role to userId=" + association.getUserId() + ", packageName=" + association.getPackageName()); - mAssociationStore.addAssociation(association); + addAssociationToStore(association); sendCallbackAndFinish(association, callback, resultReceiver); } else { Slog.e(TAG, "Failed to add u" + association.getUserId() @@ -338,6 +347,17 @@ public class AssociationRequestsProcessor { mAssociationStore.updateAssociation(updated); } + private void addAssociationToStore(@NonNull AssociationInfo association) { + Slog.i(TAG, "New CDM association created=" + association); + + mAssociationStore.addAssociation(association); + + mService.updateSpecialAccessPermissionForAssociatedPackage(association.getUserId(), + association.getPackageName()); + + logCreateAssociation(association.getDeviceProfile()); + } + private void sendCallbackAndFinish(@Nullable AssociationInfo association, @Nullable IAssociationRequestCallback callback, @Nullable ResultReceiver resultReceiver) { @@ -389,22 +409,27 @@ public class AssociationRequestsProcessor { private PendingIntent createPendingIntent(int packageUid, Intent intent) { final PendingIntent pendingIntent; + final long token = Binder.clearCallingIdentity(); // Using uid of the application that will own the association (usually the same // application that sent the request) allows us to have multiple "pending" association // requests at the same time. // If the application already has a pending association request, that PendingIntent // will be cancelled except application wants to cancel the request by the system. - return Binder.withCleanCallingIdentity(() -> - PendingIntent.getActivityAsUser( + try { + pendingIntent = PendingIntent.getActivityAsUser( mContext, /*requestCode */ packageUid, intent, FLAG_ONE_SHOT | FLAG_CANCEL_CURRENT | FLAG_IMMUTABLE, ActivityOptions.makeBasic() .setPendingIntentCreatorBackgroundActivityStartMode( ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) .toBundle(), - UserHandle.CURRENT) - ); + UserHandle.CURRENT); + } finally { + Binder.restoreCallingIdentity(token); + } + + return pendingIntent; } private final ResultReceiver mOnRequestConfirmationReceiver = @@ -445,7 +470,7 @@ public class AssociationRequestsProcessor { // Throttle frequent associations final long now = System.currentTimeMillis(); final List<AssociationInfo> associationForPackage = - mAssociationStore.getActiveAssociationsByPackage(userId, packageName); + mAssociationStore.getAssociationsForPackage(userId, packageName); // Number of "recent" associations. int recent = 0; for (AssociationInfo association : associationForPackage) { @@ -461,6 +486,6 @@ public class AssociationRequestsProcessor { } } - return PackageUtils.isPackageAllowlisted(mContext, mPackageManagerInternal, packageName); + return PackageUtils.isPackageAllowlisted(mContext, mPackageManager, packageName); } } diff --git a/services/companion/java/com/android/server/companion/association/AssociationRevokeProcessor.java b/services/companion/java/com/android/server/companion/association/AssociationRevokeProcessor.java new file mode 100644 index 000000000000..d1efbbcd3411 --- /dev/null +++ b/services/companion/java/com/android/server/companion/association/AssociationRevokeProcessor.java @@ -0,0 +1,383 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.companion.association; + +import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE; +import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PROJECTION; + +import static com.android.internal.util.CollectionUtils.any; +import static com.android.server.companion.utils.MetricUtils.logRemoveAssociation; +import static com.android.server.companion.utils.RolesUtils.removeRoleHolderForAssociation; +import static com.android.server.companion.CompanionDeviceManagerService.PerUserAssociationSet; + +import android.annotation.NonNull; +import android.annotation.SuppressLint; +import android.annotation.UserIdInt; +import android.app.ActivityManager; +import android.companion.AssociationInfo; +import android.content.Context; +import android.content.pm.PackageManagerInternal; +import android.os.Binder; +import android.os.UserHandle; +import android.util.ArraySet; +import android.util.Log; +import android.util.Slog; + +import com.android.internal.annotations.GuardedBy; +import com.android.server.companion.CompanionApplicationController; +import com.android.server.companion.CompanionDeviceManagerService; +import com.android.server.companion.datatransfer.SystemDataTransferRequestStore; +import com.android.server.companion.presence.CompanionDevicePresenceMonitor; +import com.android.server.companion.transport.CompanionTransportManager; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * A class response for Association removal. + */ +@SuppressLint("LongLogTag") +public class AssociationRevokeProcessor { + + private static final String TAG = "CDM_AssociationRevokeProcessor"; + private static final boolean DEBUG = false; + private final @NonNull Context mContext; + private final @NonNull CompanionDeviceManagerService mService; + private final @NonNull AssociationStore mAssociationStore; + private final @NonNull PackageManagerInternal mPackageManagerInternal; + private final @NonNull CompanionDevicePresenceMonitor mDevicePresenceMonitor; + private final @NonNull SystemDataTransferRequestStore mSystemDataTransferRequestStore; + private final @NonNull CompanionApplicationController mCompanionAppController; + private final @NonNull CompanionTransportManager mTransportManager; + private final OnPackageVisibilityChangeListener mOnPackageVisibilityChangeListener; + private final ActivityManager mActivityManager; + + /** + * A structure that consists of a set of revoked associations that pending for role holder + * removal per each user. + * + * @see #maybeRemoveRoleHolderForAssociation(AssociationInfo) + * @see #addToPendingRoleHolderRemoval(AssociationInfo) + * @see #removeFromPendingRoleHolderRemoval(AssociationInfo) + * @see #getPendingRoleHolderRemovalAssociationsForUser(int) + */ + @GuardedBy("mRevokedAssociationsPendingRoleHolderRemoval") + private final PerUserAssociationSet mRevokedAssociationsPendingRoleHolderRemoval = + new PerUserAssociationSet(); + /** + * Contains uid-s of packages pending to be removed from the role holder list (after + * revocation of an association), which will happen one the package is no longer visible to the + * user. + * For quicker uid -> (userId, packageName) look-up this is not a {@code Set<Integer>} but + * a {@code Map<Integer, String>} which maps uid-s to packageName-s (userId-s can be derived + * from uid-s using {@link UserHandle#getUserId(int)}). + * + * @see #maybeRemoveRoleHolderForAssociation(AssociationInfo) + * @see #addToPendingRoleHolderRemoval(AssociationInfo) + * @see #removeFromPendingRoleHolderRemoval(AssociationInfo) + */ + @GuardedBy("mRevokedAssociationsPendingRoleHolderRemoval") + private final Map<Integer, String> mUidsPendingRoleHolderRemoval = new HashMap<>(); + + public AssociationRevokeProcessor(@NonNull CompanionDeviceManagerService service, + @NonNull AssociationStore associationStore, + @NonNull PackageManagerInternal packageManager, + @NonNull CompanionDevicePresenceMonitor devicePresenceMonitor, + @NonNull CompanionApplicationController applicationController, + @NonNull SystemDataTransferRequestStore systemDataTransferRequestStore, + @NonNull CompanionTransportManager companionTransportManager) { + mService = service; + mContext = service.getContext(); + mActivityManager = mContext.getSystemService(ActivityManager.class); + mAssociationStore = associationStore; + mPackageManagerInternal = packageManager; + mOnPackageVisibilityChangeListener = + new OnPackageVisibilityChangeListener(mActivityManager); + mDevicePresenceMonitor = devicePresenceMonitor; + mCompanionAppController = applicationController; + mSystemDataTransferRequestStore = systemDataTransferRequestStore; + mTransportManager = companionTransportManager; + } + + /** + * Disassociate an association + */ + // TODO: also revoke notification access + public void disassociateInternal(int associationId) { + final AssociationInfo association = mAssociationStore.getAssociationById(associationId); + final int userId = association.getUserId(); + final String packageName = association.getPackageName(); + final String deviceProfile = association.getDeviceProfile(); + + // Detach transport if exists + mTransportManager.detachSystemDataTransport(packageName, userId, associationId); + + if (!maybeRemoveRoleHolderForAssociation(association)) { + // Need to remove the app from list of the role holders, but will have to do it later + // (the app is in foreground at the moment). + addToPendingRoleHolderRemoval(association); + } + + // Need to check if device still present now because CompanionDevicePresenceMonitor will + // remove current connected device after mAssociationStore.removeAssociation + final boolean wasPresent = mDevicePresenceMonitor.isDevicePresent(associationId); + + // Removing the association. + mAssociationStore.removeAssociation(associationId); + // Do not need to persistUserState since CompanionDeviceManagerService will get callback + // from #onAssociationChanged, and it will handle the persistUserState which including + // active and revoked association. + logRemoveAssociation(deviceProfile); + + // Remove all the system data transfer requests for the association. + mSystemDataTransferRequestStore.removeRequestsByAssociationId(userId, associationId); + + if (!wasPresent || !association.isNotifyOnDeviceNearby()) return; + // The device was connected and the app was notified: check if we need to unbind the app + // now. + final boolean shouldStayBound = any( + mAssociationStore.getAssociationsForPackage(userId, packageName), + it -> it.isNotifyOnDeviceNearby() + && mDevicePresenceMonitor.isDevicePresent(it.getId())); + if (shouldStayBound) return; + mCompanionAppController.unbindCompanionApplication(userId, packageName); + } + + /** + * First, checks if the companion application should be removed from the list role holders when + * upon association's removal, i.e.: association's profile (matches the role) is not null, + * the application does not have other associations with the same profile, etc. + * + * <p> + * Then, if establishes that the application indeed has to be removed from the list of the role + * holders, checks if it could be done right now - + * {@link android.app.role.RoleManager#removeRoleHolderAsUser(String, String, int, UserHandle, java.util.concurrent.Executor, java.util.function.Consumer) RoleManager#removeRoleHolderAsUser()} + * will kill the application's process, which leads poor user experience if the application was + * in foreground when this happened, to avoid this CDMS delays invoking + * {@code RoleManager.removeRoleHolderAsUser()} until the app is no longer in foreground. + * + * @return {@code true} if the application does NOT need be removed from the list of the role + * holders OR if the application was successfully removed from the list of role holders. + * I.e.: from the role-management perspective the association is done with. + * {@code false} if the application needs to be removed from the list of role the role + * holders, BUT it CDMS would prefer to do it later. + * I.e.: application is in the foreground at the moment, but invoking + * {@code RoleManager.removeRoleHolderAsUser()} will kill the application's process, + * which would lead to the poor UX, hence need to try later. + */ + public boolean maybeRemoveRoleHolderForAssociation(@NonNull AssociationInfo association) { + if (DEBUG) Log.d(TAG, "maybeRemoveRoleHolderForAssociation() association=" + association); + final String deviceProfile = association.getDeviceProfile(); + + if (deviceProfile == null) { + // No role was granted to for this association, there is nothing else we need to here. + return true; + } + // Do not need to remove the system role since it was pre-granted by the system. + if (deviceProfile.equals(DEVICE_PROFILE_AUTOMOTIVE_PROJECTION)) { + return true; + } + + // Check if the applications is associated with another devices with the profile. If so, + // it should remain the role holder. + final int id = association.getId(); + final int userId = association.getUserId(); + final String packageName = association.getPackageName(); + final boolean roleStillInUse = any( + mAssociationStore.getAssociationsForPackage(userId, packageName), + it -> deviceProfile.equals(it.getDeviceProfile()) && id != it.getId()); + if (roleStillInUse) { + // Application should remain a role holder, there is nothing else we need to here. + return true; + } + + final int packageProcessImportance = getPackageProcessImportance(userId, packageName); + if (packageProcessImportance <= IMPORTANCE_VISIBLE) { + // Need to remove the app from the list of role holders, but the process is visible to + // the user at the moment, so we'll need to it later: log and return false. + Slog.i(TAG, "Cannot remove role holder for the removed association id=" + id + + " now - process is visible."); + return false; + } + + removeRoleHolderForAssociation(mContext, association.getUserId(), + association.getPackageName(), association.getDeviceProfile()); + return true; + } + + /** + * Set revoked flag for active association and add the revoked association and the uid into + * the caches. + * + * @see #mRevokedAssociationsPendingRoleHolderRemoval + * @see #mUidsPendingRoleHolderRemoval + * @see OnPackageVisibilityChangeListener + */ + public void addToPendingRoleHolderRemoval(@NonNull AssociationInfo association) { + // First: set revoked flag + association = (new AssociationInfo.Builder(association)).setRevoked(true).build(); + final String packageName = association.getPackageName(); + final int userId = association.getUserId(); + final int uid = mPackageManagerInternal.getPackageUid(packageName, /* flags */0, userId); + // Second: add to the set. + synchronized (mRevokedAssociationsPendingRoleHolderRemoval) { + mRevokedAssociationsPendingRoleHolderRemoval.forUser(association.getUserId()) + .add(association); + if (!mUidsPendingRoleHolderRemoval.containsKey(uid)) { + mUidsPendingRoleHolderRemoval.put(uid, packageName); + + if (mUidsPendingRoleHolderRemoval.size() == 1) { + // Just added first uid: start the listener + mOnPackageVisibilityChangeListener.startListening(); + } + } + } + } + + /** + * @return a copy of the revoked associations set (safeguarding against + * {@code ConcurrentModificationException}-s). + */ + @NonNull + public Set<AssociationInfo> getPendingRoleHolderRemovalAssociationsForUser( + @UserIdInt int userId) { + synchronized (mRevokedAssociationsPendingRoleHolderRemoval) { + // Return a copy. + return new ArraySet<>(mRevokedAssociationsPendingRoleHolderRemoval.forUser(userId)); + } + } + + @SuppressLint("MissingPermission") + private int getPackageProcessImportance(@UserIdInt int userId, @NonNull String packageName) { + return Binder.withCleanCallingIdentity(() -> { + final int uid = + mPackageManagerInternal.getPackageUid(packageName, /* flags */0, userId); + return mActivityManager.getUidImportance(uid); + }); + } + + /** + * Remove the revoked association from the cache and also remove the uid from the map if + * there are other associations with the same package still pending for role holder removal. + * + * @see #mRevokedAssociationsPendingRoleHolderRemoval + * @see #mUidsPendingRoleHolderRemoval + * @see OnPackageVisibilityChangeListener + */ + private void removeFromPendingRoleHolderRemoval(@NonNull AssociationInfo association) { + final String packageName = association.getPackageName(); + final int userId = association.getUserId(); + final int uid = mPackageManagerInternal.getPackageUid(packageName, /* flags */ 0, userId); + + synchronized (mRevokedAssociationsPendingRoleHolderRemoval) { + mRevokedAssociationsPendingRoleHolderRemoval.forUser(userId) + .remove(association); + + final boolean shouldKeepUidForRemoval = any( + getPendingRoleHolderRemovalAssociationsForUser(userId), + ai -> packageName.equals(ai.getPackageName())); + // Do not remove the uid from the map since other associations with + // the same packageName still pending for role holder removal. + if (!shouldKeepUidForRemoval) { + mUidsPendingRoleHolderRemoval.remove(uid); + } + + if (mUidsPendingRoleHolderRemoval.isEmpty()) { + // The set is empty now - can "turn off" the listener. + mOnPackageVisibilityChangeListener.stopListening(); + } + } + } + + private String getPackageNameByUid(int uid) { + synchronized (mRevokedAssociationsPendingRoleHolderRemoval) { + return mUidsPendingRoleHolderRemoval.get(uid); + } + } + + /** + * An OnUidImportanceListener class which watches the importance of the packages. + * In this class, we ONLY interested in the importance of the running process is greater than + * {@link ActivityManager.RunningAppProcessInfo#IMPORTANCE_VISIBLE} for the uids have been added + * into the {@link #mUidsPendingRoleHolderRemoval}. Lastly remove the role holder for the + * revoked associations for the same packages. + * + * @see #maybeRemoveRoleHolderForAssociation(AssociationInfo) + * @see #removeFromPendingRoleHolderRemoval(AssociationInfo) + * @see #getPendingRoleHolderRemovalAssociationsForUser(int) + */ + private class OnPackageVisibilityChangeListener implements + ActivityManager.OnUidImportanceListener { + final @NonNull ActivityManager mAm; + + OnPackageVisibilityChangeListener(@NonNull ActivityManager am) { + this.mAm = am; + } + + @SuppressLint("MissingPermission") + void startListening() { + Binder.withCleanCallingIdentity( + () -> mAm.addOnUidImportanceListener( + /* listener */ OnPackageVisibilityChangeListener.this, + ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE)); + } + + @SuppressLint("MissingPermission") + void stopListening() { + Binder.withCleanCallingIdentity( + () -> mAm.removeOnUidImportanceListener( + /* listener */ OnPackageVisibilityChangeListener.this)); + } + + @Override + public void onUidImportance(int uid, int importance) { + if (importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) { + // The lower the importance value the more "important" the process is. + // We are only interested when the process ceases to be visible. + return; + } + + final String packageName = getPackageNameByUid(uid); + if (packageName == null) { + // Not interested in this uid. + return; + } + + final int userId = UserHandle.getUserId(uid); + + boolean needToPersistStateForUser = false; + + for (AssociationInfo association : + getPendingRoleHolderRemovalAssociationsForUser(userId)) { + if (!packageName.equals(association.getPackageName())) continue; + + if (!maybeRemoveRoleHolderForAssociation(association)) { + // Did not remove the role holder, will have to try again later. + continue; + } + + removeFromPendingRoleHolderRemoval(association); + needToPersistStateForUser = true; + } + + if (needToPersistStateForUser) { + mService.postPersistUserState(userId); + } + } + } +} diff --git a/services/companion/java/com/android/server/companion/association/AssociationStore.java b/services/companion/java/com/android/server/companion/association/AssociationStore.java index 29de764c4d5f..2f94bdebb988 100644 --- a/services/companion/java/com/android/server/companion/association/AssociationStore.java +++ b/services/companion/java/com/android/server/companion/association/AssociationStore.java @@ -16,24 +16,15 @@ package com.android.server.companion.association; -import static com.android.server.companion.utils.MetricUtils.logCreateAssociation; -import static com.android.server.companion.utils.MetricUtils.logRemoveAssociation; - import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.annotation.UserIdInt; import android.companion.AssociationInfo; -import android.companion.IOnAssociationsChangedListener; -import android.content.pm.UserInfo; import android.net.MacAddress; -import android.os.Binder; -import android.os.RemoteCallbackList; -import android.os.RemoteException; -import android.os.UserHandle; -import android.os.UserManager; import android.util.Slog; +import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.CollectionUtils; @@ -42,14 +33,15 @@ import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; /** * Association store for CRUD. @@ -117,105 +109,44 @@ public class AssociationStore { private final Object mLock = new Object(); - private final ExecutorService mExecutor; - @GuardedBy("mLock") - private boolean mPersisted = false; + private final Map<Integer, AssociationInfo> mIdMap = new HashMap<>(); @GuardedBy("mLock") - private final Map<Integer, AssociationInfo> mIdToAssociationMap = new HashMap<>(); + private final Map<MacAddress, Set<Integer>> mAddressMap = new HashMap<>(); @GuardedBy("mLock") - private final Map<Integer, Integer> mUserToMaxId = new HashMap<>(); - - @GuardedBy("mLocalListeners") - private final Set<OnChangeListener> mLocalListeners = new LinkedHashSet<>(); - @GuardedBy("mRemoteListeners") - private final RemoteCallbackList<IOnAssociationsChangedListener> mRemoteListeners = - new RemoteCallbackList<>(); - - private final UserManager mUserManager; - private final AssociationDiskStore mDiskStore; - - public AssociationStore(UserManager userManager, AssociationDiskStore diskStore) { - mUserManager = userManager; - mDiskStore = diskStore; - mExecutor = Executors.newSingleThreadExecutor(); - } - - /** - * Load all alive users' associations from disk to cache. - */ - public void refreshCache() { - Binder.withCleanCallingIdentity(() -> { - List<Integer> userIds = new ArrayList<>(); - for (UserInfo user : mUserManager.getAliveUsers()) { - userIds.add(user.id); - } - - synchronized (mLock) { - mPersisted = false; - - mIdToAssociationMap.clear(); - mUserToMaxId.clear(); - - // The data is stored in DE directories, so we can read the data for all users now - // (which would not be possible if the data was stored to CE directories). - Map<Integer, Associations> userToAssociationsMap = - mDiskStore.readAssociationsByUsers(userIds); - for (Map.Entry<Integer, Associations> entry : userToAssociationsMap.entrySet()) { - for (AssociationInfo association : entry.getValue().getAssociations()) { - mIdToAssociationMap.put(association.getId(), association); - } - mUserToMaxId.put(entry.getKey(), entry.getValue().getMaxId()); - } - - mPersisted = true; - } - }); - } - - /** - * Get the current max association id. - */ - public int getMaxId(int userId) { - synchronized (mLock) { - return mUserToMaxId.getOrDefault(userId, 0); - } - } + private final SparseArray<List<AssociationInfo>> mCachedPerUser = new SparseArray<>(); - /** - * Get the next available association id. - */ - public int getNextId(int userId) { - synchronized (mLock) { - return getMaxId(userId) + 1; - } - } + @GuardedBy("mListeners") + private final Set<OnChangeListener> mListeners = new LinkedHashSet<>(); /** * Add an association. */ public void addAssociation(@NonNull AssociationInfo association) { - Slog.i(TAG, "Adding new association=[" + association + "]..."); + Slog.i(TAG, "Adding new association=" + association); + + // Validity check first. + checkNotRevoked(association); final int id = association.getId(); - final int userId = association.getUserId(); synchronized (mLock) { - if (mIdToAssociationMap.containsKey(id)) { - Slog.e(TAG, "Association with id=[" + id + "] already exists."); + if (mIdMap.containsKey(id)) { + Slog.e(TAG, "Association with id " + id + " already exists."); return; } + mIdMap.put(id, association); - mIdToAssociationMap.put(id, association); - mUserToMaxId.put(userId, Math.max(mUserToMaxId.getOrDefault(userId, 0), id)); + final MacAddress address = association.getDeviceMacAddress(); + if (address != null) { + mAddressMap.computeIfAbsent(address, it -> new HashSet<>()).add(id); + } - writeCacheToDisk(userId); + invalidateCacheForUserLocked(association.getUserId()); Slog.i(TAG, "Done adding new association."); } - logCreateAssociation(association.getDeviceProfile()); - broadcastChange(CHANGE_TYPE_ADDED, association); } @@ -223,16 +154,18 @@ public class AssociationStore { * Update an association. */ public void updateAssociation(@NonNull AssociationInfo updated) { - Slog.i(TAG, "Updating new association=[" + updated + "]..."); + Slog.i(TAG, "Updating new association=" + updated); + // Validity check first. + checkNotRevoked(updated); final int id = updated.getId(); + final AssociationInfo current; final boolean macAddressChanged; - synchronized (mLock) { - current = mIdToAssociationMap.get(id); + current = mIdMap.get(id); if (current == null) { - Slog.w(TAG, "Can't update association id=[" + id + "]. It does not exist."); + Slog.w(TAG, "Can't update association. It does not exist."); return; } @@ -241,238 +174,174 @@ public class AssociationStore { return; } - mIdToAssociationMap.put(id, updated); - - writeCacheToDisk(updated.getUserId()); + // Update the ID-to-Association map. + mIdMap.put(id, updated); + // Invalidate the corresponding user cache entry. + invalidateCacheForUserLocked(current.getUserId()); + + // Update the MacAddress-to-List<Association> map if needed. + final MacAddress updatedAddress = updated.getDeviceMacAddress(); + final MacAddress currentAddress = current.getDeviceMacAddress(); + macAddressChanged = !Objects.equals(currentAddress, updatedAddress); + if (macAddressChanged) { + if (currentAddress != null) { + mAddressMap.get(currentAddress).remove(id); + } + if (updatedAddress != null) { + mAddressMap.computeIfAbsent(updatedAddress, it -> new HashSet<>()).add(id); + } + } + Slog.i(TAG, "Done updating association."); } - Slog.i(TAG, "Done updating association."); - - // Check if the MacAddress has changed. - final MacAddress updatedAddress = updated.getDeviceMacAddress(); - final MacAddress currentAddress = current.getDeviceMacAddress(); - macAddressChanged = !Objects.equals(currentAddress, updatedAddress); - final int changeType = macAddressChanged ? CHANGE_TYPE_UPDATED_ADDRESS_CHANGED : CHANGE_TYPE_UPDATED_ADDRESS_UNCHANGED; - broadcastChange(changeType, updated); } /** - * Remove an association. + * Remove an association */ public void removeAssociation(int id) { - Slog.i(TAG, "Removing association id=[" + id + "]..."); + Slog.i(TAG, "Removing association id=" + id); final AssociationInfo association; - synchronized (mLock) { - association = mIdToAssociationMap.remove(id); + association = mIdMap.remove(id); if (association == null) { - Slog.w(TAG, "Can't remove association id=[" + id + "]. It does not exist."); + Slog.w(TAG, "Can't remove association. It does not exist."); return; } - writeCacheToDisk(association.getUserId()); - - Slog.i(TAG, "Done removing association."); - } - - logRemoveAssociation(association.getDeviceProfile()); - - broadcastChange(CHANGE_TYPE_REMOVED, association); - } - - private void writeCacheToDisk(@UserIdInt int userId) { - mExecutor.execute(() -> { - Associations associations = new Associations(); - synchronized (mLock) { - associations.setMaxId(mUserToMaxId.getOrDefault(userId, 0)); - associations.setAssociations( - CollectionUtils.filter(mIdToAssociationMap.values().stream().toList(), - a -> a.getUserId() == userId)); + final MacAddress macAddress = association.getDeviceMacAddress(); + if (macAddress != null) { + mAddressMap.get(macAddress).remove(id); } - mDiskStore.writeAssociationsForUser(userId, associations); - }); - } - /** - * Get a copy of all associations including pending and revoked ones. - * Modifying the copy won't modify the actual associations. - * - * If a cache miss happens, read from disk. - */ - @NonNull - public List<AssociationInfo> getAssociations() { - synchronized (mLock) { - if (!mPersisted) { - refreshCache(); - } - return List.copyOf(mIdToAssociationMap.values()); - } - } + invalidateCacheForUserLocked(association.getUserId()); - /** - * Get a copy of active associations. - */ - @NonNull - public List<AssociationInfo> getActiveAssociations() { - synchronized (mLock) { - return CollectionUtils.filter(getAssociations(), AssociationInfo::isActive); + Slog.i(TAG, "Done removing association."); } - } - /** - * Get a copy of all associations by user. - */ - @NonNull - public List<AssociationInfo> getAssociationsByUser(@UserIdInt int userId) { - synchronized (mLock) { - return CollectionUtils.filter(getAssociations(), a -> a.getUserId() == userId); - } + broadcastChange(CHANGE_TYPE_REMOVED, association); } /** - * Get a copy of active associations by user. + * @return a "snapshot" of the current state of the existing associations. */ - @NonNull - public List<AssociationInfo> getActiveAssociationsByUser(@UserIdInt int userId) { + public @NonNull Collection<AssociationInfo> getAssociations() { synchronized (mLock) { - return CollectionUtils.filter(getActiveAssociations(), a -> a.getUserId() == userId); + // IMPORTANT: make and return a COPY of the mIdMap.values(), NOT a "direct" reference. + // The HashMap.values() returns a collection which is backed by the HashMap, so changes + // to the HashMap are reflected in this collection. + // For us this means that if mIdMap is modified while the iteration over mIdMap.values() + // is in progress it may lead to "undefined results" (according to the HashMap's + // documentation) or cause ConcurrentModificationExceptions in the iterator (according + // to the bugreports...). + return List.copyOf(mIdMap.values()); } } /** - * Get a copy of all associations by package. + * Get associations for the user. */ - @NonNull - public List<AssociationInfo> getAssociationsByPackage(@UserIdInt int userId, - @NonNull String packageName) { + public @NonNull List<AssociationInfo> getAssociationsForUser(@UserIdInt int userId) { synchronized (mLock) { - return CollectionUtils.filter(getAssociationsByUser(userId), - a -> a.getPackageName().equals(packageName)); + return getAssociationsForUserLocked(userId); } } /** - * Get a copy of active associations by package. + * Get associations for the package */ - @NonNull - public List<AssociationInfo> getActiveAssociationsByPackage(@UserIdInt int userId, - @NonNull String packageName) { - synchronized (mLock) { - return CollectionUtils.filter(getActiveAssociationsByUser(userId), - a -> a.getPackageName().equals(packageName)); - } + public @NonNull List<AssociationInfo> getAssociationsForPackage( + @UserIdInt int userId, @NonNull String packageName) { + final List<AssociationInfo> associationsForUser = getAssociationsForUser(userId); + final List<AssociationInfo> associationsForPackage = + CollectionUtils.filter(associationsForUser, + it -> it.getPackageName().equals(packageName)); + return Collections.unmodifiableList(associationsForPackage); } /** - * Get the first active association with the mac address. + * Get associations by mac address for the package. */ - @Nullable - public AssociationInfo getFirstAssociationByAddress( + public @Nullable AssociationInfo getAssociationsForPackageWithAddress( @UserIdInt int userId, @NonNull String packageName, @NonNull String macAddress) { - synchronized (mLock) { - return CollectionUtils.find(getActiveAssociationsByPackage(userId, packageName), - a -> a.getDeviceMacAddress() != null && a.getDeviceMacAddress() - .equals(MacAddress.fromString(macAddress))); - } + final List<AssociationInfo> associations = getAssociationsByAddress(macAddress); + return CollectionUtils.find(associations, + it -> it.belongsToPackage(userId, packageName)); } /** - * Get the association by id. + * Get association by id. */ - @Nullable - public AssociationInfo getAssociationById(int id) { + public @Nullable AssociationInfo getAssociationById(int id) { synchronized (mLock) { - return mIdToAssociationMap.get(id); + return mIdMap.get(id); } } /** - * Get a copy of active associations by mac address. + * Get associations by mac address. */ @NonNull - public List<AssociationInfo> getActiveAssociationsByAddress(@NonNull String macAddress) { - synchronized (mLock) { - return CollectionUtils.filter(getActiveAssociations(), - a -> a.getDeviceMacAddress() != null && a.getDeviceMacAddress() - .equals(MacAddress.fromString(macAddress))); - } - } + public List<AssociationInfo> getAssociationsByAddress(@NonNull String macAddress) { + final MacAddress address = MacAddress.fromString(macAddress); - /** - * Get a copy of revoked associations. - */ - @NonNull - public List<AssociationInfo> getRevokedAssociations() { synchronized (mLock) { - return CollectionUtils.filter(getAssociations(), AssociationInfo::isRevoked); - } - } + final Set<Integer> ids = mAddressMap.get(address); + if (ids == null) return Collections.emptyList(); - /** - * Get a copy of revoked associations for the package. - */ - @NonNull - public List<AssociationInfo> getRevokedAssociations(@UserIdInt int userId, - @NonNull String packageName) { - synchronized (mLock) { - return CollectionUtils.filter(getAssociations(), - a -> packageName.equals(a.getPackageName()) && a.getUserId() == userId - && a.isRevoked()); + final List<AssociationInfo> associations = new ArrayList<>(ids.size()); + for (Integer id : ids) { + associations.add(mIdMap.get(id)); + } + + return Collections.unmodifiableList(associations); } } - /** - * Get a copy of active associations. - */ + @GuardedBy("mLock") @NonNull - public List<AssociationInfo> getPendingAssociations(@UserIdInt int userId, - @NonNull String packageName) { - synchronized (mLock) { - return CollectionUtils.filter(getAssociations(), - a -> packageName.equals(a.getPackageName()) && a.getUserId() == userId - && a.isPending()); + private List<AssociationInfo> getAssociationsForUserLocked(@UserIdInt int userId) { + final List<AssociationInfo> cached = mCachedPerUser.get(userId); + if (cached != null) { + return cached; } - } - /** - * Register a local listener for association changes. - */ - public void registerLocalListener(@NonNull OnChangeListener listener) { - synchronized (mLocalListeners) { - mLocalListeners.add(listener); + final List<AssociationInfo> associationsForUser = new ArrayList<>(); + for (AssociationInfo association : mIdMap.values()) { + if (association.getUserId() == userId) { + associationsForUser.add(association); + } } + final List<AssociationInfo> set = Collections.unmodifiableList(associationsForUser); + mCachedPerUser.set(userId, set); + return set; } - /** - * Unregister a local listener previously registered for association changes. - */ - public void unregisterLocalListener(@NonNull OnChangeListener listener) { - synchronized (mLocalListeners) { - mLocalListeners.remove(listener); - } + @GuardedBy("mLock") + private void invalidateCacheForUserLocked(@UserIdInt int userId) { + mCachedPerUser.delete(userId); } /** - * Register a remote listener for association changes. + * Register a listener for association changes. */ - public void registerRemoteListener(@NonNull IOnAssociationsChangedListener listener, - int userId) { - synchronized (mRemoteListeners) { - mRemoteListeners.register(listener, userId); + public void registerListener(@NonNull OnChangeListener listener) { + synchronized (mListeners) { + mListeners.add(listener); } } /** - * Unregister a remote listener previously registered for association changes. + * Unregister a listener previously registered for association changes. */ - public void unregisterRemoteListener(@NonNull IOnAssociationsChangedListener listener) { - synchronized (mRemoteListeners) { - mRemoteListeners.unregister(listener); + public void unregisterListener(@NonNull OnChangeListener listener) { + synchronized (mListeners) { + mListeners.remove(listener); } } @@ -481,39 +350,52 @@ public class AssociationStore { */ public void dump(@NonNull PrintWriter out) { out.append("Companion Device Associations: "); - if (getActiveAssociations().isEmpty()) { + if (getAssociations().isEmpty()) { out.append("<empty>\n"); } else { out.append("\n"); - for (AssociationInfo a : getActiveAssociations()) { + for (AssociationInfo a : getAssociations()) { out.append(" ").append(a.toString()).append('\n'); } } } private void broadcastChange(@ChangeType int changeType, AssociationInfo association) { - synchronized (mLocalListeners) { - for (OnChangeListener listener : mLocalListeners) { + synchronized (mListeners) { + for (OnChangeListener listener : mListeners) { listener.onAssociationChanged(changeType, association); } } - synchronized (mRemoteListeners) { - final int userId = association.getUserId(); - final List<AssociationInfo> updatedAssociations = getActiveAssociationsByUser(userId); - // Notify listeners if ADDED, REMOVED or UPDATED_ADDRESS_CHANGED. - // Do NOT notify when UPDATED_ADDRESS_UNCHANGED, which means a minor tweak in - // association's configs, which "listeners" won't (and shouldn't) be able to see. - if (changeType != CHANGE_TYPE_UPDATED_ADDRESS_UNCHANGED) { - mRemoteListeners.broadcast((listener, callbackUserId) -> { - int listenerUserId = (int) callbackUserId; - if (listenerUserId == userId || listenerUserId == UserHandle.USER_ALL) { - try { - listener.onAssociationsChanged(updatedAssociations); - } catch (RemoteException ignored) { - } - } - }); + } + + /** + * Set associations to cache. It will clear the existing cache. + */ + public void setAssociationsToCache(Collection<AssociationInfo> associations) { + // Validity check first. + associations.forEach(AssociationStore::checkNotRevoked); + + synchronized (mLock) { + mIdMap.clear(); + mAddressMap.clear(); + mCachedPerUser.clear(); + + for (AssociationInfo association : associations) { + final int id = association.getId(); + mIdMap.put(id, association); + + final MacAddress address = association.getDeviceMacAddress(); + if (address != null) { + mAddressMap.computeIfAbsent(address, it -> new HashSet<>()).add(id); + } } } } + + private static void checkNotRevoked(@NonNull AssociationInfo association) { + if (association.isRevoked()) { + throw new IllegalArgumentException( + "Revoked (removed) associations MUST NOT appear in the AssociationStore"); + } + } } diff --git a/services/companion/java/com/android/server/companion/association/Associations.java b/services/companion/java/com/android/server/companion/association/Associations.java deleted file mode 100644 index 7da3699dba8d..000000000000 --- a/services/companion/java/com/android/server/companion/association/Associations.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.companion.association; - -import android.companion.AssociationInfo; - -import java.util.ArrayList; -import java.util.List; - -/** - * Represents associations per user. Should be only used by Association stores. - */ -public class Associations { - - private int mVersion = 0; - - private List<AssociationInfo> mAssociations = new ArrayList<>(); - - private int mMaxId = 0; - - public Associations() { - } - - public void setVersion(int version) { - mVersion = version; - } - - /** - * Add an association. - */ - public void addAssociation(AssociationInfo association) { - mAssociations.add(association); - } - - public void setMaxId(int maxId) { - mMaxId = maxId; - } - - public void setAssociations(List<AssociationInfo> associations) { - mAssociations = List.copyOf(associations); - } - - public int getVersion() { - return mVersion; - } - - public int getMaxId() { - return mMaxId; - } - - public List<AssociationInfo> getAssociations() { - return mAssociations; - } -} diff --git a/services/companion/java/com/android/server/companion/association/DisassociationProcessor.java b/services/companion/java/com/android/server/companion/association/DisassociationProcessor.java deleted file mode 100644 index ec8977918c56..000000000000 --- a/services/companion/java/com/android/server/companion/association/DisassociationProcessor.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.companion.association; - -import static android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE; -import static android.companion.AssociationRequest.DEVICE_PROFILE_AUTOMOTIVE_PROJECTION; - -import static com.android.internal.util.CollectionUtils.any; -import static com.android.server.companion.utils.RolesUtils.removeRoleHolderForAssociation; - -import android.annotation.NonNull; -import android.annotation.SuppressLint; -import android.annotation.UserIdInt; -import android.app.ActivityManager; -import android.companion.AssociationInfo; -import android.content.Context; -import android.content.pm.PackageManagerInternal; -import android.os.Binder; -import android.os.UserHandle; -import android.util.Slog; - -import com.android.server.companion.CompanionApplicationController; -import com.android.server.companion.datatransfer.SystemDataTransferRequestStore; -import com.android.server.companion.presence.CompanionDevicePresenceMonitor; -import com.android.server.companion.transport.CompanionTransportManager; - -/** - * A class response for Association removal. - */ -@SuppressLint("LongLogTag") -public class DisassociationProcessor { - - private static final String TAG = "CDM_DisassociationProcessor"; - @NonNull - private final Context mContext; - @NonNull - private final AssociationStore mAssociationStore; - @NonNull - private final PackageManagerInternal mPackageManagerInternal; - @NonNull - private final CompanionDevicePresenceMonitor mDevicePresenceMonitor; - @NonNull - private final SystemDataTransferRequestStore mSystemDataTransferRequestStore; - @NonNull - private final CompanionApplicationController mCompanionAppController; - @NonNull - private final CompanionTransportManager mTransportManager; - private final OnPackageVisibilityChangeListener mOnPackageVisibilityChangeListener; - private final ActivityManager mActivityManager; - - public DisassociationProcessor(@NonNull Context context, - @NonNull ActivityManager activityManager, - @NonNull AssociationStore associationStore, - @NonNull PackageManagerInternal packageManager, - @NonNull CompanionDevicePresenceMonitor devicePresenceMonitor, - @NonNull CompanionApplicationController applicationController, - @NonNull SystemDataTransferRequestStore systemDataTransferRequestStore, - @NonNull CompanionTransportManager companionTransportManager) { - mContext = context; - mActivityManager = activityManager; - mAssociationStore = associationStore; - mPackageManagerInternal = packageManager; - mOnPackageVisibilityChangeListener = - new OnPackageVisibilityChangeListener(); - mDevicePresenceMonitor = devicePresenceMonitor; - mCompanionAppController = applicationController; - mSystemDataTransferRequestStore = systemDataTransferRequestStore; - mTransportManager = companionTransportManager; - } - - /** - * Disassociate an association by id. - */ - // TODO: also revoke notification access - public void disassociate(int id) { - Slog.i(TAG, "Disassociating id=[" + id + "]..."); - - final AssociationInfo association = mAssociationStore.getAssociationById(id); - if (association == null) { - Slog.e(TAG, "Can't disassociate id=[" + id + "]. It doesn't exist."); - return; - } - - final int userId = association.getUserId(); - final String packageName = association.getPackageName(); - final String deviceProfile = association.getDeviceProfile(); - - final boolean isRoleInUseByOtherAssociations = deviceProfile != null - && any(mAssociationStore.getActiveAssociationsByPackage(userId, packageName), - it -> deviceProfile.equals(it.getDeviceProfile()) && id != it.getId()); - - final int packageProcessImportance = getPackageProcessImportance(userId, packageName); - if (packageProcessImportance <= IMPORTANCE_VISIBLE && deviceProfile != null - && !isRoleInUseByOtherAssociations) { - // Need to remove the app from the list of role holders, but the process is visible - // to the user at the moment, so we'll need to do it later. - Slog.i(TAG, "Cannot disassociate id=[" + id + "] now - process is visible. " - + "Start listening to package importance..."); - - AssociationInfo revokedAssociation = (new AssociationInfo.Builder( - association)).setRevoked(true).build(); - mAssociationStore.updateAssociation(revokedAssociation); - startListening(); - return; - } - - // Association cleanup. - mAssociationStore.removeAssociation(association.getId()); - mSystemDataTransferRequestStore.removeRequestsByAssociationId(userId, id); - - // Detach transport if exists - mTransportManager.detachSystemDataTransport(packageName, userId, id); - - // If role is not in use by other associations, revoke the role. - // Do not need to remove the system role since it was pre-granted by the system. - if (!isRoleInUseByOtherAssociations && deviceProfile != null && !deviceProfile.equals( - DEVICE_PROFILE_AUTOMOTIVE_PROJECTION)) { - removeRoleHolderForAssociation(mContext, association.getUserId(), - association.getPackageName(), association.getDeviceProfile()); - } - - // Unbind the app if needed. - final boolean wasPresent = mDevicePresenceMonitor.isDevicePresent(id); - if (!wasPresent || !association.isNotifyOnDeviceNearby()) { - return; - } - final boolean shouldStayBound = any( - mAssociationStore.getActiveAssociationsByPackage(userId, packageName), - it -> it.isNotifyOnDeviceNearby() - && mDevicePresenceMonitor.isDevicePresent(it.getId())); - if (!shouldStayBound) { - mCompanionAppController.unbindCompanionApplication(userId, packageName); - } - } - - @SuppressLint("MissingPermission") - private int getPackageProcessImportance(@UserIdInt int userId, @NonNull String packageName) { - return Binder.withCleanCallingIdentity(() -> { - final int uid = - mPackageManagerInternal.getPackageUid(packageName, /* flags */0, userId); - return mActivityManager.getUidImportance(uid); - }); - } - - private void startListening() { - Slog.i(TAG, "Start listening to uid importance changes..."); - try { - Binder.withCleanCallingIdentity( - () -> mActivityManager.addOnUidImportanceListener( - mOnPackageVisibilityChangeListener, - ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE)); - } catch (IllegalArgumentException e) { - Slog.e(TAG, "Failed to start listening to uid importance changes."); - } - } - - private void stopListening() { - Slog.i(TAG, "Stop listening to uid importance changes."); - try { - Binder.withCleanCallingIdentity(() -> mActivityManager.removeOnUidImportanceListener( - mOnPackageVisibilityChangeListener)); - } catch (IllegalArgumentException e) { - Slog.e(TAG, "Failed to stop listening to uid importance changes."); - } - } - - /** - * An OnUidImportanceListener class which watches the importance of the packages. - * In this class, we ONLY interested in the importance of the running process is greater than - * {@link ActivityManager.RunningAppProcessInfo#IMPORTANCE_VISIBLE}. - * - * Lastly remove the role holder for the revoked associations for the same packages. - * - * @see #disassociate(int) - */ - private class OnPackageVisibilityChangeListener implements - ActivityManager.OnUidImportanceListener { - - @Override - public void onUidImportance(int uid, int importance) { - if (importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) { - // The lower the importance value the more "important" the process is. - // We are only interested when the process ceases to be visible. - return; - } - - final String packageName = mPackageManagerInternal.getNameForUid(uid); - if (packageName == null) { - // Not interested in this uid. - return; - } - - int userId = UserHandle.getUserId(uid); - for (AssociationInfo association : mAssociationStore.getRevokedAssociations(userId, - packageName)) { - disassociate(association.getId()); - } - - if (mAssociationStore.getRevokedAssociations().isEmpty()) { - stopListening(); - } - } - } -} diff --git a/services/companion/java/com/android/server/companion/association/InactiveAssociationsRemovalService.java b/services/companion/java/com/android/server/companion/association/InactiveAssociationsRemovalService.java index f28731548dcc..894c49a2b5cf 100644 --- a/services/companion/java/com/android/server/companion/association/InactiveAssociationsRemovalService.java +++ b/services/companion/java/com/android/server/companion/association/InactiveAssociationsRemovalService.java @@ -33,7 +33,7 @@ import com.android.server.companion.CompanionDeviceManagerServiceInternal; * A Job Service responsible for clean up idle self-managed associations. * * The job will be executed only if the device is charging and in idle mode due to the application - * will be killed if association/role are revoked. See {@link DisassociationProcessor} + * will be killed if association/role are revoked. See {@link AssociationRevokeProcessor} */ public class InactiveAssociationsRemovalService extends JobService { diff --git a/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java b/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java index c5ca0bf7e9c5..a08e0da90d49 100644 --- a/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java +++ b/services/companion/java/com/android/server/companion/datatransfer/SystemDataTransferProcessor.java @@ -186,14 +186,18 @@ public class SystemDataTransferProcessor { intent.putExtras(extras); // Create a PendingIntent - return Binder.withCleanCallingIdentity(() -> - PendingIntent.getActivityAsUser(mContext, /*requestCode */ associationId, - intent, FLAG_ONE_SHOT | FLAG_CANCEL_CURRENT | FLAG_IMMUTABLE, - ActivityOptions.makeBasic() - .setPendingIntentCreatorBackgroundActivityStartMode( - ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) - .toBundle(), - UserHandle.CURRENT)); + final long token = Binder.clearCallingIdentity(); + try { + return PendingIntent.getActivityAsUser(mContext, /*requestCode */ associationId, intent, + FLAG_ONE_SHOT | FLAG_CANCEL_CURRENT | FLAG_IMMUTABLE, + ActivityOptions.makeBasic() + .setPendingIntentCreatorBackgroundActivityStartMode( + ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) + .toBundle(), + UserHandle.CURRENT); + } finally { + Binder.restoreCallingIdentity(token); + } } /** @@ -224,7 +228,8 @@ public class SystemDataTransferProcessor { } // Start permission sync - Binder.withCleanCallingIdentity(() -> { + final long callingIdentityToken = Binder.clearCallingIdentity(); + try { // TODO: refactor to work with streams of data mPermissionControllerManager.getRuntimePermissionBackup(UserHandle.of(userId), mExecutor, backup -> { @@ -232,31 +237,39 @@ public class SystemDataTransferProcessor { .requestPermissionRestore(associationId, backup); translateFutureToCallback(future, callback); }); - }); + } finally { + Binder.restoreCallingIdentity(callingIdentityToken); + } } /** * Enable perm sync for the association */ public void enablePermissionsSync(int associationId) { - Binder.withCleanCallingIdentity(() -> { + final long callingIdentityToken = Binder.clearCallingIdentity(); + try { int userId = mAssociationStore.getAssociationById(associationId).getUserId(); PermissionSyncRequest request = new PermissionSyncRequest(associationId); request.setUserConsented(true); mSystemDataTransferRequestStore.writeRequest(userId, request); - }); + } finally { + Binder.restoreCallingIdentity(callingIdentityToken); + } } /** * Disable perm sync for the association */ public void disablePermissionsSync(int associationId) { - Binder.withCleanCallingIdentity(() -> { + final long callingIdentityToken = Binder.clearCallingIdentity(); + try { int userId = mAssociationStore.getAssociationById(associationId).getUserId(); PermissionSyncRequest request = new PermissionSyncRequest(associationId); request.setUserConsented(false); mSystemDataTransferRequestStore.writeRequest(userId, request); - }); + } finally { + Binder.restoreCallingIdentity(callingIdentityToken); + } } /** @@ -264,7 +277,8 @@ public class SystemDataTransferProcessor { */ @Nullable public PermissionSyncRequest getPermissionSyncRequest(int associationId) { - return Binder.withCleanCallingIdentity(() -> { + final long callingIdentityToken = Binder.clearCallingIdentity(); + try { int userId = mAssociationStore.getAssociationById(associationId).getUserId(); List<SystemDataTransferRequest> requests = mSystemDataTransferRequestStore.readRequestsByAssociationId(userId, @@ -275,17 +289,22 @@ public class SystemDataTransferProcessor { } } return null; - }); + } finally { + Binder.restoreCallingIdentity(callingIdentityToken); + } } /** * Remove perm sync request for the association. */ public void removePermissionSyncRequest(int associationId) { - Binder.withCleanCallingIdentity(() -> { + final long callingIdentityToken = Binder.clearCallingIdentity(); + try { int userId = mAssociationStore.getAssociationById(associationId).getUserId(); mSystemDataTransferRequestStore.removeRequestsByAssociationId(userId, associationId); - }); + } finally { + Binder.restoreCallingIdentity(callingIdentityToken); + } } private void onReceivePermissionRestore(byte[] message) { @@ -299,12 +318,14 @@ public class SystemDataTransferProcessor { Slog.i(LOG_TAG, "Applying permissions."); // Start applying permissions UserHandle user = mContext.getUser(); - - Binder.withCleanCallingIdentity(() -> { + final long callingIdentityToken = Binder.clearCallingIdentity(); + try { // TODO: refactor to work with streams of data mPermissionControllerManager.stageAndApplyRuntimePermissionsBackup( message, user); - }); + } finally { + Binder.restoreCallingIdentity(callingIdentityToken); + } } private static void translateFutureToCallback(@NonNull Future<?> future, diff --git a/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java b/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java index c89ce11c169d..99466a966647 100644 --- a/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java +++ b/services/companion/java/com/android/server/companion/presence/BleCompanionDeviceScanner.java @@ -106,7 +106,7 @@ class BleCompanionDeviceScanner implements AssociationStore.OnChangeListener { checkBleState(); registerBluetoothStateBroadcastReceiver(context); - mAssociationStore.registerLocalListener(this); + mAssociationStore.registerListener(this); } @MainThread @@ -183,7 +183,7 @@ class BleCompanionDeviceScanner implements AssociationStore.OnChangeListener { // Collect MAC addresses from all associations. final Set<String> macAddresses = new HashSet<>(); - for (AssociationInfo association : mAssociationStore.getActiveAssociations()) { + for (AssociationInfo association : mAssociationStore.getAssociations()) { if (!association.isNotifyOnDeviceNearby()) continue; // Beware that BT stack does not consider low-case MAC addresses valid, while @@ -255,7 +255,7 @@ class BleCompanionDeviceScanner implements AssociationStore.OnChangeListener { if (DEBUG) Log.i(TAG, "notifyDevice_Found()" + btDeviceToString(device)); final List<AssociationInfo> associations = - mAssociationStore.getActiveAssociationsByAddress(device.getAddress()); + mAssociationStore.getAssociationsByAddress(device.getAddress()); if (DEBUG) Log.d(TAG, " > associations=" + Arrays.toString(associations.toArray())); for (AssociationInfo association : associations) { @@ -268,7 +268,7 @@ class BleCompanionDeviceScanner implements AssociationStore.OnChangeListener { if (DEBUG) Log.i(TAG, "notifyDevice_Lost()" + btDeviceToString(device)); final List<AssociationInfo> associations = - mAssociationStore.getActiveAssociationsByAddress(device.getAddress()); + mAssociationStore.getAssociationsByAddress(device.getAddress()); if (DEBUG) Log.d(TAG, " > associations=" + Arrays.toString(associations.toArray())); for (AssociationInfo association : associations) { @@ -319,7 +319,7 @@ class BleCompanionDeviceScanner implements AssociationStore.OnChangeListener { Log.v(TAG, " > scanResult=" + result); final List<AssociationInfo> associations = - mAssociationStore.getActiveAssociationsByAddress(device.getAddress()); + mAssociationStore.getAssociationsByAddress(device.getAddress()); Log.v(TAG, " > associations=" + Arrays.toString(associations.toArray())); } diff --git a/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java b/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java index cb363a7c9d7f..4da3f9bead4e 100644 --- a/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java +++ b/services/companion/java/com/android/server/companion/presence/BluetoothCompanionDeviceConnectionListener.java @@ -93,7 +93,7 @@ public class BluetoothCompanionDeviceConnectionListener btAdapter.registerBluetoothConnectionCallback( new HandlerExecutor(Handler.getMain()), /* callback */this); - mAssociationStore.registerLocalListener(this); + mAssociationStore.registerListener(this); } /** @@ -168,7 +168,7 @@ public class BluetoothCompanionDeviceConnectionListener private void onDeviceConnectivityChanged(@NonNull BluetoothDevice device, boolean connected) { int userId = UserHandle.myUserId(); final List<AssociationInfo> associations = - mAssociationStore.getActiveAssociationsByAddress(device.getAddress()); + mAssociationStore.getAssociationsByAddress(device.getAddress()); final List<ObservableUuid> observableUuids = mObservableUuidStore.getObservableUuidsForUser(userId); final ParcelUuid[] bluetoothDeviceUuids = device.getUuids(); diff --git a/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java b/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java index 7a1a83f53315..37bbb937d1b5 100644 --- a/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java +++ b/services/companion/java/com/android/server/companion/presence/CompanionDevicePresenceMonitor.java @@ -145,7 +145,7 @@ public class CompanionDevicePresenceMonitor implements AssociationStore.OnChange Log.w(TAG, "BluetoothAdapter is NOT available."); } - mAssociationStore.registerLocalListener(this); + mAssociationStore.registerListener(this); } /** @@ -481,7 +481,7 @@ public class CompanionDevicePresenceMonitor implements AssociationStore.OnChange * BT connected and BLE presence and are not pending to report BLE lost. */ private boolean canStopBleScan() { - for (AssociationInfo ai : mAssociationStore.getActiveAssociations()) { + for (AssociationInfo ai : mAssociationStore.getAssociations()) { int id = ai.getId(); synchronized (mBtDisconnectedDevices) { if (ai.isNotifyOnDeviceNearby() && !(isBtConnected(id) diff --git a/services/companion/java/com/android/server/companion/presence/ObservableUuidStore.java b/services/companion/java/com/android/server/companion/presence/ObservableUuidStore.java index db15da2922cf..ee8b1065b42c 100644 --- a/services/companion/java/com/android/server/companion/presence/ObservableUuidStore.java +++ b/services/companion/java/com/android/server/companion/presence/ObservableUuidStore.java @@ -90,8 +90,6 @@ public class ObservableUuidStore { * Remove the observable uuid. */ public void removeObservableUuid(@UserIdInt int userId, ParcelUuid uuid, String packageName) { - Slog.i(TAG, "Removing uuid=[" + uuid.getUuid() + "] from store..."); - List<ObservableUuid> cachedObservableUuids; synchronized (mLock) { @@ -110,7 +108,7 @@ public class ObservableUuidStore { * Write the observable uuid. */ public void writeObservableUuid(@UserIdInt int userId, ObservableUuid uuid) { - Slog.i(TAG, "Writing uuid=[" + uuid.getUuid() + "] to store..."); + Slog.i(TAG, "Writing uuid=" + uuid.getUuid() + " to store."); List<ObservableUuid> cachedObservableUuids; synchronized (mLock) { diff --git a/services/companion/java/com/android/server/companion/utils/DataStoreUtils.java b/services/companion/java/com/android/server/companion/utils/DataStoreUtils.java index 369a92504948..c75b1a57206e 100644 --- a/services/companion/java/com/android/server/companion/utils/DataStoreUtils.java +++ b/services/companion/java/com/android/server/companion/utils/DataStoreUtils.java @@ -64,8 +64,8 @@ public final class DataStoreUtils { * IMPORTANT: the method will ALWAYS return the same {@link AtomicFile} object, which makes it * possible to synchronize reads and writes to the file using the returned object. * - * @param userId the userId to retrieve the storage file - * @param fileName the storage file name + * @param userId the userId to retrieve the storage file + * @param fileName the storage file name * @return an AtomicFile for the user */ @NonNull diff --git a/services/companion/java/com/android/server/companion/utils/RolesUtils.java b/services/companion/java/com/android/server/companion/utils/RolesUtils.java index dd12e0406089..f798e218e8e0 100644 --- a/services/companion/java/com/android/server/companion/utils/RolesUtils.java +++ b/services/companion/java/com/android/server/companion/utils/RolesUtils.java @@ -93,8 +93,8 @@ public final class RolesUtils { Slog.i(TAG, "Removing CDM role=" + deviceProfile + " for userId=" + userId + ", packageName=" + packageName); - - Binder.withCleanCallingIdentity(() -> + final long identity = Binder.clearCallingIdentity(); + try { roleManager.removeRoleHolderAsUser(deviceProfile, packageName, MANAGE_HOLDERS_FLAG_DONT_KILL_APP, userHandle, context.getMainExecutor(), success -> { @@ -103,9 +103,11 @@ public final class RolesUtils { + packageName + " from the list of " + deviceProfile + " holders."); } - }) - ); + }); + } finally { + Binder.restoreCallingIdentity(identity); + } } - private RolesUtils() {} + private RolesUtils() {}; } diff --git a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java index ff076192b6ad..9e3f5ce54599 100644 --- a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +++ b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java @@ -18,6 +18,7 @@ package com.android.server.companion.virtual; import static android.content.pm.ActivityInfo.FLAG_CAN_DISPLAY_ON_REMOTE_DEVICES; import static android.view.Display.DEFAULT_DISPLAY; +import static android.view.Display.INVALID_DISPLAY; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; @@ -48,6 +49,8 @@ import com.android.internal.app.BlockedAppStreamingActivity; import com.android.modules.expresslog.Counter; import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; /** * A controller to control the policies of the windows that can be displayed on the virtual display. @@ -121,8 +124,12 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController private final ComponentName mPermissionDialogComponent; private final Object mGenericWindowPolicyControllerLock = new Object(); @Nullable private final ActivityBlockedCallback mActivityBlockedCallback; + + // Do not access mDisplayId and mIsMirrorDisplay directly, instead use waitAndGetDisplayId() + // and waitAndGetIsMirrorDisplay() private int mDisplayId = Display.INVALID_DISPLAY; private boolean mIsMirrorDisplay = false; + private final CountDownLatch mDisplayIdSetLatch = new CountDownLatch(1); @NonNull @GuardedBy("mGenericWindowPolicyControllerLock") @@ -214,6 +221,33 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController void setDisplayId(int displayId, boolean isMirrorDisplay) { mDisplayId = displayId; mIsMirrorDisplay = isMirrorDisplay; + mDisplayIdSetLatch.countDown(); + } + + private int waitAndGetDisplayId() { + try { + if (!mDisplayIdSetLatch.await(10, TimeUnit.SECONDS)) { + Slog.e(TAG, "Timed out while waiting for GWPC displayId to be set."); + return INVALID_DISPLAY; + } + } catch (InterruptedException e) { + Slog.e(TAG, "Interrupted while waiting for GWPC displayId to be set."); + return INVALID_DISPLAY; + } + return mDisplayId; + } + + private boolean waitAndGetIsMirrorDisplay() { + try { + if (!mDisplayIdSetLatch.await(10, TimeUnit.SECONDS)) { + Slog.e(TAG, "Timed out while waiting for GWPC isMirrorDisplay to be set."); + return false; + } + } catch (InterruptedException e) { + Slog.e(TAG, "Interrupted while waiting for GWPC isMirrorDisplay to be set."); + return false; + } + return mIsMirrorDisplay; } /** @@ -281,7 +315,7 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @WindowConfiguration.WindowingMode int windowingMode, int launchingFromDisplayId, boolean isNewTask) { // Mirror displays cannot contain activities. - if (mIsMirrorDisplay) { + if (waitAndGetIsMirrorDisplay()) { Slog.d(TAG, "Mirror virtual displays cannot contain activities."); return false; } @@ -341,11 +375,13 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @SuppressWarnings("AndroidFrameworkRequiresPermission") public boolean keepActivityOnWindowFlagsChanged(ActivityInfo activityInfo, int windowFlags, int systemWindowFlags) { + int displayId = waitAndGetDisplayId(); // The callback is fired only when windowFlags are changed. To let VirtualDevice owner // aware that the virtual display has a secure window on top. - if ((windowFlags & FLAG_SECURE) != 0 && mSecureWindowCallback != null) { + if ((windowFlags & FLAG_SECURE) != 0 && mSecureWindowCallback != null + && displayId != INVALID_DISPLAY) { // Post callback on the main thread, so it doesn't block activity launching. - mHandler.post(() -> mSecureWindowCallback.onSecureWindowShown(mDisplayId, + mHandler.post(() -> mSecureWindowCallback.onSecureWindowShown(displayId, activityInfo.applicationInfo.uid)); } @@ -365,13 +401,14 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @Override public void onTopActivityChanged(ComponentName topActivity, int uid, @UserIdInt int userId) { + int displayId = waitAndGetDisplayId(); // Don't send onTopActivityChanged() callback when topActivity is null because it's defined // as @NonNull in ActivityListener interface. Sends onDisplayEmpty() callback instead when // there is no activity running on virtual display. - if (mActivityListener != null && topActivity != null) { + if (mActivityListener != null && topActivity != null && displayId != INVALID_DISPLAY) { // Post callback on the main thread so it doesn't block activity launching mHandler.post(() -> - mActivityListener.onTopActivityChanged(mDisplayId, topActivity, userId)); + mActivityListener.onTopActivityChanged(displayId, topActivity, userId)); } } @@ -380,9 +417,11 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController synchronized (mGenericWindowPolicyControllerLock) { mRunningUids.clear(); mRunningUids.addAll(runningUids); - if (mActivityListener != null && mRunningUids.isEmpty()) { + int displayId = waitAndGetDisplayId(); + if (mActivityListener != null && mRunningUids.isEmpty() + && displayId != INVALID_DISPLAY) { // Post callback on the main thread so it doesn't block activity launching - mHandler.post(() -> mActivityListener.onDisplayEmpty(mDisplayId)); + mHandler.post(() -> mActivityListener.onDisplayEmpty(displayId)); } if (!mRunningAppsChangedListeners.isEmpty()) { final ArraySet<RunningAppsChangedListener> listeners = @@ -438,10 +477,12 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController } private void notifyActivityBlocked(ActivityInfo activityInfo) { + int displayId = waitAndGetDisplayId(); // Don't trigger activity blocked callback for mirror displays, because we can't show // any activity or presentation on it anyway. - if (!mIsMirrorDisplay && mActivityBlockedCallback != null) { - mActivityBlockedCallback.onActivityBlocked(mDisplayId, activityInfo); + if (!waitAndGetIsMirrorDisplay() && mActivityBlockedCallback != null + && displayId != INVALID_DISPLAY) { + mActivityBlockedCallback.onActivityBlocked(displayId, activityInfo); } if (android.companion.virtualdevice.flags.Flags.metricsCollection()) { Counter.logIncrementWithUid( diff --git a/services/contextualsearch/Android.bp b/services/contextualsearch/Android.bp new file mode 100644 index 000000000000..b4dd20ec5b7c --- /dev/null +++ b/services/contextualsearch/Android.bp @@ -0,0 +1,22 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + +filegroup { + name: "services.contextualsearch-sources", + srcs: ["java/**/*.java"], + path: "java", + visibility: ["//frameworks/base/services"], +} + +java_library_static { + name: "services.contextualsearch", + defaults: ["platform_service_defaults"], + srcs: [":services.contextualsearch-sources"], + libs: ["services.core"], +} diff --git a/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java b/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java new file mode 100644 index 000000000000..b28bc1ffb611 --- /dev/null +++ b/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerService.java @@ -0,0 +1,315 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.contextualsearch; + +import static android.Manifest.permission.ACCESS_CONTEXTUAL_SEARCH; +import static android.content.Context.CONTEXTUAL_SEARCH_SERVICE; +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; +import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION; +import static android.content.Intent.FLAG_ACTIVITY_NO_USER_ACTION; +import static android.content.pm.PackageManager.MATCH_FACTORY_ONLY; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.RequiresPermission; +import android.app.ActivityOptions; +import android.app.admin.DevicePolicyManagerInternal; +import android.app.contextualsearch.ContextualSearchManager; +import android.app.contextualsearch.ContextualSearchState; +import android.app.contextualsearch.IContextualSearchCallback; +import android.app.contextualsearch.IContextualSearchManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ResolveInfo; +import android.graphics.Bitmap; +import android.os.Binder; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.Message; +import android.os.ParcelableException; +import android.os.Process; +import android.os.RemoteException; +import android.os.ResultReceiver; +import android.os.ShellCallback; +import android.util.Log; +import android.util.Slog; +import android.window.ScreenCapture; + +import com.android.internal.R; +import com.android.internal.annotations.GuardedBy; +import com.android.server.LocalServices; +import com.android.server.SystemService; +import com.android.server.wm.ActivityAssistInfo; +import com.android.server.wm.ActivityTaskManagerInternal; +import com.android.server.wm.WindowManagerInternal; + +import java.io.FileDescriptor; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class ContextualSearchManagerService extends SystemService { + + private static final int MSG_RESET_TEMPORARY_PACKAGE = 0; + private static final int MAX_TEMP_PACKAGE_DURATION_MS = 1_000 * 60 * 2; // 2 minutes + private final Context mContext; + private final ActivityTaskManagerInternal mAtmInternal; + private final WindowManagerInternal mWmInternal; + private final DevicePolicyManagerInternal mDpmInternal; + + private Handler mTemporaryHandler; + + @GuardedBy("this") + private String mTemporaryPackage = null; + private static final String TAG = ContextualSearchManagerService.class.getSimpleName(); + + public ContextualSearchManagerService(@NonNull Context context) { + super(context); + if (DEBUG_USER) Log.d(TAG, "ContextualSearchManagerService created"); + mContext = context; + mAtmInternal = Objects.requireNonNull( + LocalServices.getService(ActivityTaskManagerInternal.class)); + mWmInternal = Objects.requireNonNull(LocalServices.getService(WindowManagerInternal.class)); + mDpmInternal = LocalServices.getService(DevicePolicyManagerInternal.class); + } + + @Override + public void onStart() { + publishBinderService(CONTEXTUAL_SEARCH_SERVICE, new ContextualSearchManagerStub()); + } + + void resetTemporaryPackage() { + synchronized (this) { + enforceOverridingPermission("resetTemporaryPackage"); + if (mTemporaryHandler != null) { + mTemporaryHandler.removeMessages(MSG_RESET_TEMPORARY_PACKAGE); + mTemporaryHandler = null; + } + if (DEBUG_USER) Log.d(TAG, "mTemporaryPackage reset."); + mTemporaryPackage = null; + } + } + + void setTemporaryPackage(@NonNull String temporaryPackage, int durationMs) { + synchronized (this) { + enforceOverridingPermission("setTemporaryPackage"); + final int maxDurationMs = MAX_TEMP_PACKAGE_DURATION_MS; + if (durationMs > maxDurationMs) { + throw new IllegalArgumentException( + "Max duration is " + maxDurationMs + " (called with " + durationMs + ")"); + } + if (mTemporaryHandler == null) { + mTemporaryHandler = new Handler(Looper.getMainLooper(), null, true) { + @Override + public void handleMessage(Message msg) { + if (msg.what == MSG_RESET_TEMPORARY_PACKAGE) { + synchronized (this) { + resetTemporaryPackage(); + } + } else { + Slog.wtf(TAG, "invalid handler msg: " + msg); + } + } + }; + } else { + mTemporaryHandler.removeMessages(MSG_RESET_TEMPORARY_PACKAGE); + } + mTemporaryPackage = temporaryPackage; + mTemporaryHandler.sendEmptyMessageDelayed(MSG_RESET_TEMPORARY_PACKAGE, durationMs); + if (DEBUG_USER) Log.d(TAG, "mTemporaryPackage set to " + mTemporaryPackage); + } + } + + private Intent getResolvedLaunchIntent() { + synchronized (this) { + // If mTemporaryPackage is not null, use it to get the ContextualSearch intent. + String csPkgName = mTemporaryPackage != null ? mTemporaryPackage : mContext + .getResources().getString(R.string.config_defaultContextualSearchPackageName); + if (csPkgName.isEmpty()) { + // Return null if csPackageName is not specified. + return null; + } + Intent launchIntent = new Intent( + ContextualSearchManager.ACTION_LAUNCH_CONTEXTUAL_SEARCH); + launchIntent.setPackage(csPkgName); + ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity( + launchIntent, MATCH_FACTORY_ONLY); + if (resolveInfo == null) { + return null; + } + ComponentName componentName = resolveInfo.getComponentInfo().getComponentName(); + if (componentName == null) { + return null; + } + launchIntent.setComponent(componentName); + return launchIntent; + } + } + + private Intent getContextualSearchIntent(int entrypoint, IBinder mToken) { + final Intent launchIntent = getResolvedLaunchIntent(); + if (launchIntent == null) { + return null; + } + + if (DEBUG_USER) Log.d(TAG, "Launch component: " + launchIntent.getComponent()); + launchIntent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NO_ANIMATION + | FLAG_ACTIVITY_NO_USER_ACTION); + launchIntent.putExtra(ContextualSearchManager.EXTRA_ENTRYPOINT, entrypoint); + launchIntent.putExtra(ContextualSearchManager.EXTRA_TOKEN, mToken); + boolean isAssistDataAllowed = mAtmInternal.isAssistDataAllowed(); + final List<ActivityAssistInfo> records = mAtmInternal.getTopVisibleActivities(); + ArrayList<String> visiblePackageNames = new ArrayList<>(); + boolean isManagedProfileVisible = false; + for (ActivityAssistInfo record : records) { + // Add the package name to the list only if assist data is allowed. + if (isAssistDataAllowed) { + visiblePackageNames.add(record.getComponentName().getPackageName()); + } + if (mDpmInternal != null + && mDpmInternal.isUserOrganizationManaged(record.getUserId())) { + isManagedProfileVisible = true; + } + } + final ScreenCapture.ScreenshotHardwareBuffer shb; + if (mWmInternal != null) { + shb = mWmInternal.takeAssistScreenshot(); + } else { + shb = null; + } + final Bitmap bm = shb != null ? shb.asBitmap() : null; + // Now that everything is fetched, putting it in the launchIntent. + if (bm != null) { + launchIntent.putExtra(ContextualSearchManager.EXTRA_FLAG_SECURE_FOUND, + shb.containsSecureLayers()); + // Only put the screenshot if assist data is allowed + if (isAssistDataAllowed) { + launchIntent.putExtra(ContextualSearchManager.EXTRA_SCREENSHOT, bm.asShared()); + } + } + launchIntent.putExtra(ContextualSearchManager.EXTRA_IS_MANAGED_PROFILE_VISIBLE, + isManagedProfileVisible); + // Only put the list of visible package names if assist data is allowed + if (isAssistDataAllowed) { + launchIntent.putExtra(ContextualSearchManager.EXTRA_VISIBLE_PACKAGE_NAMES, + visiblePackageNames); + } + return launchIntent; + } + + @RequiresPermission(android.Manifest.permission.START_TASKS_FROM_RECENTS) + private int invokeContextualSearchIntent(Intent launchIntent) { + // Contextual search starts with a frozen screen - so we launch without + // any system animations or starting window. + final ActivityOptions opts = ActivityOptions.makeCustomTaskAnimation(mContext, + /* enterResId= */ 0, /* exitResId= */ 0, null, null, null); + opts.setDisableStartingWindow(true); + return mAtmInternal.startActivityWithScreenshot(launchIntent, + mContext.getPackageName(), Binder.getCallingUid(), Binder.getCallingPid(), null, + opts.toBundle(), Binder.getCallingUserHandle().getIdentifier()); + } + + private void enforcePermission(@NonNull final String func) { + Context ctx = getContext(); + if (!(ctx.checkCallingPermission(ACCESS_CONTEXTUAL_SEARCH) == PERMISSION_GRANTED + || isCallerTemporary())) { + String msg = "Permission Denial: Cannot call " + func + " from pid=" + + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid(); + throw new SecurityException(msg); + } + } + + private void enforceOverridingPermission(@NonNull final String func) { + if (!(Binder.getCallingUid() == Process.SHELL_UID + || Binder.getCallingUid() == Process.ROOT_UID + || Binder.getCallingUid() == Process.SYSTEM_UID)) { + String msg = "Permission Denial: Cannot override Contextual Search. Called " + func + + " from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid(); + throw new SecurityException(msg); + } + } + + private boolean isCallerTemporary() { + synchronized (this) { + return mTemporaryPackage != null + && mTemporaryPackage.equals( + getContext().getPackageManager().getNameForUid(Binder.getCallingUid())); + } + } + + private class ContextualSearchManagerStub extends IContextualSearchManager.Stub { + private @Nullable IBinder mToken; + + @Override + public void startContextualSearch(int entrypoint) { + synchronized (this) { + if (DEBUG_USER) Log.d(TAG, "startContextualSearch"); + enforcePermission("startContextualSearch"); + mToken = new Binder(); + // We get the launch intent with the system server's identity because the system + // server has READ_FRAME_BUFFER permission to get the screenshot and because only + // the system server can invoke non-exported activities. + Binder.withCleanCallingIdentity(() -> { + Intent launchIntent = getContextualSearchIntent(entrypoint, mToken); + if (launchIntent != null) { + int result = invokeContextualSearchIntent(launchIntent); + if (DEBUG_USER) Log.d(TAG, "Launch result: " + result); + } + }); + } + } + + @Override + public void getContextualSearchState( + @NonNull IBinder token, + @NonNull IContextualSearchCallback callback) { + if (DEBUG_USER) { + Log.i(TAG, "getContextualSearchState token: " + token + ", callback: " + callback); + } + if (mToken == null || !mToken.equals(token)) { + if (DEBUG_USER) { + Log.e(TAG, "getContextualSearchState: invalid token, returning error"); + } + try { + callback.onError( + new ParcelableException(new IllegalArgumentException("Invalid token"))); + } catch (RemoteException e) { + Log.e(TAG, "Could not invoke onError callback", e); + } + return; + } + mToken = null; + // Process data request + try { + callback.onResult(new ContextualSearchState(null, null, Bundle.EMPTY)); + } catch (RemoteException e) { + Log.e(TAG, "Could not invoke onResult callback", e); + } + } + + public void onShellCommand(@Nullable FileDescriptor in, @Nullable FileDescriptor out, + @Nullable FileDescriptor err, @NonNull String[] args, + @Nullable ShellCallback callback, @NonNull ResultReceiver resultReceiver) { + new ContextualSearchManagerShellCommand(ContextualSearchManagerService.this) + .exec(this, in, out, err, args, callback, resultReceiver); + } + } +} diff --git a/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerShellCommand.java b/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerShellCommand.java new file mode 100644 index 000000000000..5777e1d154de --- /dev/null +++ b/services/contextualsearch/java/com/android/server/contextualsearch/ContextualSearchManagerShellCommand.java @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.contextualsearch; + +import android.annotation.NonNull; +import android.os.ShellCommand; + +import java.io.PrintWriter; + +public class ContextualSearchManagerShellCommand extends ShellCommand { + + private final ContextualSearchManagerService mService; + + ContextualSearchManagerShellCommand(@NonNull ContextualSearchManagerService service) { + mService = service; + } + + @Override + public int onCommand(String cmd) { + if (cmd == null) { + return handleDefaultCommands(cmd); + } + final PrintWriter pw = getOutPrintWriter(); + switch (cmd) { + case "set": { + final String what = getNextArgRequired(); + switch (what) { + case "temporary-package": { + String packageName = getNextArg(); + if (packageName == null) { + mService.resetTemporaryPackage(); + pw.println("ContextualSearchManagerService reset."); + return 0; + } + final int duration = Integer.parseInt(getNextArgRequired()); + mService.setTemporaryPackage(packageName, duration); + pw.println("ContextualSearchManagerService temporarily set to " + + packageName + " for " + duration + "ms"); + break; + } + } + } + break; + default: + return handleDefaultCommands(cmd); + } + return 0; + } + + @Override + public void onHelp() { + try (PrintWriter pw = getOutPrintWriter()) { + pw.println("ContextualSearchService commands:"); + pw.println(" help"); + pw.println(" Prints this help text."); + pw.println(""); + pw.println(" set temporary-package [PACKAGE_NAME DURATION]"); + pw.println(" Temporarily (for DURATION ms) changes the Contextual Search " + + "implementation."); + pw.println(" To reset, call without any arguments."); + pw.println(""); + } + } +} diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 0012b3d86552..133a77df3573 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -4658,6 +4658,8 @@ public final class ActiveServices { INVALID_UID /* sdkSandboxClientAppUid */, null /* sdkSandboxClientAppPackage */, false /* inSharedIsolatedProcess */); + r.foregroundId = fgsDelegateOptions.mClientNotificationId; + r.foregroundNoti = fgsDelegateOptions.mClientNotification; res.setService(r); smap.mServicesByInstanceName.put(cn, r); smap.mServicesByIntent.put(filter, r); @@ -8171,7 +8173,7 @@ public final class ActiveServices { * @param targetProcess the process of the service to start. * @return {@link ReasonCode} */ - private @ReasonCode int shouldAllowFgsWhileInUsePermissionLocked(String callingPackage, + @ReasonCode int shouldAllowFgsWhileInUsePermissionLocked(String callingPackage, int callingPid, int callingUid, @Nullable ProcessRecord targetProcess, BackgroundStartPrivileges backgroundStartPrivileges) { int ret = REASON_DENIED; @@ -9046,6 +9048,10 @@ public final class ActiveServices { }); } signalForegroundServiceObserversLocked(r); + if (r.foregroundId != 0 && r.foregroundNoti != null) { + r.foregroundNoti.flags |= Notification.FLAG_FOREGROUND_SERVICE; + r.postNotification(true); + } return true; } diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index ff837974bf3c..272e84b80870 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -51,6 +51,7 @@ import android.text.TextUtils; import android.util.ArraySet; import android.util.KeyValueListParser; import android.util.Slog; +import android.util.SparseBooleanArray; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; @@ -436,6 +437,18 @@ final class ActivityManagerConstants extends ContentObserver { private static final String KEY_MAX_SERVICE_CONNECTIONS_PER_PROCESS = "max_service_connections_per_process"; + private static final String KEY_PROC_STATE_DEBUG_UIDS = "proc_state_debug_uids"; + + /** + * UIDs we want to print detailed info in OomAdjuster. + * It's only used for debugging, and it's almost never updated, so we just create a new + * array when it's changed to avoid synchronization. + */ + volatile SparseBooleanArray mProcStateDebugUids = new SparseBooleanArray(0); + volatile boolean mEnableProcStateStacktrace = false; + volatile int mProcStateDebugSetProcStateDelay = 0; + volatile int mProcStateDebugSetUidStateDelay = 0; + // Maximum number of cached processes we will allow. public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES; @@ -1339,6 +1352,9 @@ final class ActivityManagerConstants extends ContentObserver { case KEY_PSS_TO_RSS_THRESHOLD_MODIFIER: updatePssToRssThresholdModifier(); break; + case KEY_PROC_STATE_DEBUG_UIDS: + updateProcStateDebugUids(); + break; default: updateFGSPermissionEnforcementFlagsIfNecessary(name); break; @@ -2039,6 +2055,76 @@ final class ActivityManagerConstants extends ContentObserver { DEFAULT_MAX_PREVIOUS_TIME); } + private void updateProcStateDebugUids() { + final String val = DeviceConfig.getString( + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + KEY_PROC_STATE_DEBUG_UIDS, + "").trim(); + + // Parse KEY_PROC_STATE_DEBUG_UIDS as comma-separated values. Each values can be: + // Number: Enable debugging on the given UID. + // "stack": Enable stack trace when updating proc/uid-states.s + // "u" + delay-ms: Enable sleep when updating uid-state + // "p" + delay-ms: Enable sleep when updating procstate + // + // Example: + // device_config put activity_manager proc_state_debug_uids '10177,10202,stack,p500,u100' + // means: + // - Monitor UID 10177 and 10202 + // - Also enable stack trace + // - Sleep 500 ms when updating the procstate. + // - Sleep 100 ms when updating the UID state. + + mEnableProcStateStacktrace = false; + mProcStateDebugSetProcStateDelay = 0; + mProcStateDebugSetUidStateDelay = 0; + if (val.length() == 0) { + mProcStateDebugUids = new SparseBooleanArray(0); + return; + } + final String[] uids = val.split(","); + + final SparseBooleanArray newArray = new SparseBooleanArray(0); + + for (String token : uids) { + if (token.length() == 0) { + continue; + } + // "stack" -> enable stacktrace. + if ("stack".equals(token)) { + mEnableProcStateStacktrace = true; + continue; + } + boolean isUid = true; + char prefix = token.charAt(0); + if ('a' <= prefix && prefix <= 'z') { + // If the token starts with an alphabet, it's not a UID. + isUid = false; + token = token.substring(1); + } + + int value = -1; + try { + value = Integer.parseInt(token.trim()); + } catch (NumberFormatException e) { + Slog.w(TAG, "Invalid number " + token + " in " + val); + continue; + } + if (isUid) { + newArray.put(value, true); + } else if (prefix == 'p') { + // Enable delay in set-proc-state + mProcStateDebugSetProcStateDelay = value; + } else if (prefix == 'u') { + // Enable delay in set-uid-state + mProcStateDebugSetUidStateDelay = value; + } else { + Slog.w(TAG, "Invalid prefix " + prefix + " in " + val); + } + } + mProcStateDebugUids = newArray; + } + private void updateMinAssocLogDuration() { MIN_ASSOC_LOG_DURATION = DeviceConfig.getLong( DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_MIN_ASSOC_LOG_DURATION, @@ -2178,6 +2264,28 @@ final class ActivityManagerConstants extends ContentObserver { mDefaultPssToRssThresholdModifier); } + boolean shouldDebugUidForProcState(int uid) { + SparseBooleanArray ar = mProcStateDebugUids; + final var size = ar.size(); + if (size == 0) { // Most common case. + return false; + } + // If the array is small (also common), avoid the binary search. + if (size <= 8) { + for (int i = 0; i < size; i++) { + if (ar.keyAt(i) == uid) { + return ar.valueAt(i); + } + } + return false; + } + return ar.get(uid, false); + } + + boolean shouldEnableProcStateDebug() { + return mProcStateDebugUids.size() > 0; + } + @NeverCompile // Avoid size overhead of debugging code. void dump(PrintWriter pw) { pw.println("ACTIVITY MANAGER SETTINGS (dumpsys activity settings) " @@ -2393,5 +2501,12 @@ final class ActivityManagerConstants extends ContentObserver { pw.print(" OOMADJ_UPDATE_QUICK="); pw.println(OOMADJ_UPDATE_QUICK); pw.print(" ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION="); pw.println(mEnableWaitForFinishAttachApplication); + + synchronized (mProcStateDebugUids) { + pw.print(" "); pw.print(KEY_PROC_STATE_DEBUG_UIDS); + pw.print("="); pw.println(mProcStateDebugUids); + pw.print(" uid-state-delay="); pw.println(mProcStateDebugSetUidStateDelay); + pw.print(" proc-state-delay="); pw.println(mProcStateDebugSetProcStateDelay); + } } } diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index 5521381e8908..8f0665d497bf 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -286,9 +286,6 @@ class BroadcastQueueModernImpl extends BroadcastQueue { // when the flag is fused on. private static final int MSG_DELIVERY_TIMEOUT_SOFT = 8; - // TODO: Use the trunk stable flag. - private static final boolean DEFER_FROZEN_OUTGOING_BCASTS = false; - private void enqueueUpdateRunningList() { mLocalHandler.removeMessages(MSG_UPDATE_RUNNING_LIST); mLocalHandler.sendEmptyMessage(MSG_UPDATE_RUNNING_LIST); @@ -361,6 +358,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * Return the total number of active queues contained inside * {@link #mRunning}. */ + @GuardedBy("mService") private int getRunningSize() { int size = 0; for (int i = 0; i < mRunning.length; i++) { @@ -372,6 +370,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { /** * Return the number of active queues that are delivering "urgent" broadcasts */ + @GuardedBy("mService") private int getRunningUrgentCount() { int count = 0; for (int i = 0; i < mRunning.length; i++) { @@ -386,6 +385,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * Return the first index of the given value contained inside * {@link #mRunning}, otherwise {@code -1}. */ + @GuardedBy("mService") private int getRunningIndexOf(@Nullable BroadcastProcessQueue test) { for (int i = 0; i < mRunning.length; i++) { if (mRunning[i] == test) return i; @@ -585,6 +585,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { traceEnd(cookie); } + @GuardedBy("mService") private boolean isPendingColdStartValid() { if (mRunningColdStart.app.getPid() > 0) { // If the process has already started, check if it wasn't killed. @@ -595,6 +596,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } } + @GuardedBy("mService") private void clearInvalidPendingColdStart() { logw("Clearing invalid pending cold start: " + mRunningColdStart); if (mRunningColdStart.wasActiveBroadcastReEnqueued()) { @@ -629,6 +631,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } } + @GuardedBy("mService") private void finishOrReEnqueueActiveBroadcast(@NonNull BroadcastProcessQueue queue) { checkState(queue.isActive(), "isActive"); @@ -646,6 +649,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } } + @GuardedBy("mService") @Override public boolean onApplicationAttachedLocked(@NonNull ProcessRecord app) throws BroadcastRetryException { @@ -689,16 +693,19 @@ class BroadcastQueueModernImpl extends BroadcastQueue { return didSomething; } + @GuardedBy("mService") @Override public void onApplicationTimeoutLocked(@NonNull ProcessRecord app) { onApplicationCleanupLocked(app); } + @GuardedBy("mService") @Override public void onApplicationProblemLocked(@NonNull ProcessRecord app) { onApplicationCleanupLocked(app); } + @GuardedBy("mService") @Override public void onApplicationCleanupLocked(@NonNull ProcessRecord app) { if (DEBUG_BROADCAST) { @@ -735,6 +742,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } } + @GuardedBy("mService") private void clearRunningColdStart() { mRunningColdStart.traceProcessEnd(); @@ -746,12 +754,14 @@ class BroadcastQueueModernImpl extends BroadcastQueue { enqueueUpdateRunningList(); } + @GuardedBy("mService") @Override public void onProcessFreezableChangedLocked(@NonNull ProcessRecord app) { mLocalHandler.removeMessages(MSG_PROCESS_FREEZABLE_CHANGED, app); mLocalHandler.obtainMessage(MSG_PROCESS_FREEZABLE_CHANGED, app).sendToTarget(); } + @GuardedBy("mService") @Override public int getPreferredSchedulingGroupLocked(@NonNull ProcessRecord app) { final BroadcastProcessQueue queue = getProcessQueue(app); @@ -761,12 +771,13 @@ class BroadcastQueueModernImpl extends BroadcastQueue { return ProcessList.SCHED_GROUP_UNDEFINED; } + @GuardedBy("mService") @Override public void enqueueBroadcastLocked(@NonNull BroadcastRecord r) { // TODO: Apply delivery group policies and FLAG_REPLACE_PENDING to collapse the // outgoing broadcasts. // TODO: Add traces/logs for the enqueueing outgoing broadcasts logic. - if (DEFER_FROZEN_OUTGOING_BCASTS && isProcessFreezable(r.callerApp)) { + if (Flags.deferOutgoingBroadcasts() && isProcessFreezable(r.callerApp)) { final BroadcastProcessQueue queue = getOrCreateProcessQueue( r.callerApp.processName, r.callerApp.uid); if (queue.getOutgoingBroadcastCount() >= mConstants.MAX_FROZEN_OUTGOING_BROADCASTS) { @@ -846,6 +857,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { traceEnd(cookie); } + @GuardedBy("mService") private void skipAndCancelReplacedBroadcasts(ArraySet<BroadcastRecord> replacedBroadcasts) { for (int i = 0; i < replacedBroadcasts.size(); ++i) { final BroadcastRecord r = replacedBroadcasts.valueAt(i); @@ -858,6 +870,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } } + @GuardedBy("mService") private void applyDeliveryGroupPolicy(@NonNull BroadcastRecord r) { if (mService.shouldIgnoreDeliveryGroupPolicy(r.intent.getAction())) { return; @@ -921,6 +934,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { mRecordsLookupCache.compareAndSet(null, recordsLookupCache); } + @GuardedBy("mService") @NonNull private ArrayMap<BroadcastRecord, Boolean> getRecordsLookupCache() { ArrayMap<BroadcastRecord, Boolean> recordsLookupCache = @@ -931,6 +945,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { return recordsLookupCache; } + @GuardedBy("mService") private boolean containsAllReceivers(@NonNull BroadcastRecord record, @NonNull BroadcastRecord testRecord, @NonNull ArrayMap<BroadcastRecord, Boolean> recordsLookupCache) { @@ -1064,6 +1079,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * Consults {@link BroadcastSkipPolicy} and the receiver process state to decide whether or * not the broadcast to a receiver can be skipped. */ + @GuardedBy("mService") private String shouldSkipReceiver(@NonNull BroadcastProcessQueue queue, @NonNull BroadcastRecord r, int index) { final int oldDeliveryState = getDeliveryState(r, index); @@ -1104,6 +1120,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * finishReceiver() to be called before moving to the next broadcast. Otherwise, * {@code false}. */ + @GuardedBy("mService") @CheckResult private boolean dispatchReceivers(@NonNull BroadcastProcessQueue queue, @NonNull BroadcastRecord r, int index) throws BroadcastRetryException { @@ -1215,6 +1232,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * Schedule the final {@link BroadcastRecord#resultTo} delivery for an * ordered broadcast; assumes the sender is still a warm process. */ + @GuardedBy("mService") private void scheduleResultTo(@NonNull BroadcastRecord r) { if (r.resultTo == null) return; final ProcessRecord app = r.resultToApp; @@ -1248,6 +1266,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { // Required when Flags.anrTimerServiceEnabled is false. This function can be replaced with a // single call to {@code mAnrTimer.start()} if and when the flag is fused on. + @GuardedBy("mService") private void startDeliveryTimeoutLocked(@NonNull BroadcastProcessQueue queue, int softTimeoutMillis) { if (mAnrTimer.serviceEnabled()) { @@ -1261,6 +1280,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { // Required when Flags.anrTimerServiceEnabled is false. This function can be replaced with a // single call to {@code mAnrTimer.cancel()} if and when the flag is fused on. + @GuardedBy("mService") private void cancelDeliveryTimeoutLocked(@NonNull BroadcastProcessQueue queue) { mAnrTimer.cancel(queue); if (!mAnrTimer.serviceEnabled()) { @@ -1270,6 +1290,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { // Required when Flags.anrTimerServiceEnabled is false. This function can be deleted entirely // if and when the flag is fused on. + @GuardedBy("mService") private void deliveryTimeoutSoftLocked(@NonNull BroadcastProcessQueue queue, int softTimeoutMillis) { if (queue.app != null) { @@ -1292,6 +1313,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { traceEnd(cookie); } + @GuardedBy("mService") private void deliveryTimeoutLocked(@NonNull BroadcastProcessQueue queue) { finishReceiverActiveLocked(queue, BroadcastRecord.DELIVERY_TIMEOUT, "deliveryTimeoutLocked"); @@ -1309,6 +1331,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } } + @GuardedBy("mService") @Override public boolean finishReceiverLocked(@NonNull ProcessRecord app, int resultCode, @Nullable String resultData, @Nullable Bundle resultExtras, boolean resultAbort, @@ -1369,6 +1392,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { /** * Return true if there are no more broadcasts in the queue or if the queue is not runnable. */ + @GuardedBy("mService") private boolean shouldRetire(@NonNull BroadcastProcessQueue queue) { // If we've made reasonable progress, periodically retire ourselves to // avoid starvation of other processes and stack overflow when a @@ -1392,6 +1416,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { /** * Terminate all active broadcasts on the queue. */ + @GuardedBy("mService") private void finishReceiverActiveLocked(@NonNull BroadcastProcessQueue queue, @DeliveryState int deliveryState, @NonNull String reason) { if (!queue.isActive()) { @@ -1493,6 +1518,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * Set the delivery state on the given broadcast, then apply any additional * bookkeeping related to ordered broadcasts. */ + @GuardedBy("mService") private void setDeliveryState(@Nullable BroadcastProcessQueue queue, @Nullable ProcessRecord app, @NonNull BroadcastRecord r, int index, @NonNull Object receiver, @DeliveryState int newDeliveryState, @@ -1558,10 +1584,12 @@ class BroadcastQueueModernImpl extends BroadcastQueue { traceEnd(cookie); } + @GuardedBy("mService") private @DeliveryState int getDeliveryState(@NonNull BroadcastRecord r, int index) { return r.getDeliveryState(index); } + @GuardedBy("mService") @Override public boolean cleanupDisabledPackageReceiversLocked(@Nullable String packageName, @Nullable Set<String> filterByClasses, int userId) { @@ -1627,6 +1655,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * Typical consumer that will skip the given broadcast, usually as a result * of it matching a predicate. */ + @GuardedBy("mService") private final BroadcastConsumer mBroadcastConsumerSkip = (r, i) -> { setDeliveryState(null, null, r, i, r.receivers.get(i), BroadcastRecord.DELIVERY_SKIPPED, "mBroadcastConsumerSkip"); @@ -1636,6 +1665,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * Typical consumer that will both skip the given broadcast and mark it as * cancelled, usually as a result of it matching a predicate. */ + @GuardedBy("mService") private final BroadcastConsumer mBroadcastConsumerSkipAndCanceled = (r, i) -> { setDeliveryState(null, null, r, i, r.receivers.get(i), BroadcastRecord.DELIVERY_SKIPPED, "mBroadcastConsumerSkipAndCanceled"); @@ -1645,23 +1675,27 @@ class BroadcastQueueModernImpl extends BroadcastQueue { }; @VisibleForTesting + @GuardedBy("mService") final BroadcastConsumer mBroadcastConsumerDeferApply = (r, i) -> { setDeliveryState(null, null, r, i, r.receivers.get(i), BroadcastRecord.DELIVERY_DEFERRED, "mBroadcastConsumerDeferApply"); }; @VisibleForTesting + @GuardedBy("mService") final BroadcastConsumer mBroadcastConsumerDeferClear = (r, i) -> { setDeliveryState(null, null, r, i, r.receivers.get(i), BroadcastRecord.DELIVERY_PENDING, "mBroadcastConsumerDeferClear"); }; + @GuardedBy("mService") final BroadcastRecordConsumer mBroadcastRecordConsumerEnqueue = this::enqueueBroadcastLocked; /** * Verify that all known {@link #mProcessQueues} are in the state tested by * the given {@link Predicate}. */ + @GuardedBy("mService") private boolean testAllProcessQueues(@NonNull Predicate<BroadcastProcessQueue> test, @NonNull String label, @NonNull PrintWriter pw) { for (int i = 0; i < mProcessQueues.size(); i++) { @@ -1685,6 +1719,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { return true; } + @GuardedBy("mService") private boolean forEachMatchingBroadcast( @NonNull Predicate<BroadcastProcessQueue> queuePredicate, @NonNull BroadcastPredicate broadcastPredicate, @@ -1709,6 +1744,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { return didSomething; } + @GuardedBy("mService") private boolean forEachMatchingQueue( @NonNull Predicate<BroadcastProcessQueue> queuePredicate, @NonNull Consumer<BroadcastProcessQueue> queueConsumer) { @@ -1730,6 +1766,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { return didSomething; } + @GuardedBy("mService") @Override public void start(@NonNull ContentResolver resolver) { mFgConstants.startObserving(mHandler, resolver); @@ -1750,35 +1787,42 @@ class BroadcastQueueModernImpl extends BroadcastQueue { mLocalHandler.sendEmptyMessage(MSG_CHECK_HEALTH); } + @GuardedBy("mService") @Override public boolean isIdleLocked() { return isIdleLocked(LOG_WRITER_INFO); } + @GuardedBy("mService") public boolean isIdleLocked(@NonNull PrintWriter pw) { return testAllProcessQueues(q -> q.isIdle(), "idle", pw); } + @GuardedBy("mService") @Override public boolean isBeyondBarrierLocked(@UptimeMillisLong long barrierTime) { return isBeyondBarrierLocked(barrierTime, LOG_WRITER_INFO); } + @GuardedBy("mService") public boolean isBeyondBarrierLocked(@UptimeMillisLong long barrierTime, @NonNull PrintWriter pw) { return testAllProcessQueues(q -> q.isBeyondBarrierLocked(barrierTime), "barrier", pw); } + @GuardedBy("mService") @Override public boolean isDispatchedLocked(@NonNull Intent intent) { return isDispatchedLocked(intent, LOG_WRITER_INFO); } + @GuardedBy("mService") public boolean isDispatchedLocked(@NonNull Intent intent, @NonNull PrintWriter pw) { return testAllProcessQueues(q -> q.isDispatched(intent), "dispatch of " + intent, pw); } + @GuardedBy("mService") @Override public void waitForIdle(@NonNull PrintWriter pw) { waitFor(() -> isIdleLocked(pw)); @@ -1801,6 +1845,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } } + @GuardedBy("mService") @Override public void waitForDispatched(@NonNull Intent intent, @NonNull PrintWriter pw) { waitFor(() -> isDispatchedLocked(intent, pw)); @@ -1819,6 +1864,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } } + @GuardedBy("mService") private void checkAndRemoveWaitingFor() { if (!mWaitingFor.isEmpty()) { mWaitingFor.removeIf((pair) -> { @@ -1854,6 +1900,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { return false; } + @GuardedBy("mService") @Override public void backgroundServicesFinishedLocked(int userId) { // Modern queue does not alter the broadcasts delivery behavior based on background @@ -1866,6 +1913,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } } + @GuardedBy("mService") private void checkHealthLocked() { try { assertHealthLocked(); @@ -1888,6 +1936,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * current state once and stop future health checks to avoid spamming. */ @VisibleForTesting + @GuardedBy("mService") void assertHealthLocked() { // Verify all runnable queues are sorted BroadcastProcessQueue prev = null; @@ -1927,6 +1976,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } @SuppressWarnings("CheckResult") + @GuardedBy("mService") private void updateWarmProcess(@NonNull BroadcastProcessQueue queue) { if (!queue.isProcessWarm()) { // This is a bit awkward; we're in the middle of traversing the @@ -1946,6 +1996,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * {@link BroadcastProcessQueue}. Also updates any runnable status that * might have changed as a side-effect. */ + @GuardedBy("mService") private void setQueueProcess(@NonNull BroadcastProcessQueue queue, @Nullable ProcessRecord app) { if (queue.setProcessAndUidState(app, mUidForeground.get(queue.uid, false), @@ -2008,6 +2059,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * Inform other parts of OS that the given broadcast queue has started * running, typically for internal bookkeeping. */ + @GuardedBy("mService") private void notifyStartedRunning(@NonNull BroadcastProcessQueue queue) { if (queue.app != null) { queue.app.mReceivers.incrementCurReceivers(); @@ -2032,6 +2084,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * Inform other parts of OS that the given broadcast queue has stopped * running, typically for internal bookkeeping. */ + @GuardedBy("mService") private void notifyStoppedRunning(@NonNull BroadcastProcessQueue queue) { if (queue.app != null) { queue.app.mReceivers.decrementCurReceivers(); @@ -2046,6 +2099,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * Inform other parts of OS that the given broadcast was just scheduled for * a registered receiver, typically for internal bookkeeping. */ + @GuardedBy("mService") private void notifyScheduleRegisteredReceiver(@NonNull ProcessRecord app, @NonNull BroadcastRecord r, @NonNull BroadcastFilter receiver) { reportUsageStatsBroadcastDispatched(app, r); @@ -2055,6 +2109,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * Inform other parts of OS that the given broadcast was just scheduled for * a manifest receiver, typically for internal bookkeeping. */ + @GuardedBy("mService") private void notifyScheduleReceiver(@NonNull ProcessRecord app, @NonNull BroadcastRecord r, @NonNull ResolveInfo receiver) { reportUsageStatsBroadcastDispatched(app, r); @@ -2077,6 +2132,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { receiverPackageName, r.userId, r.callerPackage, r.toString()); } + @GuardedBy("mService") private void reportUsageStatsBroadcastDispatched(@NonNull ProcessRecord app, @NonNull BroadcastRecord r) { final long idForResponseEvent = (r.options != null) @@ -2102,6 +2158,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { * Inform other parts of OS that the given broadcast was just finished, * typically for internal bookkeeping. */ + @GuardedBy("mService") private void notifyFinishReceiver(@Nullable BroadcastProcessQueue queue, @Nullable ProcessRecord app, @NonNull BroadcastRecord r, int index, @NonNull Object receiver) { @@ -2115,6 +2172,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } } + @GuardedBy("mService") private void logBroadcastDeliveryEventReported(@Nullable BroadcastProcessQueue queue, @Nullable ProcessRecord app, @NonNull BroadcastRecord r, int index, @NonNull Object receiver) { @@ -2165,6 +2223,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } } + @GuardedBy("mService") private void notifyFinishBroadcast(@NonNull BroadcastRecord r) { mService.notifyBroadcastFinishedLocked(r); r.finishTime = SystemClock.uptimeMillis(); @@ -2193,11 +2252,13 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } @VisibleForTesting + @GuardedBy("mService") @NonNull BroadcastProcessQueue getOrCreateProcessQueue(@NonNull ProcessRecord app) { return getOrCreateProcessQueue(app.processName, app.info.uid); } @VisibleForTesting + @GuardedBy("mService") @NonNull BroadcastProcessQueue getOrCreateProcessQueue(@NonNull String processName, int uid) { BroadcastProcessQueue leaf = mProcessQueues.get(uid); @@ -2222,11 +2283,13 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } @VisibleForTesting + @GuardedBy("mService") @Nullable BroadcastProcessQueue getProcessQueue(@NonNull ProcessRecord app) { return getProcessQueue(app.processName, app.info.uid); } @VisibleForTesting + @GuardedBy("mService") @Nullable BroadcastProcessQueue getProcessQueue(@NonNull String processName, int uid) { BroadcastProcessQueue leaf = mProcessQueues.get(uid); while (leaf != null) { @@ -2239,11 +2302,13 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } @VisibleForTesting + @GuardedBy("mService") @Nullable BroadcastProcessQueue removeProcessQueue(@NonNull ProcessRecord app) { return removeProcessQueue(app.processName, app.info.uid); } @VisibleForTesting + @GuardedBy("mService") @Nullable BroadcastProcessQueue removeProcessQueue(@NonNull String processName, int uid) { BroadcastProcessQueue prev = null; @@ -2267,6 +2332,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { return null; } + @GuardedBy("mService") private void logBootCompletedBroadcastCompletionLatencyIfPossible(BroadcastRecord r) { // Only log after last receiver. // In case of split BOOT_COMPLETED broadcast, make sure only call this method on the @@ -2322,6 +2388,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { @Override @NeverCompile + @GuardedBy("mService") public void dumpDebug(@NonNull ProtoOutputStream proto, long fieldId) { long token = proto.start(fieldId); proto.write(BroadcastQueueProto.QUEUE_NAME, mQueueName); @@ -2331,6 +2398,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { @Override @NeverCompile + @GuardedBy("mService") public boolean dumpLocked(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args, int opti, boolean dumpConstants, boolean dumpHistory, boolean dumpAll, @Nullable String dumpPackage, boolean needSep) { diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags index 80387322b038..b142781418e8 100644 --- a/services/core/java/com/android/server/am/EventLogTags.logtags +++ b/services/core/java/com/android/server/am/EventLogTags.logtags @@ -135,3 +135,9 @@ option java_package com.android.server.am # Caller information to clear application data 30120 am_clear_app_data_caller (pid|1),(uid|1),(package|3) + +30111 am_uid_state_changed (UID|1|5),(Seq|1|5),(UidState|1|5),(OldUidState|1|5),(Capability|1|5),(OldCapability|1|5),(Flags|1|5),(reason|3) +30112 am_proc_state_changed (UID|1|5),(PID|1|5),(Seq|1|5),(ProcState|1|5),(OldProcState|1|5),(OomAdj|1|5),(OldOomAdj|1|5),(reason|3) + +# "Misc" events. See OomAdjusterDebugLogger.java +30113 am_oom_adj_misc (Event|1|5),(UID|1|5),(PID|1|5),(Seq|1|5),(Arg1|1|5),(Arg2|1|5),(reason|3) diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 7f6d62c29648..1a7629f3182d 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -401,6 +401,14 @@ public class OomAdjuster { @GuardedBy("mService") private boolean mPendingFullOomAdjUpdate = false; + /** + * Most recent reason string. We update it in sync with the trace. + */ + @OomAdjReason + protected int mLastReason; + + private final OomAdjusterDebugLogger mLogger; + /** Overrideable by a test */ @VisibleForTesting protected boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId, @@ -433,6 +441,8 @@ public class OomAdjuster { mCachedAppOptimizer = new CachedAppOptimizer(mService); mCacheOomRanker = new CacheOomRanker(service); + mLogger = new OomAdjusterDebugLogger(this, mService.mConstants); + mProcessGroupHandler = new Handler(adjusterThread.getLooper(), msg -> { final int pid = msg.arg1; final int group = msg.arg2; @@ -636,6 +646,7 @@ public class OomAdjuster { protected boolean performUpdateOomAdjLSP(ProcessRecord app, @OomAdjReason int oomAdjReason) { final ProcessRecord topApp = mService.getTopApp(); + mLastReason = oomAdjReason; Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason)); mService.mOomAdjProfiler.oomAdjStarted(); mAdjSeq++; @@ -916,6 +927,7 @@ public class OomAdjuster { protected void performUpdateOomAdjPendingTargetsLocked(@OomAdjReason int oomAdjReason) { final ProcessRecord topApp = mService.getTopApp(); + mLastReason = oomAdjReason; Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason)); mService.mOomAdjProfiler.oomAdjStarted(); @@ -958,6 +970,7 @@ public class OomAdjuster { } } + mLastReason = oomAdjReason; if (startProfiling) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason)); mService.mOomAdjProfiler.oomAdjStarted(); @@ -1491,6 +1504,7 @@ public class OomAdjuster { || uidRec.isSetAllowListed() != uidRec.isCurAllowListed() || uidRec.getProcAdjChanged()) { int uidChange = 0; + final boolean shouldLog = mLogger.shouldLog(uidRec.getUid()); if (DEBUG_UID_OBSERVERS) { Slog.i(TAG_UID_OBSERVERS, "Changes in " + uidRec + ": proc state from " + uidRec.getSetProcState() + " to " @@ -1511,14 +1525,21 @@ public class OomAdjuster { || uidRec.isSetAllowListed() || uidRec.getLastBackgroundTime() == 0) { uidRec.setLastBackgroundTime(nowElapsed); + if (shouldLog) { + mLogger.logSetLastBackgroundTime(uidRec.getUid(), nowElapsed); + } if (mService.mDeterministicUidIdle || !mService.mHandler.hasMessages(IDLE_UIDS_MSG)) { // Note: the background settle time is in elapsed realtime, while // the handler time base is uptime. All this means is that we may // stop background uids later than we had intended, but that only // happens because the device was sleeping so we are okay anyway. + if (shouldLog) { + mLogger.logScheduleUidIdle1(uidRec.getUid(), + mConstants.BACKGROUND_SETTLE_TIME); + } mService.mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG, - mConstants.BACKGROUND_SETTLE_TIME); + mConstants.BACKGROUND_SETTLE_TIME); // XXX } } if (uidRec.isIdle() && !uidRec.isSetIdle()) { @@ -1536,6 +1557,9 @@ public class OomAdjuster { } uidRec.setLastBackgroundTime(0); uidRec.setLastIdleTime(0); + if (shouldLog) { + mLogger.logClearLastBackgroundTime(uidRec.getUid()); + } } final boolean wasCached = uidRec.getSetProcState() > ActivityManager.PROCESS_STATE_RECEIVER; @@ -1555,11 +1579,25 @@ public class OomAdjuster { if (uidRec.getProcAdjChanged()) { uidChange |= UidRecord.CHANGE_PROCADJ; } + int oldProcState = uidRec.getSetProcState(); + int oldCapability = uidRec.getSetCapability(); uidRec.setSetProcState(uidRec.getCurProcState()); uidRec.setSetCapability(uidRec.getCurCapability()); uidRec.setSetAllowListed(uidRec.isCurAllowListed()); uidRec.setSetIdle(uidRec.isIdle()); uidRec.clearProcAdjChanged(); + if (shouldLog + && ((uidRec.getSetProcState() != oldProcState) + || (uidRec.getSetCapability() != oldCapability))) { + int flags = 0; + if (uidRec.isSetAllowListed()) { + flags |= 1; + } + mLogger.logUidStateChanged(uidRec.getUid(), + uidRec.getSetProcState(), oldProcState, + uidRec.getSetCapability(), oldCapability, + flags); + } if ((uidChange & UidRecord.CHANGE_PROCSTATE) != 0 || (uidChange & UidRecord.CHANGE_CAPABILITY) != 0) { mService.mAtmInternal.onUidProcStateChanged( @@ -3300,6 +3338,7 @@ public class OomAdjuster { mCachedAppOptimizer.onOomAdjustChanged(state.getSetAdj(), state.getCurAdj(), app); } + final int oldOomAdj = state.getSetAdj(); if (state.getCurAdj() != state.getSetAdj()) { ProcessList.setOomAdj(app.getPid(), app.uid, state.getCurAdj()); if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mService.mCurOomAdjUid == app.info.uid) { @@ -3457,6 +3496,7 @@ public class OomAdjuster { mService.mAppProfiler.updateNextPssTimeLPf( state.getCurProcState(), app.mProfile, now, forceUpdatePssTime); } + int oldProcState = state.getSetProcState(); if (state.getSetProcState() != state.getCurProcState()) { if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mService.mCurOomAdjUid == app.uid) { String msg = "Proc state change of " + app.processName @@ -3556,6 +3596,11 @@ public class OomAdjuster { // Kick off the delayed checkup message if needed. if (mService.mDeterministicUidIdle || !mService.mHandler.hasMessages(IDLE_UIDS_MSG)) { + if (mLogger.shouldLog(app.uid)) { + mLogger.logScheduleUidIdle2( + uidRec.getUid(), app.getPid(), + mConstants.mKillBgRestrictedAndCachedIdleSettleTimeMs); + } mService.mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG, mConstants.mKillBgRestrictedAndCachedIdleSettleTimeMs); } @@ -3563,6 +3608,12 @@ public class OomAdjuster { } state.setSetCached(state.isCached()); state.setSetNoKillOnBgRestrictedAndIdle(state.shouldNotKillOnBgRestrictedAndIdle()); + if (((oldProcState != state.getSetProcState()) || (oldOomAdj != state.getSetAdj())) + && mLogger.shouldLog(app.uid)) { + mLogger.logProcStateChanged(app.uid, app.getPid(), + state.getSetProcState(), oldProcState, + state.getSetAdj(), oldOomAdj); + } return success; } @@ -3704,6 +3755,7 @@ public class OomAdjuster { if (mService.mLocalPowerManager != null) { mService.mLocalPowerManager.startUidChanges(); } + boolean shouldLogMisc = false; for (int i = N - 1; i >= 0; i--) { final UidRecord uidRec = mActiveUids.valueAt(i); final long bgTime = uidRec.getLastBackgroundTime(); @@ -3721,6 +3773,9 @@ public class OomAdjuster { if (nextTime == 0 || nextTime > bgTime) { nextTime = bgTime; } + if (mLogger.shouldLog(uidRec.getUid())) { + shouldLogMisc = true; + } } } } @@ -3742,8 +3797,11 @@ public class OomAdjuster { } } if (nextTime > 0) { - mService.mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG, - nextTime + mConstants.BACKGROUND_SETTLE_TIME - nowElapsed); + long delay = nextTime + mConstants.BACKGROUND_SETTLE_TIME - nowElapsed; + if (shouldLogMisc) { + mLogger.logScheduleUidIdle3(delay); + } + mService.mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG, delay); } } diff --git a/services/core/java/com/android/server/am/OomAdjusterDebugLogger.java b/services/core/java/com/android/server/am/OomAdjusterDebugLogger.java new file mode 100644 index 000000000000..1294a4d25c44 --- /dev/null +++ b/services/core/java/com/android/server/am/OomAdjusterDebugLogger.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.server.am; + +import android.app.StackTrace; +import android.util.Slog; + +/** + * Helper for writing debug log about proc/uid state changes. + */ +class OomAdjusterDebugLogger { + // Use the "am_" tag to make it similar to event logs. + private static final String STACK_TRACE_TAG = "am_stack"; + + private final OomAdjuster mOomAdjuster; + private final ActivityManagerConstants mConstants; + + private static final int MISC_SCHEDULE_IDLE_UIDS_MSG_1 = 1; + private static final int MISC_SCHEDULE_IDLE_UIDS_MSG_2 = 2; + private static final int MISC_SCHEDULE_IDLE_UIDS_MSG_3 = 3; + + private static final int MISC_SET_LAST_BG_TIME = 10; + private static final int MISC_CLEAR_LAST_BG_TIME = 11; + + OomAdjusterDebugLogger(OomAdjuster oomAdjuster, ActivityManagerConstants constants) { + mOomAdjuster = oomAdjuster; + mConstants = constants; + } + + boolean shouldLog(int uid) { + return mConstants.shouldDebugUidForProcState(uid); + } + + private void maybeLogStacktrace(String msg) { + if (!mConstants.mEnableProcStateStacktrace) { + return; + } + Slog.i(STACK_TRACE_TAG, + msg + ": " + OomAdjuster.oomAdjReasonToString(mOomAdjuster.mLastReason), + new StackTrace("Called here")); + } + + private void maybeSleep(int millis) { + if (millis == 0) { + return; + } + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + } + } + + void logUidStateChanged(int uid, int uidstate, int olduidstate, + int capability, int oldcapability, int flags) { + EventLogTags.writeAmUidStateChanged( + uid, mOomAdjuster.mAdjSeq, uidstate, olduidstate, capability, oldcapability, flags, + OomAdjuster.oomAdjReasonToString(mOomAdjuster.mLastReason)); + maybeLogStacktrace("uidStateChanged"); + maybeSleep(mConstants.mProcStateDebugSetUidStateDelay); + } + + void logProcStateChanged(int uid, int pid, int procstate, int oldprocstate, + int oomadj, int oldoomadj) { + EventLogTags.writeAmProcStateChanged( + uid, pid, mOomAdjuster.mAdjSeq, procstate, oldprocstate, oomadj, oldoomadj, + OomAdjuster.oomAdjReasonToString(mOomAdjuster.mLastReason)); + maybeLogStacktrace("procStateChanged"); + maybeSleep(mConstants.mProcStateDebugSetProcStateDelay); + } + + void logScheduleUidIdle1(int uid, long delay) { + EventLogTags.writeAmOomAdjMisc(MISC_SCHEDULE_IDLE_UIDS_MSG_1, + uid, 0, mOomAdjuster.mAdjSeq, (int) delay, 0, ""); + } + + void logScheduleUidIdle2(int uid, int pid, long delay) { + EventLogTags.writeAmOomAdjMisc(MISC_SCHEDULE_IDLE_UIDS_MSG_2, + uid, pid, mOomAdjuster.mAdjSeq, (int) delay, 0, ""); + } + + void logScheduleUidIdle3(long delay) { + EventLogTags.writeAmOomAdjMisc(MISC_SCHEDULE_IDLE_UIDS_MSG_3, + 0, 0, mOomAdjuster.mAdjSeq, (int) delay, 0, ""); + } + + void logSetLastBackgroundTime(int uid, long time) { + EventLogTags.writeAmOomAdjMisc(MISC_SET_LAST_BG_TIME, + uid, 0, mOomAdjuster.mAdjSeq, (int) time, 0, + OomAdjuster.oomAdjReasonToString(mOomAdjuster.mLastReason)); + } + + void logClearLastBackgroundTime(int uid) { + EventLogTags.writeAmOomAdjMisc(MISC_CLEAR_LAST_BG_TIME, + uid, 0, mOomAdjuster.mAdjSeq, 0, 0, + OomAdjuster.oomAdjReasonToString(mOomAdjuster.mLastReason)); + } +} diff --git a/services/core/java/com/android/server/am/OomAdjusterModernImpl.java b/services/core/java/com/android/server/am/OomAdjusterModernImpl.java index 46bdfe892040..5feac1ff92cb 100644 --- a/services/core/java/com/android/server/am/OomAdjusterModernImpl.java +++ b/services/core/java/com/android/server/am/OomAdjusterModernImpl.java @@ -741,6 +741,7 @@ public class OomAdjusterModernImpl extends OomAdjuster { mPendingProcessSet.clear(); mService.mAppProfiler.mHasPreviousProcess = mService.mAppProfiler.mHasHomeProcess = false; + mLastReason = oomAdjReason; Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason)); mService.mOomAdjProfiler.oomAdjStarted(); @@ -761,6 +762,7 @@ public class OomAdjusterModernImpl extends OomAdjuster { @GuardedBy("mService") @Override protected void performUpdateOomAdjPendingTargetsLocked(@OomAdjReason int oomAdjReason) { + mLastReason = oomAdjReason; Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason)); mService.mOomAdjProfiler.oomAdjStarted(); diff --git a/services/core/java/com/android/server/am/PendingIntentController.java b/services/core/java/com/android/server/am/PendingIntentController.java index 5df910716ba6..fb0d6957129a 100644 --- a/services/core/java/com/android/server/am/PendingIntentController.java +++ b/services/core/java/com/android/server/am/PendingIntentController.java @@ -146,6 +146,21 @@ public class PendingIntentController { ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED); } + if (opts != null && opts.isPendingIntentBackgroundActivityLaunchAllowedByPermission()) { + Slog.wtf(TAG, + "Resetting option pendingIntentBackgroundActivityLaunchAllowedByPermission" + + " which is set by the pending intent creator (" + + packageName + + ") because this option is meant for the pending intent sender"); + if (CompatChanges.isChangeEnabled(PendingIntent.PENDING_INTENT_OPTIONS_CHECK, + callingUid)) { + throw new IllegalArgumentException( + "pendingIntentBackgroundActivityLaunchAllowedByPermission " + + "can not be set by creator of a PendingIntent"); + } + opts.setPendingIntentBackgroundActivityLaunchAllowedByPermission(false); + } + final boolean noCreate = (flags & PendingIntent.FLAG_NO_CREATE) != 0; final boolean cancelCurrent = (flags & PendingIntent.FLAG_CANCEL_CURRENT) != 0; final boolean updateCurrent = (flags & PendingIntent.FLAG_UPDATE_CURRENT) != 0; diff --git a/services/core/java/com/android/server/am/flags.aconfig b/services/core/java/com/android/server/am/flags.aconfig index e955b00566b8..7611f4078c73 100644 --- a/services/core/java/com/android/server/am/flags.aconfig +++ b/services/core/java/com/android/server/am/flags.aconfig @@ -52,6 +52,14 @@ flag { flag { namespace: "backstage_power" + name: "defer_outgoing_broadcasts" + description: "Defer outgoing broadcasts from processes in freezable state" + bug: "327496592" + is_fixed_read_only: true +} + +flag { + namespace: "backstage_power" name: "avoid_repeated_bcast_re_enqueues" description: "Avoid re-enqueueing a broadcast repeatedly" bug: "319225224" @@ -60,3 +68,10 @@ flag { purpose: PURPOSE_BUGFIX } } + +flag { + namespace: "backstage_power" + name: "log_excessive_binder_proxies" + description: "Log the excessive incoming binder proxies into statsd" + bug: "298263955" +} diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java index e915688b95b1..b7e11a7fe261 100644 --- a/services/core/java/com/android/server/biometrics/AuthService.java +++ b/services/core/java/com/android/server/biometrics/AuthService.java @@ -20,7 +20,7 @@ package com.android.server.biometrics; // TODO(b/141025588): Create separate internal and external permissions for AuthService. // TODO(b/141025588): Get rid of the USE_FINGERPRINT permission. -import static android.Manifest.permission.SET_BIOMETRIC_DIALOG_LOGO; +import static android.Manifest.permission.SET_BIOMETRIC_DIALOG_ADVANCED; import static android.Manifest.permission.TEST_BIOMETRIC; import static android.Manifest.permission.USE_BIOMETRIC; import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL; @@ -1030,8 +1030,8 @@ public class AuthService extends SystemService { } private void checkManageBiometricPermission() { - getContext().enforceCallingOrSelfPermission(SET_BIOMETRIC_DIALOG_LOGO, - "Must have SET_BIOMETRIC_DIALOG_LOGO permission"); + getContext().enforceCallingOrSelfPermission(SET_BIOMETRIC_DIALOG_ADVANCED, + "Must have SET_BIOMETRIC_DIALOG_ADVANCED permission"); } private void checkPermission() { diff --git a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java index a100fe06c407..29cccdf9e2c6 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java @@ -74,7 +74,6 @@ final class InputMethodBindingController { @GuardedBy("ImfLock.class") @Nullable private IInputMethodInvoker mCurMethod; @GuardedBy("ImfLock.class") private int mCurMethodUid = Process.INVALID_UID; @GuardedBy("ImfLock.class") @Nullable private IBinder mCurToken; - @GuardedBy("ImfLock.class") private int mCurSeq; @GuardedBy("ImfLock.class") private boolean mVisibleBound; @GuardedBy("ImfLock.class") private boolean mSupportsStylusHw; @GuardedBy("ImfLock.class") private boolean mSupportsConnectionlessStylusHw; @@ -195,27 +194,6 @@ final class InputMethodBindingController { } /** - * The current binding sequence number, incremented every time there is - * a new bind performed. - */ - @GuardedBy("ImfLock.class") - int getSequenceNumber() { - return mCurSeq; - } - - /** - * Increase the current binding sequence number by one. - * Reset to 1 on overflow. - */ - @GuardedBy("ImfLock.class") - void advanceSequenceNumber() { - mCurSeq += 1; - if (mCurSeq <= 0) { - mCurSeq = 1; - } - } - - /** * If non-null, this is the input method service we are currently connected * to. */ @@ -435,9 +413,11 @@ final class InputMethodBindingController { mLastBindTime = SystemClock.uptimeMillis(); addFreshWindowToken(); + final UserData monitor = UserData.getOrCreate( + mService.getCurrentImeUserIdLocked()); return new InputBindResult( InputBindResult.ResultCode.SUCCESS_WAITING_IME_BINDING, - null, null, null, mCurId, mCurSeq, false); + null, null, null, mCurId, monitor.mSequence.getSequenceNumber(), false); } Slog.w(InputMethodManagerService.TAG, diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 950d6aae0e26..d0a83a66dfba 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -479,7 +479,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub */ @GuardedBy("ImfLock.class") private int getSequenceNumberLocked() { - return mBindingController.getSequenceNumber(); + final UserData monitor = UserData.getOrCreate(mCurrentUserId); + return monitor.mSequence.getSequenceNumber(); } /** @@ -488,7 +489,8 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub */ @GuardedBy("ImfLock.class") private void advanceSequenceNumberLocked() { - mBindingController.advanceSequenceNumber(); + final UserData monitor = UserData.getOrCreate(mCurrentUserId); + monitor.mSequence.advanceSequenceNumber(); } @GuardedBy("ImfLock.class") @@ -1369,6 +1371,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub // InputMethodSettingsRepository should be initialized before buildInputMethodListLocked InputMethodSettingsRepository.initialize(mHandler, mContext); AdditionalSubtypeMapRepository.initialize(mHandler, mContext); + UserData.initialize(mHandler); mCurrentUserId = mActivityManagerInternal.getCurrentUserId(); @@ -5859,6 +5862,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub p.println(" curSession=" + c.mCurSession); }; mClientController.forAllClients(clientControllerDump); + p.println(" mCurrentUserId=" + mCurrentUserId); p.println(" mCurMethodId=" + getSelectedMethodIdLocked()); client = mCurClient; p.println(" mCurClient=" + client + " mCurSeq=" + getSequenceNumberLocked()); @@ -5884,8 +5888,6 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub ? Arrays.toString(mStylusIds.toArray()) : "")); p.println(" mSwitchingController:"); mSwitchingController.dump(p); - p.println(" mSettings:"); - settings.dump(p, " "); p.println(" mStartInputHistory:"); mStartInputHistory.dump(pw, " "); diff --git a/services/core/java/com/android/server/inputmethod/Sequence.java b/services/core/java/com/android/server/inputmethod/Sequence.java new file mode 100644 index 000000000000..05e31ce1c682 --- /dev/null +++ b/services/core/java/com/android/server/inputmethod/Sequence.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.inputmethod; + +import com.android.internal.annotations.GuardedBy; + +/** + * A sequence number utility class that only generate positive numbers. + */ +final class Sequence { + + private final Object mLock = new Object(); + + private int mSequence; + + int getSequenceNumber() { + synchronized (mLock) { + return mSequence; + } + } + + @GuardedBy("ImfLock.class") + void advanceSequenceNumber() { + synchronized (mLock) { + mSequence++; + if (mSequence <= 0) { + mSequence = 1; + } + } + } +} diff --git a/services/core/java/com/android/server/inputmethod/UserData.java b/services/core/java/com/android/server/inputmethod/UserData.java new file mode 100644 index 000000000000..fc2a422e136f --- /dev/null +++ b/services/core/java/com/android/server/inputmethod/UserData.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.inputmethod; + +import android.annotation.NonNull; +import android.annotation.UserIdInt; +import android.content.pm.UserInfo; +import android.os.Handler; +import android.util.SparseArray; + +import com.android.internal.annotations.GuardedBy; +import com.android.server.LocalServices; +import com.android.server.pm.UserManagerInternal; + +final class UserData { + + @NonNull + private static final SparseArray<UserData> sPerUserMonitor = new SparseArray<>(); + + @UserIdInt + final int mUserId; + + @GuardedBy("ImfLock.class") + final Sequence mSequence = new Sequence(); + + /** + * Not intended to be instantiated. + */ + private UserData(int userId) { + mUserId = userId; + } + + @GuardedBy("ImfLock.class") + static UserData getOrCreate(@UserIdInt int userId) { + UserData monitor = sPerUserMonitor.get(userId); + if (monitor == null) { + monitor = new UserData(userId); + sPerUserMonitor.put(userId, monitor); + } + return monitor; + } + + static void initialize(Handler handler) { + final UserManagerInternal userManagerInternal = + LocalServices.getService(UserManagerInternal.class); + userManagerInternal.addUserLifecycleListener( + new UserManagerInternal.UserLifecycleListener() { + @Override + public void onUserRemoved(UserInfo user) { + final int userId = user.id; + handler.post(() -> { + synchronized (ImfLock.class) { + sPerUserMonitor.remove(userId); + } + }); + } + + @Override + public void onUserCreated(UserInfo user, Object unusedToken) { + final int userId = user.id; + handler.post(() -> { + synchronized (ImfLock.class) { + getOrCreate(userId); + } + }); + } + }); + synchronized (ImfLock.class) { + for (int userId : userManagerInternal.getUserIds()) { + getOrCreate(userId); + } + } + } +} diff --git a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java index 2a487856bfb8..51a8aeff96c6 100644 --- a/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java +++ b/services/core/java/com/android/server/media/MediaRouter2ServiceImpl.java @@ -33,6 +33,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.app.ActivityManager; +import android.app.AppOpsManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -115,6 +116,7 @@ class MediaRouter2ServiceImpl { private final Context mContext; private final UserManagerInternal mUserManagerInternal; private final Object mLock = new Object(); + private final AppOpsManager mAppOpsManager; final AtomicInteger mNextRouterOrManagerId = new AtomicInteger(1); final ActivityManager mActivityManager; final PowerManager mPowerManager; @@ -152,7 +154,30 @@ class MediaRouter2ServiceImpl { } }; - @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS) + private final AppOpsManager.OnOpChangedListener mOnOpChangedListener = + new AppOpsManager.OnOpChangedListener() { + @Override + public void onOpChanged(String op, String packageName) { + // Do nothing. + } + + @Override + public void onOpChanged( + @NonNull String op, @NonNull String packageName, int userId) { + if (!TextUtils.equals(op, AppOpsManager.OPSTR_MEDIA_ROUTING_CONTROL)) { + return; + } + synchronized (mLock) { + revokeManagerRecordAccessIfNeededLocked(packageName, userId); + } + } + }; + + @RequiresPermission( + allOf = { + Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS, + Manifest.permission.WATCH_APPOPS + }) /* package */ MediaRouter2ServiceImpl(Context context) { mContext = context; mActivityManager = mContext.getSystemService(ActivityManager.class); @@ -160,6 +185,7 @@ class MediaRouter2ServiceImpl { REQUIRED_PACKAGE_IMPORTANCE_FOR_SCANNING); mPowerManager = mContext.getSystemService(PowerManager.class); mUserManagerInternal = LocalServices.getService(UserManagerInternal.class); + mAppOpsManager = mContext.getSystemService(AppOpsManager.class); if (!Flags.disableScreenOffBroadcastReceiver()) { IntentFilter screenOnOffIntentFilter = new IntentFilter(); @@ -168,6 +194,12 @@ class MediaRouter2ServiceImpl { mContext.registerReceiver(mScreenOnOffReceiver, screenOnOffIntentFilter); } + // Passing null package name to listen to all events. + mAppOpsManager.startWatchingMode( + AppOpsManager.OP_MEDIA_ROUTING_CONTROL, + /* packageName */ null, + mOnOpChangedListener); + mContext.getPackageManager().addOnPermissionsChangeListener(this::onPermissionsChanged); } @@ -523,7 +555,6 @@ class MediaRouter2ServiceImpl { final int callerPid = Binder.getCallingPid(); final UserHandle callerUser = Binder.getCallingUserHandle(); - // TODO (b/305919655) - Handle revoking of MEDIA_ROUTING_CONTROL at runtime. enforcePrivilegedRoutingPermissions(callerUid, callerPid, callerPackageName); final long token = Binder.clearCallingIdentity(); @@ -564,7 +595,6 @@ class MediaRouter2ServiceImpl { final long token = Binder.clearCallingIdentity(); try { - // TODO (b/305919655) - Handle revoking of MEDIA_ROUTING_CONTROL at runtime. enforcePrivilegedRoutingPermissions(callerUid, callerPid, callerPackageName); enforceCrossUserPermissions(callerUid, callerPid, targetUser); if (!verifyPackageExistsForUser(targetPackageName, targetUser)) { @@ -835,9 +865,7 @@ class MediaRouter2ServiceImpl { }) private void enforcePrivilegedRoutingPermissions( int callerUid, int callerPid, @Nullable String callerPackageName) { - if (mContext.checkPermission( - Manifest.permission.MEDIA_CONTENT_CONTROL, callerPid, callerUid) - == PackageManager.PERMISSION_GRANTED) { + if (hasMediaContentControlPermission(callerUid, callerPid)) { return; } @@ -851,6 +879,13 @@ class MediaRouter2ServiceImpl { } } + @RequiresPermission(Manifest.permission.MEDIA_CONTENT_CONTROL) + private boolean hasMediaContentControlPermission(int callerUid, int callerPid) { + return mContext.checkPermission( + Manifest.permission.MEDIA_CONTENT_CONTROL, callerPid, callerUid) + == PackageManager.PERMISSION_GRANTED; + } + private boolean checkMediaRoutingControlPermission( int callerUid, int callerPid, @Nullable String callerPackageName) { return PermissionChecker.checkPermissionForDataDelivery( @@ -966,6 +1001,68 @@ class MediaRouter2ServiceImpl { return mUserManagerInternal.getProfileParentId(userId) == mCurrentActiveUserId; } + @GuardedBy("mLock") + private void revokeManagerRecordAccessIfNeededLocked(@NonNull String packageName, int userId) { + UserRecord userRecord = mUserRecords.get(userId); + if (userRecord == null) { + return; + } + + List<ManagerRecord> managers = + userRecord.mManagerRecords.stream() + .filter(r -> !r.mHasMediaContentControl) + .filter(r -> TextUtils.equals(r.mOwnerPackageName, packageName)) + .collect(Collectors.toList()); + + if (managers.isEmpty()) { + return; + } + + ManagerRecord record = managers.getFirst(); + + // Uid and package name are shared across all manager records in the list. + boolean isAppOpAllowed = + mAppOpsManager.unsafeCheckOp( + AppOpsManager.OPSTR_MEDIA_ROUTING_CONTROL, + record.mOwnerUid, + record.mOwnerPackageName) + == AppOpsManager.MODE_ALLOWED; + + if (isAppOpAllowed) { + return; + } + + for (ManagerRecord manager : managers) { + boolean isRegularPermission = + mContext.checkPermission( + Manifest.permission.MEDIA_ROUTING_CONTROL, + manager.mOwnerPid, + manager.mOwnerUid) + == PackageManager.PERMISSION_GRANTED; + + if (isRegularPermission) { + // We should check the regular permission for all manager records, as different PIDs + // might yield different permission results. + continue; + } + + Log.w( + TAG, + TextUtils.formatSimple( + "Revoking access to manager record id: %d, package: %s, userId:" + + " %d", + manager.mManagerId, manager.mOwnerPackageName, userRecord.mUserId)); + + unregisterManagerLocked(manager.mManager, /* died */ false); + + try { + manager.mManager.invalidateInstance(); + } catch (RemoteException ex) { + Slog.w(TAG, "Failed to notify manager= " + manager + " of permission revocation."); + } + } + } + // Start of locked methods that are used by MediaRouter2. @GuardedBy("mLock") @@ -1423,6 +1520,8 @@ class MediaRouter2ServiceImpl { boolean hasMediaRoutingControl = checkMediaRoutingControlPermission(callerUid, callerPid, callerPackageName); + boolean hasMediaContentControl = hasMediaContentControlPermission(callerUid, callerPid); + Slog.i( TAG, TextUtils.formatSimple( @@ -1446,7 +1545,8 @@ class MediaRouter2ServiceImpl { callerPid, callerPackageName, targetPackageName, - hasMediaRoutingControl); + hasMediaRoutingControl, + hasMediaContentControl); try { binder.linkToDeath(managerRecord, 0); } catch (RemoteException ex) { @@ -2123,6 +2223,7 @@ class MediaRouter2ServiceImpl { @Nullable public final String mTargetPackageName; public final boolean mHasMediaRoutingControl; + public final boolean mHasMediaContentControl; @Nullable public SessionCreationRequest mLastSessionCreationRequest; public @ScanningState int mScanningState = SCANNING_STATE_NOT_SCANNING; @@ -2134,7 +2235,8 @@ class MediaRouter2ServiceImpl { int ownerPid, @NonNull String ownerPackageName, @Nullable String targetPackageName, - boolean hasMediaRoutingControl) { + boolean hasMediaRoutingControl, + boolean hasMediaContentControl) { mUserRecord = userRecord; mManager = manager; mOwnerUid = ownerUid; @@ -2143,6 +2245,7 @@ class MediaRouter2ServiceImpl { mTargetPackageName = targetPackageName; mManagerId = mNextRouterOrManagerId.getAndIncrement(); mHasMediaRoutingControl = hasMediaRoutingControl; + mHasMediaContentControl = hasMediaContentControl; } public void dispose() { diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 97ce77c71138..18b495bfce5d 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -340,8 +340,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { static final String TAG = NetworkPolicyLogger.TAG; private static final boolean LOGD = NetworkPolicyLogger.LOGD; private static final boolean LOGV = NetworkPolicyLogger.LOGV; - // TODO: b/304347838 - Remove once the feature is in staging. - private static final boolean ALWAYS_RESTRICT_BACKGROUND_NETWORK = false; /** * No opportunistic quota could be calculated from user data plan or data settings. @@ -1070,8 +1068,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } // The flag is boot-stable. - mBackgroundNetworkRestricted = ALWAYS_RESTRICT_BACKGROUND_NETWORK - && Flags.networkBlockedForTopSleepingAndAbove(); + mBackgroundNetworkRestricted = Flags.networkBlockedForTopSleepingAndAbove(); if (mBackgroundNetworkRestricted) { // Firewall rules and UidBlockedState will get updated in // updateRulesForGlobalChangeAL below. diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 4bec61acc38f..ae68018c90b3 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -3601,7 +3601,8 @@ final class InstallPackageHelper { continue; } if ((scanFlags & SCAN_DROP_CACHE) != 0) { - final PackageCacher cacher = new PackageCacher(mPm.getCacheDir()); + final PackageCacher cacher = new PackageCacher(mPm.getCacheDir(), + mPm.mPackageParserCallback); Log.w(TAG, "Dropping cache of " + file.getAbsolutePath()); cacher.cleanCachedResult(file); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 7c51707f7280..35cb5b000219 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1739,7 +1739,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService () -> LocalServices.getService(UserManagerInternal.class)), (i, pm) -> new DisplayMetrics(), (i, pm) -> new PackageParser2(pm.mSeparateProcesses, i.getDisplayMetrics(), - new PackageCacher(pm.mCacheDir), + new PackageCacher(pm.mCacheDir, pm.mPackageParserCallback), pm.mPackageParserCallback) /* scanningCachingPackageParserProducer */, (i, pm) -> new PackageParser2(pm.mSeparateProcesses, i.getDisplayMetrics(), null, pm.mPackageParserCallback) /* scanningPackageParserProducer */, diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java index c9fd2610bfb7..19191374f12a 100644 --- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java +++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java @@ -217,8 +217,7 @@ public class UserRestrictionsUtils { private static final Set<String> IMMUTABLE_BY_OWNERS = Sets.newArraySet( UserManager.DISALLOW_RECORD_AUDIO, UserManager.DISALLOW_WALLPAPER, - UserManager.DISALLOW_OEM_UNLOCK, - UserManager.DISALLOW_ADD_PRIVATE_PROFILE + UserManager.DISALLOW_OEM_UNLOCK ); /** @@ -293,7 +292,8 @@ public class UserRestrictionsUtils { UserManager.DISALLOW_USB_FILE_TRANSFER, UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, UserManager.DISALLOW_UNMUTE_MICROPHONE, - UserManager.DISALLOW_CONFIG_DEFAULT_APPS + UserManager.DISALLOW_CONFIG_DEFAULT_APPS, + UserManager.DISALLOW_ADD_PRIVATE_PROFILE ); /** diff --git a/services/core/java/com/android/server/pm/parsing/PackageCacher.java b/services/core/java/com/android/server/pm/parsing/PackageCacher.java index b6267c499c07..2db454aa4c41 100644 --- a/services/core/java/com/android/server/pm/parsing/PackageCacher.java +++ b/services/core/java/com/android/server/pm/parsing/PackageCacher.java @@ -17,6 +17,7 @@ package com.android.server.pm.parsing; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.pm.PackageParserCacheHelper; import android.os.Environment; import android.os.FileUtils; @@ -29,8 +30,10 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.pm.parsing.IPackageCacher; +import com.android.internal.pm.parsing.PackageParser2; import com.android.internal.pm.parsing.pkg.PackageImpl; import com.android.internal.pm.parsing.pkg.ParsedPackage; +import com.android.internal.pm.pkg.parsing.ParsingPackageUtils; import com.android.server.pm.ApexManager; import libcore.io.IoUtils; @@ -51,9 +54,16 @@ public class PackageCacher implements IPackageCacher { @NonNull private final File mCacheDir; + @Nullable + private final PackageParser2.Callback mCallback; - public PackageCacher(@NonNull File cacheDir) { + public PackageCacher(File cacheDir) { + this(cacheDir, null); + } + + public PackageCacher(File cacheDir, @Nullable PackageParser2.Callback callback) { this.mCacheDir = cacheDir; + this.mCallback = callback; } /** @@ -71,12 +81,17 @@ public class PackageCacher implements IPackageCacher { @VisibleForTesting protected ParsedPackage fromCacheEntry(byte[] bytes) { - return fromCacheEntryStatic(bytes); + return fromCacheEntryStatic(bytes, mCallback); } /** static version of {@link #fromCacheEntry} for unit tests. */ @VisibleForTesting public static ParsedPackage fromCacheEntryStatic(byte[] bytes) { + return fromCacheEntryStatic(bytes, null); + } + + private static ParsedPackage fromCacheEntryStatic(byte[] bytes, + @Nullable ParsingPackageUtils.Callback callback) { final Parcel p = Parcel.obtain(); p.unmarshall(bytes, 0, bytes.length); p.setDataPosition(0); @@ -85,7 +100,7 @@ public class PackageCacher implements IPackageCacher { new PackageParserCacheHelper.ReadHelper(p); helper.startAndInstall(); - ParsedPackage pkg = new PackageImpl(p); + ParsedPackage pkg = new PackageImpl(p, callback); p.recycle(); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index ecd70350c303..9e31748385c5 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -1506,9 +1506,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void stemPrimaryPress(int count) { - if (DEBUG_INPUT) { - Slog.d(TAG, "stemPrimaryPress: " + count); - } + Slog.d(TAG, "stemPrimaryPress: " + count); if (count == 3) { stemPrimaryTriplePressAction(mTriplePressOnStemPrimaryBehavior); } else if (count == 2) { @@ -1519,22 +1517,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void stemPrimarySinglePressAction(int behavior) { - if (DEBUG_INPUT) { - Slog.d(TAG, "stemPrimarySinglePressAction: behavior=" + behavior); - } + Slog.d(TAG, "stemPrimarySinglePressAction: behavior=" + behavior); if (behavior == SHORT_PRESS_PRIMARY_NOTHING) return; final boolean keyguardActive = mKeyguardDelegate != null && mKeyguardDelegate.isShowing(); if (keyguardActive) { // If keyguarded then notify the keyguard. mKeyguardDelegate.onSystemKeyPressed(KeyEvent.KEYCODE_STEM_PRIMARY); + Slog.d(TAG, "stemPrimarySinglePressAction: skip due to keyguard"); return; } switch (behavior) { case SHORT_PRESS_PRIMARY_LAUNCH_ALL_APPS: - if (DEBUG_INPUT) { - Slog.d(TAG, "Executing stem primary short press action behavior."); - } Intent allAppsIntent = new Intent(Intent.ACTION_ALL_APPS); allAppsIntent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK @@ -1542,12 +1536,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { startActivityAsUser(allAppsIntent, UserHandle.CURRENT_OR_SELF); break; case SHORT_PRESS_PRIMARY_LAUNCH_TARGET_ACTIVITY: - if (DEBUG_INPUT) { - Slog.d( - TAG, - "Executing stem primary short press action behavior for launching " - + "target activity."); - } if (mPrimaryShortPressTargetActivity != null) { Intent targetActivityIntent = new Intent(); targetActivityIntent.setComponent(mPrimaryShortPressTargetActivity); @@ -1578,13 +1566,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void stemPrimaryDoublePressAction(int behavior) { + Slog.d(TAG, "stemPrimaryDoublePressAction: " + behavior); switch (behavior) { case DOUBLE_PRESS_PRIMARY_NOTHING: break; case DOUBLE_PRESS_PRIMARY_SWITCH_RECENT_APP: - if (DEBUG_INPUT) { - Slog.d(TAG, "Executing stem primary double press action behavior."); - } final boolean keyguardActive = mKeyguardDelegate == null ? false : mKeyguardDelegate.isShowing(); @@ -1596,13 +1582,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void stemPrimaryTriplePressAction(int behavior) { + Slog.d(TAG, "stemPrimaryTriplePressAction: " + behavior); switch (behavior) { case TRIPLE_PRESS_PRIMARY_NOTHING: break; case TRIPLE_PRESS_PRIMARY_TOGGLE_ACCESSIBILITY: - if (DEBUG_INPUT) { - Slog.d(TAG, "Executing stem primary triple press action behavior."); - } mTalkbackShortcutController.toggleTalkback(mCurrentUserId); if (mTalkbackShortcutController.isTalkBackShortcutGestureEnabled()) { performHapticFeedback(HapticFeedbackConstants.CONFIRM, /* always = */ @@ -1614,9 +1598,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void stemPrimaryLongPress(long eventTime) { - if (DEBUG_INPUT) { - Slog.d(TAG, "Executing stem primary long press action behavior."); - } + Slog.d(TAG, "stemPrimaryLongPress: " + mLongPressOnStemPrimaryBehavior); switch (mLongPressOnStemPrimaryBehavior) { case LONG_PRESS_PRIMARY_NOTHING: @@ -1696,10 +1678,19 @@ public class PhoneWindowManager implements WindowManagerPolicy { return mLongPressOnStemPrimaryBehavior != LONG_PRESS_PRIMARY_NOTHING; } + /** Determine whether the device has any stem primary behaviors. */ private boolean hasStemPrimaryBehavior() { + // Read the default stem behaviors from the XML config to determine whether stem primary + // behaviors are supported in this build. If they are supported, then the behaviors may be + // overridden at runtime through their respective Settings overrides. If they are not + // supported, the Settings overrides will not apply. + final int defaultShortPressOnStemPrimaryBehavior = mContext.getResources().getInteger( + com.android.internal.R.integer.config_shortPressOnStemPrimaryBehavior); + final int defaultLongPressOnStemPrimaryBehavior = mContext.getResources().getInteger( + com.android.internal.R.integer.config_longPressOnStemPrimaryBehavior); return getMaxMultiPressStemPrimaryCount() > 1 - || hasLongPressOnStemPrimaryBehavior() - || mShortPressOnStemPrimaryBehavior != SHORT_PRESS_PRIMARY_NOTHING; + || defaultLongPressOnStemPrimaryBehavior != LONG_PRESS_PRIMARY_NOTHING + || defaultShortPressOnStemPrimaryBehavior != SHORT_PRESS_PRIMARY_NOTHING; } private void interceptScreenshotChord(int source, long pressDelay) { @@ -2787,6 +2778,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { KeyEvent.KEYCODE_STEM_PRIMARY, eventTime, () -> { + Slog.d(TAG, "StemPrimaryKeyRule: executing deferred onKeyUp"); // Save the info of the focused task on screen. This may be used // later to bring the current focused task back to top. For // example, stem primary triple press enables the A11y interface diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 6ff8cf3cc2c8..ea9ab30e6293 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -3949,7 +3949,7 @@ public final class PowerManagerService extends SystemService UserspaceRebootLogger.noteUserspaceRebootWasRequested(); } if (mHandler == null || !mSystemReady) { - if (RescueParty.isAttemptingFactoryReset()) { + if (RescueParty.isRecoveryTriggeredReboot()) { // If we're stuck in a really low-level reboot loop, and a // rescue party is trying to prompt the user for a factory data // reset, we must GET TO DA CHOPPA! diff --git a/services/core/java/com/android/server/power/ShutdownThread.java b/services/core/java/com/android/server/power/ShutdownThread.java index 4bf8a78a1f16..afcf49daf0c4 100644 --- a/services/core/java/com/android/server/power/ShutdownThread.java +++ b/services/core/java/com/android/server/power/ShutdownThread.java @@ -337,7 +337,7 @@ public final class ShutdownThread extends Thread { com.android.internal.R.string.reboot_to_update_reboot)); } } else if (mReason != null && mReason.equals(PowerManager.REBOOT_RECOVERY)) { - if (RescueParty.isAttemptingFactoryReset()) { + if (RescueParty.isRecoveryTriggeredReboot()) { // We're not actually doing a factory reset yet; we're rebooting // to ask the user if they'd like to reset, so give them a less // scary dialog message. diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java index 35717af962ef..aa1a41eee220 100644 --- a/services/core/java/com/android/server/power/hint/HintManagerService.java +++ b/services/core/java/com/android/server/power/hint/HintManagerService.java @@ -24,6 +24,7 @@ import android.app.ActivityManagerInternal; import android.app.StatsManager; import android.app.UidObserver; import android.content.Context; +import android.hardware.power.WorkDuration; import android.os.Binder; import android.os.IBinder; import android.os.IHintManager; @@ -32,7 +33,6 @@ import android.os.PerformanceHintManager; import android.os.Process; import android.os.RemoteException; import android.os.SystemProperties; -import android.os.WorkDuration; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -198,8 +198,8 @@ public final class HintManagerService extends SystemService { private static native void nativeSetMode(long halPtr, int mode, boolean enabled); - private static native void nativeReportActualWorkDuration(long halPtr, - WorkDuration[] workDurations); + private static native void nativeReportActualWorkDuration( + long halPtr, WorkDuration[] workDurations); /** Wrapper for HintManager.nativeInit */ public void halInit() { @@ -670,46 +670,46 @@ public final class HintManagerService extends SystemService { void validateWorkDuration(WorkDuration workDuration) { if (DEBUG) { - Slogf.d(TAG, "WorkDuration(" + workDuration.getTimestampNanos() + ", " - + workDuration.getWorkPeriodStartTimestampNanos() + ", " - + workDuration.getActualTotalDurationNanos() + ", " - + workDuration.getActualCpuDurationNanos() + ", " - + workDuration.getActualGpuDurationNanos() + ")"); + Slogf.d(TAG, "WorkDuration(" + + workDuration.durationNanos + ", " + + workDuration.workPeriodStartTimestampNanos + ", " + + workDuration.cpuDurationNanos + ", " + + workDuration.gpuDurationNanos + ")"); } // Allow work period start timestamp to be zero in system server side because // legacy API call will use zero value. It can not be estimated with the timestamp // the sample is received because the samples could stack up. - if (workDuration.getWorkPeriodStartTimestampNanos() < 0) { + if (workDuration.durationNanos <= 0) { throw new IllegalArgumentException( - TextUtils.formatSimple( - "Work period start timestamp (%d) should be greater than 0", - workDuration.getWorkPeriodStartTimestampNanos())); + TextUtils.formatSimple("Actual total duration (%d) should be greater than 0", + workDuration.durationNanos)); } - if (workDuration.getActualTotalDurationNanos() <= 0) { + if (workDuration.workPeriodStartTimestampNanos < 0) { throw new IllegalArgumentException( - TextUtils.formatSimple("Actual total duration (%d) should be greater than 0", - workDuration.getActualTotalDurationNanos())); + TextUtils.formatSimple( + "Work period start timestamp (%d) should be greater than 0", + workDuration.workPeriodStartTimestampNanos)); } - if (workDuration.getActualCpuDurationNanos() < 0) { + if (workDuration.cpuDurationNanos < 0) { throw new IllegalArgumentException( TextUtils.formatSimple( "Actual CPU duration (%d) should be greater than or equal to 0", - workDuration.getActualCpuDurationNanos())); + workDuration.cpuDurationNanos)); } - if (workDuration.getActualGpuDurationNanos() < 0) { + if (workDuration.gpuDurationNanos < 0) { throw new IllegalArgumentException( TextUtils.formatSimple( "Actual GPU duration (%d) should greater than or equal to 0", - workDuration.getActualGpuDurationNanos())); + workDuration.gpuDurationNanos)); } - if (workDuration.getActualCpuDurationNanos() - + workDuration.getActualGpuDurationNanos() <= 0) { + if (workDuration.cpuDurationNanos + + workDuration.gpuDurationNanos <= 0) { throw new IllegalArgumentException( TextUtils.formatSimple( "The actual CPU duration (%d) and the actual GPU duration (%d)" - + " should not both be 0", workDuration.getActualCpuDurationNanos(), - workDuration.getActualGpuDurationNanos())); + + " should not both be 0", workDuration.cpuDurationNanos, + workDuration.gpuDurationNanos)); } } diff --git a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java index 7206c0377bf7..ecd140e23ab6 100644 --- a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java +++ b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java @@ -89,7 +89,7 @@ public class TelephonySubscriptionTracker extends BroadcastReceiver { @NonNull private final TelephonyManager mTelephonyManager; @NonNull private final SubscriptionManager mSubscriptionManager; - @NonNull private final CarrierConfigManager mCarrierConfigManager; + @Nullable private final CarrierConfigManager mCarrierConfigManager; @NonNull private final ActiveDataSubscriptionIdListener mActiveDataSubIdListener; @@ -158,8 +158,10 @@ public class TelephonySubscriptionTracker extends BroadcastReceiver { mSubscriptionManager.addOnSubscriptionsChangedListener( executor, mSubscriptionChangedListener); mTelephonyManager.registerTelephonyCallback(executor, mActiveDataSubIdListener); - mCarrierConfigManager.registerCarrierConfigChangeListener(executor, - mCarrierConfigChangeListener); + if (mCarrierConfigManager != null) { + mCarrierConfigManager.registerCarrierConfigChangeListener(executor, + mCarrierConfigChangeListener); + } registerCarrierPrivilegesCallbacks(); } @@ -200,7 +202,10 @@ public class TelephonySubscriptionTracker extends BroadcastReceiver { mContext.unregisterReceiver(this); mSubscriptionManager.removeOnSubscriptionsChangedListener(mSubscriptionChangedListener); mTelephonyManager.unregisterTelephonyCallback(mActiveDataSubIdListener); - mCarrierConfigManager.unregisterCarrierConfigChangeListener(mCarrierConfigChangeListener); + if (mCarrierConfigManager != null) { + mCarrierConfigManager.unregisterCarrierConfigChangeListener( + mCarrierConfigChangeListener); + } unregisterCarrierPrivilegesCallbacks(); } diff --git a/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java b/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java index 65ab12930c59..7f53ea372687 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperDataParser.java @@ -336,6 +336,9 @@ public class WallpaperDataParser { parser.getAttributeInt(null, "cropRight" + pair.second, 0), parser.getAttributeInt(null, "cropBottom" + pair.second, 0)); if (!cropHint.isEmpty()) wallpaper.mCropHints.put(pair.first, cropHint); + if (!cropHint.isEmpty() && cropHint.equals(legacyCropHint)) { + wallpaper.mOrientationWhenSet = pair.first; + } } if (wallpaper.mCropHints.size() == 0 && totalCropHint.isEmpty()) { // migration case: the crops per screen orientation are not specified. diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 04e298810dad..6fa6957f2949 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -328,7 +328,6 @@ import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.SystemClock; -import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; import android.service.contentcapture.ActivityEvent; @@ -1004,10 +1003,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Whether the Activity allows state sharing in untrusted embedding private final boolean mAllowUntrustedEmbeddingStateSharing; - // TODO(b/329378309): Remove this once the overview handles the configuration correctly. - private static final boolean OVERRIDE_OVERVIEW_CONFIGURATION = - SystemProperties.getBoolean("persist.wm.debug.override_overview_configuration", true); - // Records whether client has overridden the WindowAnimation_(Open/Close)(Enter/Exit)Animation. private CustomAppTransition mCustomOpenTransition; private CustomAppTransition mCustomCloseTransition; @@ -8613,12 +8608,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (rotation == ROTATION_UNDEFINED && !isFixedRotationTransforming()) { rotation = mDisplayContent.getRotation(); } - final int activityType = inOutConfig.windowConfiguration.getActivityType(); - if (OVERRIDE_OVERVIEW_CONFIGURATION - && (activityType == ACTIVITY_TYPE_HOME || activityType == ACTIVITY_TYPE_RECENTS)) { - // Do not early return and provide the override. This should be removed shortly as we - // don't override 1P components. - } else if (!mWmService.mFlags.mInsetsDecoupledConfiguration + if (!mWmService.mFlags.mInsetsDecoupledConfiguration || info.isChangeEnabled(INSETS_DECOUPLED_CONFIGURATION_ENFORCED) || getCompatDisplayInsets() != null || isFloating(parentWindowingMode) || fullBounds == null diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index 1a63f14e1b8c..5184e49385b2 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -228,11 +228,8 @@ public class AppTransition implements Dump { private int mAppTransitionState = APP_STATE_IDLE; private final ArrayList<AppTransitionListener> mListeners = new ArrayList<>(); - private KeyguardExitAnimationStartListener mKeyguardExitAnimationStartListener; private final ExecutorService mDefaultExecutor = Executors.newSingleThreadExecutor(); - private final boolean mGridLayoutRecentsEnabled; - private final int mDefaultWindowAnimationStyleResId; private boolean mOverrideTaskTransition; @@ -249,8 +246,6 @@ public class AppTransition implements Dump { mTransitionAnimation = new TransitionAnimation( context, ProtoLog.isEnabled(WM_DEBUG_ANIM), TAG); - mGridLayoutRecentsEnabled = SystemProperties.getBoolean("ro.recents.grid", false); - final TypedArray windowStyle = mContext.getTheme().obtainStyledAttributes( com.android.internal.R.styleable.Window); mDefaultWindowAnimationStyleResId = windowStyle.getResourceId( @@ -493,11 +488,6 @@ public class AppTransition implements Dump { mListeners.remove(listener); } - void registerKeygaurdExitAnimationStartListener( - KeyguardExitAnimationStartListener listener) { - mKeyguardExitAnimationStartListener = listener; - } - public void notifyAppTransitionFinishedLocked(IBinder token) { for (int i = 0; i < mListeners.size(); i++) { mListeners.get(i).onAppTransitionFinishedLocked(token); @@ -1595,14 +1585,6 @@ public class AppTransition implements Dump { return mNextAppTransitionRequests.contains(transit); } - /** - * @return whether the transition should show the thumbnail being scaled down. - */ - private boolean shouldScaleDownThumbnailTransition(int uiMode, int orientation) { - return mGridLayoutRecentsEnabled - || orientation == Configuration.ORIENTATION_PORTRAIT; - } - private void handleAppTransitionTimeout() { synchronized (mService.mGlobalLock) { final DisplayContent dc = mDisplayContent; diff --git a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java index f7baa7914f86..2788342cb097 100644 --- a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java +++ b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java @@ -449,7 +449,48 @@ public class BackgroundActivityStartController { this.mResultForRealCaller = resultForRealCaller; } - private String dump() { + public boolean isPendingIntentBalAllowedByPermission() { + return PendingIntentRecord.isPendingIntentBalAllowedByPermission(mCheckedOptions); + } + + public boolean callerExplicitOptInOrAutoOptIn() { + if (mAutoOptInCaller) { + return !callerExplicitOptOut(); + } + return mCheckedOptions.getPendingIntentCreatorBackgroundActivityStartMode() + == MODE_BACKGROUND_ACTIVITY_START_ALLOWED; + } + + public boolean realCallerExplicitOptInOrAutoOptIn() { + if (mAutoOptInReason != null) { + return !realCallerExplicitOptOut(); + } + return mCheckedOptions.getPendingIntentBackgroundActivityStartMode() + == MODE_BACKGROUND_ACTIVITY_START_ALLOWED; + } + + public boolean callerExplicitOptOut() { + return mCheckedOptions.getPendingIntentCreatorBackgroundActivityStartMode() + == MODE_BACKGROUND_ACTIVITY_START_DENIED; + } + + public boolean realCallerExplicitOptOut() { + return mCheckedOptions.getPendingIntentBackgroundActivityStartMode() + == MODE_BACKGROUND_ACTIVITY_START_DENIED; + } + + public boolean callerExplicitOptInOrOut() { + return mCheckedOptions.getPendingIntentCreatorBackgroundActivityStartMode() + != MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED; + } + + public boolean realCallerExplicitOptInOrOut() { + return mCheckedOptions.getPendingIntentBackgroundActivityStartMode() + != MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED; + } + + @Override + public String toString() { StringBuilder sb = new StringBuilder(2048); sb.append("[callingPackage: ") .append(getDebugPackageName(mCallingPackage, mCallingUid)); @@ -501,51 +542,6 @@ public class BackgroundActivityStartController { sb.append("]"); return sb.toString(); } - - public boolean isPendingIntentBalAllowedByPermission() { - return PendingIntentRecord.isPendingIntentBalAllowedByPermission(mCheckedOptions); - } - - public boolean callerExplicitOptInOrAutoOptIn() { - if (mAutoOptInCaller) { - return !callerExplicitOptOut(); - } - return mCheckedOptions.getPendingIntentCreatorBackgroundActivityStartMode() - == MODE_BACKGROUND_ACTIVITY_START_ALLOWED; - } - - public boolean realCallerExplicitOptInOrAutoOptIn() { - if (mAutoOptInReason != null) { - return !realCallerExplicitOptOut(); - } - return mCheckedOptions.getPendingIntentBackgroundActivityStartMode() - == MODE_BACKGROUND_ACTIVITY_START_ALLOWED; - } - - public boolean callerExplicitOptOut() { - return mCheckedOptions.getPendingIntentCreatorBackgroundActivityStartMode() - == MODE_BACKGROUND_ACTIVITY_START_DENIED; - } - - public boolean realCallerExplicitOptOut() { - return mCheckedOptions.getPendingIntentBackgroundActivityStartMode() - == MODE_BACKGROUND_ACTIVITY_START_DENIED; - } - - public boolean callerExplicitOptInOrOut() { - return mCheckedOptions.getPendingIntentCreatorBackgroundActivityStartMode() - != MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED; - } - - public boolean realCallerExplicitOptInOrOut() { - return mCheckedOptions.getPendingIntentBackgroundActivityStartMode() - != MODE_BACKGROUND_ACTIVITY_START_SYSTEM_DEFINED; - } - - @Override - public String toString() { - return dump(); - } } static class BalVerdict { @@ -700,8 +696,7 @@ public class BackgroundActivityStartController { if (!state.hasRealCaller()) { if (resultForCaller.allows()) { if (DEBUG_ACTIVITY_STARTS) { - Slog.d(TAG, "Background activity start allowed. " - + state.dump()); + Slog.d(TAG, "Background activity start allowed. " + state); } return allowBasedOnCaller(state); } @@ -729,15 +724,13 @@ public class BackgroundActivityStartController { // Handle cases with explicit opt-in if (resultForCaller.allows() && state.callerExplicitOptInOrAutoOptIn()) { if (DEBUG_ACTIVITY_STARTS) { - Slog.d(TAG, "Activity start explicitly allowed by caller. " - + state.dump()); + Slog.d(TAG, "Activity start explicitly allowed by caller. " + state); } return allowBasedOnCaller(state); } if (resultForRealCaller.allows() && state.realCallerExplicitOptInOrAutoOptIn()) { if (DEBUG_ACTIVITY_STARTS) { - Slog.d(TAG, "Activity start explicitly allowed by real caller. " - + state.dump()); + Slog.d(TAG, "Activity start explicitly allowed by real caller. " + state); } return allowBasedOnRealCaller(state); } @@ -750,7 +743,7 @@ public class BackgroundActivityStartController { if (state.mBalAllowedByPiCreator.allowsBackgroundActivityStarts()) { Slog.wtf(TAG, "With Android 15 BAL hardening this activity start may be blocked" + " if the PI creator upgrades target_sdk to 35+! " - + " (missing opt in by PI creator)!" + state.dump()); + + " (missing opt in by PI creator)!" + state); return allowBasedOnCaller(state); } } @@ -759,7 +752,7 @@ public class BackgroundActivityStartController { if (state.mBalAllowedByPiSender.allowsBackgroundActivityStarts()) { Slog.wtf(TAG, "With Android 14 BAL hardening this activity start will be blocked" + " if the PI sender upgrades target_sdk to 34+! " - + " (missing opt in by PI sender)!" + state.dump()); + + " (missing opt in by PI sender)!" + state); return allowBasedOnRealCaller(state); } } @@ -773,23 +766,20 @@ public class BackgroundActivityStartController { private BalVerdict allowBasedOnCaller(BalState state) { if (DEBUG_ACTIVITY_STARTS) { - Slog.d(TAG, "Background activity launch allowed based on caller. " - + state.dump()); + Slog.d(TAG, "Background activity launch allowed based on caller. " + state); } return statsLog(state.mResultForCaller, state); } private BalVerdict allowBasedOnRealCaller(BalState state) { if (DEBUG_ACTIVITY_STARTS) { - Slog.d(TAG, "Background activity launch allowed based on real caller. " - + state.dump()); + Slog.d(TAG, "Background activity launch allowed based on real caller. " + state); } return statsLog(state.mResultForRealCaller, state); } private BalVerdict abortLaunch(BalState state) { - Slog.wtf(TAG, "Background activity launch blocked! " - + state.dump()); + Slog.wtf(TAG, "Background activity launch blocked! " + state); if (balShowToastsBlocked() && (state.mResultForCaller.allows() || state.mResultForRealCaller.allows())) { // only show a toast if either caller or real caller could launch if they opted in diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 56e6107d489e..1dcfde464a97 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3521,6 +3521,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } void enableHighPerfTransition(boolean enable) { + if (!mWmService.mSupportsHighPerfTransitions) { + return; + } if (!explicitRefreshRateHints()) { if (enable) { getPendingTransaction().setEarlyWakeupStart(); diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index e789fecb8625..16f7373ebc5e 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -117,6 +117,7 @@ import android.view.InsetsState; import android.view.Surface; import android.view.View; import android.view.ViewDebug; +import android.view.WindowInsets; import android.view.WindowInsets.Type; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowLayout; @@ -969,19 +970,30 @@ public class DisplayPolicy { break; case TYPE_BASE_APPLICATION: - - // A non-translucent main app window isn't allowed to fit insets or display cutouts, - // as it would create a hole on the display! if (attrs.isFullscreen() && win.mActivityRecord != null && win.mActivityRecord.fillsParent() - && (attrs.privateFlags & PRIVATE_FLAG_FORCE_DRAW_BAR_BACKGROUNDS) != 0 - && (attrs.getFitInsetsTypes() != 0 - || (attrs.privateFlags & PRIVATE_FLAG_EDGE_TO_EDGE_ENFORCED) != 0 - && attrs.layoutInDisplayCutoutMode - != LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS)) { - throw new IllegalArgumentException("Illegal attributes: Main activity window" - + " that isn't translucent trying to fit insets or display cutouts." - + " attrs=" + attrs); + && (attrs.privateFlags & PRIVATE_FLAG_FORCE_DRAW_BAR_BACKGROUNDS) != 0) { + if (attrs.getFitInsetsTypes() != 0) { + // A non-translucent main app window isn't allowed to fit insets, + // as it would create a hole on the display! + throw new IllegalArgumentException("Illegal attributes: Main window of " + + win.mActivityRecord.getName() + " that isn't translucent trying" + + " to fit insets. fitInsetsTypes=" + WindowInsets.Type.toString( + attrs.getFitInsetsTypes())); + } + if ((attrs.privateFlags & PRIVATE_FLAG_EDGE_TO_EDGE_ENFORCED) != 0 + && attrs.layoutInDisplayCutoutMode + != LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS) { + // A non-translucent main window of the app enforced to go edge-to-edge + // isn't allowed to fit display cutout, or it will cause software bezels. + throw new IllegalArgumentException("Illegal attributes: Main window of " + + win.mActivityRecord.getName() + " that isn't translucent and" + + " targets SDK level " + win.mActivityRecord.mTargetSdk + + " (>= 35) trying to specify layoutInDisplayCutoutMode as '" + + WindowManager.LayoutParams.layoutInDisplayCutoutModeToString( + attrs.layoutInDisplayCutoutMode) + + "' instead of 'always'"); + } } break; } diff --git a/services/core/java/com/android/server/wm/DragDropController.java b/services/core/java/com/android/server/wm/DragDropController.java index 34ea4ac35224..8116f6870f66 100644 --- a/services/core/java/com/android/server/wm/DragDropController.java +++ b/services/core/java/com/android/server/wm/DragDropController.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.view.View.DRAG_FLAG_GLOBAL; import static android.view.View.DRAG_FLAG_GLOBAL_SAME_APPLICATION; import static android.view.View.DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG; @@ -36,6 +37,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.RemoteException; +import android.os.Trace; import android.util.Slog; import android.view.Display; import android.view.DragEvent; @@ -52,6 +54,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.server.wm.WindowManagerInternal.IDragDropCallback; import java.util.Objects; +import java.util.Random; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; @@ -386,6 +389,9 @@ class DragDropController { + "(listener=" + mGlobalDragListener + ", flags=" + mDragState.mFlags + ")"); return false; } + final int traceCookie = new Random().nextInt(); + Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER, "DragDropController#notifyUnhandledDrop", + traceCookie); if (DEBUG_DRAG) Slog.d(TAG_WM, "Sending DROP to unhandled listener (" + reason + ")"); try { // Schedule timeout for the unhandled drag listener to call back @@ -396,6 +402,8 @@ class DragDropController { if (DEBUG_DRAG) Slog.d(TAG_WM, "Unhandled listener finished handling DROP"); synchronized (mService.mGlobalLock) { onUnhandledDropCallback(consumedByListener); + Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER, + "DragDropController#notifyUnhandledDrop", traceCookie); } } }); diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java index b266caa82056..5ed343a4d028 100644 --- a/services/core/java/com/android/server/wm/DragState.java +++ b/services/core/java/com/android/server/wm/DragState.java @@ -20,6 +20,7 @@ import static android.content.ClipDescription.MIMETYPE_APPLICATION_ACTIVITY; import static android.content.ClipDescription.MIMETYPE_APPLICATION_SHORTCUT; import static android.content.ClipDescription.MIMETYPE_APPLICATION_TASK; import static android.os.InputConstants.DEFAULT_DISPATCHING_TIMEOUT_MILLIS; +import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_INTERCEPT_GLOBAL_DRAG_AND_DROP; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION; @@ -49,6 +50,7 @@ import android.os.Binder; import android.os.Build; import android.os.IBinder; import android.os.RemoteException; +import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.util.Slog; @@ -258,6 +260,7 @@ class DragState { } mNotifiedWindows.clear(); mDragInProgress = false; + Trace.instant(TRACE_TAG_WINDOW_MANAGER, "DragDropController#DRAG_ENDED"); } // Take the cursor back if it has been changed. @@ -343,6 +346,18 @@ class DragState { if (mAnimator != null) { return false; } + try { + Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "DragDropController#DROP"); + return reportDropWindowLockInner(token, x, y); + } finally { + Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); + } + } + + private boolean reportDropWindowLockInner(IBinder token, float x, float y) { + if (mAnimator != null) { + return false; + } final WindowState touchedWin = mService.mInputToWindowMap.get(token); final DragEvent unhandledDropEvent = createDropEvent(x, y, null /* touchedWin */, @@ -355,10 +370,12 @@ class DragState { return true; } + Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "DragDropController#noWindow"); // "drop" outside a valid window -- no recipient to apply a timeout to, and we can send // the drag-ended message immediately. endDragLocked(false /* consumed */, false /* relinquishDragSurfaceToDropTarget */); if (DEBUG_DRAG) Slog.d(TAG_WM, "Drop outside a valid window " + touchedWin); + Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); return false; } @@ -367,6 +384,7 @@ class DragState { final IBinder clientToken = touchedWin.mClient.asBinder(); final DragEvent event = createDropEvent(x, y, touchedWin, false /* includePrivateInfo */); try { + Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "DragDropController#dispatchDrop"); touchedWin.mClient.dispatchDragEvent(event); // 5 second timeout for this window to respond to the drop @@ -380,6 +398,7 @@ class DragState { if (MY_PID != touchedWin.mSession.mPid) { event.recycle(); } + Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); } mToken = clientToken; mUnhandledDropEvent = unhandledDropEvent; @@ -471,6 +490,7 @@ class DragState { /* call out to each visible window/session informing it about the drag */ void broadcastDragStartedLocked(final float touchX, final float touchY) { + Trace.instant(TRACE_TAG_WINDOW_MANAGER, "DragDropController#DRAG_STARTED"); mOriginalX = mCurrentX = touchX; mOriginalY = mCurrentY = touchY; diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index a24c02a3b677..5d613cf45643 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -22,7 +22,6 @@ import static android.content.pm.ActivityInfo.FORCE_RESIZE_APP; import static android.content.pm.ActivityInfo.OVERRIDE_ANY_ORIENTATION; import static android.content.pm.ActivityInfo.OVERRIDE_ANY_ORIENTATION_TO_USER; import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION; -import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT; import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH; import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE; import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS; @@ -132,7 +131,6 @@ import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.statusbar.LetterboxDetails; import com.android.server.wm.LetterboxConfiguration.LetterboxBackgroundType; -import com.android.window.flags.Flags; import java.io.PrintWriter; import java.util.ArrayList; @@ -196,8 +194,7 @@ final class LetterboxUiController { private final boolean mIsOverrideCameraCompatDisableRefreshEnabled; // Corresponds to OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE private final boolean mIsOverrideCameraCompatEnableRefreshViaPauseEnabled; - // Corresponds to OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT - private final boolean mIsOverrideCameraCompatDisableFreeformWindowingTreatmentEnabled; + // Corresponds to OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION private final boolean mIsOverrideEnableCompatIgnoreRequestedOrientationEnabled; // Corresponds to OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED @@ -324,15 +321,15 @@ final class LetterboxUiController { PROPERTY_COMPAT_ENABLE_FAKE_FOCUS); mBooleanPropertyCameraCompatAllowForceRotation = readComponentProperty(packageManager, mActivityRecord.packageName, - mLetterboxConfiguration::isCameraCompatTreatmentEnabled, + () -> mLetterboxConfiguration.isCameraCompatTreatmentEnabled(), PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION); mBooleanPropertyCameraCompatAllowRefresh = readComponentProperty(packageManager, mActivityRecord.packageName, - mLetterboxConfiguration::isCameraCompatTreatmentEnabled, + () -> mLetterboxConfiguration.isCameraCompatTreatmentEnabled(), PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH); mBooleanPropertyCameraCompatEnableRefreshViaPause = readComponentProperty(packageManager, mActivityRecord.packageName, - mLetterboxConfiguration::isCameraCompatTreatmentEnabled, + () -> mLetterboxConfiguration.isCameraCompatTreatmentEnabled(), PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE); mBooleanPropertyAllowOrientationOverride = @@ -354,11 +351,11 @@ final class LetterboxUiController { mBooleanPropertyAllowUserAspectRatioOverride = readComponentProperty(packageManager, mActivityRecord.packageName, - mLetterboxConfiguration::isUserAppAspectRatioSettingsEnabled, + () -> mLetterboxConfiguration.isUserAppAspectRatioSettingsEnabled(), PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE); mBooleanPropertyAllowUserAspectRatioFullscreenOverride = readComponentProperty(packageManager, mActivityRecord.packageName, - mLetterboxConfiguration::isUserAppAspectRatioFullscreenEnabled, + () -> mLetterboxConfiguration.isUserAppAspectRatioFullscreenEnabled(), PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE); mIsOverrideAnyOrientationEnabled = isCompatChangeEnabled(OVERRIDE_ANY_ORIENTATION); @@ -383,8 +380,6 @@ final class LetterboxUiController { isCompatChangeEnabled(OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH); mIsOverrideCameraCompatEnableRefreshViaPauseEnabled = isCompatChangeEnabled(OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE); - mIsOverrideCameraCompatDisableFreeformWindowingTreatmentEnabled = - isCompatChangeEnabled(OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT); mIsOverrideEnableCompatIgnoreRequestedOrientationEnabled = isCompatChangeEnabled(OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION); @@ -764,7 +759,8 @@ final class LetterboxUiController { */ boolean shouldRefreshActivityForCameraCompat() { return shouldEnableWithOptOutOverrideAndProperty( - /* gatingCondition */ mLetterboxConfiguration::isCameraCompatTreatmentEnabled, + /* gatingCondition */ () -> mLetterboxConfiguration + .isCameraCompatTreatmentEnabled(), mIsOverrideCameraCompatDisableRefreshEnabled, mBooleanPropertyCameraCompatAllowRefresh); } @@ -785,7 +781,8 @@ final class LetterboxUiController { */ boolean shouldRefreshActivityViaPauseForCameraCompat() { return shouldEnableWithOverrideAndProperty( - /* gatingCondition */ mLetterboxConfiguration::isCameraCompatTreatmentEnabled, + /* gatingCondition */ () -> mLetterboxConfiguration + .isCameraCompatTreatmentEnabled(), mIsOverrideCameraCompatEnableRefreshViaPauseEnabled, mBooleanPropertyCameraCompatEnableRefreshViaPause); } @@ -803,34 +800,12 @@ final class LetterboxUiController { */ boolean shouldForceRotateForCameraCompat() { return shouldEnableWithOptOutOverrideAndProperty( - /* gatingCondition */ mLetterboxConfiguration::isCameraCompatTreatmentEnabled, + /* gatingCondition */ () -> mLetterboxConfiguration + .isCameraCompatTreatmentEnabled(), mIsOverrideCameraCompatDisableForceRotationEnabled, mBooleanPropertyCameraCompatAllowForceRotation); } - /** - * Whether activity is eligible for camera compatibility free-form treatment. - * - * <p>The treatment is applied to a fixed-orientation camera activity in free-form windowing - * mode. The treatment letterboxes or pillarboxes the activity to the expected orientation and - * provides changes to the camera and display orientation signals to match those expected on a - * portrait device in that orientation (for example, on a standard phone). - * - * <p>The treatment is enabled when the following conditions are met: - * <ul> - * <li>Property gating the camera compatibility free-form treatment is enabled. - * <li>Activity isn't opted out by the device manufacturer with override or by the app - * developers with the component property. - * </ul> - */ - boolean shouldApplyFreeformTreatmentForCameraCompat() { - return shouldEnableWithOptOutOverrideAndProperty( - /* gatingCondition */ ()-> Flags.cameraCompatForFreeform(), - mIsOverrideCameraCompatDisableFreeformWindowingTreatmentEnabled, - // TODO(b/328616176): add a manifest override for developers. - null); - } - private boolean isCameraCompatTreatmentActive() { DisplayContent displayContent = mActivityRecord.mDisplayContent; if (displayContent == null) { diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index dd146420c748..33588a03b8e1 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -364,11 +364,6 @@ class RecentTasks { com.android.internal.R.integer.config_minNumVisibleRecentTasks_lowRam); mMaxNumVisibleTasks = res.getInteger( com.android.internal.R.integer.config_maxNumVisibleRecentTasks_lowRam); - } else if (SystemProperties.getBoolean("ro.recents.grid", false)) { - mMinNumVisibleTasks = res.getInteger( - com.android.internal.R.integer.config_minNumVisibleRecentTasks_grid); - mMaxNumVisibleTasks = res.getInteger( - com.android.internal.R.integer.config_maxNumVisibleRecentTasks_grid); } else { mMinNumVisibleTasks = res.getInteger( com.android.internal.R.integer.config_minNumVisibleRecentTasks); diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java index 77319cc0ba8a..acc63305055b 100644 --- a/services/core/java/com/android/server/wm/WindowManagerInternal.java +++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java @@ -620,14 +620,6 @@ public abstract class WindowManagerInternal { public abstract void unregisterTaskSystemBarsListener(TaskSystemBarsListener listener); /** - * Registers a listener to be notified to start the keyguard exit animation. - * - * @param listener The listener to register. - */ - public abstract void registerKeyguardExitAnimationStartListener( - KeyguardExitAnimationStartListener listener); - - /** * Reports that the password for the given user has changed. */ public abstract void reportPasswordChanged(int userId); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 40b1b20909af..207b1bbcea16 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -538,7 +538,7 @@ public class WindowManagerService extends IWindowManager.Stub final boolean mHasPermanentDpad; final long mDrawLockTimeoutMillis; final boolean mAllowAnimationsInLowPowerMode; - + final boolean mSupportsHighPerfTransitions; final boolean mAllowBootMessages; // Indicates whether the Assistant should show on top of the Dream (respectively, above @@ -1181,6 +1181,8 @@ public class WindowManagerService extends IWindowManager.Stub com.android.internal.R.bool.config_allowAnimationsInLowPowerMode); mMaxUiWidth = context.getResources().getInteger( com.android.internal.R.integer.config_maxUiWidth); + mSupportsHighPerfTransitions = context.getResources().getBoolean( + com.android.internal.R.bool.config_deviceSupportsHighPerfTransitions); mDisableTransitionAnimation = context.getResources().getBoolean( com.android.internal.R.bool.config_disableTransitionAnimation); mPerDisplayFocusEnabled = context.getResources().getBoolean( @@ -1192,6 +1194,7 @@ public class WindowManagerService extends IWindowManager.Stub final boolean isScreenSizeDecoupledFromStatusBarAndCutout = context.getResources() .getBoolean(R.bool.config_decoupleStatusBarAndDisplayCutoutFromScreenSize) && mFlags.mAllowsScreenSizeDecoupledFromStatusBarAndCutout; + if (mFlags.mInsetsDecoupledConfiguration) { mDecorTypes = 0; mConfigTypes = 0; @@ -8094,15 +8097,6 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public void registerKeyguardExitAnimationStartListener( - KeyguardExitAnimationStartListener listener) { - synchronized (mGlobalLock) { - getDefaultDisplayContentLocked().mAppTransition - .registerKeygaurdExitAnimationStartListener(listener); - } - } - - @Override public void reportPasswordChanged(int userId) { mKeyguardDisableHandler.updateKeyguardEnabled(userId); } diff --git a/services/core/java/com/android/server/wm/utils/OptPropFactory.java b/services/core/java/com/android/server/wm/utils/OptPropFactory.java new file mode 100644 index 000000000000..8201969b7c46 --- /dev/null +++ b/services/core/java/com/android/server/wm/utils/OptPropFactory.java @@ -0,0 +1,233 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.wm.utils; + +import static java.lang.Boolean.FALSE; +import static java.lang.Boolean.TRUE; + +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.content.pm.PackageManager; +import android.util.Slog; + +import java.util.function.BooleanSupplier; + +/** + * Utility class which helps with handling with properties to opt-in or + * opt-out a specific feature. + */ +public class OptPropFactory { + + @NonNull + private final PackageManager mPackageManager; + + @NonNull + private final String mPackageName; + + /** + * Object responsible to handle optIn and optOut properties. + * + * @param packageManager The PackageManager reference + * @param packageName The name of the package. + */ + public OptPropFactory(@NonNull PackageManager packageManager, @NonNull String packageName) { + mPackageManager = packageManager; + mPackageName = packageName; + } + + /** + * Creates an OptProp for the given property + * + * @param propertyName The name of the property. + * @return The OptProp for the given property + */ + @NonNull + public OptProp create(@NonNull String propertyName) { + return OptProp.create( + () -> mPackageManager.getProperty(propertyName, mPackageName).getBoolean(), + propertyName); + } + + /** + * Creates an OptProp for the given property behind a gate condition. + * + * @param propertyName The name of the property. + * @param gateCondition If this resolves to false, the property is unset. This is evaluated at + * every interaction with the OptProp. + * @return The OptProp for the given property + */ + @NonNull + public OptProp create(@NonNull String propertyName, @NonNull BooleanSupplier gateCondition) { + return OptProp.create( + () -> mPackageManager.getProperty(propertyName, mPackageName).getBoolean(), + propertyName, + gateCondition); + } + + @FunctionalInterface + private interface ThrowableBooleanSupplier { + boolean get() throws Exception; + } + + public static class OptProp { + + private static final int VALUE_UNSET = -2; + private static final int VALUE_UNDEFINED = -1; + private static final int VALUE_FALSE = 0; + private static final int VALUE_TRUE = 1; + + @IntDef(prefix = {"VALUE_"}, value = { + VALUE_UNSET, + VALUE_UNDEFINED, + VALUE_FALSE, + VALUE_TRUE, + }) + @interface OptionalValue {} + + private static final String TAG = "OptProp"; + + // The condition is evaluated every time the OptProp state is accessed. + @NonNull + private final BooleanSupplier mCondition; + + // This is evaluated only once in the lifetime of an OptProp. + @NonNull + private final ThrowableBooleanSupplier mValueSupplier; + + @NonNull + private final String mPropertyName; + + @OptionalValue + private int mValue = VALUE_UNDEFINED; + + private OptProp(@NonNull ThrowableBooleanSupplier valueSupplier, + @NonNull String propertyName, + @NonNull BooleanSupplier condition) { + mValueSupplier = valueSupplier; + mPropertyName = propertyName; + mCondition = condition; + } + + @NonNull + private static OptProp create(@NonNull ThrowableBooleanSupplier valueSupplier, + @NonNull String propertyName) { + return new OptProp(valueSupplier, propertyName, () -> true); + } + + @NonNull + private static OptProp create(@NonNull ThrowableBooleanSupplier valueSupplier, + @NonNull String propertyName, @NonNull BooleanSupplier condition) { + return new OptProp(valueSupplier, propertyName, condition); + } + + /** + * @return {@code true} when the guarding condition is {@code true} and the property has + * been explicitly set to {@code true}. {@code false} otherwise. The guarding condition is + * evaluated every time this method is invoked. + */ + public boolean isTrue() { + return mCondition.getAsBoolean() && getValue() == VALUE_TRUE; + } + + /** + * @return {@code true} when the guarding condition is {@code true} and the property has + * been explicitly set to {@code false}. {@code false} otherwise. The guarding condition is + * evaluated every time this method is invoked. + */ + public boolean isFalse() { + return mCondition.getAsBoolean() && getValue() == VALUE_FALSE; + } + + /** + * Returns {@code true} when the following conditions are met: + * <ul> + * <li>{@code gatingCondition} doesn't evaluate to {@code false} + * <li>App developers didn't opt out with a component {@code property} + * <li>App developers opted in with a component {@code property} or an OEM opted in with + * a per-app override + * </ul> + * + * <p>This is used for the treatments that are enabled only on per-app basis. + */ + public boolean shouldEnableWithOverrideAndProperty(boolean overrideValue) { + if (!mCondition.getAsBoolean()) { + return false; + } + if (getValue() == VALUE_FALSE) { + return false; + } + return getValue() == VALUE_TRUE || overrideValue; + } + + /** + * Returns {@code true} when the following conditions are met: + * <ul> + * <li>{@code gatingCondition} doesn't evaluate to {@code false} + * <li>App developers didn't opt out with a component {@code property} + * <li>OEM opted in with a per-app override + * </ul> + * + * <p>This is used for the treatments that are enabled based with the heuristic but can be + * disabled on per-app basis by OEMs or app developers. + */ + public boolean shouldEnableWithOptInOverrideAndOptOutProperty( + boolean overrideValue) { + if (!mCondition.getAsBoolean()) { + return false; + } + return getValue() != VALUE_FALSE && overrideValue; + } + + /** + * Returns {@code true} when the following conditions are met: + * <ul> + * <li>{@code gatingCondition} doesn't resolve to {@code false} + * <li>OEM didn't opt out with a per-app override + * <li>App developers didn't opt out with a component {@code property} + * </ul> + * + * <p>This is used for the treatments that are enabled based with the heuristic but can be + * disabled on per-app basis by OEMs or app developers. + */ + public boolean shouldEnableWithOptOutOverrideAndProperty(boolean overrideValue) { + if (!mCondition.getAsBoolean()) { + return false; + } + return getValue() != VALUE_FALSE && !overrideValue; + } + + @OptionalValue + private int getValue() { + if (mValue == VALUE_UNDEFINED) { + try { + final Boolean value = mValueSupplier.get(); + if (TRUE.equals(value)) { + mValue = VALUE_TRUE; + } else if (FALSE.equals(value)) { + mValue = VALUE_FALSE; + } else { + mValue = VALUE_UNSET; + } + } catch (Exception e) { + Slog.w(TAG, "Cannot read opt property " + mPropertyName); + mValue = VALUE_UNSET; + } + } + return mValue; + } + } +} diff --git a/services/core/jni/com_android_server_hint_HintManagerService.cpp b/services/core/jni/com_android_server_hint_HintManagerService.cpp index b2bdaa35f28c..5b8ef19ea179 100644 --- a/services/core/jni/com_android_server_hint_HintManagerService.cpp +++ b/services/core/jni/com_android_server_hint_HintManagerService.cpp @@ -19,8 +19,11 @@ //#define LOG_NDEBUG 0 #include <aidl/android/hardware/power/IPower.h> +#include <aidl/android/os/IHintManager.h> #include <android-base/stringprintf.h> -#include <inttypes.h> +#include <android/binder_manager.h> +#include <android/binder_parcel.h> +#include <android/binder_parcel_utils.h> #include <nativehelper/JNIHelp.h> #include <nativehelper/ScopedPrimitiveArray.h> #include <powermanager/PowerHalController.h> @@ -43,15 +46,16 @@ namespace android { static struct { jclass clazz{}; jfieldID workPeriodStartTimestampNanos{}; - jfieldID actualTotalDurationNanos{}; - jfieldID actualCpuDurationNanos{}; - jfieldID actualGpuDurationNanos{}; - jfieldID timestampNanos{}; + jfieldID durationNanos{}; + jfieldID cpuDurationNanos{}; + jfieldID gpuDurationNanos{}; + jfieldID timeStampNanos{}; } gWorkDurationInfo; static power::PowerHalController gPowerHalController; -static std::unordered_map<jlong, std::shared_ptr<PowerHintSessionWrapper>> gSessionMap; static std::mutex gSessionMapLock; +static std::unordered_map<jlong, std::shared_ptr<PowerHintSessionWrapper>> gSessionMap + GUARDED_BY(gSessionMapLock); static int64_t getHintSessionPreferredRate() { int64_t rate = -1; @@ -63,15 +67,15 @@ static int64_t getHintSessionPreferredRate() { } static jlong createHintSession(JNIEnv* env, int32_t tgid, int32_t uid, - std::vector<int32_t> threadIds, int64_t durationNanos) { + std::vector<int32_t>& threadIds, int64_t durationNanos) { auto result = gPowerHalController.createHintSession(tgid, uid, threadIds, durationNanos); if (result.isOk()) { - auto session_ptr = reinterpret_cast<jlong>(result.value().get()); - { - std::unique_lock<std::mutex> sessionLock(gSessionMapLock); - auto res = gSessionMap.insert({session_ptr, result.value()}); - return res.second ? session_ptr : 0; - } + jlong session_ptr = reinterpret_cast<jlong>(result.value().get()); + std::scoped_lock sessionLock(gSessionMapLock); + auto res = gSessionMap.insert({session_ptr, result.value()}); + return res.second ? session_ptr : 0; + } else if (result.isFailed()) { + ALOGW("createHintSession failed with message: %s", result.errorMessage()); } return 0; } @@ -89,7 +93,7 @@ static void resumeHintSession(JNIEnv* env, int64_t session_ptr) { static void closeHintSession(JNIEnv* env, int64_t session_ptr) { auto appSession = reinterpret_cast<PowerHintSessionWrapper*>(session_ptr); appSession->close(); - std::unique_lock<std::mutex> sessionLock(gSessionMapLock); + std::scoped_lock sessionLock(gSessionMapLock); gSessionMap.erase(session_ptr); } @@ -135,11 +139,8 @@ static jlong nativeCreateHintSession(JNIEnv* env, jclass /* clazz */, jint tgid, ALOGW("GetIntArrayElements returns nullptr."); return 0; } - std::vector<int32_t> threadIds(tidArray.size()); - for (size_t i = 0; i < tidArray.size(); i++) { - threadIds[i] = tidArray[i]; - } - return createHintSession(env, tgid, uid, std::move(threadIds), durationNanos); + std::vector<int32_t> threadIds(tidArray.get(), tidArray.get() + tidArray.size()); + return createHintSession(env, tgid, uid, threadIds, durationNanos); } static void nativePauseHintSession(JNIEnv* env, jclass /* clazz */, jlong session_ptr) { @@ -177,12 +178,9 @@ static void nativeSendHint(JNIEnv* env, jclass /* clazz */, jlong session_ptr, j } static void nativeSetThreads(JNIEnv* env, jclass /* clazz */, jlong session_ptr, jintArray tids) { - ScopedIntArrayRO arrayThreadIds(env, tids); + ScopedIntArrayRO tidArray(env, tids); - std::vector<int32_t> threadIds(arrayThreadIds.size()); - for (size_t i = 0; i < arrayThreadIds.size(); i++) { - threadIds[i] = arrayThreadIds[i]; - } + std::vector<int32_t> threadIds(tidArray.get(), tidArray.get() + tidArray.size()); setThreads(session_ptr, threadIds); } @@ -200,13 +198,13 @@ static void nativeReportActualWorkDuration2(JNIEnv* env, jclass /* clazz */, jlo workDurations[i].workPeriodStartTimestampNanos = env->GetLongField(workDuration, gWorkDurationInfo.workPeriodStartTimestampNanos); workDurations[i].durationNanos = - env->GetLongField(workDuration, gWorkDurationInfo.actualTotalDurationNanos); + env->GetLongField(workDuration, gWorkDurationInfo.durationNanos); workDurations[i].cpuDurationNanos = - env->GetLongField(workDuration, gWorkDurationInfo.actualCpuDurationNanos); + env->GetLongField(workDuration, gWorkDurationInfo.cpuDurationNanos); workDurations[i].gpuDurationNanos = - env->GetLongField(workDuration, gWorkDurationInfo.actualGpuDurationNanos); + env->GetLongField(workDuration, gWorkDurationInfo.gpuDurationNanos); workDurations[i].timeStampNanos = - env->GetLongField(workDuration, gWorkDurationInfo.timestampNanos); + env->GetLongField(workDuration, gWorkDurationInfo.timeStampNanos); } reportActualWorkDuration(session_ptr, workDurations); } @@ -225,22 +223,22 @@ static const JNINativeMethod sHintManagerServiceMethods[] = { {"nativeSendHint", "(JI)V", (void*)nativeSendHint}, {"nativeSetThreads", "(J[I)V", (void*)nativeSetThreads}, {"nativeSetMode", "(JIZ)V", (void*)nativeSetMode}, - {"nativeReportActualWorkDuration", "(J[Landroid/os/WorkDuration;)V", + {"nativeReportActualWorkDuration", "(J[Landroid/hardware/power/WorkDuration;)V", (void*)nativeReportActualWorkDuration2}, }; int register_android_server_HintManagerService(JNIEnv* env) { - gWorkDurationInfo.clazz = env->FindClass("android/os/WorkDuration"); + gWorkDurationInfo.clazz = env->FindClass("android/hardware/power/WorkDuration"); gWorkDurationInfo.workPeriodStartTimestampNanos = - env->GetFieldID(gWorkDurationInfo.clazz, "mWorkPeriodStartTimestampNanos", "J"); - gWorkDurationInfo.actualTotalDurationNanos = - env->GetFieldID(gWorkDurationInfo.clazz, "mActualTotalDurationNanos", "J"); - gWorkDurationInfo.actualCpuDurationNanos = - env->GetFieldID(gWorkDurationInfo.clazz, "mActualCpuDurationNanos", "J"); - gWorkDurationInfo.actualGpuDurationNanos = - env->GetFieldID(gWorkDurationInfo.clazz, "mActualGpuDurationNanos", "J"); - gWorkDurationInfo.timestampNanos = - env->GetFieldID(gWorkDurationInfo.clazz, "mTimestampNanos", "J"); + env->GetFieldID(gWorkDurationInfo.clazz, "workPeriodStartTimestampNanos", "J"); + gWorkDurationInfo.durationNanos = + env->GetFieldID(gWorkDurationInfo.clazz, "durationNanos", "J"); + gWorkDurationInfo.cpuDurationNanos = + env->GetFieldID(gWorkDurationInfo.clazz, "cpuDurationNanos", "J"); + gWorkDurationInfo.gpuDurationNanos = + env->GetFieldID(gWorkDurationInfo.clazz, "gpuDurationNanos", "J"); + gWorkDurationInfo.timeStampNanos = + env->GetFieldID(gWorkDurationInfo.clazz, "timeStampNanos", "J"); return jniRegisterNativeMethods(env, "com/android/server/power/hint/" diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index b892f3ad7883..cb87f7e4bf31 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -18460,7 +18460,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return; } new CalculateHasIncompatibleAccountsTask().executeOnExecutor( - calculateHasIncompatibleAccountsExecutor, null); + calculateHasIncompatibleAccountsExecutor); } @Nullable diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index c6189ed405a1..3b2a3dd9763a 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -408,6 +408,8 @@ public final class SystemServer implements Dumpable { "com.android.server.searchui.SearchUiManagerService"; private static final String SMARTSPACE_MANAGER_SERVICE_CLASS = "com.android.server.smartspace.SmartspaceManagerService"; + private static final String CONTEXTUAL_SEARCH_MANAGER_SERVICE_CLASS = + "com.android.server.contextualsearch.ContextualSearchManagerService"; private static final String DEVICE_IDLE_CONTROLLER_CLASS = "com.android.server.DeviceIdleController"; private static final String BLOB_STORE_MANAGER_SERVICE_CLASS = @@ -2016,6 +2018,16 @@ public final class SystemServer implements Dumpable { Slog.d(TAG, "SmartspaceManagerService not defined by OEM or disabled by flag"); } + // Contextual search manager service + if (deviceHasConfigString(context, + R.string.config_defaultContextualSearchPackageName)) { + t.traceBegin("StartContextualSearchService"); + mSystemServiceManager.startService(CONTEXTUAL_SEARCH_MANAGER_SERVICE_CLASS); + t.traceEnd(); + } else { + Slog.d(TAG, "ContextualSearchManagerService not defined or disabled by flag"); + } + t.traceBegin("InitConnectivityModuleConnector"); try { ConnectivityModuleConnector.getInstance().init(context); diff --git a/services/permission/java/com/android/server/permission/access/AccessCheckingService.kt b/services/permission/java/com/android/server/permission/access/AccessCheckingService.kt index fd2e8c8fc9e7..f957bab435f5 100644 --- a/services/permission/java/com/android/server/permission/access/AccessCheckingService.kt +++ b/services/permission/java/com/android/server/permission/access/AccessCheckingService.kt @@ -106,8 +106,6 @@ class AccessCheckingService(context: Context) : SystemService(context) { persistence.read(state) this.state = state - mutateState { with(policy) { onInitialized() } } - appOpService.initialize() permissionService.initialize() } diff --git a/services/permission/java/com/android/server/permission/access/AccessPolicy.kt b/services/permission/java/com/android/server/permission/access/AccessPolicy.kt index 29fe95c1e252..36bea7d2eea2 100644 --- a/services/permission/java/com/android/server/permission/access/AccessPolicy.kt +++ b/services/permission/java/com/android/server/permission/access/AccessPolicy.kt @@ -98,10 +98,6 @@ private constructor( forEachSchemePolicy { with(it) { onStateMutated() } } } - fun MutateStateScope.onInitialized() { - forEachSchemePolicy { with(it) { onInitialized() } } - } - fun MutateStateScope.onUserAdded(userId: Int) { newState.mutateExternalState().mutateUserIds() += userId newState.mutateUserStatesNoWrite()[userId] = MutableUserState() @@ -443,8 +439,6 @@ abstract class SchemePolicy { open fun GetStateScope.onStateMutated() {} - open fun MutateStateScope.onInitialized() {} - open fun MutateStateScope.onUserAdded(userId: Int) {} open fun MutateStateScope.onUserRemoved(userId: Int) {} diff --git a/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPersistence.kt b/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPersistence.kt index 1f40f01ffef4..4a9da90b2ab3 100644 --- a/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPersistence.kt +++ b/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPersistence.kt @@ -101,10 +101,6 @@ class AppIdPermissionPersistence { val type = getAttributeIntOrThrow(ATTR_TYPE) when (type) { Permission.TYPE_MANIFEST -> {} - Permission.TYPE_CONFIG -> { - Slog.w(LOG_TAG, "Ignoring unexpected config permission $name") - return - } Permission.TYPE_DYNAMIC -> { permissionInfo.apply { icon = getAttributeIntHexOrDefault(ATTR_ICON, 0) @@ -134,20 +130,11 @@ class AppIdPermissionPersistence { } private fun BinaryXmlSerializer.serializePermission(permission: Permission) { - val type = permission.type - when (type) { - Permission.TYPE_MANIFEST, - Permission.TYPE_DYNAMIC -> {} - Permission.TYPE_CONFIG -> return - else -> { - Slog.w(LOG_TAG, "Skipping serializing permission $name with unknown type $type") - return - } - } tag(TAG_PERMISSION) { attributeInterned(ATTR_NAME, permission.name) attributeInterned(ATTR_PACKAGE_NAME, permission.packageName) attributeIntHex(ATTR_PROTECTION_LEVEL, permission.protectionLevel) + val type = permission.type attributeInt(ATTR_TYPE, type) if (type == Permission.TYPE_DYNAMIC) { val permissionInfo = permission.permissionInfo diff --git a/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt b/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt index 761874042be8..47fd970c760e 100644 --- a/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt +++ b/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt @@ -79,46 +79,6 @@ class AppIdPermissionPolicy : SchemePolicy() { onPermissionFlagsChangedListeners.forEachIndexed { _, it -> it.onStateMutated() } } - override fun MutateStateScope.onInitialized() { - if (!Flags.newPermissionGidEnabled()) { - newState.externalState.configPermissions.forEach { (permissionName, permissionEntry) -> - val oldPermission = newState.systemState.permissions[permissionName] - val newPermission = - if (oldPermission != null) { - if (permissionEntry.gids != null) { - oldPermission.copy( - gids = permissionEntry.gids, - areGidsPerUser = permissionEntry.perUser - ) - } else { - return@forEach - } - } else { - @Suppress("DEPRECATION") - val permissionInfo = - PermissionInfo().apply { - name = permissionName - packageName = PLATFORM_PACKAGE_NAME - protectionLevel = PermissionInfo.PROTECTION_SIGNATURE - } - if (permissionEntry.gids != null) { - Permission( - permissionInfo, - false, - Permission.TYPE_CONFIG, - 0, - permissionEntry.gids, - permissionEntry.perUser - ) - } else { - Permission(permissionInfo, false, Permission.TYPE_CONFIG, 0) - } - } - newState.mutateSystemState().mutatePermissions()[permissionName] = newPermission - } - } - } - override fun MutateStateScope.onUserAdded(userId: Int) { newState.externalState.packageStates.forEach { (_, packageState) -> evaluateAllPermissionStatesForPackageAndUser(packageState, userId, null) @@ -507,6 +467,7 @@ class AppIdPermissionPolicy : SchemePolicy() { } else { newState.systemState.permissions[permissionName] } + // Different from the old implementation, which may add an (incomplete) signature // permission inside another package's permission tree, we now consistently ignore such // permissions. @@ -521,8 +482,9 @@ class AppIdPermissionPolicy : SchemePolicy() { ) return@forEachIndexed } - var newPermission = - if (oldPermission != null && newPackageName != oldPermission.packageName) { + + if (oldPermission != null) { + if (newPackageName != oldPermission.packageName) { val oldPackageName = oldPermission.packageName // Only allow system apps to redefine non-system permissions. if (!packageState.isSystem) { @@ -534,45 +496,7 @@ class AppIdPermissionPolicy : SchemePolicy() { ) return@forEachIndexed } - if ( - oldPermission.type == Permission.TYPE_CONFIG && !oldPermission.isReconciled - ) { - // It's a config permission and has no owner, take ownership now. - oldPermission.copy( - permissionInfo = newPermissionInfo, - isReconciled = true, - type = Permission.TYPE_MANIFEST, - appId = packageState.appId - ) - } else if ( - newState.externalState.packageStates[oldPackageName]?.isSystem != true - ) { - Slog.w( - LOG_TAG, - "Overriding permission $permissionName with new declaration in" + - " system package $newPackageName: originally declared in another" + - " package $oldPackageName" - ) - // Remove permission state on owner change. - newState.externalState.userIds.forEachIndexed { _, userId -> - newState.externalState.appIdPackageNames.forEachIndexed { _, appId, _ -> - setPermissionFlags(appId, userId, permissionName, 0) - } - } - // Different from the old implementation, which removes the GIDs upon - // permission - // override, but adds them back on the next boot, we now just consistently - // keep - // the GIDs. - Permission( - newPermissionInfo, - true, - Permission.TYPE_MANIFEST, - packageState.appId, - oldPermission.gids, - oldPermission.areGidsPerUser - ) - } else { + if (newState.externalState.packageStates[oldPackageName]?.isSystem == true) { Slog.w( LOG_TAG, "Ignoring permission $permissionName declared in system package" + @@ -581,84 +505,72 @@ class AppIdPermissionPolicy : SchemePolicy() { ) return@forEachIndexed } - } else { - if (oldPermission != null && oldPermission.isReconciled) { - val isPermissionGroupChanged = - newPermissionInfo.isRuntime && - newPermissionInfo.group != null && - newPermissionInfo.group != oldPermission.groupName - val isPermissionProtectionChanged = - oldPermission.type != Permission.TYPE_CONFIG && - ((newPermissionInfo.isRuntime && !oldPermission.isRuntime) || - (newPermissionInfo.isInternal && !oldPermission.isInternal)) - if (isPermissionGroupChanged || isPermissionProtectionChanged) { - newState.externalState.userIds.forEachIndexed { _, userId -> - newState.externalState.appIdPackageNames.forEachIndexed { - _, - appId, - _ -> - if (isPermissionGroupChanged) { - // We might auto-grant permissions if any permission of - // the group is already granted. Hence if the group of - // a granted permission changes we need to revoke it to - // avoid having permissions of the new group auto-granted. - Slog.w( - LOG_TAG, - "Revoking runtime permission $permissionName for" + - " appId $appId and userId $userId as the permission" + - " group changed from ${oldPermission.groupName}" + - " to ${newPermissionInfo.group}" - ) - } - if (isPermissionProtectionChanged) { - Slog.w( - LOG_TAG, - "Revoking permission $permissionName for" + - " appId $appId and userId $userId as the permission" + - " protection changed." - ) - } - setPermissionFlags(appId, userId, permissionName, 0) + Slog.w( + LOG_TAG, + "Overriding permission $permissionName with new declaration in" + + " system package $newPackageName: originally declared in another" + + " package $oldPackageName" + ) + // Remove permission state on owner change. + newState.externalState.userIds.forEachIndexed { _, userId -> + newState.externalState.appIdPackageNames.forEachIndexed { _, appId, _ -> + setPermissionFlags(appId, userId, permissionName, 0) + } + } + } else if (oldPermission.isReconciled) { + val isPermissionGroupChanged = + newPermissionInfo.isRuntime && + newPermissionInfo.group != null && + newPermissionInfo.group != oldPermission.groupName + val isPermissionProtectionChanged = + (newPermissionInfo.isRuntime && !oldPermission.isRuntime) || + (newPermissionInfo.isInternal && !oldPermission.isInternal) + if (isPermissionGroupChanged || isPermissionProtectionChanged) { + newState.externalState.userIds.forEachIndexed { _, userId -> + newState.externalState.appIdPackageNames.forEachIndexed { _, appId, _ -> + if (isPermissionGroupChanged) { + // We might auto-grant permissions if any permission of + // the group is already granted. Hence if the group of + // a granted permission changes we need to revoke it to + // avoid having permissions of the new group auto-granted. + Slog.w( + LOG_TAG, + "Revoking runtime permission $permissionName for" + + " appId $appId and userId $userId as the permission" + + " group changed from ${oldPermission.groupName}" + + " to ${newPermissionInfo.group}" + ) + } + if (isPermissionProtectionChanged) { + Slog.w( + LOG_TAG, + "Revoking permission $permissionName for" + + " appId $appId and userId $userId as the permission" + + " protection changed." + ) } + setPermissionFlags(appId, userId, permissionName, 0) } } } - - // Different from the old implementation, which doesn't update the permission - // definition upon app update, but does update it on the next boot, we now - // consistently update the permission definition upon app update. - @Suppress("IfThenToElvis") - if (oldPermission != null) { - oldPermission.copy( - permissionInfo = newPermissionInfo, - isReconciled = true, - type = Permission.TYPE_MANIFEST, - appId = packageState.appId - ) - } else { - Permission( - newPermissionInfo, - true, - Permission.TYPE_MANIFEST, - packageState.appId - ) - } } - if (Flags.newPermissionGidEnabled()) { - var gids = EmptyArray.INT - var areGidsPerUser = false - if (!parsedPermission.isTree && packageState.isSystem) { - newState.externalState.configPermissions[permissionName]?.let { - // PermissionEntry.gids may return null when parsing legacy config trying - // to work around an issue about upgrading from L platfrm. We can just - // ignore such entries now. - if (it.gids != null) { - gids = it.gids - areGidsPerUser = it.perUser - } + } + + var gids = EmptyArray.INT + var areGidsPerUser = false + if (!parsedPermission.isTree && packageState.isSystem) { + newState.externalState.configPermissions[permissionName]?.let { + // PermissionEntry.gids may return null when parsing legacy config trying + // to work around an issue about upgrading from L platfrm. We can just + // ignore such entries now. + if (it.gids != null) { + gids = it.gids + areGidsPerUser = it.perUser } } - newPermission = Permission( + } + val newPermission = + Permission( newPermissionInfo, true, Permission.TYPE_MANIFEST, @@ -666,7 +578,6 @@ class AppIdPermissionPolicy : SchemePolicy() { gids, areGidsPerUser ) - } if (parsedPermission.isTree) { newState.mutateSystemState().mutatePermissionTrees()[permissionName] = newPermission diff --git a/services/permission/java/com/android/server/permission/access/permission/Permission.kt b/services/permission/java/com/android/server/permission/access/permission/Permission.kt index aa569280eadf..4d806e0be9c8 100644 --- a/services/permission/java/com/android/server/permission/access/permission/Permission.kt +++ b/services/permission/java/com/android/server/permission/access/permission/Permission.kt @@ -162,15 +162,12 @@ data class Permission( companion object { // The permission is defined in an application manifest. const val TYPE_MANIFEST = 0 - // The permission is defined in a system config. - const val TYPE_CONFIG = 1 // The permission is defined dynamically. const val TYPE_DYNAMIC = 2 fun typeToString(type: Int): String = when (type) { TYPE_MANIFEST -> "TYPE_MANIFEST" - TYPE_CONFIG -> "TYPE_CONFIG" TYPE_DYNAMIC -> "TYPE_DYNAMIC" else -> type.toString() } diff --git a/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionDefinitionsTest.kt b/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionDefinitionsTest.kt index 925dad8b6661..e6e2257668c2 100644 --- a/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionDefinitionsTest.kt +++ b/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionDefinitionsTest.kt @@ -203,23 +203,6 @@ class AppIdPermissionPolicyPermissionDefinitionsTest : BasePermissionPolicyTest( } @Test - fun testPermissionDefinition_configPermission_getsTakenOver() { - testTakingOverPermissionAndPermissionGroupDefinitions( - oldPermissionOwnerIsSystem = true, - newPermissionOwnerIsSystem = true, - type = Permission.TYPE_CONFIG, - isReconciled = false - ) - - assertWithMessage( - "After $action is called for a config permission with" + - " no owner, the ownership is not taken over by a system app $PACKAGE_NAME_0" - ) - .that(getPermission(PERMISSION_NAME_0)?.packageName) - .isEqualTo(PACKAGE_NAME_0) - } - - @Test fun testPermissionDefinition_systemAppTakingOverPermissionDefinition_getsTakenOver() { testTakingOverPermissionAndPermissionGroupDefinitions(newPermissionOwnerIsSystem = true) diff --git a/services/tests/dreamservicetests/res/xml/test_dream_metadata.xml b/services/tests/dreamservicetests/res/xml/test_dream_metadata.xml index 9211ec1a2f14..6e7d9ad00e34 100644 --- a/services/tests/dreamservicetests/res/xml/test_dream_metadata.xml +++ b/services/tests/dreamservicetests/res/xml/test_dream_metadata.xml @@ -17,4 +17,6 @@ <dream xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity= "com.android.frameworks.dreamservicetests/.TestDreamSettingsActivity" - android:showClockAndComplications="false" /> + android:showClockAndComplications="false" + android:dreamCategory="home_panel" + /> diff --git a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamServiceTest.java b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamServiceTest.java index d231e40f5d0d..293ab7baa355 100644 --- a/services/tests/dreamservicetests/src/com/android/server/dreams/DreamServiceTest.java +++ b/services/tests/dreamservicetests/src/com/android/server/dreams/DreamServiceTest.java @@ -48,6 +48,7 @@ public class DreamServiceTest { assertThat(metadata.settingsActivity).isEqualTo( ComponentName.unflattenFromString(testSettingsActivity)); assertFalse(metadata.showComplications); + assertThat(metadata.dreamCategory).isEqualTo(DreamService.DREAM_CATEGORY_HOME_PANEL); } @Test @@ -58,6 +59,7 @@ public class DreamServiceTest { final DreamService.DreamMetadata metadata = getDreamMetadata(testDreamClassName); assertThat(metadata.settingsActivity).isNull(); + assertThat(metadata.dreamCategory).isEqualTo(DreamService.DREAM_CATEGORY_DEFAULT); } private DreamService.DreamMetadata getDreamMetadata(String dreamClassName) diff --git a/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java b/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java index 211a83d8588e..c30ac2d6c248 100644 --- a/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java @@ -439,19 +439,19 @@ public class RescuePartyTest { } @Test - public void testIsAttemptingFactoryReset() { + public void testIsRecoveryTriggeredReboot() { for (int i = 0; i < LEVEL_FACTORY_RESET; i++) { noteBoot(i + 1); } assertFalse(RescueParty.isFactoryResetPropertySet()); setCrashRecoveryPropAttemptingReboot(false); noteBoot(LEVEL_FACTORY_RESET + 1); - assertTrue(RescueParty.isAttemptingFactoryReset()); + assertTrue(RescueParty.isRecoveryTriggeredReboot()); assertTrue(RescueParty.isFactoryResetPropertySet()); } @Test - public void testIsAttemptingFactoryResetOnlyAfterRebootCompleted() { + public void testIsRecoveryTriggeredRebootOnlyAfterRebootCompleted() { for (int i = 0; i < LEVEL_FACTORY_RESET; i++) { noteBoot(i + 1); } @@ -464,7 +464,7 @@ public class RescuePartyTest { noteBoot(mitigationCount++); setCrashRecoveryPropAttemptingReboot(false); noteBoot(mitigationCount + 1); - assertTrue(RescueParty.isAttemptingFactoryReset()); + assertTrue(RescueParty.isRecoveryTriggeredReboot()); assertTrue(RescueParty.isFactoryResetPropertySet()); } @@ -477,7 +477,7 @@ public class RescuePartyTest { for (int i = 1; i <= LEVEL_FACTORY_RESET; i++) { noteBoot(i); } - assertFalse(RescueParty.isAttemptingFactoryReset()); + assertFalse(RescueParty.isRecoveryTriggeredReboot()); } @Test @@ -489,7 +489,7 @@ public class RescuePartyTest { for (int i = 0; i <= LEVEL_FACTORY_RESET; i++) { noteAppCrash(i + 1, true); } - assertFalse(RescueParty.isAttemptingFactoryReset()); + assertFalse(RescueParty.isRecoveryTriggeredReboot()); } @Test @@ -501,7 +501,7 @@ public class RescuePartyTest { for (int i = 1; i <= LEVEL_FACTORY_RESET; i++) { noteBoot(i); } - assertTrue(RescueParty.isAttemptingFactoryReset()); + assertTrue(RescueParty.isRecoveryTriggeredReboot()); } @Test public void testNotThrottlingAfterTimeoutOnAppCrash() { @@ -512,7 +512,7 @@ public class RescuePartyTest { for (int i = 0; i <= LEVEL_FACTORY_RESET; i++) { noteAppCrash(i + 1, true); } - assertTrue(RescueParty.isAttemptingFactoryReset()); + assertTrue(RescueParty.isRecoveryTriggeredReboot()); } @Test diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java index fcb3caa19b85..dc5b00a18d7b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java @@ -28,10 +28,15 @@ import static android.app.ActivityManager.PROCESS_STATE_SERVICE; import static android.app.ActivityManager.PROCESS_STATE_TOP; import static android.app.ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND; import static android.app.ActivityManager.PROCESS_STATE_UNKNOWN; +import static android.os.PowerExemptionManager.REASON_DENIED; import static android.util.DebugUtils.valueToString; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; import static com.android.server.am.ActivityManagerInternalTest.CustomThread; import static com.android.server.am.ActivityManagerService.Injector; import static com.android.server.am.ProcessList.NETWORK_STATE_BLOCK; @@ -52,28 +57,40 @@ import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.nullable; +import static org.mockito.Mockito.after; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.timeout; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; -import static org.mockito.Mockito.when; import android.Manifest; import android.app.ActivityManager; +import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.BackgroundStartPrivileges; import android.app.BroadcastOptions; +import android.app.ForegroundServiceDelegationOptions; import android.app.IApplicationThread; import android.app.IUidObserver; +import android.app.Notification; +import android.app.NotificationChannel; import android.app.SyncNotedAppOp; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageManager; import android.content.pm.PackageManagerInternal; +import android.content.pm.ServiceInfo; +import android.graphics.drawable.Icon; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; @@ -84,6 +101,7 @@ import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; +import android.permission.IPermissionManager; import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; @@ -105,18 +123,20 @@ import com.android.server.am.ProcessList.IsolatedUidRange; import com.android.server.am.ProcessList.IsolatedUidRangeAllocator; import com.android.server.am.UidObserverController.ChangeRecord; import com.android.server.appop.AppOpsService; +import com.android.server.notification.NotificationManagerInternal; +import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.ActivityTaskManagerService; import org.junit.After; -import org.junit.AfterClass; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.mockito.MockitoSession; +import org.mockito.quality.Strictness; +import org.mockito.verification.VerificationMode; import java.io.File; import java.util.ArrayList; @@ -127,13 +147,15 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import java.util.function.Function; /** * Test class for {@link ActivityManagerService}. * * Build/Install/Run: - * atest FrameworksServicesTests:ActivityManagerServiceTest + * atest FrameworksMockingServicesTests:ActivityManagerServiceTest */ @Presubmit @SmallTest @@ -148,6 +170,9 @@ public class ActivityManagerServiceTest { private static final String TEST_EXTRA_KEY1 = "com.android.server.am.TEST_EXTRA_KEY1"; private static final String TEST_EXTRA_VALUE1 = "com.android.server.am.TEST_EXTRA_VALUE1"; + + private static final String TEST_PACKAGE_NAME = "com.android.server.am.testpackage"; + private static final String PROPERTY_APPLY_SDK_SANDBOX_AUDIT_RESTRICTIONS = "apply_sdk_sandbox_audit_restrictions"; private static final String PROPERTY_APPLY_SDK_SANDBOX_NEXT_RESTRICTIONS = @@ -155,6 +180,7 @@ public class ActivityManagerServiceTest { private static final String APPLY_SDK_SANDBOX_AUDIT_RESTRICTIONS = ":isSdkSandboxAudit"; private static final String APPLY_SDK_SANDBOX_NEXT_RESTRICTIONS = ":isSdkSandboxNext"; private static final int TEST_UID = 11111; + private static final int TEST_PID = 22222; private static final int USER_ID = 666; private static final long TEST_PROC_STATE_SEQ1 = 555; @@ -169,22 +195,8 @@ public class ActivityManagerServiceTest { UidRecord.CHANGE_CAPABILITY, }; - private static PackageManagerInternal sPackageManagerInternal; private static ProcessList.ProcessListSettingsListener sProcessListSettingsListener; - @BeforeClass - public static void setUpOnce() { - sPackageManagerInternal = mock(PackageManagerInternal.class); - doReturn(new ComponentName("", "")).when(sPackageManagerInternal) - .getSystemUiServiceComponent(); - LocalServices.addService(PackageManagerInternal.class, sPackageManagerInternal); - } - - @AfterClass - public static void tearDownOnce() { - LocalServices.removeServiceForTest(PackageManagerInternal.class); - } - @Rule public final ApplicationExitInfoTest.ServiceThreadRule mServiceThreadRule = new ApplicationExitInfoTest.ServiceThreadRule(); @@ -196,15 +208,41 @@ public class ActivityManagerServiceTest { @Mock private AppOpsService mAppOpsService; @Mock private UserController mUserController; + @Mock private IPackageManager mPackageManager; + @Mock private IPermissionManager mPermissionManager; + @Mock private BatteryStatsService mBatteryStatsService; + @Mock private PackageManagerInternal mPackageManagerInternal; + @Mock private ActivityTaskManagerInternal mActivityTaskManagerInternal; + @Mock private NotificationManagerInternal mNotificationManagerInternal; + private TestInjector mInjector; private ActivityManagerService mAms; + private ActiveServices mActiveServices; private HandlerThread mHandlerThread; private TestHandler mHandler; + private MockitoSession mMockingSession; + @Before - public void setUp() { + public void setUp() throws Exception { + mMockingSession = mockitoSession() + .initMocks(this) + .mockStatic(AppGlobals.class) + .strictness(Strictness.LENIENT) + .startMocking(); MockitoAnnotations.initMocks(this); + LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal); + LocalServices.addService(ActivityTaskManagerInternal.class, mActivityTaskManagerInternal); + LocalServices.addService(NotificationManagerInternal.class, mNotificationManagerInternal); + + doReturn(new ComponentName("", "")).when(mPackageManagerInternal) + .getSystemUiServiceComponent(); + + doReturn(mPackageManager).when(AppGlobals::getPackageManager); + doReturn(mPermissionManager).when(AppGlobals::getPermissionManager); + doReturn(new String[]{""}).when(mPackageManager).getPackagesForUid(eq(Process.myUid())); + mHandlerThread = new HandlerThread(TAG); mHandlerThread.start(); mHandler = new TestHandler(mHandlerThread.getLooper()); @@ -220,6 +258,7 @@ public class ActivityManagerServiceTest { mAms.mConstants.mNetworkAccessTimeoutMs = 2000; mAms.mActivityTaskManager = new ActivityTaskManagerService(mContext); mAms.mActivityTaskManager.initialize(null, null, mHandler.getLooper()); + mAms.mAtmInternal = mActivityTaskManagerInternal; mHandler.setRunnablesToIgnore( List.of(mAms.mUidObserverController.getDispatchRunnableForTest())); @@ -250,6 +289,15 @@ public class ActivityManagerServiceTest { if (sProcessListSettingsListener != null) { sProcessListSettingsListener.unregisterObserver(); } + clearInvocations(mNotificationManagerInternal); + + LocalServices.removeServiceForTest(PackageManagerInternal.class); + LocalServices.removeServiceForTest(ActivityTaskManagerInternal.class); + LocalServices.removeServiceForTest(NotificationManagerInternal.class); + + if (mMockingSession != null) { + mMockingSession.finishMocking(); + } } @SuppressWarnings("GuardedBy") @@ -445,6 +493,7 @@ public class ActivityManagerServiceTest { } } + @SuppressWarnings("GuardedBy") private UidRecord addUidRecord(int uid) { final UidRecord uidRec = new UidRecord(uid, mAms); uidRec.procStateSeqWaitingForNetwork = 1; @@ -453,10 +502,13 @@ public class ActivityManagerServiceTest { ApplicationInfo info = new ApplicationInfo(); info.packageName = ""; + info.uid = uid; final ProcessRecord appRec = new ProcessRecord(mAms, info, TAG, uid); - final ProcessStatsService tracker = new ProcessStatsService(mAms, mContext.getCacheDir()); - appRec.makeActive(mock(IApplicationThread.class), tracker); + final ProcessStatsService tracker = mAms.mProcessStats; + final IApplicationThread appThread = mock(IApplicationThread.class); + doReturn(mock(IBinder.class)).when(appThread).asBinder(); + appRec.makeActive(appThread, tracker); mAms.mProcessList.getLruProcessesLSP().add(appRec); return uidRec; @@ -1209,6 +1261,108 @@ public class ActivityManagerServiceTest { mAms.mUidObserverController.getPendingUidChangesForTest().clear(); } + @Test + public void testStartForegroundServiceDelegateWithNotification() throws Exception { + testStartForegroundServiceDelegate(true); + } + + @Test + public void testStartForegroundServiceDelegateWithoutNotification() throws Exception { + testStartForegroundServiceDelegate(false); + } + + @SuppressWarnings("GuardedBy") + private void testStartForegroundServiceDelegate(boolean withNotification) throws Exception { + mockNoteOperation(); + + final int notificationId = 42; + final Notification notification = mock(Notification.class); + + addUidRecord(TEST_UID); + final ProcessRecord app = mAms.mProcessList.getLruProcessesLSP().get(0); + app.mPid = TEST_PID; + app.info.packageName = TEST_PACKAGE_NAME; + app.info.processName = TEST_PACKAGE_NAME; + + doReturn(app.info).when(mPackageManager).getApplicationInfo( + eq(app.info.packageName), anyLong(), anyInt()); + + doReturn(true).when(mActiveServices) + .canStartForegroundServiceLocked(anyInt(), anyInt(), anyString()); + doReturn(REASON_DENIED).when(mActiveServices) + .shouldAllowFgsWhileInUsePermissionLocked(anyString(), anyInt(), anyInt(), + any(ProcessRecord.class), any(BackgroundStartPrivileges.class)); + + doReturn(true).when(mNotificationManagerInternal).areNotificationsEnabledForPackage( + anyString(), anyInt()); + doReturn(mock(Icon.class)).when(notification).getSmallIcon(); + doReturn("").when(notification).getChannelId(); + doReturn(mock(NotificationChannel.class)).when(mNotificationManagerInternal) + .getNotificationChannel(anyString(), anyInt(), anyString()); + + mAms.mAppProfiler.mCachedAppsWatermarkData.mCachedAppHighWatermark = Integer.MAX_VALUE; + + final ForegroundServiceDelegationOptions.Builder optionsBuilder = + new ForegroundServiceDelegationOptions.Builder() + .setClientPid(app.mPid) + .setClientUid(app.uid) + .setClientPackageName(app.info.packageName) + .setClientAppThread(app.getThread()) + .setSticky(false) + .setClientInstanceName( + "SystemExemptedFgsDelegate_" + + Process.myUid() + + "_" + + app.uid + + "_" + + app.info.packageName) + .setForegroundServiceTypes(ServiceInfo.FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED) + .setDelegationService( + ForegroundServiceDelegationOptions.DELEGATION_SERVICE_SYSTEM_EXEMPTED); + if (withNotification) { + optionsBuilder.setClientNotification(notificationId, notification); + } + final ForegroundServiceDelegationOptions options = optionsBuilder.build(); + + final CountDownLatch[] latchHolder = new CountDownLatch[1]; + final ServiceConnection conn = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + latchHolder[0].countDown(); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + latchHolder[0].countDown(); + } + }; + + latchHolder[0] = new CountDownLatch(1); + mAms.mInternal.startForegroundServiceDelegate(options, conn); + + assertThat(latchHolder[0].await(5, TimeUnit.SECONDS)).isTrue(); + assertEquals(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, + app.mState.getCurProcState()); + final long timeoutMs = 5000L; + final VerificationMode mode = withNotification + ? timeout(timeoutMs) : after(timeoutMs).atMost(0); + verify(mNotificationManagerInternal, mode) + .enqueueNotification(eq(app.info.packageName), eq(app.info.packageName), + eq(app.info.uid), eq(app.mPid), eq(null), + eq(notificationId), eq(notification), anyInt(), eq(true)); + + latchHolder[0] = new CountDownLatch(1); + mAms.mInternal.stopForegroundServiceDelegate(options); + + assertThat(latchHolder[0].await(5, TimeUnit.SECONDS)).isTrue(); + assertEquals(ActivityManager.PROCESS_STATE_CACHED_EMPTY, + app.mState.getCurProcState()); + verify(mNotificationManagerInternal, mode) + .cancelNotification(eq(app.info.packageName), eq(app.info.packageName), + eq(app.info.uid), eq(app.mPid), eq(null), + eq(notificationId), anyInt()); + } + private static class TestHandler extends Handler { private static final long WAIT_FOR_MSG_TIMEOUT_MS = 4000; // 4 sec private static final long WAIT_FOR_MSG_INTERVAL_MS = 400; // 0.4 sec @@ -1291,6 +1445,19 @@ public class ActivityManagerServiceTest { usersStartedOnSecondaryDisplays.add(new Pair<>(userId, displayId)); return returnValueForstartUserOnSecondaryDisplay; } + + @Override + public ActiveServices getActiveServices(ActivityManagerService service) { + if (mActiveServices == null) { + mActiveServices = spy(new ActiveServices(service)); + } + return mActiveServices; + } + + @Override + public BatteryStatsService getBatteryStatsService() { + return mBatteryStatsService; + } } // TODO: [b/302724778] Remove manual JNI load diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BaseBroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BaseBroadcastQueueTest.java index bd20ae26821e..ce281daf41c4 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/BaseBroadcastQueueTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/BaseBroadcastQueueTest.java @@ -56,6 +56,7 @@ import com.android.server.wm.ActivityTaskManagerService; import org.junit.Rule; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import java.io.File; @@ -160,6 +161,7 @@ public abstract class BaseBroadcastQueueTest { realAms.mActivityTaskManager = new ActivityTaskManagerService(mContext); realAms.mActivityTaskManager.initialize(null, null, mContext.getMainLooper()); realAms.mAtmInternal = spy(realAms.mActivityTaskManager.getAtmInternal()); + realAms.mOomAdjuster.mCachedAppOptimizer = Mockito.mock(CachedAppOptimizer.class); realAms.mOomAdjuster = spy(realAms.mOomAdjuster); ExtendedMockito.doNothing().when(() -> ProcessList.setOomAdj(anyInt(), anyInt(), anyInt())); realAms.mPackageManagerInt = mPackageManagerInt; diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java index 66ab8076a217..420af86c4408 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java @@ -86,7 +86,6 @@ import androidx.test.platform.app.InstrumentationRegistry; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.mockito.ArgumentMatcher; import org.mockito.InOrder; @@ -2335,8 +2334,8 @@ public class BroadcastQueueTest extends BaseBroadcastQueueTest { .isGreaterThan(getReceiverScheduledTime(prioritizedRecord, receiverBlue)); } - @Ignore @Test + @RequiresFlagsEnabled(Flags.FLAG_DEFER_OUTGOING_BROADCASTS) public void testDeferOutgoingBroadcasts() throws Exception { final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED); setProcessFreezable(callerApp, true /* pendingFreeze */, false /* frozen */); @@ -2350,6 +2349,8 @@ public class BroadcastQueueTest extends BaseBroadcastQueueTest { makeRegisteredReceiver(receiverGreenApp), makeManifestReceiver(PACKAGE_BLUE, CLASS_BLUE), makeManifestReceiver(PACKAGE_YELLOW, CLASS_YELLOW)))); + // Verify that we invoke the call to freeze the caller app. + verify(mAms.mOomAdjuster.mCachedAppOptimizer).freezeAppAsyncImmediateLSP(callerApp); waitForIdle(); verifyScheduleRegisteredReceiver(never(), receiverGreenApp, timeTick); diff --git a/services/tests/mockingservicestests/src/com/android/server/backup/PackageManagerBackupAgentTest.java b/services/tests/mockingservicestests/src/com/android/server/backup/PackageManagerBackupAgentTest.java index d1b6de08db51..20e198c192bf 100644 --- a/services/tests/mockingservicestests/src/com/android/server/backup/PackageManagerBackupAgentTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/backup/PackageManagerBackupAgentTest.java @@ -55,20 +55,21 @@ public class PackageManagerBackupAgentTest { @Rule public TemporaryFolder folder = new TemporaryFolder(); + private PackageManager mPackageManager; private PackageManagerBackupAgent mPackageManagerBackupAgent; private ImmutableList<PackageInfo> mPackages; private File mBackupData, mOldState, mNewState; @Before public void setUp() throws Exception { - PackageManager packageManager = getApplicationContext().getPackageManager(); + mPackageManager = getApplicationContext().getPackageManager(); PackageInfo existingPackageInfo = - packageManager.getPackageInfoAsUser( + mPackageManager.getPackageInfoAsUser( EXISTING_PACKAGE_NAME, PackageManager.GET_SIGNING_CERTIFICATES, USER_ID); mPackages = ImmutableList.of(existingPackageInfo); mPackageManagerBackupAgent = - new PackageManagerBackupAgent(packageManager, mPackages, USER_ID); + new PackageManagerBackupAgent(mPackageManager, mPackages, USER_ID); mBackupData = folder.newFile("backup_data"); mOldState = folder.newFile("old_state"); @@ -101,11 +102,8 @@ public class PackageManagerBackupAgentTest { runBackupAgentOnBackup(); - // We shouldn't have written anything, but a known issue is that we always write the - // ancestral record version. ImmutableMap<String, Optional<ByteBuffer>> keyValues = getKeyValues(mBackupData); - assertThat(keyValues.keySet()) - .containsExactly(PackageManagerBackupAgent.ANCESTRAL_RECORD_KEY); + assertThat(keyValues).isEmpty(); assertThat(mNewState.length()).isGreaterThan(0); assertThat(mNewState.length()).isEqualTo(mOldState.length()); } @@ -122,9 +120,7 @@ public class PackageManagerBackupAgentTest { // Note that uninstalledPackageName should not exist, i.e. it did not get deleted. ImmutableMap<String, Optional<ByteBuffer>> keyValues = getKeyValues(mBackupData); - assertThat(keyValues.keySet()) - .containsExactly( - PackageManagerBackupAgent.ANCESTRAL_RECORD_KEY, EXISTING_PACKAGE_NAME); + assertThat(keyValues.keySet()).containsExactly(EXISTING_PACKAGE_NAME); assertThat(mNewState.length()).isGreaterThan(0); } @@ -133,7 +129,9 @@ public class PackageManagerBackupAgentTest { String uninstalledPackageName = "does.not.exist"; writeLegacyStateFile( mOldState, - ImmutableList.of(createPackage(uninstalledPackageName, 1), mPackages.getFirst())); + ImmutableList.of(createPackage(uninstalledPackageName, 1), mPackages.getFirst()), + /* writeStateFileVersion= */ false, + /* writeAncestralRecordVersion= */ false); runBackupAgentOnBackup(); @@ -147,6 +145,30 @@ public class PackageManagerBackupAgentTest { } @Test + public void onBackup_noAncestralRecordInfo_deletesUninstalledPackagesFromBackup() + throws Exception { + PackageInfo pkgNotInstalled = createPackage("does.not.exist", 2); + PackageInfo pkgInstalled = + mPackageManager.getPackageInfoAsUser( + EXISTING_PACKAGE_NAME, PackageManager.GET_SIGNING_CERTIFICATES, USER_ID); + writeLegacyStateFile( + mOldState, + ImmutableList.of(pkgInstalled, pkgNotInstalled), + /* writeStateFileVersion= */ true, + /* writeAncestralRecordVersion= */ false); + + runBackupAgentOnBackup(); + + ImmutableMap<String, Optional<ByteBuffer>> keyValues = getKeyValues(mBackupData); + assertThat(keyValues.keySet()) + .containsExactly( + PackageManagerBackupAgent.ANCESTRAL_RECORD_KEY, + pkgInstalled.packageName, + pkgNotInstalled.packageName); + assertThat(keyValues).containsEntry(pkgNotInstalled.packageName, Optional.empty()); + } + + @Test public void onRestore_recentBackup_restoresBackup() throws Exception { runBackupAgentOnBackup(); @@ -229,7 +251,11 @@ public class PackageManagerBackupAgentTest { } /** This creates a legacy state file in which {@code STATE_FILE_HEADER} was not yet present. */ - private static void writeLegacyStateFile(File stateFile, ImmutableList<PackageInfo> packages) + private static void writeLegacyStateFile( + File stateFile, + ImmutableList<PackageInfo> packages, + boolean writeStateFileVersion, + boolean writeAncestralRecordVersion) throws Exception { try (ParcelFileDescriptor stateFileDescriptor = openForWriting(stateFile); DataOutputStream out = @@ -237,6 +263,19 @@ public class PackageManagerBackupAgentTest { new BufferedOutputStream( new FileOutputStream( stateFileDescriptor.getFileDescriptor())))) { + + if (writeStateFileVersion) { + // state file version header + out.writeUTF(PackageManagerBackupAgent.STATE_FILE_HEADER); + out.writeInt(PackageManagerBackupAgent.STATE_FILE_VERSION); + } + + if (writeAncestralRecordVersion) { + // Record the ancestral record + out.writeUTF(PackageManagerBackupAgent.ANCESTRAL_RECORD_KEY); + out.writeInt(PackageManagerBackupAgent.ANCESTRAL_RECORD_VERSION); + } + out.writeUTF(PackageManagerBackupAgent.GLOBAL_METADATA_KEY); out.writeInt(Build.VERSION.SDK_INT); out.writeUTF(Build.VERSION.INCREMENTAL); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java index eb8950384f10..b2ecea1b0302 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java @@ -813,7 +813,6 @@ public class AccessibilityManagerServiceTest { } @Test - @RequiresFlagsEnabled(Flags.FLAG_DISABLE_CONTINUOUS_SHORTCUT_ON_FORCE_STOP) public void testPackagesForceStopped_fromContinuousService_removesButtonTarget() { final AccessibilityServiceInfo info_a = new AccessibilityServiceInfo(); info_a.setComponentName(COMPONENT_NAME); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java index 6ac3658bc3b4..3d0db71ba17f 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/ProxyAccessibilityServiceConnectionTest.java @@ -24,6 +24,13 @@ import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_REQUEST import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; +import static com.google.common.truth.Truth.assertThat; + +import static org.junit.Assert.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.AccessibilityTrace; import android.content.ComponentName; @@ -33,13 +40,6 @@ import android.graphics.Color; import android.os.Handler; import android.view.accessibility.AccessibilityEvent; -import static com.google.common.truth.Truth.assertThat; - -import static org.junit.Assert.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import com.android.server.wm.WindowManagerInternal; import org.junit.Before; @@ -225,7 +225,7 @@ public class ProxyAccessibilityServiceConnectionTest { } @Test - public void testDisableSelf_setIllegalOperationExceptionThrown_() { + public void testDisableSelf_setIllegalOperationExceptionThrown() { UnsupportedOperationException thrown = assertThrows( UnsupportedOperationException.class, @@ -233,4 +233,9 @@ public class ProxyAccessibilityServiceConnectionTest { assertThat(thrown).hasMessageThat().contains("disableSelf is not supported"); } + + @Test + public void getInstalledAndEnabledServices_noServices_returnEmpty() { + assertThat(mProxyConnection.getInstalledAndEnabledServices()).isEmpty(); + } } 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 67b131fcbb75..124970758fa5 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java @@ -206,7 +206,6 @@ import libcore.io.Streams; import org.junit.After; import org.junit.Assume; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.MethodRule; @@ -2151,14 +2150,12 @@ public class NetworkPolicyManagerServiceTest { assertFalse(mService.isUidNetworkingBlocked(UID_E, false)); } - @Ignore("Temporarily disabled until the feature is enabled") @Test @RequiresFlagsEnabled(Flags.FLAG_NETWORK_BLOCKED_FOR_TOP_SLEEPING_AND_ABOVE) public void testBackgroundChainEnabled() throws Exception { verify(mNetworkManager).setFirewallChainEnabled(FIREWALL_CHAIN_BACKGROUND, true); } - @Ignore("Temporarily disabled until the feature is enabled") @Test @RequiresFlagsEnabled(Flags.FLAG_NETWORK_BLOCKED_FOR_TOP_SLEEPING_AND_ABOVE) public void testBackgroundChainOnProcStateChange() throws Exception { @@ -2188,7 +2185,6 @@ public class NetworkPolicyManagerServiceTest { assertTrue(mService.isUidNetworkingBlocked(UID_A, false)); } - @Ignore("Temporarily disabled until the feature is enabled") @Test @RequiresFlagsEnabled(Flags.FLAG_NETWORK_BLOCKED_FOR_TOP_SLEEPING_AND_ABOVE) public void testBackgroundChainOnAllowlistChange() throws Exception { @@ -2227,7 +2223,6 @@ public class NetworkPolicyManagerServiceTest { assertFalse(mService.isUidNetworkingBlocked(UID_B, false)); } - @Ignore("Temporarily disabled until the feature is enabled") @Test @RequiresFlagsEnabled(Flags.FLAG_NETWORK_BLOCKED_FOR_TOP_SLEEPING_AND_ABOVE) public void testBackgroundChainOnTempAllowlistChange() throws Exception { @@ -2266,7 +2261,6 @@ public class NetworkPolicyManagerServiceTest { && uidState.procState == procState && uidState.capability == capability; } - @Ignore("Temporarily disabled until the feature is enabled") @Test @RequiresFlagsEnabled(Flags.FLAG_NETWORK_BLOCKED_FOR_TOP_SLEEPING_AND_ABOVE) public void testUidObserverFiltersProcStateChanges() throws Exception { @@ -2329,7 +2323,6 @@ public class NetworkPolicyManagerServiceTest { waitForUidEventHandlerIdle(); } - @Ignore("Temporarily disabled until the feature is enabled") @Test @RequiresFlagsEnabled(Flags.FLAG_NETWORK_BLOCKED_FOR_TOP_SLEEPING_AND_ABOVE) public void testUidObserverFiltersStaleChanges() throws Exception { @@ -2350,7 +2343,6 @@ public class NetworkPolicyManagerServiceTest { waitForUidEventHandlerIdle(); } - @Ignore("Temporarily disabled until the feature is enabled") @Test @RequiresFlagsEnabled(Flags.FLAG_NETWORK_BLOCKED_FOR_TOP_SLEEPING_AND_ABOVE) public void testUidObserverFiltersCapabilityChanges() throws Exception { @@ -2430,7 +2422,6 @@ public class NetworkPolicyManagerServiceTest { assertFalse(mService.isUidNetworkingBlocked(UID_A, false)); } - @Ignore("Temporarily disabled until the feature is enabled") @Test @RequiresFlagsEnabled(Flags.FLAG_NETWORK_BLOCKED_FOR_TOP_SLEEPING_AND_ABOVE) public void testObsoleteHandleUidChanged() throws Exception { diff --git a/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java index e249cd7311cf..55c48e07162b 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserRestrictionsUtilsTest.java @@ -90,8 +90,6 @@ public class UserRestrictionsUtilsTest { public void testCanDeviceOwnerChange() { assertFalse(UserRestrictionsUtils.canDeviceOwnerChange(UserManager.DISALLOW_RECORD_AUDIO)); assertFalse(UserRestrictionsUtils.canDeviceOwnerChange(UserManager.DISALLOW_WALLPAPER)); - assertFalse(UserRestrictionsUtils.canDeviceOwnerChange( - UserManager.DISALLOW_ADD_PRIVATE_PROFILE)); assertTrue(UserRestrictionsUtils.canDeviceOwnerChange(UserManager.DISALLOW_ADD_USER)); assertTrue(UserRestrictionsUtils.canDeviceOwnerChange(UserManager.DISALLOW_USER_SWITCH)); } @@ -110,10 +108,6 @@ public class UserRestrictionsUtilsTest { UserManager.DISALLOW_USER_SWITCH, true, false)); - assertFalse(UserRestrictionsUtils.canProfileOwnerChange( - UserManager.DISALLOW_ADD_PRIVATE_PROFILE, - true, - false)); assertTrue(UserRestrictionsUtils.canProfileOwnerChange( UserManager.DISALLOW_ADD_USER, true, diff --git a/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java index 4ab9d3ecf624..66599e9e9125 100644 --- a/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/hint/HintManagerServiceTest.java @@ -39,12 +39,12 @@ import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.content.Context; +import android.hardware.power.WorkDuration; import android.os.Binder; import android.os.IBinder; import android.os.IHintSession; import android.os.PerformanceHintManager; import android.os.Process; -import android.os.WorkDuration; import android.util.Log; import com.android.server.FgThread; @@ -76,6 +76,18 @@ import java.util.concurrent.locks.LockSupport; public class HintManagerServiceTest { private static final String TAG = "HintManagerServiceTest"; + private static WorkDuration makeWorkDuration( + long timestamp, long duration, long workPeriodStartTime, + long cpuDuration, long gpuDuration) { + WorkDuration out = new WorkDuration(); + out.timeStampNanos = timestamp; + out.durationNanos = duration; + out.workPeriodStartTimestampNanos = workPeriodStartTime; + out.cpuDurationNanos = cpuDuration; + out.gpuDurationNanos = gpuDuration; + return out; + } + private static final long DEFAULT_HINT_PREFERRED_RATE = 16666666L; private static final long DEFAULT_TARGET_DURATION = 16666666L; private static final long CONCURRENCY_TEST_DURATION_SEC = 10; @@ -91,11 +103,11 @@ public class HintManagerServiceTest { private static final long[] TIMESTAMPS_ZERO = new long[] {}; private static final long[] TIMESTAMPS_TWO = new long[] {1L, 2L}; private static final WorkDuration[] WORK_DURATIONS_FIVE = new WorkDuration[] { - new WorkDuration(1L, 11L, 8L, 4L, 1L), - new WorkDuration(2L, 13L, 8L, 6L, 2L), - new WorkDuration(3L, 333333333L, 8L, 333333333L, 3L), - new WorkDuration(2L, 13L, 0L, 6L, 2L), - new WorkDuration(2L, 13L, 8L, 0L, 2L), + makeWorkDuration(1L, 11L, 1L, 8L, 4L), + makeWorkDuration(2L, 13L, 2L, 8L, 6L), + makeWorkDuration(3L, 333333333L, 3L, 8L, 333333333L), + makeWorkDuration(2L, 13L, 2L, 0L, 6L), + makeWorkDuration(2L, 13L, 2L, 8L, 0L), }; @Mock private Context mContext; @@ -621,20 +633,20 @@ public class HintManagerServiceTest { assertThrows(IllegalArgumentException.class, () -> { a.reportActualWorkDuration2( - new WorkDuration[] {new WorkDuration(-1L, 11L, 8L, 4L, 1L)}); + new WorkDuration[] {makeWorkDuration(1L, 11L, -1L, 8L, 4L)}); }); assertThrows(IllegalArgumentException.class, () -> { - a.reportActualWorkDuration2(new WorkDuration[] {new WorkDuration(1L, 0L, 8L, 4L, 1L)}); + a.reportActualWorkDuration2(new WorkDuration[] {makeWorkDuration(1L, 0L, 1L, 8L, 4L)}); }); assertThrows(IllegalArgumentException.class, () -> { - a.reportActualWorkDuration2(new WorkDuration[] {new WorkDuration(1L, 11L, 0L, 0L, 1L)}); + a.reportActualWorkDuration2(new WorkDuration[] {makeWorkDuration(1L, 11L, 1L, 0L, 0L)}); }); assertThrows(IllegalArgumentException.class, () -> { a.reportActualWorkDuration2( - new WorkDuration[] {new WorkDuration(1L, 11L, 8L, -1L, 1L)}); + new WorkDuration[] {makeWorkDuration(1L, 11L, 1L, 8L, -1L)}); }); reset(mNativeWrapperMock); diff --git a/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java b/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java index fee6582c1ba4..dff4984adb80 100644 --- a/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java +++ b/services/tests/wmtests/src/com/android/server/policy/ShortcutKeyTestBase.java @@ -43,9 +43,12 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy; import static com.android.server.policy.WindowManagerPolicy.ACTION_PASS_TO_USER; +import static org.mockito.ArgumentMatchers.eq; + import static java.util.Collections.unmodifiableMap; import android.content.Context; +import android.content.res.Resources; import android.platform.test.flag.junit.SetFlagsRule; import android.util.ArrayMap; import android.view.InputDevice; @@ -57,6 +60,7 @@ import com.android.internal.util.test.FakeSettingsProvider; import com.android.internal.util.test.FakeSettingsProviderRule; import org.junit.After; +import org.junit.Before; import org.junit.Rule; import org.junit.rules.RuleChain; @@ -70,9 +74,10 @@ class ShortcutKeyTestBase { @Rule public RuleChain rules = RuleChain.outerRule(mSettingsProviderRule).around(mSetFlagsRule); + private Resources mResources; TestPhoneWindowManager mPhoneWindowManager; DispatchedKeyHandler mDispatchedKeyHandler = event -> false; - final Context mContext = spy(getInstrumentation().getTargetContext()); + Context mContext; /** Modifier key to meta state */ protected static final Map<Integer, Integer> MODIFIER; @@ -90,6 +95,16 @@ class ShortcutKeyTestBase { MODIFIER = unmodifiableMap(map); } + @Before + public void setup() { + mContext = spy(getInstrumentation().getTargetContext()); + mResources = spy(mContext.getResources()); + doReturn(mResources).when(mContext).getResources(); + doReturn(mSettingsProviderRule.mockContentResolver(mContext)) + .when(mContext).getContentResolver(); + } + + /** Same as {@link setUpPhoneWindowManager(boolean)}, without supporting settings update. */ protected final void setUpPhoneWindowManager() { setUpPhoneWindowManager(/* supportSettingsUpdate= */ false); @@ -101,12 +116,14 @@ class ShortcutKeyTestBase { * <p>Subclasses must call this at the start of the test if they intend to interact with phone * window manager. * - * @param supportSettingsUpdate {@code true} if this test should read and listen to provider - * settings values. + * @param supportSettingsUpdate {@code true} to have PWM respond to any Settings changes upon + * instantiation. Although this is supposed to also allow a test to listen to any Settings + * changes after instantiation, MockContentResolver in this class's setup stubs out + * notifyChange(), which prevents SettingsObserver from getting notified of events. So + * we're effectively always instantiating TestPhoneWindowManager with + * supportSettingsUpdate=false. */ protected final void setUpPhoneWindowManager(boolean supportSettingsUpdate) { - doReturn(mSettingsProviderRule.mockContentResolver(mContext)) - .when(mContext).getContentResolver(); mPhoneWindowManager = new TestPhoneWindowManager(mContext, supportSettingsUpdate); } @@ -187,6 +204,23 @@ class ShortcutKeyTestBase { sendKeyCombination(new int[]{keyCode}, 0 /*durationMillis*/, longPress, DEFAULT_DISPLAY); } + /** + * Since we use SettingsProviderRule to mock the ContentResolver in these + * tests, the settings observer registered by PhoneWindowManager will not + * be triggered automatically by the mock. Use this method to force the + * settings observer change after modifying any settings. + */ + void triggerSettingsObserverChange() { + mPhoneWindowManager.getSettingsObserver().onChange( + // This boolean doesn't matter. This observer does the same thing regardless. + /*selfChange=*/true); + } + + /** Override a resource's return value. */ + void overrideResource(int resId, int expectedBehavior) { + doReturn(expectedBehavior).when(mResources).getInteger(eq(resId)); + } + private void interceptKey(KeyEvent keyEvent) { int actions = mPhoneWindowManager.interceptKeyBeforeQueueing(keyEvent); if ((actions & ACTION_PASS_TO_USER) != 0) { diff --git a/services/tests/wmtests/src/com/android/server/policy/StemKeyGestureTests.java b/services/tests/wmtests/src/com/android/server/policy/StemKeyGestureTests.java index 77e7a0a65c82..2e850252765b 100644 --- a/services/tests/wmtests/src/com/android/server/policy/StemKeyGestureTests.java +++ b/services/tests/wmtests/src/com/android/server/policy/StemKeyGestureTests.java @@ -291,6 +291,101 @@ public class StemKeyGestureTests extends ShortcutKeyTestBase { mPhoneWindowManager.assertSwitchToTask(referenceId); } + /** + * Ensure the stem rule is added even when button behaviors are set to nothing. + * + * This makes sure that if stem key behaviors are overridden to NOTHING, then we check the + * XML config as the source of truth upon reboot to see whether a device should have a stem + * key rule. This test walks us through a scenario where a device powers off during Wear's + * Touch Lock mode. + */ + @Test + public void stemKeyRuleIsAddedEvenWhenBehaviorsRemoved() { + // deactivate stem button presses + overrideBehavior(STEM_PRIMARY_BUTTON_SHORT_PRESS, + PhoneWindowManager.SHORT_PRESS_PRIMARY_NOTHING); + overrideBehavior(STEM_PRIMARY_BUTTON_DOUBLE_PRESS, + PhoneWindowManager.DOUBLE_PRESS_PRIMARY_NOTHING); + overrideBehavior(STEM_PRIMARY_BUTTON_TRIPLE_PRESS, + PhoneWindowManager.TRIPLE_PRESS_PRIMARY_NOTHING); + overrideBehavior(STEM_PRIMARY_BUTTON_LONG_PRESS, + PhoneWindowManager.LONG_PRESS_PRIMARY_NOTHING); + + // pretend like we have stem keys enabled in the xmls + overrideResource( + com.android.internal.R.integer.config_shortPressOnStemPrimaryBehavior, + SHORT_PRESS_PRIMARY_LAUNCH_ALL_APPS); + + // start the PhoneWindowManager, just like would happen with a reboot + setUpPhoneWindowManager(/* supportSettingsUpdate= */ true); + // Set the stem behavior back to something normal after boot + overrideBehavior(STEM_PRIMARY_BUTTON_SHORT_PRESS, + SHORT_PRESS_PRIMARY_LAUNCH_ALL_APPS); + // manually trigger the SettingsObserver's onChange() method because subclasses of + // ShortcutKeyTestBase cannot automatically pick up Settings changes. + triggerSettingsObserverChange(); + + // These calls are required to make the All Apps view show up + mPhoneWindowManager.overrideShouldEarlyShortPressOnStemPrimary(false); + mPhoneWindowManager.overrideStartActivity(); + mPhoneWindowManager.setKeyguardServiceDelegateIsShowing(false); + mPhoneWindowManager.overrideIsUserSetupComplete(true); + + sendKey(KEYCODE_STEM_PRIMARY); + + // Because the rule was loaded and we changed the behavior back to non-zero, PWM should + // actually perform this action. It would not perform the action if the rule was missing. + mPhoneWindowManager.assertOpenAllAppView(); + } + + /** + * Ensure the stem rule is not added when stem behavior is not defined in the xml. + * + * This is the opposite of the test above. + */ + @Test + public void stemKeyRuleIsNotAddedWhenXmlDoesntDefineIt() { + // deactivate stem button presses + overrideBehavior(STEM_PRIMARY_BUTTON_SHORT_PRESS, + PhoneWindowManager.SHORT_PRESS_PRIMARY_NOTHING); + overrideBehavior(STEM_PRIMARY_BUTTON_DOUBLE_PRESS, + PhoneWindowManager.DOUBLE_PRESS_PRIMARY_NOTHING); + overrideBehavior(STEM_PRIMARY_BUTTON_TRIPLE_PRESS, + PhoneWindowManager.TRIPLE_PRESS_PRIMARY_NOTHING); + overrideBehavior(STEM_PRIMARY_BUTTON_LONG_PRESS, + PhoneWindowManager.LONG_PRESS_PRIMARY_NOTHING); + + // pretend like we do not have stem keys enabled in the xmls + overrideResource( + com.android.internal.R.integer.config_shortPressOnStemPrimaryBehavior, + PhoneWindowManager.SHORT_PRESS_PRIMARY_NOTHING); + overrideResource( + com.android.internal.R.integer.config_longPressOnStemPrimaryBehavior, + PhoneWindowManager.LONG_PRESS_PRIMARY_NOTHING); + + // start the PhoneWindowManager, just like would happen with a reboot + setUpPhoneWindowManager(/* supportSettingsUpdate= */ true); + // Set the stem behavior back to something normal after boot + // (Despite this fact, a stem press shouldn't have any behavior because there's no rule.) + overrideBehavior(STEM_PRIMARY_BUTTON_SHORT_PRESS, + SHORT_PRESS_PRIMARY_LAUNCH_ALL_APPS); + // manually trigger the SettingsObserver's onChange() method because subclasses of + // ShortcutKeyTestBase cannot automatically pick up Settings changes. + triggerSettingsObserverChange(); + + // These calls are required to make the All Apps view show up + mPhoneWindowManager.overrideShouldEarlyShortPressOnStemPrimary(false); + mPhoneWindowManager.overrideStartActivity(); + mPhoneWindowManager.setKeyguardServiceDelegateIsShowing(false); + mPhoneWindowManager.overrideIsUserSetupComplete(true); + + sendKey(KEYCODE_STEM_PRIMARY); + + // Because the rule was not loaded, PWM should not actually perform this action, even + // though the Settings override is set to non-null. + mPhoneWindowManager.assertNotOpenAllAppView(); + } + private void overrideBehavior(String key, int expectedBehavior) { Settings.Global.putLong(mContext.getContentResolver(), key, expectedBehavior); } diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java index 0776c512b61d..52df010bd588 100644 --- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java @@ -66,6 +66,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.database.ContentObserver; import android.hardware.SensorPrivacyManager; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManagerInternal; @@ -246,6 +247,13 @@ class TestPhoneWindowManager { } } + /** + * {@link TestPhoneWindowManager}'s constructor. + * + * @param context The {@Context} to be used in any Context-related actions. + * @param supportSettingsUpdate {@code true} if this object should read and listen to provider + * settings values. + */ TestPhoneWindowManager(Context context, boolean supportSettingsUpdate) { MockitoAnnotations.initMocks(this); mHandler = new Handler(mTestLooper.getLooper()); @@ -416,6 +424,13 @@ class TestPhoneWindowManager { mPhoneWindowManager.dispatchUnhandledKey(mInputToken, event, FLAG_INTERACTIVE); } + /** + * Provide access to the SettingsObserver so that tests can manually trigger Settings changes. + */ + ContentObserver getSettingsObserver() { + return mPhoneWindowManager.mSettingsObserver; + } + long getCurrentTime() { return mClock.now(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java index 0290f0f5bd0f..4e4bbfe6371d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java @@ -21,7 +21,6 @@ import static android.content.pm.ActivityInfo.FORCE_RESIZE_APP; import static android.content.pm.ActivityInfo.OVERRIDE_ANY_ORIENTATION; import static android.content.pm.ActivityInfo.OVERRIDE_ANY_ORIENTATION_TO_USER; import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION; -import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT; import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH; import static android.content.pm.ActivityInfo.OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE; import static android.content.pm.ActivityInfo.OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS; @@ -64,7 +63,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wm.LetterboxUiController.MIN_COUNT_TO_IGNORE_REQUEST_IN_LOOP; import static com.android.server.wm.LetterboxUiController.SET_ORIENTATION_REQUEST_COUNTER_TIMEOUT_MS; -import static com.android.window.flags.Flags.FLAG_CAMERA_COMPAT_FOR_FREEFORM; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -83,7 +81,6 @@ import android.content.pm.PackageManager.Property; import android.content.res.Resources; import android.graphics.Rect; import android.platform.test.annotations.Presubmit; -import android.platform.test.flag.junit.SetFlagsRule; import android.view.InsetsSource; import android.view.InsetsState; import android.view.RoundedCorner; @@ -104,11 +101,11 @@ import org.junit.Test; import org.junit.rules.TestRule; import org.junit.runner.RunWith; -/** + /** * Test class for {@link LetterboxUiControllerTest}. * * Build/Install/Run: - * atest WmTests:LetterboxUiControllerTest + * atest WmTests:LetterboxUiControllerTest */ @SmallTest @Presubmit @@ -125,8 +122,6 @@ public class LetterboxUiControllerTest extends WindowTestsBase { @Rule public TestRule compatChangeRule = new PlatformCompatChangeRule(); - @Rule - public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private ActivityRecord mActivity; private Task mTask; @@ -471,48 +466,10 @@ public class LetterboxUiControllerTest extends WindowTestsBase { assertTrue(mController.shouldForceRotateForCameraCompat()); } - // shouldApplyFreeformTreatmentForCameraCompat - - @Test - public void testShouldApplyCameraCompatFreeformTreatment_flagIsDisabled_returnsFalse() { - mSetFlagsRule.disableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM); - - assertFalse(mController.shouldApplyFreeformTreatmentForCameraCompat()); - } - - @Test - @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT}) - public void testShouldApplyCameraCompatFreeformTreatment_overrideEnabled_returnsFalse() { - mSetFlagsRule.enableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM); - - assertFalse(mController.shouldApplyFreeformTreatmentForCameraCompat()); - } - - @Test - @EnableCompatChanges({OVERRIDE_CAMERA_COMPAT_DISABLE_FREEFORM_WINDOWING_TREATMENT}) - public void testShouldApplyCameraCompatFreeformTreatment_disabledByOverride_returnsFalse() - throws Exception { - mSetFlagsRule.enableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM); - - mController = new LetterboxUiController(mWm, mActivity); - - assertFalse(mController.shouldApplyFreeformTreatmentForCameraCompat()); - } - - @Test - public void testShouldApplyCameraCompatFreeformTreatment_notDisabledByOverride_returnsTrue() - throws Exception { - mSetFlagsRule.enableFlags(FLAG_CAMERA_COMPAT_FOR_FREEFORM); - - mController = new LetterboxUiController(mWm, mActivity); - - assertTrue(mController.shouldApplyFreeformTreatmentForCameraCompat()); - } - @Test public void testGetCropBoundsIfNeeded_handleCropForTransparentActivityBasedOnOpaqueBounds() { final InsetsSource taskbar = new InsetsSource(/*id=*/ 0, - WindowInsets.Type.navigationBars()); + WindowInsets.Type.navigationBars()); taskbar.setFlags(FLAG_INSETS_ROUNDED_CORNER, FLAG_INSETS_ROUNDED_CORNER); final WindowState mainWindow = mockForGetCropBoundsAndRoundedCorners(taskbar); final Rect opaqueBounds = new Rect(0, 0, 500, 300); @@ -769,7 +726,7 @@ public class LetterboxUiControllerTest extends WindowTestsBase { throws Exception { mDisplayContent.setIgnoreOrientationRequest(false); assertEquals(SCREEN_ORIENTATION_PORTRAIT, mController.overrideOrientationIfNeeded( - /* candidate */ SCREEN_ORIENTATION_PORTRAIT)); + /* candidate */ SCREEN_ORIENTATION_PORTRAIT)); } @Test @@ -779,7 +736,7 @@ public class LetterboxUiControllerTest extends WindowTestsBase { prepareActivityThatShouldApplyUserMinAspectRatioOverride(); assertEquals(SCREEN_ORIENTATION_PORTRAIT, mController.overrideOrientationIfNeeded( - /* candidate */ SCREEN_ORIENTATION_PORTRAIT)); + /* candidate */ SCREEN_ORIENTATION_PORTRAIT)); } @Test @@ -902,7 +859,6 @@ public class LetterboxUiControllerTest extends WindowTestsBase { assertEquals(SCREEN_ORIENTATION_USER, mController.overrideOrientationIfNeeded( /* candidate */ SCREEN_ORIENTATION_UNSPECIFIED)); } - @Test public void testOverrideOrientationIfNeeded_respectOrientationRequestOverUserFullScreen() { spyOn(mController); @@ -1424,7 +1380,7 @@ public class LetterboxUiControllerTest extends WindowTestsBase { private void mockThatProperty(String propertyName, boolean value) throws Exception { Property property = new Property(propertyName, /* value */ value, /* packageName */ "", - /* className */ ""); + /* className */ ""); PackageManager pm = mWm.mContext.getPackageManager(); spyOn(pm); doReturn(property).when(pm).getProperty(eq(propertyName), anyString()); diff --git a/services/tests/wmtests/src/com/android/server/wm/utils/OptPropFactoryTest.java b/services/tests/wmtests/src/com/android/server/wm/utils/OptPropFactoryTest.java new file mode 100644 index 000000000000..004de1fc962b --- /dev/null +++ b/services/tests/wmtests/src/com/android/server/wm/utils/OptPropFactoryTest.java @@ -0,0 +1,286 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.wm.utils; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.pm.PackageManager; +import android.platform.test.annotations.Presubmit; + +import androidx.test.filters.SmallTest; + +import com.android.server.wm.utils.OptPropFactory.OptProp; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import java.util.function.BooleanSupplier; + +/** + * Build/Install/Run: + * atest WmTests:OptPropFactoryTest + */ +@SmallTest +@Presubmit +public class OptPropFactoryTest { + + private PackageManager mPackageManager; + private OptPropFactory mOptPropFactory; + + @Before + public void setUp() { + mPackageManager = mock(PackageManager.class); + mOptPropFactory = new OptPropFactory(mPackageManager, ""); + } + + @Test + public void optProp_laziness() throws PackageManager.NameNotFoundException { + initPropAs(/* propertyValue */ true); + // When OptPropBuilder is created the PackageManager is not used + verify(mPackageManager, never()).getProperty(anyString(), anyString()); + + // Accessing the value multiple times only uses PackageManager once + final OptProp optProp = createOptProp(); + optProp.isTrue(); + optProp.isFalse(); + + verify(mPackageManager).getProperty(anyString(), anyString()); + } + + @Test + public void optProp_withSetValueTrue() throws PackageManager.NameNotFoundException { + initPropAs(/* propertyValue */ true); + + final OptProp optProp = createOptProp(); + + assertTrue(optProp.isTrue()); + assertFalse(optProp.isFalse()); + } + + @Test + public void optProp_withSetValueFalse() throws PackageManager.NameNotFoundException { + initPropAs(/* propertyValue */ false); + + final OptProp optProp = createOptProp(); + + assertFalse(optProp.isTrue()); + assertTrue(optProp.isFalse()); + } + + @Test + public void optProp_withSetValueWithConditionFalse() + throws PackageManager.NameNotFoundException { + initPropAs(/* propertyValue */ true); + + final OptProp optProp = createOptProp(() -> false); + + assertFalse(optProp.isTrue()); + assertFalse(optProp.isFalse()); + } + + @Test + public void optProp_withUnsetValue() { + final OptProp optProp = createOptProp(); + + assertFalse(optProp.isTrue()); + assertFalse(optProp.isFalse()); + } + + @Test + public void optProp_isUnsetWhenPropertyIsNotPresent() + throws PackageManager.NameNotFoundException { + initPropAsWithException(); + // Property is unset + final OptProp optUnset = createOptProp(); + assertFalse(optUnset.isTrue()); + assertFalse(optUnset.isFalse()); + } + + @Test + public void optProp_shouldEnableWithOverrideAndProperty() + throws PackageManager.NameNotFoundException { + // Property is unset + final OptProp optUnset = createOptProp(() -> false); + assertFalse(optUnset.shouldEnableWithOverrideAndProperty(/* override */ true)); + + // The value is the override one + final OptProp optUnsetOn = createOptProp(); + assertTrue(optUnsetOn.shouldEnableWithOverrideAndProperty(/* override */ true)); + assertFalse(optUnsetOn.shouldEnableWithOverrideAndProperty(/* override */ false)); + + // Property is set to true + initPropAs(true); + final OptProp optTrue = createOptProp(() -> false); + assertFalse(optTrue.shouldEnableWithOverrideAndProperty(/* override */ true)); + + final OptProp optTrueOn = createOptProp(() -> true); + assertTrue(optTrueOn.shouldEnableWithOverrideAndProperty(/* override */ true)); + assertTrue(optTrueOn.shouldEnableWithOverrideAndProperty(/* override */ false)); + + // Property is set to false + initPropAs(false); + final OptProp optFalse = createOptProp(() -> false); + assertFalse(optFalse.shouldEnableWithOverrideAndProperty(/* override */ true)); + + final OptProp optFalseOn = createOptProp(); + assertFalse(optFalseOn.shouldEnableWithOverrideAndProperty(/* override */ true)); + assertFalse(optFalseOn.shouldEnableWithOverrideAndProperty(/* override */ false)); + } + + @Test + public void optProp_shouldEnableWithOptInOverrideAndOptOutProperty() + throws PackageManager.NameNotFoundException { + // Property is unset + final OptProp optUnset = createOptProp(() -> false); + assertFalse(optUnset.shouldEnableWithOptInOverrideAndOptOutProperty(/* override */ true)); + + final OptProp optUnsetOn = createOptProp(); + assertTrue(optUnsetOn.shouldEnableWithOptInOverrideAndOptOutProperty(/* override */ true)); + assertFalse( + optUnsetOn.shouldEnableWithOptInOverrideAndOptOutProperty(/* override */ false)); + + // Property is set to true + initPropAs(true); + final OptProp optTrue = createOptProp(() -> false); + assertFalse(optTrue.shouldEnableWithOptInOverrideAndOptOutProperty(/* override */ true)); + + // Is the value of the override + final OptProp optTrueOn = createOptProp(() -> true); + assertTrue(optTrueOn.shouldEnableWithOptInOverrideAndOptOutProperty(/* override */ true)); + assertFalse(optTrueOn.shouldEnableWithOptInOverrideAndOptOutProperty(/* override */ false)); + + // Property is set to false + initPropAs(false); + final OptProp optFalse = createOptProp(() -> false); + assertFalse(optFalse.shouldEnableWithOptInOverrideAndOptOutProperty(/* override */ true)); + + // Always false ahatever is the value of the override + final OptProp optFalseOn = createOptProp(); + assertFalse(optFalseOn.shouldEnableWithOptInOverrideAndOptOutProperty(/* override */ true)); + assertFalse( + optFalseOn.shouldEnableWithOptInOverrideAndOptOutProperty(/* override */ false)); + } + + @Test + public void optProp_shouldEnableWithOptOutOverrideAndProperty() + throws PackageManager.NameNotFoundException { + // Property is unset + final OptProp optUnset = createOptProp(() -> false); + assertFalse(optUnset.shouldEnableWithOptOutOverrideAndProperty(/* override */ true)); + + // Is the negate of the override value + final OptProp optUnsetOn = createOptProp(); + assertTrue(optUnsetOn.shouldEnableWithOptOutOverrideAndProperty(/* override */ false)); + assertFalse(optUnsetOn.shouldEnableWithOptOutOverrideAndProperty(/* override */ true)); + + // Property is set to true + initPropAs(true); + final OptProp optTrue = createOptProp(() -> false); + assertFalse(optTrue.shouldEnableWithOptOutOverrideAndProperty(/* override */ true)); + + // Is the negate of the override value + final OptProp optTrueOn = createOptProp(() -> true); + assertTrue(optTrueOn.shouldEnableWithOptOutOverrideAndProperty(/* override */ false)); + assertFalse(optTrueOn.shouldEnableWithOptOutOverrideAndProperty(/* override */ true)); + + // Property is set to false + initPropAs(false); + final OptProp optFalse = createOptProp(() -> false); + assertFalse(optFalse.shouldEnableWithOptOutOverrideAndProperty(/* override */ true)); + + // Always false ahatever is the value of the override + final OptProp optFalseOn = createOptProp(); + assertFalse(optFalseOn.shouldEnableWithOptOutOverrideAndProperty(/* override */ true)); + assertFalse(optFalseOn.shouldEnableWithOptOutOverrideAndProperty(/* override */ false)); + } + + @Test + public void optProp_gateConditionIsInvokedOnlyOncePerInvocation() + throws PackageManager.NameNotFoundException { + + final FakeGateCondition trueCondition = new FakeGateCondition(/* returnValue */ true); + final OptProp optProp = createOptProp(trueCondition); + + optProp.shouldEnableWithOverrideAndProperty(/* override value */ true); + assertEquals(1, trueCondition.getInvocationCount()); + trueCondition.clearInvocationCount(); + + initPropAs(true); + optProp.shouldEnableWithOptInOverrideAndOptOutProperty(/* override value */ true); + assertEquals(1, trueCondition.getInvocationCount()); + trueCondition.clearInvocationCount(); + + optProp.shouldEnableWithOptOutOverrideAndProperty(/* override value */ true); + assertEquals(1, trueCondition.getInvocationCount()); + trueCondition.clearInvocationCount(); + } + + private void initPropAs(boolean propertyValue) throws PackageManager.NameNotFoundException { + Mockito.clearInvocations(mPackageManager); + final PackageManager.Property prop = new PackageManager.Property( + "", /* value */ propertyValue, "", ""); + when(mPackageManager.getProperty(anyString(), anyString())).thenReturn(prop); + } + + private void initPropAsWithException() throws PackageManager.NameNotFoundException { + Mockito.clearInvocations(mPackageManager); + when(mPackageManager.getProperty("", "")).thenThrow( + new PackageManager.NameNotFoundException()); + } + + private OptProp createOptProp() { + return mOptPropFactory.create(""); + } + + private OptProp createOptProp(BooleanSupplier condition) { + return mOptPropFactory.create("", condition); + } + + private static class FakeGateCondition implements BooleanSupplier { + + private int mInvocationCount = 0; + private final boolean mReturnValue; + + private FakeGateCondition(boolean returnValue) { + mReturnValue = returnValue; + } + + @Override + public boolean getAsBoolean() { + mInvocationCount++; + return mReturnValue; + } + + int getInvocationCount() { + return mInvocationCount; + } + + void clearInvocationCount() { + mInvocationCount = 0; + } + + } +} diff --git a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java index 2ff21ad40558..40537c85784d 100644 --- a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java +++ b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java @@ -978,8 +978,14 @@ public class UsbProfileGroupSettingsManager { shouldRestrictOverlayActivities = filteredAppProcessInfos.stream().anyMatch(pkg -> { try { - return mPackageManager.getProperty(PROPERTY_RESTRICT_USB_OVERLAY_ACTIVITIES, pkg) - .getBoolean(); + boolean restrictUsbOverlayActivitiesForPackage = mPackageManager + .getProperty(PROPERTY_RESTRICT_USB_OVERLAY_ACTIVITIES, pkg).getBoolean(); + + if (restrictUsbOverlayActivitiesForPackage) { + Slog.d(TAG, "restricting usb overlay activities as package " + pkg + + " is in foreground"); + } + return restrictUsbOverlayActivitiesForPackage; } catch (NameNotFoundException e) { if (DEBUG) { Slog.d(TAG, "property PROPERTY_RESTRICT_USB_OVERLAY_ACTIVITIES " @@ -989,8 +995,8 @@ public class UsbProfileGroupSettingsManager { } }); - if (shouldRestrictOverlayActivities) { - Slog.d(TAG, "restricting starting of usb overlay activities"); + if (!shouldRestrictOverlayActivities) { + Slog.d(TAG, "starting of usb overlay activities"); } return shouldRestrictOverlayActivities; } diff --git a/telecomm/java/android/telecom/DisconnectCause.java b/telecomm/java/android/telecom/DisconnectCause.java index 5ba5ee8836e1..8b9a93bd92a4 100644 --- a/telecomm/java/android/telecom/DisconnectCause.java +++ b/telecomm/java/android/telecom/DisconnectCause.java @@ -16,6 +16,8 @@ package android.telecom; +import static java.lang.annotation.RetentionPolicy.SOURCE; + import android.annotation.FlaggedApi; import android.annotation.NonNull; import android.annotation.Nullable; @@ -28,8 +30,11 @@ import android.telephony.PreciseDisconnectCause; import android.telephony.ims.ImsReasonInfo; import android.text.TextUtils; +import androidx.annotation.IntDef; + import com.android.server.telecom.flags.Flags; +import java.lang.annotation.Retention; import java.util.Objects; /** @@ -42,48 +47,69 @@ import java.util.Objects; public final class DisconnectCause implements Parcelable { /** Disconnected because of an unknown or unspecified reason. */ - public static final int UNKNOWN = TelecomProtoEnums.UNKNOWN; // = 0 + public static final int UNKNOWN = 0; /** Disconnected because there was an error, such as a problem with the network. */ - public static final int ERROR = TelecomProtoEnums.ERROR; // = 1 + public static final int ERROR = 1; /** Disconnected because of a local user-initiated action, such as hanging up. */ - public static final int LOCAL = TelecomProtoEnums.LOCAL; // = 2 + public static final int LOCAL = 2; /** * Disconnected because the remote party hung up an ongoing call, or because an outgoing call * was not answered by the remote party. */ - public static final int REMOTE = TelecomProtoEnums.REMOTE; // = 3 + public static final int REMOTE = 3; /** Disconnected because it has been canceled. */ - public static final int CANCELED = TelecomProtoEnums.CANCELED; // = 4 + public static final int CANCELED = 4; /** Disconnected because there was no response to an incoming call. */ - public static final int MISSED = TelecomProtoEnums.MISSED; // = 5 + public static final int MISSED = 5; /** Disconnected because the user rejected an incoming call. */ - public static final int REJECTED = TelecomProtoEnums.REJECTED; // = 6 + public static final int REJECTED = 6; /** Disconnected because the other party was busy. */ - public static final int BUSY = TelecomProtoEnums.BUSY; // = 7 + public static final int BUSY = 7; /** * Disconnected because of a restriction on placing the call, such as dialing in airplane * mode. */ - public static final int RESTRICTED = TelecomProtoEnums.RESTRICTED; // = 8 + public static final int RESTRICTED = 8; /** Disconnected for reason not described by other disconnect codes. */ - public static final int OTHER = TelecomProtoEnums.OTHER; // = 9 + public static final int OTHER = 9; /** * Disconnected because the connection manager did not support the call. The call will be tried * again without a connection manager. See {@link PhoneAccount#CAPABILITY_CONNECTION_MANAGER}. */ - public static final int CONNECTION_MANAGER_NOT_SUPPORTED = - TelecomProtoEnums.CONNECTION_MANAGER_NOT_SUPPORTED; // = 10 + public static final int CONNECTION_MANAGER_NOT_SUPPORTED = 10; /** * Disconnected because the user did not locally answer the incoming call, but it was answered * on another device where the call was ringing. */ - public static final int ANSWERED_ELSEWHERE = TelecomProtoEnums.ANSWERED_ELSEWHERE; // = 11 + public static final int ANSWERED_ELSEWHERE = 11; /** * Disconnected because the call was pulled from the current device to another device. */ - public static final int CALL_PULLED = TelecomProtoEnums.CALL_PULLED; // = 12 + public static final int CALL_PULLED = 12; + + /** + * @hide + */ + @Retention(SOURCE) + @FlaggedApi(Flags.FLAG_TELECOM_RESOLVE_HIDDEN_DEPENDENCIES) + @IntDef({ + UNKNOWN, + ERROR, + LOCAL, + REMOTE, + CANCELED, + MISSED, + REJECTED, + BUSY, + RESTRICTED, + OTHER, + CONNECTION_MANAGER_NOT_SUPPORTED, + ANSWERED_ELSEWHERE, + CALL_PULLED + }) + public @interface DisconnectCauseCode {} /** * Reason code (returned via {@link #getReason()}) which indicates that a call could not be @@ -116,7 +142,7 @@ public final class DisconnectCause implements Parcelable { */ public static final String REASON_EMERGENCY_CALL_PLACED = "REASON_EMERGENCY_CALL_PLACED"; - private int mDisconnectCode; + private @DisconnectCauseCode int mDisconnectCode; private CharSequence mDisconnectLabel; private CharSequence mDisconnectDescription; private String mDisconnectReason; @@ -130,7 +156,7 @@ public final class DisconnectCause implements Parcelable { * * @param code The code for the disconnect cause. */ - public DisconnectCause(int code) { + public DisconnectCause(@DisconnectCauseCode int code) { this(code, null, null, null, ToneGenerator.TONE_UNKNOWN); } @@ -140,7 +166,7 @@ public final class DisconnectCause implements Parcelable { * @param code The code for the disconnect cause. * @param reason The reason for the disconnect. */ - public DisconnectCause(int code, String reason) { + public DisconnectCause(@DisconnectCauseCode int code, String reason) { this(code, null, null, reason, ToneGenerator.TONE_UNKNOWN); } @@ -152,7 +178,8 @@ public final class DisconnectCause implements Parcelable { * @param description The localized description to show to the user to explain the disconnect. * @param reason The reason for the disconnect. */ - public DisconnectCause(int code, CharSequence label, CharSequence description, String reason) { + public DisconnectCause(@DisconnectCauseCode int code, CharSequence label, + CharSequence description, String reason) { this(code, label, description, reason, ToneGenerator.TONE_UNKNOWN); } @@ -165,8 +192,8 @@ public final class DisconnectCause implements Parcelable { * @param reason The reason for the disconnect. * @param toneToPlay The tone to play on disconnect, as defined in {@link ToneGenerator}. */ - public DisconnectCause(int code, CharSequence label, CharSequence description, String reason, - int toneToPlay) { + public DisconnectCause(@DisconnectCauseCode int code, CharSequence label, + CharSequence description, String reason, int toneToPlay) { this(code, label, description, reason, toneToPlay, android.telephony.DisconnectCause.ERROR_UNSPECIFIED, PreciseDisconnectCause.ERROR_UNSPECIFIED, null /* imsReasonInfo */); @@ -186,8 +213,8 @@ public final class DisconnectCause implements Parcelable { * @param imsReasonInfo The relevant {@link ImsReasonInfo}, or {@code null} if not available. * @hide */ - public DisconnectCause(int code, @NonNull CharSequence label, - @NonNull CharSequence description, @NonNull String reason, + public DisconnectCause(@DisconnectCauseCode int code, @Nullable CharSequence label, + @Nullable CharSequence description, @Nullable String reason, int toneToPlay, @Annotation.DisconnectCauses int telephonyDisconnectCause, @Annotation.PreciseDisconnectCauses int telephonyPreciseDisconnectCause, @Nullable ImsReasonInfo imsReasonInfo) { @@ -206,7 +233,7 @@ public final class DisconnectCause implements Parcelable { * * @return The disconnect code. */ - public int getCode() { + public @DisconnectCauseCode int getCode() { return mDisconnectCode; } @@ -301,28 +328,24 @@ public final class DisconnectCause implements Parcelable { @SystemApi @FlaggedApi(Flags.FLAG_TELECOM_RESOLVE_HIDDEN_DEPENDENCIES) public static final class Builder { - private int mDisconnectCode; + private @DisconnectCauseCode int mDisconnectCode; private CharSequence mDisconnectLabel; private CharSequence mDisconnectDescription; private String mDisconnectReason; - private int mToneToPlay; + private int mToneToPlay = ToneGenerator.TONE_UNKNOWN; private int mTelephonyDisconnectCause; private int mTelephonyPreciseDisconnectCause; private ImsReasonInfo mImsReasonInfo; - /** - * Sets the code for the reason for this disconnect. - * @param code The code denoting the type of disconnect. - */ - public @NonNull DisconnectCause.Builder setCode(int code) { + public Builder(@DisconnectCauseCode int code) { mDisconnectCode = code; - return this; } /** * Sets a label which explains the reason for the disconnect cause, used for display in the * user interface. * @param label The label to associate with the disconnect cause. + * @return The {@link DisconnectCause} builder instance. */ public @NonNull DisconnectCause.Builder setLabel(@Nullable CharSequence label) { mDisconnectLabel = label; @@ -333,6 +356,7 @@ public final class DisconnectCause implements Parcelable { * Sets a description which provides the reason for the disconnect cause, used for display * in the user interface. * @param description The description to associate with the disconnect cause. + * @return The {@link DisconnectCause} builder instance. */ public @NonNull DisconnectCause.Builder setDescription( @Nullable CharSequence description) { @@ -344,6 +368,7 @@ public final class DisconnectCause implements Parcelable { * Sets a reason providing explanation for the disconnect (intended for logging and not for * displaying in the user interface). * @param reason The reason for the disconnect. + * @return The {@link DisconnectCause} builder instance. */ public @NonNull DisconnectCause.Builder setReason(@NonNull String reason) { mDisconnectReason = reason; @@ -353,6 +378,7 @@ public final class DisconnectCause implements Parcelable { /** * Sets the tone to play when disconnected. * @param toneToPlay The tone as defined in {@link ToneGenerator} to play when disconnected. + * @return The {@link DisconnectCause} builder instance. */ public @NonNull DisconnectCause.Builder setTone(int toneToPlay) { mToneToPlay = toneToPlay; @@ -363,6 +389,7 @@ public final class DisconnectCause implements Parcelable { * Sets the telephony {@link android.telephony.DisconnectCause} for the call (used * internally by Telecom for providing extra debug information from Telephony). * @param telephonyDisconnectCause The disconnect cause as provided by Telephony. + * @return The {@link DisconnectCause} builder instance. */ public @NonNull DisconnectCause.Builder setTelephonyDisconnectCause( @Annotation.DisconnectCauses int telephonyDisconnectCause) { @@ -375,6 +402,7 @@ public final class DisconnectCause implements Parcelable { * internally by Telecom for providing extra debug information from Telephony). * @param telephonyPreciseDisconnectCause The precise disconnect cause as provided by * Telephony. + * @return The {@link DisconnectCause} builder instance. */ public @NonNull DisconnectCause.Builder setTelephonyPreciseDisconnectCause( @@ -384,10 +412,11 @@ public final class DisconnectCause implements Parcelable { } /** - * Returns the telephony {@link ImsReasonInfo} associated with the call disconnection. This + * Sets the telephony {@link ImsReasonInfo} associated with the call disconnection. This * is only used internally by Telecom for providing extra debug information from Telephony. * * @param imsReasonInfo The {@link ImsReasonInfo} or {@code null} if not known. + * @return The {@link DisconnectCause} builder instance. */ public @NonNull DisconnectCause.Builder setImsReasonInfo( @Nullable ImsReasonInfo imsReasonInfo) { diff --git a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java index 8531b507a92f..6482432f4049 100644 --- a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java +++ b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java @@ -33,6 +33,7 @@ import android.util.ArrayMap; import android.util.Log; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.telephony.flags.Flags; import com.android.internal.telephony.util.TelephonyUtils; import java.util.ArrayList; @@ -41,7 +42,7 @@ import java.util.Map; import java.util.Set; /** - * Utilities for handling carrier applications. + * Utilities to control the states of the system bundled (preinstalled) carrier applications. * @hide */ public final class CarrierAppUtils { @@ -246,17 +247,27 @@ public final class CarrierAppUtils { // Always re-grant default permissions to carrier apps w/ privileges. enabledCarrierPackages.add(ai.packageName); } else { // No carrier privileges - // Only update enabled state for the app on /system. Once it has been - // updated we shouldn't touch it. - if (!isUpdatedSystemApp(ai) && enabledSetting - == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT - && (ai.flags & ApplicationInfo.FLAG_INSTALLED) != 0) { - Log.i(TAG, "Update state (" + packageName - + "): DISABLED_UNTIL_USED for user " + userId); - context.createContextAsUser(UserHandle.of(userId), 0) - .getPackageManager() - .setSystemAppState( - packageName, PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + // Only uninstall system carrier apps that fulfill ALL conditions below: + // 1. It has no carrier privileges + // 2. It has never been uninstalled before (i.e. we uninstall at most once) + // 3. It has not been installed as an update from its system built-in version + // 4. It is in default state (not explicitly DISABLED/DISABLED_BY_USER/ENABLED) + // 5. It is currently installed for the calling user + // TODO(b/329739019): + // 1. Merge the nested if conditions below during flag cleaning up phase + // 2. Support user case that NEW carrier app is added during OTA, when emerge. + if (!Flags.hidePreinstalledCarrierAppAtMostOnce() || !hasRunEver) { + if (!isUpdatedSystemApp(ai) && enabledSetting + == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT + && (ai.flags & ApplicationInfo.FLAG_INSTALLED) != 0) { + Log.i(TAG, "Update state (" + packageName + + "): DISABLED_UNTIL_USED for user " + userId); + context.createContextAsUser(UserHandle.of(userId), 0) + .getPackageManager() + .setSystemAppState( + packageName, + PackageManager.SYSTEM_APP_STATE_UNINSTALLED); + } } // Associated apps are more brittle, because we can't rely on the distinction diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java index e3ce766b40bc..ebabbf911399 100644 --- a/telephony/java/android/telephony/euicc/EuiccManager.java +++ b/telephony/java/android/telephony/euicc/EuiccManager.java @@ -512,6 +512,7 @@ public class EuiccManager { EUICC_ACTIVATION_TYPE_BACKUP, EUICC_ACTIVATION_TYPE_TRANSFER, EUICC_ACTIVATION_TYPE_ACCOUNT_REQUIRED, + EUICC_ACTIVATION_TYPE_TRANSFER_FINAL_HOLD, }) public @interface EuiccActivationType{} @@ -555,6 +556,15 @@ public class EuiccManager { public static final int EUICC_ACTIVATION_TYPE_ACCOUNT_REQUIRED = 4; /** + * The activation flow of eSIM transfer to block the transfer process before B&R flow. + * This is needed to avoid connection overlapping between eSIM connection B&R connection. + * + * @hide + */ + // TODO(b/329212614): add system api annotation during the allowed api timeline. + public static final int EUICC_ACTIVATION_TYPE_TRANSFER_FINAL_HOLD = 5; + + /** * Euicc OTA update status which can be got by {@link #getOtaStatus} * @removed mistakenly exposed as system-api previously */ diff --git a/tools/aapt2/optimize/VersionCollapser.cpp b/tools/aapt2/optimize/VersionCollapser.cpp index cd791bda250b..27fff9a05334 100644 --- a/tools/aapt2/optimize/VersionCollapser.cpp +++ b/tools/aapt2/optimize/VersionCollapser.cpp @@ -70,7 +70,7 @@ FilterIterator<Iterator, Pred> make_filter_iterator(Iterator begin, * exception is when there is no exact matching resource for the minSdk. The next smallest one will * be kept. */ -static void CollapseVersions(int min_sdk, ResourceEntry* entry) { +static void CollapseVersions(IAaptContext* context, int min_sdk, ResourceEntry* entry) { // First look for all sdks less than minSdk. for (auto iter = entry->values.rbegin(); iter != entry->values.rend(); ++iter) { @@ -102,7 +102,14 @@ static void CollapseVersions(int min_sdk, ResourceEntry* entry) { auto filter_iter = make_filter_iterator(iter + 1, entry->values.rend(), pred); while (filter_iter.HasNext()) { - filter_iter.Next() = {}; + auto& next = filter_iter.Next(); + if (context->IsVerbose()) { + context->GetDiagnostics()->Note(android::DiagMessage() + << "removing configuration " << next->config.to_string() + << " for entry: " << entry->name + << ", because its SDK version is smaller than minSdk"); + } + next = {}; } } } @@ -126,6 +133,12 @@ static void CollapseVersions(int min_sdk, ResourceEntry* entry) { util::make_unique<ResourceConfigValue>( config_value->config.CopyWithoutSdkVersion(), config_value->product); + if (context->IsVerbose()) { + context->GetDiagnostics()->Note(android::DiagMessage() + << "overriding resource: " << entry->name + << ", removing SDK version from configuration " + << config_value->config.to_string()); + } new_value->value = std::move(config_value->value); config_value = std::move(new_value); @@ -147,10 +160,14 @@ static void CollapseVersions(int min_sdk, ResourceEntry* entry) { bool VersionCollapser::Consume(IAaptContext* context, ResourceTable* table) { TRACE_NAME("VersionCollapser::Consume"); const int min_sdk = context->GetMinSdkVersion(); + if (context->IsVerbose()) { + context->GetDiagnostics()->Note(android::DiagMessage() + << "Running VersionCollapser with minSdk = " << min_sdk); + } for (auto& package : table->packages) { for (auto& type : package->types) { for (auto& entry : type->entries) { - CollapseVersions(min_sdk, entry.get()); + CollapseVersions(context, min_sdk, entry.get()); } } } |