diff options
512 files changed, 7930 insertions, 4416 deletions
diff --git a/AconfigFlags.bp b/AconfigFlags.bp index ac756ea1d624..071cc6555be7 100644 --- a/AconfigFlags.bp +++ b/AconfigFlags.bp @@ -848,6 +848,7 @@ java_aconfig_library { "//apex_available:platform", "com.android.nfcservices", "com.android.permission", + "com.android.extservices", ], } diff --git a/cmds/screencap/screencap.cpp b/cmds/screencap/screencap.cpp index 9ff1161081fc..a432819e2eaf 100644 --- a/cmds/screencap/screencap.cpp +++ b/cmds/screencap/screencap.cpp @@ -37,13 +37,13 @@ #include <ui/GraphicTypes.h> #include <ui/PixelFormat.h> -#include "utils/Errors.h" #include "screencap_utils.h" +#include "utils/Errors.h" using namespace android; -#define COLORSPACE_UNKNOWN 0 -#define COLORSPACE_SRGB 1 +#define COLORSPACE_UNKNOWN 0 +#define COLORSPACE_SRGB 1 #define COLORSPACE_DISPLAY_P3 2 void usage(const char* pname, ftl::Optional<DisplayId> displayIdOpt) { @@ -62,13 +62,13 @@ If FILENAME is not given, the results will be printed to stdout. )", pname, displayIdOpt - .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()); + .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 @@ -87,8 +87,7 @@ static const struct option LONG_OPTIONS[] = {{"png", no_argument, nullptr, 'p'}, LongOpts::HintForSeamless}, {0, 0, 0, 0}}; -static int32_t flinger2bitmapFormat(PixelFormat f) -{ +static int32_t flinger2bitmapFormat(PixelFormat f) { switch (f) { case PIXEL_FORMAT_RGB_565: return ANDROID_BITMAP_FORMAT_RGB_565; @@ -97,8 +96,7 @@ static int32_t flinger2bitmapFormat(PixelFormat f) } } -static uint32_t dataSpaceToInt(ui::Dataspace d) -{ +static uint32_t dataSpaceToInt(ui::Dataspace d) { switch (d) { case ui::Dataspace::V0_SRGB: return COLORSPACE_SRGB; @@ -112,25 +110,20 @@ static uint32_t dataSpaceToInt(ui::Dataspace d) static status_t notifyMediaScanner(const char* fileName) { std::string filePath("file://"); filePath.append(fileName); - char *cmd[] = { - (char*) "am", - (char*) "broadcast", - (char*) "-a", - (char*) "android.intent.action.MEDIA_SCANNER_SCAN_FILE", - (char*) "-d", - &filePath[0], - nullptr - }; + char* cmd[] = {(char*)"am", (char*)"broadcast", + (char*)"-a", (char*)"android.intent.action.MEDIA_SCANNER_SCAN_FILE", + (char*)"-d", &filePath[0], + nullptr}; int status; int pid = fork(); - if (pid < 0){ + if (pid < 0) { fprintf(stderr, "Unable to fork in order to send intent for media scanner.\n"); return UNKNOWN_ERROR; } - if (pid == 0){ + if (pid == 0) { int fd = open("/dev/null", O_WRONLY); - if (fd < 0){ + if (fd < 0) { fprintf(stderr, "Unable to open /dev/null for media scanner stdout redirection.\n"); exit(1); } @@ -216,31 +209,33 @@ status_t saveImage(const char* fn, std::optional<AndroidBitmapCompressFormat> fo info.height = buffer->getHeight(); info.stride = buffer->getStride() * bytesPerPixel(buffer->getPixelFormat()); - int result; + int bitmapResult; if (gainmapBase) { - result = ABitmap_compressWithGainmap(&info, static_cast<ADataSpace>(dataspace), base, - gainmapBase, captureResults.hdrSdrRatio, *format, - 100, &fd, - [](void* fdPtr, const void* data, - size_t size) -> bool { - int bytesWritten = - write(*static_cast<int*>(fdPtr), data, - size); - return bytesWritten == size; - }); + bitmapResult = + ABitmap_compressWithGainmap(&info, static_cast<ADataSpace>(dataspace), base, + gainmapBase, captureResults.hdrSdrRatio, *format, + 100, &fd, + [](void* fdPtr, const void* data, + size_t size) -> bool { + int bytesWritten = + write(*static_cast<int*>(fdPtr), data, + size); + return bytesWritten == size; + }); } else { - result = AndroidBitmap_compress(&info, static_cast<int32_t>(dataspace), base, *format, - 100, &fd, - [](void* fdPtr, const void* data, size_t size) -> bool { - int bytesWritten = write(*static_cast<int*>(fdPtr), - data, size); - return bytesWritten == size; - }); + bitmapResult = + AndroidBitmap_compress(&info, static_cast<int32_t>(dataspace), base, *format, + 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 (error code: %d)\n", result); + if (bitmapResult != ANDROID_BITMAP_RESULT_SUCCESS) { + fprintf(stderr, "Failed to compress (error code: %d)\n", bitmapResult); } if (fn != NULL) { @@ -258,9 +253,9 @@ status_t saveImage(const char* fn, std::optional<AndroidBitmapCompressFormat> fo 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); + for (size_t y = 0; y < h; y++) { + write(fd, base, w * Bpp); + base = (void*)((char*)base + s * Bpp); } } close(fd); @@ -276,10 +271,9 @@ status_t saveImage(const char* fn, std::optional<AndroidBitmapCompressFormat> fo return 0; } -int main(int argc, char** argv) -{ +int main(int argc, char** argv) { const std::vector<PhysicalDisplayId> physicalDisplays = - SurfaceComposerClient::getPhysicalDisplayIds(); + SurfaceComposerClient::getPhysicalDisplayIds(); if (physicalDisplays.empty()) { fprintf(stderr, "Failed to get ID for any displays.\n"); @@ -352,9 +346,9 @@ int main(int argc, char** argv) std::string suffix; if (argc == 1) { - std::string_view filename = { argv[0] }; + std::string_view filename = {argv[0]}; if (filename.ends_with(".png")) { - baseName = filename.substr(0, filename.size()-4); + baseName = filename.substr(0, filename.size() - 4); suffix = ".png"; png = true; } else if (filename.ends_with(".jpeg")) { diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index efcd278ed118..458c1715d2b6 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -3067,7 +3067,7 @@ public class AppOpsManager { new AppOpInfo.Builder(OP_ESTABLISH_VPN_MANAGER, OPSTR_ESTABLISH_VPN_MANAGER, "ESTABLISH_VPN_MANAGER").setDefaultMode(AppOpsManager.MODE_ALLOWED).build(), new AppOpInfo.Builder(OP_ACCESS_RESTRICTED_SETTINGS, OPSTR_ACCESS_RESTRICTED_SETTINGS, - "ACCESS_RESTRICTED_SETTINGS").setDefaultMode(AppOpsManager.MODE_ALLOWED) + "ACCESS_RESTRICTED_SETTINGS").setDefaultMode(AppOpsManager.MODE_DEFAULT) .setDisableReset(true).setRestrictRead(true).build(), new AppOpInfo.Builder(OP_RECEIVE_AMBIENT_TRIGGER_AUDIO, OPSTR_RECEIVE_AMBIENT_TRIGGER_AUDIO, "RECEIVE_SOUNDTRIGGER_AUDIO").setDefaultMode(AppOpsManager.MODE_ALLOWED) diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index bc01f934e701..6fedcbe50f30 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -121,6 +121,7 @@ interface INotificationManager void deleteNotificationChannelGroup(String pkg, String channelGroupId); NotificationChannelGroup getNotificationChannelGroup(String pkg, String channelGroupId); ParceledListSlice getNotificationChannelGroups(String pkg); + ParceledListSlice getNotificationChannelGroupsWithoutChannels(String pkg); boolean onlyHasDefaultChannel(String pkg, int uid); boolean areChannelsBypassingDnd(); ParceledListSlice getNotificationChannelsBypassingDnd(String pkg, int uid); diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java index c6f008c46f99..d88395331656 100644 --- a/core/java/android/app/NotificationChannel.java +++ b/core/java/android/app/NotificationChannel.java @@ -380,17 +380,6 @@ public final class NotificationChannel implements Parcelable { mSound = null; } mLights = in.readByte() != 0; - mVibrationPattern = in.createLongArray(); - if (mVibrationPattern != null && mVibrationPattern.length > MAX_VIBRATION_LENGTH) { - mVibrationPattern = Arrays.copyOf(mVibrationPattern, MAX_VIBRATION_LENGTH); - } - if (Flags.notificationChannelVibrationEffectApi()) { - mVibrationEffect = - in.readInt() != 0 ? VibrationEffect.CREATOR.createFromParcel(in) : null; - if (Flags.notifChannelCropVibrationEffects() && mVibrationEffect != null) { - mVibrationEffect = getTrimmedVibrationEffect(mVibrationEffect); - } - } mUserLockedFields = in.readInt(); mUserVisibleTaskShown = in.readByte() != 0; mVibrationEnabled = in.readByte() != 0; @@ -412,6 +401,38 @@ public final class NotificationChannel implements Parcelable { mImportantConvo = in.readBoolean(); mDeletedTime = in.readLong(); mImportanceLockedDefaultApp = in.readBoolean(); + + // Add new fields above this line and not after vibration effect! When + // notif_channel_estimate_effect_size is true, we use parcel size to detect whether the + // vibration effect might be too large to handle, so this must remain at the end lest any + // following fields cause the data to get incorrectly dropped. + mVibrationPattern = in.createLongArray(); + if (mVibrationPattern != null && mVibrationPattern.length > MAX_VIBRATION_LENGTH) { + mVibrationPattern = Arrays.copyOf(mVibrationPattern, MAX_VIBRATION_LENGTH); + } + boolean largeEffect = false; + if (Flags.notifChannelEstimateEffectSize()) { + // Note that we must check the length of remaining data in the parcel before reading in + // the data. + largeEffect = (in.dataAvail() > MAX_SERIALIZED_VIBRATION_LENGTH); + } + if (Flags.notificationChannelVibrationEffectApi()) { + mVibrationEffect = + in.readInt() != 0 ? VibrationEffect.CREATOR.createFromParcel(in) : null; + if (Flags.notifChannelCropVibrationEffects() && mVibrationEffect != null) { + if (Flags.notifChannelEstimateEffectSize()) { + // Try trimming the effect if the remaining parcel size is large. If trimming is + // not applicable for the effect, rather than serializing to XML (expensive) to + // check the exact serialized length, we just reject the effect. + if (largeEffect) { + mVibrationEffect = mVibrationEffect.cropToLengthOrNull( + MAX_VIBRATION_LENGTH); + } + } else { + mVibrationEffect = getTrimmedVibrationEffect(mVibrationEffect); + } + } + } } @Override @@ -444,15 +465,6 @@ public final class NotificationChannel implements Parcelable { dest.writeByte((byte) 0); } dest.writeByte(mLights ? (byte) 1 : (byte) 0); - dest.writeLongArray(mVibrationPattern); - if (Flags.notificationChannelVibrationEffectApi()) { - if (mVibrationEffect != null) { - dest.writeInt(1); - mVibrationEffect.writeToParcel(dest, /* flags= */ 0); - } else { - dest.writeInt(0); - } - } dest.writeInt(mUserLockedFields); dest.writeByte(mUserVisibleTaskShown ? (byte) 1 : (byte) 0); dest.writeByte(mVibrationEnabled ? (byte) 1 : (byte) 0); @@ -480,6 +492,17 @@ public final class NotificationChannel implements Parcelable { dest.writeBoolean(mImportantConvo); dest.writeLong(mDeletedTime); dest.writeBoolean(mImportanceLockedDefaultApp); + + // Add new fields above this line; vibration effect must remain the last entry. + dest.writeLongArray(mVibrationPattern); + if (Flags.notificationChannelVibrationEffectApi()) { + if (mVibrationEffect != null) { + dest.writeInt(1); + mVibrationEffect.writeToParcel(dest, /* flags= */ 0); + } else { + dest.writeInt(0); + } + } } /** @hide */ @@ -605,7 +628,9 @@ public final class NotificationChannel implements Parcelable { return input; } - // Returns trimmed vibration effect or null if not trimmable. + // Returns trimmed vibration effect or null if not trimmable and the serialized string is too + // long. Note that this method involves serializing the full VibrationEffect, which may be + // expensive. private VibrationEffect getTrimmedVibrationEffect(VibrationEffect effect) { if (effect == null) { return null; diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 6e31779f2fb3..00f896deae4b 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -69,12 +69,14 @@ import android.service.notification.ZenDeviceEffects; import android.service.notification.ZenModeConfig; import android.service.notification.ZenPolicy; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.Log; import android.util.LruCache; import android.util.Slog; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.notification.NotificationChannelGroupsHelper; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -1396,11 +1398,23 @@ public class NotificationManager { * The channel group must belong to your package, or null will be returned. */ public NotificationChannelGroup getNotificationChannelGroup(String channelGroupId) { - INotificationManager service = service(); - try { - return service.getNotificationChannelGroup(mContext.getPackageName(), channelGroupId); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + if (Flags.nmBinderPerfCacheChannels()) { + String pkgName = mContext.getPackageName(); + // getNotificationChannelGroup may only be called by the same package. + List<NotificationChannel> channelList = mNotificationChannelListCache.query( + new NotificationChannelQuery(pkgName, pkgName, mContext.getUserId())); + Map<String, NotificationChannelGroup> groupHeaders = + mNotificationChannelGroupsCache.query(pkgName); + return NotificationChannelGroupsHelper.getGroupWithChannels(channelGroupId, channelList, + groupHeaders, /* includeDeleted= */ false); + } else { + INotificationManager service = service(); + try { + return service.getNotificationChannelGroup(mContext.getPackageName(), + channelGroupId); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } } @@ -1408,17 +1422,27 @@ public class NotificationManager { * Returns all notification channel groups belonging to the calling app. */ public List<NotificationChannelGroup> getNotificationChannelGroups() { - INotificationManager service = service(); - try { - final ParceledListSlice<NotificationChannelGroup> parceledList = - service.getNotificationChannelGroups(mContext.getPackageName()); - if (parceledList != null) { - return parceledList.getList(); + if (Flags.nmBinderPerfCacheChannels()) { + String pkgName = mContext.getPackageName(); + List<NotificationChannel> channelList = mNotificationChannelListCache.query( + new NotificationChannelQuery(pkgName, pkgName, mContext.getUserId())); + Map<String, NotificationChannelGroup> groupHeaders = + mNotificationChannelGroupsCache.query(pkgName); + return NotificationChannelGroupsHelper.getGroupsWithChannels(channelList, groupHeaders, + NotificationChannelGroupsHelper.Params.forAllGroups()); + } else { + INotificationManager service = service(); + try { + final ParceledListSlice<NotificationChannelGroup> parceledList = + service.getNotificationChannelGroups(mContext.getPackageName()); + if (parceledList != null) { + return parceledList.getList(); + } + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + return new ArrayList<>(); } - return new ArrayList<>(); } /** @@ -1448,9 +1472,11 @@ public class NotificationManager { } } - private static final String NOTIFICATION_CHANNEL_CACHE_API = "getNotificationChannel"; - private static final String NOTIFICATION_CHANNEL_LIST_CACHE_NAME = "getNotificationChannels"; - private static final int NOTIFICATION_CHANNEL_CACHE_SIZE = 10; + private static final String NOTIFICATION_CHANNELS_CACHE_API = "getNotificationChannels"; + private static final int NOTIFICATION_CHANNELS_CACHE_SIZE = 10; + private static final String NOTIFICATION_CHANNEL_GROUPS_CACHE_API = + "getNotificationChannelGroups"; + private static final int NOTIFICATION_CHANNEL_GROUPS_CACHE_SIZE = 10; private final IpcDataCache.QueryHandler<NotificationChannelQuery, List<NotificationChannel>> mNotificationChannelListQueryHandler = new IpcDataCache.QueryHandler<>() { @@ -1480,8 +1506,8 @@ public class NotificationManager { private final IpcDataCache<NotificationChannelQuery, List<NotificationChannel>> mNotificationChannelListCache = - new IpcDataCache<>(NOTIFICATION_CHANNEL_CACHE_SIZE, IpcDataCache.MODULE_SYSTEM, - NOTIFICATION_CHANNEL_CACHE_API, NOTIFICATION_CHANNEL_LIST_CACHE_NAME, + new IpcDataCache<>(NOTIFICATION_CHANNELS_CACHE_SIZE, IpcDataCache.MODULE_SYSTEM, + NOTIFICATION_CHANNELS_CACHE_API, NOTIFICATION_CHANNELS_CACHE_API, mNotificationChannelListQueryHandler); private record NotificationChannelQuery( @@ -1489,13 +1515,52 @@ public class NotificationManager { String targetPkg, int userId) {} + private final IpcDataCache.QueryHandler<String, Map<String, NotificationChannelGroup>> + mNotificationChannelGroupsQueryHandler = new IpcDataCache.QueryHandler<>() { + @Override + public Map<String, NotificationChannelGroup> apply(String pkg) { + INotificationManager service = service(); + Map<String, NotificationChannelGroup> groups = new ArrayMap<>(); + try { + final ParceledListSlice<NotificationChannelGroup> parceledList = + service.getNotificationChannelGroupsWithoutChannels(pkg); + if (parceledList != null) { + for (NotificationChannelGroup group : parceledList.getList()) { + groups.put(group.getId(), group); + } + } + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + return groups; + } + + @Override + public boolean shouldBypassCache(@NonNull String query) { + // Other locations should also not be querying the cache in the first place if + // the flag is not enabled, but this is an extra precaution. + if (!Flags.nmBinderPerfCacheChannels()) { + Log.wtf(TAG, + "shouldBypassCache called when nm_binder_perf_cache_channels off"); + return true; + } + return false; + } + }; + + private final IpcDataCache<String, Map<String, NotificationChannelGroup>> + mNotificationChannelGroupsCache = new IpcDataCache<>( + NOTIFICATION_CHANNEL_GROUPS_CACHE_SIZE, IpcDataCache.MODULE_SYSTEM, + NOTIFICATION_CHANNEL_GROUPS_CACHE_API, NOTIFICATION_CHANNEL_GROUPS_CACHE_API, + mNotificationChannelGroupsQueryHandler); + /** * @hide */ public static void invalidateNotificationChannelCache() { if (Flags.nmBinderPerfCacheChannels()) { IpcDataCache.invalidateCache(IpcDataCache.MODULE_SYSTEM, - NOTIFICATION_CHANNEL_CACHE_API); + NOTIFICATION_CHANNELS_CACHE_API); } else { // if we are here, we have failed to flag something Log.wtf(TAG, "invalidateNotificationChannelCache called without flag"); @@ -1503,14 +1568,28 @@ public class NotificationManager { } /** + * @hide + */ + public static void invalidateNotificationChannelGroupCache() { + if (Flags.nmBinderPerfCacheChannels()) { + IpcDataCache.invalidateCache(IpcDataCache.MODULE_SYSTEM, + NOTIFICATION_CHANNEL_GROUPS_CACHE_API); + } else { + // if we are here, we have failed to flag something + Log.wtf(TAG, "invalidateNotificationChannelGroupCache called without flag"); + } + } + + /** * For testing only: running tests with a cache requires marking the cache's property for * testing, as test APIs otherwise cannot invalidate the cache. This must be called after * calling PropertyInvalidatedCache.setTestMode(true). * @hide */ @VisibleForTesting - public void setChannelCacheToTestMode() { + public void setChannelCachesToTestMode() { mNotificationChannelListCache.testPropertyName(); + mNotificationChannelGroupsCache.testPropertyName(); } /** diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 076f856635b5..957482450893 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -297,6 +297,16 @@ public class WallpaperManager { "android.wallpaper.lockscreen_layout_changed"; /** + * Command for {@link #sendWallpaperCommand}: Include the tap position within the wallpaper + * focal area.The x and y arguments are the absolute tap coordinates, already scaled to match + * the wallpaper's dimensions. + * + * @hide + */ + public static final String COMMAND_LOCKSCREEN_TAP = + "android.wallpaper.lockscreen_tap"; + + /** * Extra passed back from setWallpaper() giving the new wallpaper's assigned ID. * @hide */ diff --git a/core/java/android/app/notification.aconfig b/core/java/android/app/notification.aconfig index 733a348aa825..a10b6ff39a37 100644 --- a/core/java/android/app/notification.aconfig +++ b/core/java/android/app/notification.aconfig @@ -154,6 +154,16 @@ flag { } flag { + name: "notif_channel_estimate_effect_size" + namespace: "systemui" + description: "When reading vibration effects from parcel, estimate size instead of unnecessarily serializing to XML" + bug: "391908451" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "evenly_divided_call_style_action_layout" namespace: "systemui" description: "Evenly divides horizontal space for action buttons in CallStyle notifications." diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 1724d9ff0deb..2e07a990fa3c 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -77,7 +77,6 @@ import android.util.Pair; import android.window.IDumpCallback; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.infra.AndroidFuture; import com.android.internal.util.function.pooled.PooledLambda; import java.io.IOException; @@ -92,7 +91,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; /** @@ -793,18 +791,8 @@ public class LauncherApps { public List<LauncherActivityInfo> getActivityList(String packageName, UserHandle user) { logErrorForInvalidProfileAccess(user); try { - final List<LauncherActivityInfo> activityList = convertToActivityList( - mService.getLauncherActivities( - mContext.getPackageName(), - packageName, - user - ), user); - if (activityList.isEmpty()) { - // b/350144057 - Log.d(TAG, "getActivityList: No launchable activities found for" - + "packageName=" + packageName + ", user=" + user); - } - return activityList; + return convertToActivityList(mService.getLauncherActivities(mContext.getPackageName(), + packageName, user), user); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 4c9e73c8b21f..a528ba4b16bf 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -1725,10 +1725,22 @@ public class InputMethodService extends AbstractInputMethodService { return "SettingsObserver{mShowImeWithHardKeyboard=" + mShowImeWithHardKeyboard + "}"; } } + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private SettingsObserver mSettingsObserver; /** + * Checks whether the IME should be shown when a hardware keyboard is connected, as configured + * through {@link Settings.Secure#SHOW_IME_WITH_HARD_KEYBOARD}, for testing purposes only. + * + * @hide + */ + @VisibleForTesting + public final boolean getShouldShowImeWithHardKeyboardForTesting() { + return mSettingsObserver.shouldShowImeWithHardKeyboard(); + } + + /** * You can call this to customize the theme used by your IME's window. * This theme should typically be one that derives from * {@link android.R.style#Theme_InputMethod}, which is the default theme @@ -4454,7 +4466,7 @@ public class InputMethodService extends AbstractInputMethodService { * * @hide */ - @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) + @VisibleForTesting public final boolean isImeNavigationBarShownForTesting() { return mNavigationBarController.isShown(); } diff --git a/core/java/android/os/PerfettoTrackEventExtra.java b/core/java/android/os/PerfettoTrackEventExtra.java index 72b909e64c70..32fbea4ff4c2 100644 --- a/core/java/android/os/PerfettoTrackEventExtra.java +++ b/core/java/android/os/PerfettoTrackEventExtra.java @@ -43,6 +43,12 @@ public final class PerfettoTrackEventExtra { } }; private static final AtomicLong sNamedTrackId = new AtomicLong(); + private static final Supplier<Flow> sFlowSupplier = Flow::new; + private static final Supplier<BuilderImpl> sBuilderSupplier = BuilderImpl::new; + private static final Supplier<FieldInt64> sFieldInt64Supplier = FieldInt64::new; + private static final Supplier<FieldDouble> sFieldDoubleSupplier = FieldDouble::new; + private static final Supplier<FieldString> sFieldStringSupplier = FieldString::new; + private static final Supplier<FieldNested> sFieldNestedSupplier = FieldNested::new; private CounterInt64 mCounterInt64; private CounterDouble mCounterDouble; @@ -139,13 +145,8 @@ public final class PerfettoTrackEventExtra { /** * Sets the event name for the track event. - * - * @param eventName can contain a format string specifier, in which case, the - * {@code args} are the format arguments. If no {@code args} are provided, - * the {@code eventName} should be the string itself. - * @param args format arguments if {@code eventName} is specified. */ - Builder setEventName(String eventName, Object... args); + Builder setEventName(String eventName); /** * Adds a debug arg with key {@code name} and value {@code val}. @@ -164,13 +165,8 @@ public final class PerfettoTrackEventExtra { /** * Adds a debug arg with key {@code name} and value {@code val}. - * - * @param val can contain a format string specifier, in which case, the - * {@code args} are the format arguments. If no {@code args} are provided, - * the {@code val} should be the string itself. - * @param args format arguments if {@code val} is specified. */ - Builder addArg(String name, String val, Object... args); + Builder addArg(String name, String val); /** * Adds a flow with {@code id}. @@ -185,68 +181,38 @@ public final class PerfettoTrackEventExtra { /** * Adds the events to a named track instead of the thread track where the * event occurred. - * - * @param name can contain a format string specifier, in which case, the - * {@code args} are the format arguments. If no {@code args} are provided, - * the {@code name} should be the string itself. - * @param args format arguments if {@code name} is specified. */ - Builder usingNamedTrack(long parentUuid, String name, Object... args); + Builder usingNamedTrack(long parentUuid, String name); /** * Adds the events to a process scoped named track instead of the thread track where the * event occurred. - * - * @param name can contain a format string specifier, in which case, the - * {@code args} are the format arguments. If no {@code args} are provided, - * the {@code name} should be the string itself. - * @param args format arguments if {@code name} is specified. */ - Builder usingProcessNamedTrack(String name, Object... args); + Builder usingProcessNamedTrack(String name); /** * Adds the events to a thread scoped named track instead of the thread track where the * event occurred. - * - * @param name can contain a format string specifier, in which case, the - * {@code args} are the format arguments. If no {@code args} are provided, - * the {@code name} should be the string itself. - * @param args format arguments if {@code name} is specified. */ - Builder usingThreadNamedTrack(long tid, String name, Object... args); + Builder usingThreadNamedTrack(long tid, String name); /** * Adds the events to a counter track instead. This is required for * setting counter values. - * - * @param name can contain a format string specifier, in which case, the - * {@code args} are the format arguments. If no {@code args} are provided, - * the {@code name} should be the string itself. - * @param args format arguments if {@code name} is specified. */ - Builder usingCounterTrack(long parentUuid, String name, Object... args); + Builder usingCounterTrack(long parentUuid, String name); /** * Adds the events to a process scoped counter track instead. This is required for * setting counter values. - * - * @param name can contain a format string specifier, in which case, the - * {@code args} are the format arguments. If no {@code args} are provided, - * the {@code name} should be the string itself. - * @param args format arguments if {@code eventName} is specified. */ - Builder usingProcessCounterTrack(String name, Object... args); + Builder usingProcessCounterTrack(String name); /** * Adds the events to a thread scoped counter track instead. This is required for * setting counter values. - * - * @param name can contain a format string specifier, in which case, the - * {@code args} are the format arguments. If no {@code args} are provided, - * the {@code name} should be the string itself. - * @param args format arguments if {@code name} is specified. */ - Builder usingThreadCounterTrack(long tid, String name, Object... args); + Builder usingThreadCounterTrack(long tid, String name); /** * Sets a long counter value on the event. @@ -272,13 +238,8 @@ public final class PerfettoTrackEventExtra { /** * Adds a proto field with field id {@code id} and value {@code val}. - * - * @param val can contain a format string specifier, in which case, the - * {@code args} are the format arguments. If no {@code args} are provided, - * the {@code val} should be the string itself. - * @param args format arguments if {@code val} is specified. */ - Builder addField(long id, String val, Object... args); + Builder addField(long id, String val); /** * Begins a proto field with field @@ -317,7 +278,7 @@ public final class PerfettoTrackEventExtra { return this; } @Override - public Builder setEventName(String eventName, Object... args) { + public Builder setEventName(String eventName) { return this; } @Override @@ -333,7 +294,7 @@ public final class PerfettoTrackEventExtra { return this; } @Override - public Builder addArg(String name, String val, Object... args) { + public Builder addArg(String name, String val) { return this; } @Override @@ -345,27 +306,27 @@ public final class PerfettoTrackEventExtra { return this; } @Override - public Builder usingNamedTrack(long parentUuid, String name, Object... args) { + public Builder usingNamedTrack(long parentUuid, String name) { return this; } @Override - public Builder usingProcessNamedTrack(String name, Object... args) { + public Builder usingProcessNamedTrack(String name) { return this; } @Override - public Builder usingThreadNamedTrack(long tid, String name, Object... args) { + public Builder usingThreadNamedTrack(long tid, String name) { return this; } @Override - public Builder usingCounterTrack(long parentUuid, String name, Object... args) { + public Builder usingCounterTrack(long parentUuid, String name) { return this; } @Override - public Builder usingProcessCounterTrack(String name, Object... args) { + public Builder usingProcessCounterTrack(String name) { return this; } @Override - public Builder usingThreadCounterTrack(long tid, String name, Object... args) { + public Builder usingThreadCounterTrack(long tid, String name) { return this; } @Override @@ -385,7 +346,7 @@ public final class PerfettoTrackEventExtra { return this; } @Override - public Builder addField(long id, String val, Object... args) { + public Builder addField(long id, String val) { return this; } @Override @@ -443,7 +404,6 @@ public final class PerfettoTrackEventExtra { private BuilderImpl() { mExtra = sTrackEventExtra.get(); - mNamedTrackCache = mExtra.mNamedTrackCache; mCounterTrackCache = mExtra.mCounterTrackCache; mArgInt64Cache = mExtra.mArgInt64Cache; @@ -489,8 +449,8 @@ public final class PerfettoTrackEventExtra { } @Override - public Builder setEventName(String eventName, Object... args) { - mEventName = toString(eventName, args); + public Builder setEventName(String eventName) { + mEventName = eventName; return this; } @@ -534,14 +494,14 @@ public final class PerfettoTrackEventExtra { } @Override - public Builder addArg(String name, String val, Object... args) { + public Builder addArg(String name, String val) { checkParent(); ArgString arg = mArgStringCache.get(name.hashCode()); if (arg == null || !arg.getName().equals(name)) { arg = new ArgString(name); mArgStringCache.put(name.hashCode(), arg); } - arg.setValue(toString(val, args)); + arg.setValue(val); mExtra.addPerfettoPointer(arg); return this; } @@ -549,7 +509,7 @@ public final class PerfettoTrackEventExtra { @Override public Builder addFlow(int id) { checkParent(); - Flow flow = mFlowCache.get(Flow::new); + Flow flow = mFlowCache.get(sFlowSupplier); flow.setProcessFlow(id); mExtra.addPerfettoPointer(flow); return this; @@ -558,16 +518,15 @@ public final class PerfettoTrackEventExtra { @Override public Builder addTerminatingFlow(int id) { checkParent(); - Flow flow = mFlowCache.get(Flow::new); + Flow flow = mFlowCache.get(sFlowSupplier); flow.setProcessTerminatingFlow(id); mExtra.addPerfettoPointer(flow); return this; } @Override - public Builder usingNamedTrack(long parentUuid, String name, Object... args) { + public Builder usingNamedTrack(long parentUuid, String name) { checkParent(); - name = toString(name, args); NamedTrack track = mNamedTrackCache.get(name.hashCode()); if (track == null || !track.getName().equals(name)) { @@ -579,19 +538,18 @@ public final class PerfettoTrackEventExtra { } @Override - public Builder usingProcessNamedTrack(String name, Object... args) { - return usingNamedTrack(PerfettoTrace.getProcessTrackUuid(), name, args); + public Builder usingProcessNamedTrack(String name) { + return usingNamedTrack(PerfettoTrace.getProcessTrackUuid(), name); } @Override - public Builder usingThreadNamedTrack(long tid, String name, Object... args) { - return usingNamedTrack(PerfettoTrace.getThreadTrackUuid(tid), name, args); + public Builder usingThreadNamedTrack(long tid, String name) { + return usingNamedTrack(PerfettoTrace.getThreadTrackUuid(tid), name); } @Override - public Builder usingCounterTrack(long parentUuid, String name, Object... args) { + public Builder usingCounterTrack(long parentUuid, String name) { checkParent(); - name = toString(name, args); CounterTrack track = mCounterTrackCache.get(name.hashCode()); if (track == null || !track.getName().equals(name)) { @@ -603,13 +561,13 @@ public final class PerfettoTrackEventExtra { } @Override - public Builder usingProcessCounterTrack(String name, Object... args) { - return usingCounterTrack(PerfettoTrace.getProcessTrackUuid(), name, args); + public Builder usingProcessCounterTrack(String name) { + return usingCounterTrack(PerfettoTrace.getProcessTrackUuid(), name); } @Override - public Builder usingThreadCounterTrack(long tid, String name, Object... args) { - return usingCounterTrack(PerfettoTrace.getThreadTrackUuid(tid), name, args); + public Builder usingThreadCounterTrack(long tid, String name) { + return usingCounterTrack(PerfettoTrace.getThreadTrackUuid(tid), name); } @Override @@ -631,7 +589,7 @@ public final class PerfettoTrackEventExtra { @Override public Builder addField(long id, long val) { checkContainer(); - FieldInt64 field = mFieldInt64Cache.get(FieldInt64::new); + FieldInt64 field = mFieldInt64Cache.get(sFieldInt64Supplier); field.setValue(id, val); mCurrentContainer.addField(field); return this; @@ -640,17 +598,17 @@ public final class PerfettoTrackEventExtra { @Override public Builder addField(long id, double val) { checkContainer(); - FieldDouble field = mFieldDoubleCache.get(FieldDouble::new); + FieldDouble field = mFieldDoubleCache.get(sFieldDoubleSupplier); field.setValue(id, val); mCurrentContainer.addField(field); return this; } @Override - public Builder addField(long id, String val, Object... args) { + public Builder addField(long id, String val) { checkContainer(); - FieldString field = mFieldStringCache.get(FieldString::new); - field.setValue(id, toString(val, args)); + FieldString field = mFieldStringCache.get(sFieldStringSupplier); + field.setValue(id, val); mCurrentContainer.addField(field); return this; } @@ -660,7 +618,7 @@ public final class PerfettoTrackEventExtra { checkParent(); mProto.clearFields(); mExtra.addPerfettoPointer(mProto); - return mBuilderCache.get(BuilderImpl::new).initInternal(this, mProto); + return mBuilderCache.get(sBuilderSupplier).initInternal(this, mProto); } @Override @@ -674,10 +632,10 @@ public final class PerfettoTrackEventExtra { @Override public Builder beginNested(long id) { checkContainer(); - FieldNested field = mFieldNestedCache.get(FieldNested::new); + FieldNested field = mFieldNestedCache.get(sFieldNestedSupplier); field.setId(id); mCurrentContainer.addField(field); - return mBuilderCache.get(BuilderImpl::new).initInternal(this, field); + return mBuilderCache.get(sBuilderSupplier).initInternal(this, field); } @Override @@ -688,10 +646,6 @@ public final class PerfettoTrackEventExtra { return mParent; } - private static String toString(String val, Object... args) { - return args == null || args.length == 0 ? val : String.format(val, args); - } - private Builder initInternal(Builder parent, FieldContainer container) { mParent = parent; mCurrentContainer = container; @@ -727,7 +681,7 @@ public final class PerfettoTrackEventExtra { * Start a {@link Builder} to build a {@link PerfettoTrackEventExtra}. */ public static Builder builder() { - return sTrackEventExtra.get().mBuilderCache.get(BuilderImpl::new).initInternal(null, null); + return sTrackEventExtra.get().mBuilderCache.get(sBuilderSupplier).initInternal(null, null); } /** diff --git a/core/java/android/window/DesktopModeFlags.java b/core/java/android/window/DesktopModeFlags.java index 943628076560..785246074cee 100644 --- a/core/java/android/window/DesktopModeFlags.java +++ b/core/java/android/window/DesktopModeFlags.java @@ -61,6 +61,10 @@ public enum DesktopModeFlags { ENABLE_DESKTOP_SKIP_COMPAT_UI_EDUCATION_IN_DESKTOP_MODE_BUGFIX( Flags::skipCompatUiEducationInDesktopMode, true), ENABLE_DESKTOP_SYSTEM_DIALOGS_TRANSITIONS(Flags::enableDesktopSystemDialogsTransitions, true), + ENABLE_DESKTOP_TAB_TEARING_MINIMIZE_ANIMATION_BUGFIX( + Flags::enableDesktopTabTearingMinimizeAnimationBugfix, false), + ENABLE_DESKTOP_TRAMPOLINE_CLOSE_ANIMATION_BUGFIX( + Flags::enableDesktopTrampolineCloseAnimationBugfix, false), ENABLE_DESKTOP_WALLPAPER_ACTIVITY_FOR_SYSTEM_USER( Flags::enableDesktopWallpaperActivityForSystemUser, true), ENABLE_DESKTOP_WINDOWING_APP_TO_WEB(Flags::enableDesktopWindowingAppToWeb, true), diff --git a/core/java/android/window/flags/lse_desktop_experience.aconfig b/core/java/android/window/flags/lse_desktop_experience.aconfig index 453c3ebe92ab..d413ba0b042c 100644 --- a/core/java/android/window/flags/lse_desktop_experience.aconfig +++ b/core/java/android/window/flags/lse_desktop_experience.aconfig @@ -616,6 +616,16 @@ flag { } flag { + name: "exclude_caption_from_app_bounds" + namespace: "lse_desktop_experience" + description: "Whether caption insets are excluded from app bounds in freeform" + bug: "388014743" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "enable_desktop_mode_through_dev_option" namespace: "lse_desktop_experience" description: "Enables support for desktop mode through developer options for devices eligible for desktop mode." diff --git a/core/java/android/window/flags/window_surfaces.aconfig b/core/java/android/window/flags/window_surfaces.aconfig index 8ff2e6aebdd0..d866b0e2f89e 100644 --- a/core/java/android/window/flags/window_surfaces.aconfig +++ b/core/java/android/window/flags/window_surfaces.aconfig @@ -106,3 +106,15 @@ flag { is_exported: true bug: "293949943" } + +flag { + namespace: "window_surfaces" + name: "fix_hide_overlay_api" + description: "Application that calls setHideOverlayWindows() shouldn't hide its own windows, this flag gate the fix of this issue." + is_fixed_read_only: true + is_exported: true + bug: "359424300" + metadata { + purpose: PURPOSE_BUGFIX + } +} diff --git a/core/java/com/android/internal/util/RateLimitingCache.java b/core/java/com/android/internal/util/RateLimitingCache.java index 9916076fd0ef..956d5d680fe7 100644 --- a/core/java/com/android/internal/util/RateLimitingCache.java +++ b/core/java/com/android/internal/util/RateLimitingCache.java @@ -17,6 +17,8 @@ package com.android.internal.util; import android.os.SystemClock; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; /** * A speed/rate limiting cache that's used to cache a value to be returned as long as period hasn't @@ -30,6 +32,12 @@ import android.os.SystemClock; * and then the cached value is returned for the remainder of the period. It uses a simple fixed * window method to track rate. Use a window and count appropriate for bursts of calls and for * high latency/cost of the AIDL call. + * <p> + * This class is thread-safe. When multiple threads call get(), they will all fetch a new value + * if the cached value is stale. This is to prevent a slow getting thread from blocking other + * threads from getting a fresh value. In such circumsntaces it's possible to exceed + * <code>count</code> calls in a given period by up to the number of threads that are concurrently + * attempting to get a fresh value minus one. * * @param <Value> The type of the return value * @hide @@ -37,12 +45,11 @@ import android.os.SystemClock; @android.ravenwood.annotation.RavenwoodKeepWholeClass public class RateLimitingCache<Value> { - private volatile Value mCurrentValue; - private volatile long mLastTimestamp; // Can be last fetch time or window start of fetch time private final long mPeriodMillis; // window size private final int mLimit; // max per window - private int mCount = 0; // current count within window - private long mRandomOffset; // random offset to avoid batching of AIDL calls at window boundary + // random offset to avoid batching of AIDL calls at window boundary + private final long mRandomOffset; + private final AtomicReference<CachedValue> mCachedValue = new AtomicReference(); /** * The interface to fetch the actual value, if the cache is null or expired. @@ -56,6 +63,12 @@ public class RateLimitingCache<Value> { V fetchValue(); } + class CachedValue { + Value value; + long timestamp; + AtomicInteger count; // current count within window + } + /** * Create a speed limiting cache that returns the same value until periodMillis has passed * and then fetches a new value via the {@link ValueFetcher}. @@ -83,6 +96,8 @@ public class RateLimitingCache<Value> { mLimit = count; if (mLimit > 1 && periodMillis > 1) { mRandomOffset = (long) (Math.random() * (periodMillis / 2)); + } else { + mRandomOffset = 0; } } @@ -102,34 +117,39 @@ public class RateLimitingCache<Value> { * @return the cached or latest value */ public Value get(ValueFetcher<Value> query) { - // If the value never changes - if (mPeriodMillis < 0 && mLastTimestamp != 0) { - return mCurrentValue; - } + CachedValue cached = mCachedValue.get(); - synchronized (this) { - // Get the current time and add a random offset to avoid colliding with other - // caches with similar harmonic window boundaries - final long now = getTime() + mRandomOffset; - final boolean newWindow = now - mLastTimestamp >= mPeriodMillis; - if (newWindow || mCount < mLimit) { - // Fetch a new value - mCurrentValue = query.fetchValue(); + // If the value never changes and there is a previous cached value, return it + if (mPeriodMillis < 0 && cached != null && cached.timestamp != 0) { + return cached.value; + } - // If rate limiting, set timestamp to start of this window - if (mLimit > 1) { - mLastTimestamp = now - (now % mPeriodMillis); - } else { - mLastTimestamp = now; - } + // Get the current time and add a random offset to avoid colliding with other + // caches with similar harmonic window boundaries + final long now = getTime() + mRandomOffset; + final boolean newWindow = cached == null || now - cached.timestamp >= mPeriodMillis; + if (newWindow || cached.count.getAndIncrement() < mLimit) { + // Fetch a new value + Value freshValue = query.fetchValue(); + long freshTimestamp = now; + // If rate limiting, set timestamp to start of this window + if (mLimit > 1) { + freshTimestamp = now - (now % mPeriodMillis); + } - if (newWindow) { - mCount = 1; - } else { - mCount++; - } + CachedValue freshCached = new CachedValue(); + freshCached.value = freshValue; + freshCached.timestamp = freshTimestamp; + if (newWindow) { + freshCached.count = new AtomicInteger(1); + } else { + freshCached.count = cached.count; } - return mCurrentValue; + + // If we fail to CAS then it means that another thread beat us to it. + // In this case we don't override their work. + mCachedValue.compareAndSet(cached, freshCached); } + return mCachedValue.get().value; } } diff --git a/core/jni/Android.bp b/core/jni/Android.bp index a2f4ca2c1b06..447822f0903f 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -42,6 +42,8 @@ cc_library_shared_for_libandroid_runtime { "-DU_USING_ICU_NAMESPACE=0", + "-DANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION", + "-Wall", "-Werror", "-Wextra", diff --git a/core/jni/android_content_res_ObbScanner.cpp b/core/jni/android_content_res_ObbScanner.cpp index 760037f63195..5b412ab19e16 100644 --- a/core/jni/android_content_res_ObbScanner.cpp +++ b/core/jni/android_content_res_ObbScanner.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "ObbScanner" diff --git a/core/jni/android_graphics_BLASTBufferQueue.cpp b/core/jni/android_graphics_BLASTBufferQueue.cpp index 10d6d33c5a76..a52678359423 100644 --- a/core/jni/android_graphics_BLASTBufferQueue.cpp +++ b/core/jni/android_graphics_BLASTBufferQueue.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "BLASTBufferQueue" diff --git a/core/jni/android_graphics_GraphicBuffer.cpp b/core/jni/android_graphics_GraphicBuffer.cpp index d5765f1907d5..61dbb32c3b9f 100644 --- a/core/jni/android_graphics_GraphicBuffer.cpp +++ b/core/jni/android_graphics_GraphicBuffer.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "GraphicBuffer" diff --git a/core/jni/android_graphics_SurfaceTexture.cpp b/core/jni/android_graphics_SurfaceTexture.cpp index 8dd63cc07b8a..93d1e2eef9e7 100644 --- a/core/jni/android_graphics_SurfaceTexture.cpp +++ b/core/jni/android_graphics_SurfaceTexture.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #undef LOG_TAG #define LOG_TAG "SurfaceTexture" diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 42406147b2f0..003ebc032a29 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -14,6 +14,7 @@ ** See the License for the specific language governing permissions and ** limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code //#define LOG_NDEBUG 0 #define LOG_TAG "Camera-JNI" diff --git a/core/jni/android_hardware_HardwareBuffer.cpp b/core/jni/android_hardware_HardwareBuffer.cpp index 2ea2158d1884..c8059f39a34a 100644 --- a/core/jni/android_hardware_HardwareBuffer.cpp +++ b/core/jni/android_hardware_HardwareBuffer.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "HardwareBuffer" diff --git a/core/jni/android_hardware_SensorManager.cpp b/core/jni/android_hardware_SensorManager.cpp index 56ea52d2ad8b..2864a5718f33 100644 --- a/core/jni/android_hardware_SensorManager.cpp +++ b/core/jni/android_hardware_SensorManager.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "SensorManager" #include <nativehelper/JNIHelp.h> diff --git a/core/jni/android_hardware_camera2_CameraMetadata.cpp b/core/jni/android_hardware_camera2_CameraMetadata.cpp index a0987373687b..7629faa3a72c 100644 --- a/core/jni/android_hardware_camera2_CameraMetadata.cpp +++ b/core/jni/android_hardware_camera2_CameraMetadata.cpp @@ -14,6 +14,7 @@ ** See the License for the specific language governing permissions and ** limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code // #define LOG_NDEBUG 0 #include <memory> diff --git a/core/jni/android_hardware_camera2_DngCreator.cpp b/core/jni/android_hardware_camera2_DngCreator.cpp index 82570be8e329..828f2eb76c60 100644 --- a/core/jni/android_hardware_camera2_DngCreator.cpp +++ b/core/jni/android_hardware_camera2_DngCreator.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code //#define LOG_NDEBUG 0 #define LOG_TAG "DngCreator_JNI" diff --git a/core/jni/android_hardware_display_DisplayTopology.cpp b/core/jni/android_hardware_display_DisplayTopology.cpp index a16f3c3c20b8..a11b3cebef47 100644 --- a/core/jni/android_hardware_display_DisplayTopology.cpp +++ b/core/jni/android_hardware_display_DisplayTopology.cpp @@ -81,7 +81,7 @@ status_t android_hardware_display_DisplayTopologyGraphNode_toNative( for (jsize i = 0; i < length; i++) { ScopedLocalRef<jobject> adjacentDisplayObj(env, env->GetObjectArrayElement(adjacentDisplaysArray, i)); - if (NULL != adjacentDisplayObj.get()) { + if (NULL == adjacentDisplayObj.get()) { break; // found null element indicating end of used portion of the array } @@ -109,7 +109,7 @@ DisplayTopologyGraph android_hardware_display_DisplayTopologyGraph_toNative(JNIE jsize length = env->GetArrayLength(nodesArray); for (jsize i = 0; i < length; i++) { ScopedLocalRef<jobject> nodeObj(env, env->GetObjectArrayElement(nodesArray, i)); - if (NULL != nodeObj.get()) { + if (NULL == nodeObj.get()) { break; // found null element indicating end of used portion of the array } diff --git a/core/jni/android_hardware_input_InputWindowHandle.cpp b/core/jni/android_hardware_input_InputWindowHandle.cpp index f1c4913fe006..a3de6fbc3992 100644 --- a/core/jni/android_hardware_input_InputWindowHandle.cpp +++ b/core/jni/android_hardware_input_InputWindowHandle.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "InputWindowHandle" diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp index 5a183925e38e..102edc944c22 100644 --- a/core/jni/android_media_AudioRecord.cpp +++ b/core/jni/android_media_AudioRecord.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code //#define LOG_NDEBUG 0 diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 3d9a19e129a8..2ba6bc4912c3 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -14,6 +14,7 @@ ** See the License for the specific language governing permissions and ** limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code //#define LOG_NDEBUG 0 diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp index 5d4d1ce20e5d..3fc1a02f46b6 100644 --- a/core/jni/android_media_AudioTrack.cpp +++ b/core/jni/android_media_AudioTrack.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code //#define LOG_NDEBUG 0 #define LOG_TAG "AudioTrack-JNI" diff --git a/core/jni/android_media_AudioVolumeGroupCallback.cpp b/core/jni/android_media_AudioVolumeGroupCallback.cpp index cb4ddbd119d5..d130a4bc68fa 100644 --- a/core/jni/android_media_AudioVolumeGroupCallback.cpp +++ b/core/jni/android_media_AudioVolumeGroupCallback.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code //#define LOG_NDEBUG 0 diff --git a/core/jni/android_media_RemoteDisplay.cpp b/core/jni/android_media_RemoteDisplay.cpp index 3b517f1eafe0..cf96f027bd5e 100644 --- a/core/jni/android_media_RemoteDisplay.cpp +++ b/core/jni/android_media_RemoteDisplay.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "RemoteDisplay" diff --git a/core/jni/android_media_ToneGenerator.cpp b/core/jni/android_media_ToneGenerator.cpp index cc4657ded596..3c590c37adac 100644 --- a/core/jni/android_media_ToneGenerator.cpp +++ b/core/jni/android_media_ToneGenerator.cpp @@ -14,6 +14,7 @@ ** See the License for the specific language governing permissions and ** limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "ToneGenerator" #include <stdio.h> diff --git a/core/jni/android_opengl_EGL14.cpp b/core/jni/android_opengl_EGL14.cpp index 917d28348d04..7e9beefdc38c 100644 --- a/core/jni/android_opengl_EGL14.cpp +++ b/core/jni/android_opengl_EGL14.cpp @@ -632,7 +632,7 @@ not_valid_surface: if (producer == NULL) goto not_valid_surface; - window = new android::Surface(producer, true); + window = android::sp<android::Surface>::make(producer, true); if (window == NULL) goto not_valid_surface; diff --git a/core/jni/android_os_HwBinder.cpp b/core/jni/android_os_HwBinder.cpp index 734b5f497e2e..8060e6232482 100644 --- a/core/jni/android_os_HwBinder.cpp +++ b/core/jni/android_os_HwBinder.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code //#define LOG_NDEBUG 0 #define LOG_TAG "android_os_HwBinder" diff --git a/core/jni/android_os_HwBlob.cpp b/core/jni/android_os_HwBlob.cpp index e554b44233b5..df579af0acb4 100644 --- a/core/jni/android_os_HwBlob.cpp +++ b/core/jni/android_os_HwBlob.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code //#define LOG_NDEBUG 0 #define LOG_TAG "android_os_HwBlob" diff --git a/core/jni/android_os_HwParcel.cpp b/core/jni/android_os_HwParcel.cpp index c7866524668f..727455c21e02 100644 --- a/core/jni/android_os_HwParcel.cpp +++ b/core/jni/android_os_HwParcel.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code //#define LOG_NDEBUG 0 #define LOG_TAG "android_os_HwParcel" diff --git a/core/jni/android_os_HwRemoteBinder.cpp b/core/jni/android_os_HwRemoteBinder.cpp index d2d7213e5761..3b567092f6a6 100644 --- a/core/jni/android_os_HwRemoteBinder.cpp +++ b/core/jni/android_os_HwRemoteBinder.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code //#define LOG_NDEBUG 0 #define LOG_TAG "JHwRemoteBinder" diff --git a/core/jni/android_os_MessageQueue.cpp b/core/jni/android_os_MessageQueue.cpp index 30d9ea19be39..d5d5521eb8c8 100644 --- a/core/jni/android_os_MessageQueue.cpp +++ b/core/jni/android_os_MessageQueue.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "MessageQueue-JNI" diff --git a/core/jni/android_tracing_PerfettoDataSource.cpp b/core/jni/android_tracing_PerfettoDataSource.cpp index fec28987e7e6..ea896e1678a7 100644 --- a/core/jni/android_tracing_PerfettoDataSource.cpp +++ b/core/jni/android_tracing_PerfettoDataSource.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "NativeJavaPerfettoDs" @@ -489,4 +490,4 @@ int register_android_tracing_PerfettoDataSource(JNIEnv* env) { return 0; } -} // namespace android
\ No newline at end of file +} // namespace android diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 639f5bff7614..1ca8e2023cb2 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "JavaBinder" //#define LOG_NDEBUG 0 diff --git a/core/jni/android_view_CompositionSamplingListener.cpp b/core/jni/android_view_CompositionSamplingListener.cpp index 59c01dc37593..28616a063730 100644 --- a/core/jni/android_view_CompositionSamplingListener.cpp +++ b/core/jni/android_view_CompositionSamplingListener.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "CompositionSamplingListener" diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp index 7ff1f8c4a748..d8f1b626abf2 100644 --- a/core/jni/android_view_DisplayEventReceiver.cpp +++ b/core/jni/android_view_DisplayEventReceiver.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "DisplayEventReceiver" diff --git a/core/jni/android_view_InputEventReceiver.cpp b/core/jni/android_view_InputEventReceiver.cpp index 6272fb1947c1..535bfd23d8c4 100644 --- a/core/jni/android_view_InputEventReceiver.cpp +++ b/core/jni/android_view_InputEventReceiver.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "InputEventReceiver" #define ATRACE_TAG ATRACE_TAG_INPUT diff --git a/core/jni/android_view_InputEventSender.cpp b/core/jni/android_view_InputEventSender.cpp index 88b02baab924..01309b795567 100644 --- a/core/jni/android_view_InputEventSender.cpp +++ b/core/jni/android_view_InputEventSender.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "InputEventSender" diff --git a/core/jni/android_view_InputQueue.cpp b/core/jni/android_view_InputQueue.cpp index 50d2cbe2ce74..17165d8a03fe 100644 --- a/core/jni/android_view_InputQueue.cpp +++ b/core/jni/android_view_InputQueue.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "InputQueue" diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index ac6298d3d0b4..312c2067d396 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "Surface" diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 6f69e4005b80..d61d18b9b193 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "SurfaceControl" #define LOG_NDEBUG 0 diff --git a/core/jni/android_view_SurfaceControlHdrLayerInfoListener.cpp b/core/jni/android_view_SurfaceControlHdrLayerInfoListener.cpp index 443f99a78f02..09cb8116d04b 100644 --- a/core/jni/android_view_SurfaceControlHdrLayerInfoListener.cpp +++ b/core/jni/android_view_SurfaceControlHdrLayerInfoListener.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "SurfaceControlHdrLayerInfoListener" diff --git a/core/jni/android_view_SurfaceSession.cpp b/core/jni/android_view_SurfaceSession.cpp index 0aac07d17cdc..6ad109e80752 100644 --- a/core/jni/android_view_SurfaceSession.cpp +++ b/core/jni/android_view_SurfaceSession.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "SurfaceSession" diff --git a/core/jni/android_view_TextureView.cpp b/core/jni/android_view_TextureView.cpp index 391f515af115..21fe1f020b29 100644 --- a/core/jni/android_view_TextureView.cpp +++ b/core/jni/android_view_TextureView.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #include "jni.h" #include <nativehelper/JNIHelp.h> diff --git a/core/jni/android_view_TunnelModeEnabledListener.cpp b/core/jni/android_view_TunnelModeEnabledListener.cpp index d9ab9571cfbe..fd78a94fc2d9 100644 --- a/core/jni/android_view_TunnelModeEnabledListener.cpp +++ b/core/jni/android_view_TunnelModeEnabledListener.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "TunnelModeEnabledListener" diff --git a/core/jni/android_window_InputTransferToken.cpp b/core/jni/android_window_InputTransferToken.cpp index 5bcea9b7c401..f92d128c7077 100644 --- a/core/jni/android_window_InputTransferToken.cpp +++ b/core/jni/android_window_InputTransferToken.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "InputTransferToken" @@ -137,4 +138,4 @@ int register_android_window_InputTransferToken(JNIEnv* env) { return err; } -} // namespace android
\ No newline at end of file +} // namespace android diff --git a/core/jni/android_window_ScreenCapture.cpp b/core/jni/android_window_ScreenCapture.cpp index 5657fa146b5b..7b085b16d24b 100644 --- a/core/jni/android_window_ScreenCapture.cpp +++ b/core/jni/android_window_ScreenCapture.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "ScreenCapture" // #define LOG_NDEBUG 0 diff --git a/core/jni/android_window_WindowInfosListener.cpp b/core/jni/android_window_WindowInfosListener.cpp index c39d5e20aa1c..30846ef99d60 100644 --- a/core/jni/android_window_WindowInfosListener.cpp +++ b/core/jni/android_window_WindowInfosListener.cpp @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #define LOG_TAG "WindowInfosListener" diff --git a/core/jni/com_google_android_gles_jni_EGLImpl.cpp b/core/jni/com_google_android_gles_jni_EGLImpl.cpp index 5aea8485d0c1..75330be2624d 100644 --- a/core/jni/com_google_android_gles_jni_EGLImpl.cpp +++ b/core/jni/com_google_android_gles_jni_EGLImpl.cpp @@ -14,6 +14,7 @@ ** See the License for the specific language governing permissions and ** limitations under the License. */ +#undef ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION // TODO:remove this and fix code #include <nativehelper/JNIHelp.h> #include <android_runtime/AndroidRuntime.h> diff --git a/core/res/res/drawable/ic_notification_summarization.xml b/core/res/res/drawable/ic_notification_summarization.xml new file mode 100644 index 000000000000..de905fa10728 --- /dev/null +++ b/core/res/res/drawable/ic_notification_summarization.xml @@ -0,0 +1,23 @@ +<!-- +Copyright (C) 2025 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="16dp" + android:height="16dp" + android:tint="?android:attr/colorControlNormal" + android:viewportHeight="960" + android:viewportWidth="960"> + <path android:fillColor="#ffffff" android:pathData="M354,673L480,597L606,674L573,530L684,434L538,421L480,285L422,420L276,433L387,530L354,673ZM233,840L298,559L80,370L368,345L480,80L592,345L880,370L662,559L727,840L480,691L233,840ZM480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490L480,490Z"/> +</vector>
\ No newline at end of file diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 1c7ce89dc0ad..368cf65ae67c 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Ontspeld"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Ontspeld <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Appinligting"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Begin tans demonstrasie …"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Stel toestel tans terug …"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-paneel links"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-paneel regs"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-paneel middel"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in die BEPERK-groep geplaas"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"het \'n prent gestuur"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Jou vingerafdrukke kan nie meer herken word nie. Stel Vingerafdrukslot weer op."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 0f5fee4cf9da..1ab3beb71858 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"ንቀል"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ንቀል"</string> <string name="app_info" msgid="6113278084877079851">"የመተግበሪያ መረጃ"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"ማሳያን በማስጀመር ላይ…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"መሣሪያን ዳግም በማስጀመር ላይ…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ከDpad በስተግራ"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ከDpad በስተቀኝ"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"የDpad ማዕከል"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ወደ የRESTRICTED ባልዲ ተከትቷል"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>፦"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"አንድ ምስል ልከዋል"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"ካርታዎች"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"መተግበሪያዎች"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ከእንግዲህ የጣት አሻራዎችዎ ሊለዩ አይችሉም። በጣት አሻራ መክፈቻን እንደገና ያዋቅሩ።"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 68712916e1df..637b08daa171 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1016,7 +1016,7 @@ <string name="lockscreen_password_wrong" msgid="8605355913868947490">"أعد المحاولة"</string> <string name="lockscreen_storage_locked" msgid="634993789186443380">"فتح القفل للوصول إلى جميع الميزات والبيانات"</string> <string name="faceunlock_multiple_failures" msgid="681991538434031708">"تم تجاوز الحد الأقصى لعدد محاولات فتح الجهاز ببصمة الوجه"</string> - <string name="lockscreen_missing_sim_message_short" msgid="1229301273156907613">"لا تتوفر شريحة SIM."</string> + <string name="lockscreen_missing_sim_message_short" msgid="1229301273156907613">"لا تتوفر شريحة SIM"</string> <string name="lockscreen_missing_sim_message" product="tablet" msgid="3986843848305639161">"لا تتوفر شريحة SIM في الجهاز اللوحي."</string> <string name="lockscreen_missing_sim_message" product="tv" msgid="3903140876952198273">"لا تتوفر شريحة SIM في جهاز Android TV."</string> <string name="lockscreen_missing_sim_message" product="default" msgid="6184187634180854181">"لا تتوفر شريحة SIM في الهاتف."</string> @@ -2092,6 +2092,12 @@ <string name="unpin_target" msgid="3963318576590204447">"إزالة تثبيت"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"إزالة تثبيت <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"معلومات عن التطبيق"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"جارٍ بدء العرض التوضيحي…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"جارٍ إعادة ضبط الجهاز…"</string> @@ -2246,6 +2252,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"زرّ الاتجاه لليسار"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"زرّ الاتجاه لليمين"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"الزرّ المركزي"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"لوحة إعدادات نوع النقر التلقائي"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"النقر بالزر الأيسر"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"إيقاف مؤقت"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"تعديل الموضع"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"تم وضع <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> في الحزمة \"محظورة\"."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"هذا المستخدم أرسل صورة"</string> @@ -2520,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"خرائط Google"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"التطبيقات"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"لم يعد بالإمكان التعرّف على بصمات أصابعك. يجب ضبط ميزة \"فتح الجهاز ببصمة الإصبع\" مجددًا."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 48895bc41000..95d442bf43a4 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"আনপিন"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ক আনপিন কৰক"</string> <string name="app_info" msgid="6113278084877079851">"এপ্ সম্পৰ্কীয় তথ্য"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"ডেম\' আৰম্ভ কৰি থকা হৈছে…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"ডিভাইচটো আকৌ ছেটিং কৰি থকা হৈছে…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ডিপেডৰ বাওঁফালৰ বুটাম"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ডিপেডৰ সোঁফালৰ বুটাম"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"ডিপেডৰ মাজৰ বুটাম"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ক সীমাবদ্ধ বাকেটটোত ৰখা হৈছে"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"এখন প্ৰতিচ্ছবি পঠিয়াইছে"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"মেপ"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"এপ্লিকেশ্বন"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"আপোনাৰ ফিংগাৰপ্ৰিণ্ট আৰু চিনাক্ত কৰিব নোৱাৰি। ফিংগাৰপ্ৰিণ্ট আনলক পুনৰ ছেট আপ কৰক।"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 9084407b1c6d..4f7da4f74a71 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Çıxarın"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"İşarələməyin: <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Tətbiq haqqında"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Demo başlayır…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Cihaz sıfırlanır…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Sola"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Sağa"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Mərkəzə"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> MƏHDUDLAŞDIRILMIŞ səbətinə yerləşdirilib"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"şəkil göndərdi"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Xəritə"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Tətbiqlər"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Barmaq izlərinizi artıq tanımaq mümkün deyil. Barmaqla Kilidaçmanı yenidən ayarlayın."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 2abb7f4da9af..049359b85a1e 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Otkači"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Otkači aplikaciju <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Informacije o aplikaciji"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Pokrećemo demonstraciju..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Resetujemo uređaj..."</string> @@ -2243,6 +2249,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"nalevo na D-pad-u"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"nadesno na D-pad-u"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"centar na D-pad-u"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Okno sa podešavanjima tipa automatskog klika"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Levi klik"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauziraj"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicija"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je dodat u segment OGRANIČENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"je poslao/la sliku"</string> @@ -2517,4 +2527,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mape"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacije"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Otisci prstiju više ne mogu da se prepoznaju. Ponovo podesite otključavanje otiskom prsta."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 7f57c8747e23..02cc889e9ecc 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -2090,6 +2090,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Адмацаваць"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Адмацаваць праграму \"<xliff:g id="LABEL">%1$s</xliff:g>\""</string> <string name="app_info" msgid="6113278084877079851">"Звесткі аб праграме"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Ідзе запуск дэманстрацыі…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Ідзе скід налад прылады…"</string> @@ -2244,6 +2250,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Улева на панэлі кіравання"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Управа на панэлі кіравання"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"У цэнтр на панэлі кіравання"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" дададзены ў АБМЕЖАВАНУЮ групу"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"адпраўлены відарыс"</string> @@ -2518,4 +2532,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карты"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Праграмы"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Вашы адбіткі пальцаў больш не распазнаюцца. Паўторна наладзьце разблакіроўку адбіткам пальца."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 6bff361516e5..d85e319edaaa 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Освобождаване"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Премахване на фиксирането на <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Информация за приложението"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Демонстрацията се стартира…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Устройството се нулира…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Контролен пад – ляво"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Контролен пад – дясно"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Контролен пад – център"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакетът <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е поставен в ОГРАНИЧЕНИЯ контейнер"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"изпратено изображение"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карти"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Приложения"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Отпечатъците ви вече не могат да бъдат разпознати. Настройте отново „Отключване с отпечатък“."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 82d1da312905..19d4962175b1 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"আনপিন করুন"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> অ্যাপ আনপিন করুন"</string> <string name="app_info" msgid="6113278084877079851">"অ্যাপের তথ্য"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"ডেমো শুরু করা হচ্ছে…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"ডিভাইস আবার সেট করা হচ্ছে…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ডিপ্যাড (Dpad)-এর বাঁদিকে"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ডিপ্যাড (Dpad)-এর ডানদিকে"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"ডিপ্যাড (Dpad)-এর মাঝখানে"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> সীমাবদ্ধ গ্রুপে অন্তর্ভুক্ত করা হয়েছে"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"একটি ছবি পাঠানো হয়েছে"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"ম্যাপ"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"অ্যাপ্লিকেশন"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"আপনার ফিঙ্গারপ্রিন্ট আর শনাক্ত করা যাবে না। \'ফিঙ্গারপ্রিন্ট আনলক\' ফিচার আবার সেট-আপ করুন।"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index d055f762858b..e95bedf3dcd3 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Otkači"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Otkači aplikaciju <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Informacije o aplikaciji"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Pokretanje demonstracije…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Vraćanje uređaja na početne postavke…"</string> @@ -2243,6 +2249,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Upravljač lijevo"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Upravljač desno"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Upravljač sredina"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Ploča postavki vrste automatskog klika"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Lijevi klik"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauziraj"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicija"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je stavljen u odjeljak OGRANIČENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"je poslao/la sliku"</string> @@ -2517,4 +2527,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mape"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacije"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaši otisci prstiju se više ne mogu prepoznavati. Ponovo postavite otključavanje otiskom prsta."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 2b0e6fca8caa..9b67f28bbfb2 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"No fixis"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"No fixis <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Informació de l\'app"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"S\'està iniciant la demostració…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"S\'està restablint el dispositiu…"</string> @@ -2243,6 +2249,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Creu direccional: esquerra"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Creu direccional: dreta"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Creu direccional: centre"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> s\'ha transferit al segment RESTRINGIT"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ha enviat una imatge"</string> @@ -2517,4 +2531,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicacions"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Les teves empremtes digitals ja no es poden reconèixer. Torna a configurar Desbloqueig amb empremta digital."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index e8f75f3b957f..f4eef972c0d1 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -2090,6 +2090,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Odepnout"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Odepnout: <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"O aplikaci"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Spouštění ukázky…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Resetování zařízení…"</string> @@ -2244,6 +2250,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad doleva"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad doprava"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad střed"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel nastavení typu automatického kliknutí"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Kliknutí levým"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pozastavit"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozice"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balíček <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> byl vložen do sekce OMEZENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"posílá obrázek"</string> @@ -2518,4 +2528,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapy"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikace"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaše otisky prstů se nedaří rozpoznat. Nastavte odemknutí otiskem prstu znovu."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 288053ee1632..bcdb691eaf86 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Frigør"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Frigør <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Appinfo"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Starter demoen…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Nulstiller enheden…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad, venstre"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad, højre"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad, midten"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blevet placeret i samlingen BEGRÆNSET"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sendte et billede"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Kort"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Dine fingeraftryk kan ikke længere genkendes. Konfigurer fingeroplåsning igen."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 10659eb7e42e..4191512fd018 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Markierung entfernen"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> loslösen"</string> <string name="app_info" msgid="6113278084877079851">"App-Informationen"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Demo wird gestartet…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Gerät wird zurückgesetzt…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Steuerkreuz nach links"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Steuerkreuz nach rechts"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Steuerkreuz Mitte"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> wurde in den BESCHRÄNKT-Bucket gelegt"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"hat ein Bild gesendet"</string> @@ -2428,7 +2442,7 @@ <string name="connected_display_thermally_unavailable_notification_content" msgid="9205758199439955949">"Dein Gerät ist zu heiß und kann den Bildschirm erst spiegeln, wenn es abgekühlt ist"</string> <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen ist aktiviert"</string> - <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> nutzt zum Anzeigen von Inhalten beide Displays"</string> + <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> nutzt beide Displays zum Anzeigen von Inhalten"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Gerät ist zu warm"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen ist nicht verfügbar, weil dein Smartphone zu warm ist"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ist nicht verfügbar"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Anwendungen"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Deine Fingerabdrücke können nicht mehr erkannt werden. Bitte richte die Entsperrung per Fingerabdruck neu ein."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 77a13ed65700..332fb1b47585 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Ξεκαρφίτσωμα"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Ξεκαρφίτσωμα <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Πληροφορίες εφαρμογής"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Έναρξη επίδειξης…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Επαναφορά συσκευής…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad αριστερά"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad δεξιά"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad κέντρο"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Το πακέτο <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> τοποθετήθηκε στον κάδο ΠΕΡΙΟΡΙΣΜΕΝΗΣ ΠΡΟΣΒΑΣΗΣ."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"έστειλε μια εικόνα"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Χάρτες"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Εφαρμογές"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Δεν είναι δυνατή πλέον η αναγνώριση των δακτυλικών αποτυπωμάτων σας. Ρυθμίστε ξανά τη λειτουργία Ξεκλείδωμα με δακτυλικό αποτύπωμα."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 667f978701f9..74feb323b4dc 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Unpin"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Unpin <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"App info"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Starting demo…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Resetting device…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Your fingerprints can no longer be recognised. Set up Fingerprint Unlock again."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index fc4b8af6f0ba..9b7764ef0475 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Unpin"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Unpin <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"App info"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Starting demo…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Resetting device…"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Left"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Right"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Center"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Autoclick type settings panel"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Left click"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pause"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Position"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Your fingerprints can no longer be recognized. Set up Fingerprint Unlock again."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 4dcece1eb448..51148ae3be1d 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Unpin"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Unpin <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"App info"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Starting demo…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Resetting device…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Your fingerprints can no longer be recognised. Set up Fingerprint Unlock again."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index a1f6f7615aba..0b9bb83b6a4a 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Unpin"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Unpin <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"App info"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Starting demo…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Resetting device…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad left"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad right"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centre"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> has been put into the RESTRICTED bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sent an image"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Your fingerprints can no longer be recognised. Set up Fingerprint Unlock again."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index f34aa97b424a..07c66ead87df 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Dejar de fijar"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Dejar de fijar <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Información de apps"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demostración…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Restableciendo dispositivo…"</string> @@ -2243,6 +2249,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Pad direccional: izquierda"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Pad direccional: derecha"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Pad direccional: centro"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel de configuración del tipo de clic automático"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clic izquierdo"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausar"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posición"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Se colocó <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> en el bucket RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"envió una imagen"</string> @@ -2517,4 +2527,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicaciones"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Ya no se pueden reconocer tus huellas dactilares. Vuelve a configurar el Desbloqueo con huellas dactilares."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 612d86f14ef8..f035d5bbceaf 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"No fijar"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"No fijar <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Información de la app"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demostración…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Restableciendo dispositivo…"</string> @@ -2243,6 +2249,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Cruceta: izquierda"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Cruceta: derecha"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Cruceta: centro"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> se ha incluido en el grupo de restringidos"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ha enviado una imagen"</string> @@ -2517,4 +2531,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicaciones"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Tus huellas digitales ya no pueden reconocerse. Vuelve a configurar Desbloqueo con huella digital."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 6d5448908b02..1e299a609bd2 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1055,7 +1055,7 @@ <string name="lockscreen_glogin_submit_button" msgid="3590556636347843733">"Logi sisse"</string> <string name="lockscreen_glogin_invalid_input" msgid="4369219936865697679">"Vale kasutajanimi või parool."</string> <string name="lockscreen_glogin_account_recovery_hint" msgid="1683405808525090649">"Kas unustasite oma kasutajanime või parooli?\nKülastage aadressi "<b>"google.com/accounts/recovery"</b>"."</string> - <string name="lockscreen_glogin_checking_password" msgid="2607271802803381645">"Kontrollimine ..."</string> + <string name="lockscreen_glogin_checking_password" msgid="2607271802803381645">"Kontrollimine..."</string> <string name="lockscreen_unlock_label" msgid="4648257878373307582">"Ava"</string> <string name="lockscreen_sound_on_label" msgid="1660281470535492430">"Heli sisse"</string> <string name="lockscreen_sound_off_label" msgid="2331496559245450053">"Heli välja"</string> @@ -1509,7 +1509,7 @@ <string name="ext_media_move_failure_message" msgid="4197306718121869335">"Proovige sisu uuesti teisaldada"</string> <string name="ext_media_status_removed" msgid="241223931135751691">"Eemaldatud"</string> <string name="ext_media_status_unmounted" msgid="8145812017295835941">"Väljutatud"</string> - <string name="ext_media_status_checking" msgid="159013362442090347">"Kontrollimine ..."</string> + <string name="ext_media_status_checking" msgid="159013362442090347">"Kontrollimine..."</string> <string name="ext_media_status_mounted" msgid="3459448555811203459">"Valmis"</string> <string name="ext_media_status_mounted_ro" msgid="1974809199760086956">"Kirjutuskaitstud"</string> <string name="ext_media_status_bad_removal" msgid="508448566481406245">"Eemaldamine polnud turvaline"</string> @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Vabasta"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Vabasta <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Rakenduse teave"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Demo käivitamine …"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Seadme lähtestamine …"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Suunaklahvistiku vasaknool"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Suunaklahvistiku paremnool"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Suunaklahvistiku keskmine nupp"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Automaatkliki tüübi seadete paneel"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Vasakklikk"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Peata"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Asukoht"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on lisatud salve PIIRANGUTEGA"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"saatis kujutise"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Rakendused"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Teie sõrmejälgi ei saa enam tuvastada. Seadistage sõrmejäljega avamine uuesti."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index bba775fe4744..177449ccb494 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Kendu aingura"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Kendu aingura <xliff:g id="LABEL">%1$s</xliff:g> aplikazioari"</string> <string name="app_info" msgid="6113278084877079851">"Aplikazioari buruzko informazioa"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Demoa abiarazten…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Gailua berrezartzen…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Norabide-kontrolagailuko ezkerreko botoia"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Norabide-kontrolagailuko eskuineko botoia"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Norabide-kontrolagailuko erdiko botoia"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Murriztuen edukiontzian ezarri da <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"erabiltzaileak irudi bat bidali du"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikazioak"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Zure hatz-markak ez dira ezagutzen jada. Konfiguratu berriro hatz-marka bidez desblokeatzeko eginbidea."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index e8e0f48a966e..e0a8c1b67cb5 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"برداشتن سنجاق"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"برداشتن سنجاق <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"اطلاعات برنامه"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"در حال شروع نسخه نمایشی…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"در حال بازنشانی دستگاه…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"پد کنترل چپ"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"پد کنترل راست"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"پد کنترل وسط"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> در سطل «محدودشده» قرار گرفت"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"تصویری ارسال کرد"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"نقشه"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"برنامهها"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"اثر انگشتانتان دیگر قابلشناسایی نیست. «قفلگشایی با اثر انگشت» را دوباره راهاندازی کنید."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 5da5844cd9c3..1b53196c9808 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Irrota"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Irrota <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Sovellustiedot"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Aloitetaan esittelyä…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Palautetaan asetuksia…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Suuntanäppäimistö: vasen painike"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Suuntanäppäimistö: oikea painike"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Suuntanäppäimistö: keskipainike"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> on nyt rajoitettujen ryhmässä"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"lähetti kuvan"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Sovellukset"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Sormenjälkiäsi ei voi enää tunnistaa. Ota sormenjälkiavaus uudelleen käyttöön."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 9d81f4f978bd..d742d87f7ed7 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Annuler l\'épinglage"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Annuler l\'épinglage de <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Détails de l\'appli"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Démarrage de la démonstration en cours…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Réinitialisation de l\'appareil en cours…"</string> @@ -2243,6 +2249,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Pavé directionnel – gauche"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Pavé directionnel – droite"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Pavé directionnel – centre"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le compartiment RESTREINT"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"a envoyé une image"</string> @@ -2517,4 +2531,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vos empreintes digitales ne peuvent plus être reconnues. Reconfigurez le Déverrouillage par empreinte digitale."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 9ef2758b4eee..f0727d69c325 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Retirer"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Retirer <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Infos sur l\'appli"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"− <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Lancement de la démo…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Réinitialisation…"</string> @@ -2243,6 +2249,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Pavé directionnel - Gauche"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Pavé directionnel - Droite"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Pavé directionnel - Centre"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a été placé dans le bucket RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g> :"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"a envoyé une image"</string> @@ -2517,4 +2531,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applications"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vos empreintes ne peuvent plus être reconnues. Reconfigurez le déverrouillage par empreinte digitale."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 6f677e3ad84b..bb41a4f5fd3d 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Deixar de fixar"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Deixar de fixar a <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Información da app"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demostración…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Restablecendo dispositivo…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Cruceta: esquerda"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Cruceta: dereita"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Cruceta: centro"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> incluíuse no grupo RESTRINXIDO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviouse unha imaxe"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapas"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicacións"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Xa non se recoñecen as túas impresións dixitais. Configura de novo o desbloqueo dactilar."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 75ce468d354a..ff32df0b26fe 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"અનપિન કરો"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ને અનપિન કરો"</string> <string name="app_info" msgid="6113278084877079851">"ઍપની માહિતી"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"ડેમો પ્રારંભ કરી રહ્યાં છે…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"ઉપકરણ ફરીથી સેટ કરી રહ્યાં છે…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"ડી-પૅડ ડાબે"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"ડી-પૅડ જમણે"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"ડી-પૅડ મધ્યમાં"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>ને પ્રતિબંધિત સમૂહમાં મૂકવામાં આવ્યું છે"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"છબી મોકલી"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ઍપ્લિકેશનો"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"તમારી ફિંગરપ્રિન્ટને હવેથી ઓળખી શકાશે નહીં. ફિંગરપ્રિન્ટ અનલૉક સુવિધાનું ફરી સેટઅપ કરો."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index d750b39a0e41..393316b2386e 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"अनपिन करें"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> को अनपिन करें"</string> <string name="app_info" msgid="6113278084877079851">"ऐप्लिकेशन की जानकारी"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"डेमो प्रारंभ हो रहा है…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"डिवाइस फिर से रीसेट कर रहा है…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"डी-पैड का बाईं ओर वाला बटन"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"डी-पैड का दाईं ओर वाला बटन"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"डी-पैड का बीच वाला बटन"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> को प्रतिबंधित बकेट में रखा गया है"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"एक इमेज भेजी गई"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"मैप"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ऐप्लिकेशन"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"अब आपके फ़िंगरप्रिंट की पहचान नहीं की जा सकती. फ़िंगरप्रिंट अनलॉक की सुविधा को दोबारा सेट अप करें."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 58de41e4ce8c..cc4d29689743 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Otkvači"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Otkvači sudionika <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Informacije o aplikaciji"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Pokretanje demo-načina..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Vraćanje uređaja na zadano…"</string> @@ -2243,6 +2249,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Lijevo na plohi za smjerove"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Desno na plohi za smjerove"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"U središtu plohe za smjerove"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Ploča postavki vrste automatskog klika"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Lijevi klik"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauziraj"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozicija"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> premješten je u spremnik OGRANIČENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"šalje sliku"</string> @@ -2517,4 +2527,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Karte"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacije"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaši se otisci prstiju više ne prepoznaju. Ponovo postavite otključavanje otiskom prsta."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index f42567ed1fe6..ddfef1aae499 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Feloldás"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> rögzítésének feloldása"</string> <string name="app_info" msgid="6113278084877079851">"Alkalmazásinfó"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Bemutató indítása…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Eszköz visszaállítása…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad – balra"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad – jobbra"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad – középre"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"A következő csomag a KORLÁTOZOTT csoportba került: <xliff:g id="PACKAGE_NAME">%1$s</xliff:g>"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"képet küldött"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Térkép"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Alkalmazások"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Az ujjlenyomata már nem ismerhető fel. Állítsa be újra a Feloldás ujjlenyomattal funkciót."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index e3fa611ce135..92633245988e 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Ապամրացնել"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Ապամրացնել <xliff:g id="LABEL">%1$s</xliff:g> հավելվածը"</string> <string name="app_info" msgid="6113278084877079851">"Հավելվածի մասին"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Ցուցադրական օգտատերը գործարկվում է…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Սարքը վերակայվում է…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad-ի «Ձախ» կոճակ"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad-ի «Աջ» կոճակ"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad-ի «Կենտրոն» կոճակ"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> փաթեթը գցվեց ՍԱՀՄԱՆԱՓԱԿՎԱԾ զամբյուղի մեջ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>՝"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"օգտատերը պատկեր է ուղարկել"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Քարտեզներ"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Հավելվածներ"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Ձեր մատնահետքերն այլևս չեն կարող ճանաչվել։ Նորից կարգավորեք մատնահետքով ապակողպումը։"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 5f60ba2de8e4..86f711483ed1 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Lepas pin"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Lepas sematan <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Info aplikasi"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Memulai demo..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Mereset perangkat..."</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Kiri"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Kanan"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Tengah"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah dimasukkan ke dalam bucket DIBATASI"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"mengirim gambar"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikasi"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Sidik jari Anda tidak dapat dikenali lagi. Siapkan Buka dengan Sidik Jari lagi."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 92567427b0b9..360e3d9815a0 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Losa"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Losa <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Forritsupplýsingar"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Byrjar kynningu…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Endurstillir tækið…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Vinstrihnappur stýriflatar"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Hægrihnappur stýriflatar"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Miðjuhnappur stýriflatar"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> var sett í flokkinn TAKMARKAÐ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"sendi mynd"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Kort"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Forrit"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Ekki er lengur hægt að bera kennsl á fingraförin þín. Settu fingrafarskenni upp aftur."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 3700620c29c7..1914ea5ec6b5 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Stacca"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Sblocca <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Informazioni app"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Avvio della demo…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Reset del dispositivo…"</string> @@ -2243,6 +2249,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad - Sinistra"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad - Destra"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad - Centro"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> è stato inserito nel bucket RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ha inviato un\'immagine"</string> @@ -2517,4 +2531,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Applicazioni"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Non è più possibile riconoscere le tue impronte. Riconfigura lo Sblocco con l\'Impronta."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index cbc989ef58f4..5e0df4708c03 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"ביטול הצמדה"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"ביטול ההצמדה של <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"פרטי האפליקציה"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"תהליך ההדגמה מתחיל…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"מתבצע איפוס של המכשיר…"</string> @@ -2243,6 +2249,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"לחצן שמאלי ב-Dpad"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"לחצן ימני ב-Dpad"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"לחצן אמצעי ב-Dpad"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> התווספה לקטגוריה \'מוגבל\'"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"נשלחה תמונה"</string> @@ -2517,4 +2531,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"מפות"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"אפליקציות"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"טביעות האצבע שלך נשחקו ואי אפשר לזהות אותן. צריך להגדיר \'פתיחה בטביעת אצבע\' מחדש."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 51dca2255a83..ac37d558e8bb 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"固定を解除"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> の固定を解除"</string> <string name="app_info" msgid="6113278084877079851">"アプリ情報"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"デモを開始しています…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"デバイスをリセットしています…"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad: 左"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad: 右"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad: 中央"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"自動クリックの種類の設定パネル"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"左クリック"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"一時停止"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"位置"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> は RESTRICTED バケットに移動しました。"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"画像を送信しました"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"マップ"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"アプリ"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"指紋を認識できなくなりました。指紋認証をもう一度設定してください。"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 2411c8cad961..2dee93b1dc24 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"ჩამაგრების მოხსნა"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>-ის ჩამაგრების მოხსნა"</string> <string name="app_info" msgid="6113278084877079851">"აპის შესახებ"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"მიმდინარეობს დემონსტრაციის დაწყება…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"მიმდინარეობს მოწყობილობის გადაყენება…"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad მარცხნივ"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad მარჯვნივ"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ცენტრი"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ავტოდაწკაპუნების ტიპის პარამეტრების არე"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"მარცხენა დაწკაპუნება"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"პაუზა"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"პოზიცია"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> მოთავსდა კალათაში „შეზღუდული“"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"გაიგზავნა სურათი"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"აპლიკაციები"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"თქვენი თითის ანაბეჭდის ამოცნობა ვეღარ ხერხდება. ხელახლა დააყენეთ ანაბეჭდით განბლოკვა."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 3f3881b0d598..6655e5d31590 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Босату"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> босату"</string> <string name="app_info" msgid="6113278084877079851">"Қолданба ақпараты"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Демо нұсқасы іске қосылуда..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Құрылғы бастапқы күйге қайтарылуда..."</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Сол жақ Dpad түймесі"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Оң жақ Dpad түймесі"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Ортаңғы Dpad түймесі"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ШЕКТЕЛГЕН себетке салынды."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"сурет жіберілді"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Қолданбалар"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Саусағыңыздың іздері бұдан былай танылмайды. Саусақ ізімен ашу функциясын қайта реттеу"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 0ad4f09d1cfa..3d78797d9a70 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"មិនខ្ទាស់"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"ដកខ្ទាស់ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"ព័ត៌មានកម្មវិធី"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"កំពុងចាប់ផ្តើមការបង្ហាញសាកល្បង…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"កំពុងកំណត់ឧបករណ៍ឡើងវិញ…"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ឆ្វេង"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ស្ដាំ"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad កណ្ដាល"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ផ្ទាំងការកំណត់ប្រភេទចុចស្វ័យប្រវត្តិ"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ចុចម៉ៅស៍ខាងឆ្វេង"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ផ្អាក"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"ទីតាំង"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ត្រូវបានដាក់ទៅក្នុងធុងដែលបានដាក់កំហិត"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>៖"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"បានផ្ញើរូបភាព"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"ផែនទី"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"កម្មវិធី"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"លែងអាចសម្គាល់ស្នាមម្រាមដៃរបស់អ្នកបានទៀតហើយ។ សូមរៀបចំការដោះសោដោយស្កេនស្នាមម្រាមដៃម្ដងទៀត។"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index c65dd276be8d..1d89ad7c08e5 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"ಅನ್ಪಿನ್"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ಅನ್ನು ಅನ್ಪಿನ್ ಮಾಡಿ"</string> <string name="app_info" msgid="6113278084877079851">"ಆ್ಯಪ್ ಮಾಹಿತಿ"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"ಡೆಮೋ ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"ಸಾಧನ ಮರುಹೊಂದಿಸಲಾಗುತ್ತಿದೆ..."</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ನ ಎಡಭಾಗದ ಬಟನ್"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ನ ಬಲಭಾಗದ ಬಟನ್"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ನ ಮಧ್ಯದ ಬಟನ್"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ಅನ್ನು ನಿರ್ಬಂಧಿತ ಬಕೆಟ್ಗೆ ಹಾಕಲಾಗಿದೆ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ಚಿತ್ರವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ಆ್ಯಪ್ಗಳು"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ನಿಮ್ಮ ಫಿಂಗರ್ಪ್ರಿಂಟ್ಗಳನ್ನು ಇನ್ನು ಮುಂದೆ ಗುರುತಿಸಲಾಗುವುದಿಲ್ಲ. ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ಲಾಕ್ ಅನ್ನು ಮತ್ತೊಮ್ಮೆ ಸೆಟಪ್ ಮಾಡಿ."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index a52da3c6b91e..ad1bdae6fc30 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"고정 해제"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> 고정 해제"</string> <string name="app_info" msgid="6113278084877079851">"앱 정보"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"데모 시작 중..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"기기 초기화 중..."</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"방향 패드 왼쪽"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"방향 패드 오른쪽"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"방향 패드 가운데"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 항목이 RESTRICTED 버킷으로 이동함"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"이미지 보냄"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"지도"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"애플리케이션"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"지문을 더 이상 인식할 수 없습니다. 지문 잠금 해제를 다시 설정하세요."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index ff743fc42bd3..cb4edb963c76 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Кадоодон алып коюу"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> бошотуу"</string> <string name="app_info" msgid="6113278084877079851">"Колдонмо тууралуу"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Демо режим башталууда…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Түзмөк баштапкы абалга келтирилүүдө…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad\'дын сол баскычы"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad\'дын оң баскычы"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad\'дын ортоңку баскычы"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ЧЕКТЕЛГЕН чакага коюлган"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"сүрөт жөнөттү"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карталар"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Колдонмолор"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Манжаңыздын изи мындан ары таанылбайт. Манжа изи менен ачуу функциясын кайрадан тууралаңыз."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 6f32d875c2c8..4b426c818179 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"ຖອນປັກໝຸດ"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"ຖອດປັກມຸດ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"ຂໍ້ມູນແອັບ"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"ກຳລັງເລີ່ມເດໂມ…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"ກຳລັງຣີເຊັດອຸປະກອນ…"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ຊ້າຍ"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ຂວາ"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ກາງ"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ແຜງການຕັ້ງຄ່າປະເພດການຄລິກອັດຕະໂນມັດ"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ຄລິກຊ້າຍ"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ຢຸດຊົ່ວຄາວ"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"ຕຳແໜ່ງ"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ຖືກວາງໄວ້ໃນກະຕ່າ \"ຈຳກັດ\" ແລ້ວ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ສົ່ງຮູບແລ້ວ"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"ແຜນທີ່"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ແອັບພລິເຄຊັນ"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ລະບົບບໍ່ສາມາດຈຳແນກລາຍນິ້ວມືຂອງທ່ານໄດ້ອີກຕໍ່ໄປ. ກະລຸນາຕັ້ງຄ່າການປົດລັອກດ້ວຍລາຍນິ້ວມືອີກຄັ້ງ."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 71ddb09b759d..544cd4108e02 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -2090,6 +2090,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Atsegti"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Atsegti <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Programos informacija"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"–<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Paleidžiama demonstracinė versija…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Įrenginys nustatomas iš naujo…"</string> @@ -2244,6 +2250,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Valdymo pultas – kairėn"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Valdymo pultas – dešinėn"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Valdymo pultas – centras"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"„<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>“ įkeltas į grupę APRIBOTA"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"išsiuntė vaizdą"</string> @@ -2518,4 +2532,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Žemėlapiai"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Programos"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Nebegalima atpažinti jūsų piršto atspaudų. Dar kartą nustatykite atrakinimą piršto atspaudu."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index a643b9861312..02e93395237c 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Atspraust"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Atspraust lietotni <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Lietotnes informācija"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Notiek demonstrācijas palaišana..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Notiek ierīces atiestatīšana..."</string> @@ -2243,6 +2249,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Virzienu slēdzis — pa kreisi"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Virzienu slēdzis — pa labi"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Virzienu slēdzis — centrs"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Pakotne “<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>” ir ievietota ierobežotā kopā."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"nosūtīts attēls"</string> @@ -2517,4 +2531,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Lietojumprogrammas"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Jūsu pirkstu nospiedumus vairs nevar atpazīt. Vēlreiz iestatiet autorizāciju ar pirksta nospiedumu."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index f2de857dee11..df101f24f158 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Откачете"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Откачи <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Информации за апликација"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Се вклучува демонстрацијата…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Се ресетира уредот…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Навигациско копче за налево"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Навигациско копче за надесно"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Навигациско копче за средина"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> е ставен во корпата ОГРАНИЧЕНИ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"испрати слика"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карти"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Апликации"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Вашите отпечатоци веќе не може да се препознаат. Поставете „Отклучување со отпечаток“ повторно."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 85dd3362990c..b5ded52f10b7 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"അൺപിൻ ചെയ്യുക"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> അൺപിൻ ചെയ്യുക"</string> <string name="app_info" msgid="6113278084877079851">"ആപ്പ് വിവരം"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"ഡെമോ ആരംഭിക്കുന്നു…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"ഉപകരണം പുനക്രമീകരിക്കുന്നു…"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ലെഫ്റ്റ്"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad റൈറ്റ്"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad സെന്റർ"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ഓട്ടോക്ലിക്ക് തരം ക്രമീകരണ പാനല്"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ഇടത് ക്ലിക്ക്"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"താൽക്കാലികമായി നിർത്തുക"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"സ്ഥാനം"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> നിയന്ത്രിത ബക്കറ്റിലേക്ക് നീക്കി"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ചിത്രം അയച്ചു"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ആപ്പുകൾ"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"നിങ്ങളുടെ ഫിംഗർപ്രിന്റുകൾ ഇനി തിരിച്ചറിയാനാകില്ല. ഫിംഗർപ്രിന്റ് അൺലോക്ക് വീണ്ടും സജ്ജീകരിക്കുക."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 2c4b9f45d5e8..a61bd7fbf1da 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Unpin"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>-г тогтоосныг болиулах"</string> <string name="app_info" msgid="6113278084877079851">"Аппын мэдээлэл"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Жишээг эхлүүлж байна…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Төхөөрөмжийг шинэчилж байна…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad зүүн"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad баруун"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad гол"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>-г ХЯЗГААРЛАСАН сагс руу орууллаа"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"зураг илгээсэн"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Газрын зураг"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Аппликэйшн"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Таны хурууны хээг цаашид таних боломжгүй. Хурууны хээгээр түгжээ тайлахыг дахин тохируулна уу."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index e9dfef8e8173..3f2e57f5163a 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -2042,7 +2042,7 @@ <string name="app_suspended_title" msgid="888873445010322650">"अॅप उपलब्ध नाही"</string> <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> आत्ता उपलब्ध नाही. हे <xliff:g id="APP_NAME_1">%2$s</xliff:g> कडून व्यवस्थापित केले जाते."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"अधिक जाणून घ्या"</string> - <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"अॅप उघडा"</string> + <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"अॅप पुन्हा सुरू करा"</string> <string name="work_mode_off_title" msgid="6367463960165135829">"वर्क ॲप्स पुन्हा सुरू करायची?"</string> <string name="work_mode_turn_on" msgid="5316648862401307800">"पुन्हा सुरू करा"</string> <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"आणीबाणी"</string> @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"अनपिन करा"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ला अनपिन करा"</string> <string name="app_info" msgid="6113278084877079851">"अॅप माहिती"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"डेमो सुरू करत आहे..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"डिव्हाइस रीसेट करत आहे..."</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad डावीकडील"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad चे उजवीकडील"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad चे मधले"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> हे प्रतिबंधित बादलीमध्ये ठेवण्यात आले आहे"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"इमेज पाठवली आहे"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"अॅप्लिकेशन"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"तुमची फिंगरप्रिंट यापुढे ओळखता येणार नाहीत. फिंगरप्रिंट अनलॉक पुन्हा सेट करा."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 5cb9defbcd3e..f9aeec485295 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Nyahsemat"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Nyahsemat <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Maklumat apl"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Memulakan tunjuk cara…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Menetapkan semula peranti…"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Kiri"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Kanan"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Tengah"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel tetapan jenis autoklik"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Klik kiri"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Jeda"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Kedudukan"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> telah diletakkan dalam baldi TERHAD"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"menghantar imej"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikasi"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Cap jari anda tidak dapat dicam lagi. Sediakan semula Buka Kunci Cap Jari."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 0a51d1ec652e..293b316efa00 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"ဖြုတ်ပါ"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ကို ပင်ဖြုတ်ရန်"</string> <string name="app_info" msgid="6113278084877079851">"အက်ပ်အချက်အလက်"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"သရုပ်ပြချက်ကို စတင်နေသည်…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"စက်ပစ္စည်းကို ပြန်လည်သတ်မှတ်နေသည်…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ဘယ်"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ညာ"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad အလယ်"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ကို တားမြစ်ထားသော သိမ်းဆည်းမှုအတွင်းသို့ ထည့်ပြီးပါပြီ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>-"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ပုံပို့ထားသည်"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"အပလီကေးရှင်းများ"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"သင့်လက်ဗွေများကို မသိရှိနိုင်တော့ပါ။ ‘လက်ဗွေသုံး လော့ခ်ဖွင့်ခြင်း’ ထပ်မံစနစ်ထည့်သွင်းပါ။"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 6bd4598709e6..a79ff1e4d7bf 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Løsne"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Løsne <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Info om appen"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Starter demo …"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Tilbakestiller enheten …"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Venstre på styrepilene"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Høyre på styrepilene"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Midt på styrepilene"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> er blitt plassert i TILGANGSBEGRENSET-toppmappen"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"har sendt et bilde"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apper"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Fingeravtrykkene dine kan ikke gjenkjennes lenger. Konfigurer opplåsing med fingeravtrykk på nytt."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index b94c2f618d6b..3f24b2773404 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"अनपिन गर्नुहोस्"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> लाई अनपिन गर्नुहोस्"</string> <string name="app_info" msgid="6113278084877079851">"एपका बारे जानकारी"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"डेमो सुरु गर्दै…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"यन्त्रलाई रिसेट गर्दै…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad को बायाँको बटन"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad को दायाँको बटन"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad को बिचको बटन"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> लाई प्रतिबन्धित बाल्टीमा राखियो"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"फोटो पठाइयो"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"नक्सा"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"एपहरू"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"तपाईंको फिंगरप्रिन्ट अब पहिचान गर्न सकिँदैन। फिंगरप्रिन्ट अनलक फेरि सेटअप गर्नुहोस्।"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 52d9106cebfd..38bcffab7c33 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Losmaken"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> losmaken"</string> <string name="app_info" msgid="6113278084877079851">"App-info"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Demo starten…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Apparaat resetten…"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad links"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad rechts"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad midden"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Deelvenster met instellingen voor het type automatisch klikken"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Klikken met de linkermuisknop"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauzeren"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Positie"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> is in de bucket RESTRICTED geplaatst"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"heeft een afbeelding gestuurd"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Kaarten"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Je vingerafdrukken worden niet meer herkend. Stel Ontgrendelen met vingerafdruk opnieuw in."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index ba2560f66ae5..e99010f02be0 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"ଅନପିନ୍ କରନ୍ତୁ"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ରେ ଅନ୍ପିନ୍ କରନ୍ତୁ"</string> <string name="app_info" msgid="6113278084877079851">"ଆପ୍ ସୂଚନା"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"ଡେମୋ ଆରମ୍ଭ କରାଯାଉଛି…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"ଡିଭାଇସ୍କୁ ରିସେଟ୍ କରାଯାଉଛି…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ବାମ"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ଡାହାଣ"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad କେନ୍ଦ୍ର"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>କୁ ପ୍ରତିବନ୍ଧିତ ବକେଟରେ ରଖାଯାଇଛି"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ଏକ ଛବି ପଠାଯାଇଛି"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ଆପ୍ଲିକେସନ"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ଆପଣଙ୍କ ଟିପଚିହ୍ନକୁ ଆଉ ଚିହ୍ନଟ କରାଯାଇପାରିବ ନାହିଁ। ଫିଙ୍ଗରପ୍ରିଣ୍ଟ ଅନଲକ ପୁଣି ସେଟ ଅପ କରନ୍ତୁ।"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 2d2f9c01a4c3..63765aa11e78 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"ਅਨਪਿੰਨ ਕਰੋ"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ਨੂੰ ਅਨਪਿੰਨ ਕਰੋ"</string> <string name="app_info" msgid="6113278084877079851">"ਐਪ ਜਾਣਕਾਰੀ"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"ਡੈਮੋ ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"ਡੀਵਾਈਸ ਰੀਸੈੱਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ਦਾ ਖੱਬੇ ਪਾਸੇ ਵਾਲਾ ਬਟਨ"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ਦਾ ਸੱਜੇ ਪਾਸੇ ਵਾਲਾ ਬਟਨ"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad ਦਾ ਵਿਚਕਾਰਲਾ ਬਟਨ"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"ਸਵੈ-ਕਲਿੱਕ ਟਾਈਪ ਸੈਟਿੰਗ ਪੈਨਲ"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"ਖੱਬਾ-ਕਲਿੱਕ ਦਬਾਓ"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"ਰੋਕੋ"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"ਸਥਿਤੀ"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ਨੂੰ ਪ੍ਰਤਿਬੰਧਿਤ ਖਾਨੇ ਵਿੱਚ ਪਾਇਆ ਗਿਆ ਹੈ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ਚਿੱਤਰ ਭੇਜਿਆ ਗਿਆ"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ਐਪਲੀਕੇਸ਼ਨਾਂ"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ਤੁਹਾਡੇ ਫਿੰਗਰਪ੍ਰਿੰਟਾਂ ਦੀ ਹੁਣ ਪਛਾਣ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਫਿੰਗਰਪ੍ਰਿੰਟ ਅਣਲਾਕ ਦਾ ਦੁਬਾਰਾ ਸੈੱਟਅੱਪ ਕਰੋ।"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 810aa325e48a..372608d3af15 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -2090,6 +2090,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Odepnij"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Odepnij: <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"O aplikacji"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Uruchamiam tryb demo…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Resetuję urządzenie…"</string> @@ -2244,6 +2250,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad – w lewo"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad – w prawo"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad – środek"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Umieszczono pakiet <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> w zasobniku danych RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"wysłano obraz"</string> @@ -2518,4 +2532,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapy"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacje"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Nie można już rozpoznać Twoich odcisków palców. Skonfiguruj ponownie odblokowywanie odciskiem palca."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 79314f716cd3..dc5275918233 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Liberar guia"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Liberar <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Informações do app"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demonstração…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Redefinindo dispositivo…"</string> @@ -2243,6 +2249,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Botão direcional: para a esquerda"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Botão direcional: para a direita"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Botão direcional: centro"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviou uma imagem"</string> @@ -2517,4 +2531,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapas"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"As impressões digitais não são mais reconhecidas. Configure o Desbloqueio por impressão digital de novo."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index af76e3f1ad03..1418a0b0aac2 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Soltar"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Soltar <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Info. da app"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"A iniciar a demonstração…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"A repor o dispositivo…"</string> @@ -2243,6 +2249,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Teclado direcional: para a esquerda"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Teclado direcional: para a direita"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Teclado direcional: centrar"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Painel de definições do tipo de clique automático"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Clicar com o botão esquerdo do rato"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pausar"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posição"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no contentor RESTRITO."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviou uma imagem"</string> @@ -2517,4 +2527,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicações"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Já não é possível reconhecer as suas impressões digitais. Configure o Desbloqueio por impressão digital novamente."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 79314f716cd3..dc5275918233 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Liberar guia"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Liberar <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Informações do app"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Iniciando demonstração…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Redefinindo dispositivo…"</string> @@ -2243,6 +2249,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Botão direcional: para a esquerda"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Botão direcional: para a direita"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Botão direcional: centro"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> foi colocado no intervalo \"RESTRITO\""</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"enviou uma imagem"</string> @@ -2517,4 +2531,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapas"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Apps"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"As impressões digitais não são mais reconhecidas. Configure o Desbloqueio por impressão digital de novo."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 0fcd12bfbc01..75369415e322 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -267,7 +267,7 @@ <string name="global_action_power_options" msgid="1185286119330160073">"Alimentare"</string> <string name="global_action_restart" msgid="4678451019561687074">"Repornește"</string> <string name="global_action_emergency" msgid="1387617624177105088">"Urgență"</string> - <string name="global_action_bug_report" msgid="5127867163044170003">"Raport despre erori"</string> + <string name="global_action_bug_report" msgid="5127867163044170003">"Raport de eroare"</string> <string name="global_action_logout" msgid="6093581310002476511">"Încheie sesiunea"</string> <string name="global_action_screenshot" msgid="2610053466156478564">"Instantaneu"</string> <string name="bugreport_title" msgid="8549990811777373050">"Raport de eroare"</string> @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Anulează fixarea"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Anulează fixarea pentru <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Informații despre aplicație"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Se pornește demonstrația…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Se resetează dispozitivul…"</string> @@ -2243,6 +2249,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad stânga"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad dreapta"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad centru"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> a fost adăugat la grupul RESTRICȚIONATE"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"a trimis o imagine"</string> @@ -2517,4 +2531,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplicații"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"E posibil ca amprentele tale să nu mai fie recunoscute. Configurează din nou Deblocarea cu amprenta."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 85177030d45a..f35392f3911a 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -2090,6 +2090,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Открепить"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Открепить приложение \"<xliff:g id="LABEL">%1$s</xliff:g>\""</string> <string name="app_info" msgid="6113278084877079851">"О приложении"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Запуск деморежима…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Сброс данных…"</string> @@ -2244,6 +2250,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"D-pad – влево"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"D-pad – вправо"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"D-pad – по центру"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Панель настроек типа автонажатия"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Нажать левую кнопку"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Приостановить"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Положение"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Приложение \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" помещено в категорию с ограниченным доступом."</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"Отправлено изображение"</string> @@ -2518,4 +2528,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карты"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Приложения"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Ваши отпечатки больше не распознаются. Настройте разблокировку по отпечатку пальца снова."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 863f0cc18ff8..d21df4a7f702 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"ගලවන්න"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ඇමුණුම ඉවත් කරන්න"</string> <string name="app_info" msgid="6113278084877079851">"යෙදුම් තොරතුරු"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"ආදර්ශනය ආරම්භ කරමින්..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"උපාංගය යළි සකසමින්..."</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad වම"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad දකුණ"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad මැද"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> අවහිර කළ බාල්දියට දමා ඇත"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"රූපයක් එව්වා"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"සිතියම්"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"යෙදුම්"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ඔබේ ඇඟිලි සලකුණු තවදුරටත් හඳුනාගත නොහැක. ඇඟිලි සලකුණු අගුළු හැරීම නැවත පිහිටුවන්න."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 9d7d52095e88..56fa73cba3fd 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -2090,6 +2090,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Uvoľniť"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Odopnúť <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Informácie o aplikácii"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Spúšťa sa ukážka…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Resetuje sa zariadenie…"</string> @@ -2244,6 +2250,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Stlačiť tlačidlo doľava krížového ovládača"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Stlačiť tlačidlo doprava krížového ovládača"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Stlačiť stredné tlačidlo krížového ovládača"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel nastavení typu automatického kliknutia"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Kliknutie ľavým tlačidlom"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pozastaviť"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Pozícia"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Balík <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> bol vložený do kontajnera OBMEDZENÉ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"odoslal(a) obrázok"</string> @@ -2518,4 +2528,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mapy"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikácie"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaše odtlačky prstov sa už nedajú rozpoznať. Znova nastavte odomknutie odtlačkom prsta."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 2776e1ce0404..f44f1e798068 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1014,7 +1014,7 @@ <string name="lockscreen_password_wrong" msgid="8605355913868947490">"Poskusite znova"</string> <string name="lockscreen_storage_locked" msgid="634993789186443380">"Odklenite za dostop do vseh funkcij in podatkov"</string> <string name="faceunlock_multiple_failures" msgid="681991538434031708">"Presegli ste dovoljeno število poskusov odklepanja z obrazom"</string> - <string name="lockscreen_missing_sim_message_short" msgid="1229301273156907613">"Ni kartice SIM."</string> + <string name="lockscreen_missing_sim_message_short" msgid="1229301273156907613">"Ni kartice SIM"</string> <string name="lockscreen_missing_sim_message" product="tablet" msgid="3986843848305639161">"V tabličnem računalniku ni kartice SIM."</string> <string name="lockscreen_missing_sim_message" product="tv" msgid="3903140876952198273">"V napravi Android TV ni kartice SIM."</string> <string name="lockscreen_missing_sim_message" product="default" msgid="6184187634180854181">"V telefonu ni kartice SIM."</string> @@ -2090,6 +2090,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Odpenjanje"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Odpni aplikacijo <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Podatki o aplikacijah"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Začenjanje predstavitve …"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Ponastavljanje naprave …"</string> @@ -2244,6 +2250,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Smerni gumb levo"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Smerni gumb desno"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Smerni gumb sredina"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Podokno z nastavitvami vrste samodejnega klika"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Levi klik"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Začasna zaustavitev"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Položaj"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Paket <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> je bil dodan v segment OMEJENO"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"je poslal(-a) sliko"</string> @@ -2518,4 +2528,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Zemljevidi"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacije"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Vaših prstnih odtisov ni več mogoče prepoznati. Znova nastavite odklepanje s prstnim odtisom."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 19be60047254..3739b53b32ac 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Zhgozhdo"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Zhgozhdoje <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Informacioni mbi aplikacionin"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Po nis demonstrimin..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Po rivendos pajisjen…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Majtas në bllokun e drejtimit"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Djathtas në bllokun e drejtimit"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Qendra e bllokut të drejtimit"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> është vendosur në grupin E KUFIZUAR"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"dërgoi një imazh"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Aplikacionet"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Gjurmët e tua të gishtave nuk mund të njihen më. Konfiguro përsëri \"Shkyçjen me gjurmën e gishtit\"."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index c286a65a78e7..009c27bcbb25 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -2089,6 +2089,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Откачи"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Откачи апликацију <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Информације о апликацији"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Покрећемо демонстрацију..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Ресетујемо уређај..."</string> @@ -2243,6 +2249,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"налево на D-pad-у"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"надесно на D-pad-у"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"центар на D-pad-у"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Окно са подешавањима типа аутоматског клика"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Леви клик"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Паузирај"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Позиција"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> је додат у сегмент ОГРАНИЧЕНО"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"је послао/ла слику"</string> @@ -2517,4 +2527,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Мапе"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Апликације"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Отисци прстију више не могу да се препознају. Поново подесите откључавање отиском прста."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index a2fcd231854c..442763ae3188 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Lossa"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Lossa <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Appinformation"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Demo startas …"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Enheten återställs …"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Styrkors, vänster"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Styrkors, höger"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Styrkors, mitten"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> har placerats i hinken RESTRICTED"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"har skickat en bild"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Appar"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Det går inte längre att känna igen dina fingeravtryck. Ställ in fingeravtryckslås igen."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 93233d91e0df..8153eb02d625 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Bandua"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Bandua <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Maelezo ya programu"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Inaanzisha onyesho..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Inaweka upya kifaa..."</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Kitufe cha kushoto cha Dpad"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Kitufe cha kulia cha Dpad"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Kitufe cha katikati cha Dpad"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> kimewekwa katika kikundi KILICHODHIBITIWA"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"alituma picha"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Ramani"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Programu"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Alama zako za vidole hazitambuliki tena. Weka tena mipangilio ya Kufungua kwa Alama ya Kidole."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 8c5acd45fd12..94168418ff4d 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"பின்னை அகற்று"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> ஐப் பின் நீக்கு"</string> <string name="app_info" msgid="6113278084877079851">"ஆப்ஸ் தகவல்"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"டெமோவைத் தொடங்குகிறது…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"சாதனத்தை மீட்டமைக்கிறது…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"இடது திசை காட்டும் பட்டன்"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"வலது திசை காட்டும் பட்டன்"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"மையப் பகுதியைக் காட்டும் பட்டன்"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> என்பதை வரம்பிடப்பட்ட பக்கெட்திற்குள் சேர்க்கப்பட்டது"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"படம் அனுப்பப்பட்டது"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ஆப்ஸ்"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"உங்கள் கைரேகைகளை இனி அடையாளம் காண முடியாது. கைரேகை அன்லாக் அம்சத்தை மீண்டும் அமையுங்கள்."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 8333b0bafc02..4bb85f72c1d8 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"అన్పిన్ చేయి"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ను అన్పిన్ చేయి"</string> <string name="app_info" msgid="6113278084877079851">"యాప్ సమాచారం"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"డెమోను ప్రారంభిస్తోంది..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"పరికరాన్ని రీసెట్ చేస్తోంది..."</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ఎడమవైపున"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad కుడివైపున"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"DPad మధ్యన"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> పరిమితం చేయబడిన బకెట్లో ఉంచబడింది"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ఇమేజ్ను పంపారు"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Maps"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"అప్లికేషన్లు"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"మీ వేలిముద్రలను ఇకపై గుర్తించడం సాధ్యం కాదు. వేలిముద్ర అన్లాక్ను మళ్లీ సెటప్ చేయండి."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 8f8252584757..26084553817a 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"เลิกปักหมุด"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"เลิกปักหมุด <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"ข้อมูลแอป"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"กำลังเริ่มการสาธิต…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"กำลังรีเซ็ตอุปกรณ์…"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad ซ้าย"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad ขวา"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad กึ่งกลาง"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"แผงการตั้งค่าประเภทการคลิกอัตโนมัติ"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"คลิกซ้าย"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"หยุดชั่วคราว"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"วางตำแหน่ง"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"ใส่ <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ในที่เก็บข้อมูลที่ถูกจำกัดแล้ว"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ส่งรูปภาพ"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"แผนที่"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"แอปพลิเคชัน"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"ระบบจะไม่จดจำลายนิ้วมือของคุณอีกต่อไป ตั้งค่าการปลดล็อกด้วยลายนิ้วมืออีกครั้ง"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 092e15c5289f..482d7fdbb621 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"I-unpin"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"I-unpin ang <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Impormasyon ng app"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Sinisimulan ang demo…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Nire-reset ang device…"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Left"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Right"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Center"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Panel ng mga setting ng uri ng autoclick"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Mag-left click"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"I-pause"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Posisyon"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Inilagay ang <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> sa PINAGHIHIGPITANG bucket"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"nagpadala ng larawan"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Mga Mapa"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Mga Application"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Hindi na makikilala ang iyong mga fingerprint. I-set up ulit ang Pag-unlock Gamit ang Fingerprint."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index e04ad55e395f..cb65ad72782d 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Sabitlemeyi kaldır"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> uygulamasının sabitlemesini kaldır"</string> <string name="app_info" msgid="6113278084877079851">"Uygulama bilgileri"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Demo başlatılıyor…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Cihaz sıfırlanıyor…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad Sol"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad Sağ"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad Orta"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> KISITLANMIŞ gruba yerleştirildi"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"bir resim gönderildi"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Haritalar"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Uygulamalar"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Parmak izleriniz artık tanınamıyor. Parmak İzi Kilidi\'ni tekrar kurun."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index a78847339b15..341aff5d70b8 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -2090,6 +2090,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Відкріпити"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Відкріпити додаток <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Про додатки"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"-<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Запуск демонстрації…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Скидання налаштувань пристрою…"</string> @@ -2244,6 +2250,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Кнопка \"вліво\" панелі керування"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Кнопка \"вправо\" панелі керування"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Центральна кнопка панелі керування"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Пакет \"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>\" додано в сегмент з обмеженнями"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"надіслано зображення"</string> @@ -2518,4 +2532,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Карти"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Додатки"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Ваші відбитки пальців більше не розпізнаються. Налаштуйте розблокування відбитком пальця повторно."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 7f3a2ef7ed31..ec832e67aa2f 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"پن ہٹائیں"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> سے پن ہٹائیں"</string> <string name="app_info" msgid="6113278084877079851">"ایپ کی معلومات"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"ڈیمو شروع ہو رہا ہے…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"آلہ ری سیٹ ہو رہا ہے…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad بائیں کریں"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad دائیں کریں"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad سینٹر"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> کو پابند کردہ بکٹ میں رکھ دیا گیا ہے"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"ایک تصویر بھیجی"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"نقشے"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"ایپلیکیشنز"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"آپ کے فنگر پرنٹس کو مزید پہچانا نہیں جا سکتا۔ فنگر پرنٹ اَن لاک کو دوبارہ سیٹ اپ کریں۔"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 9f24b987033b..e764fc293124 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Yechib olish"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Yechib olish: <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Ilova haqida"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Demo boshlanmoqda…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Qurilma asl holatga qaytarilmoqda…"</string> @@ -2242,6 +2248,10 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad – chapga"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad – oʻngga"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad – markazga"</string> + <string name="accessibility_autoclick_type_settings_panel_title" msgid="7354373370578758696">"Avtomatik klik turi sozlamalari paneli"</string> + <string name="accessibility_autoclick_left_click" msgid="2301793352260551080">"Chap klik"</string> + <string name="accessibility_autoclick_pause" msgid="3272200156172573568">"Pauza"</string> + <string name="accessibility_autoclick_position" msgid="2933660969907663545">"Joylashuvi"</string> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> cheklangan turkumga joylandi"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"rasm yuborildi"</string> @@ -2516,4 +2526,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Xaritalar"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Ilovalar"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Barmoq izlaringiz endi tanilmaydi. Barmoq izi bilan ochishni qayta sozlang."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 678f3e09f123..cd89cfdaa017 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Bỏ ghim"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Bỏ ghim <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Thông tin ứng dụng"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Đang bắt đầu bản trình diễn..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Đang đặt lại thiết bị..."</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Chuyển sang trái bằng bàn phím di chuyển"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Chuyển sang phải bằng bàn phím di chuyển"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Căn giữa bằng bàn phím di chuyển"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"Đã đưa <xliff:g id="PACKAGE_NAME">%1$s</xliff:g> vào bộ chứa BỊ HẠN CHẾ"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"đã gửi hình ảnh"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Bản đồ"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Ứng dụng"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Hệ thống không nhận dạng được vân tay của bạn. Hãy thiết lập lại tính năng Mở khoá bằng vân tay."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 7888f4749e25..d5aa069c6e8b 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"取消置顶"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"取消置顶<xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"应用信息"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"正在启动演示模式…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"正在重置设备…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"向左方向键"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"向右方向键"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"方向键中心"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已被放入受限存储分区"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"发送了一张图片"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"地图"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"应用"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"系统无法再识别您的指纹。请重新设置“指纹解锁”功能。"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 0fb351d12681..91c852146be7 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"取消固定"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"取消將<xliff:g id="LABEL">%1$s</xliff:g>置頂"</string> <string name="app_info" msgid="6113278084877079851">"應用程式資料"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"正在開始示範…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"正在重設裝置…"</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"十字鍵向左鍵"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"十字鍵向右鍵"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"十字鍵中心鍵"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> 已納入受限制的儲存區"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"已傳送圖片"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"地圖"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"應用程式"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"無法再辨識你的指紋。請重新設定「指紋解鎖」功能。"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 9e83ce8d44c2..1a71fedeef65 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"取消固定"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"將「<xliff:g id="LABEL">%1$s</xliff:g>」取消固定"</string> <string name="app_info" msgid="6113278084877079851">"應用程式資訊"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"正在啟動示範模式..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"正在重設裝置..."</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Dpad 向左移"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Dpad 向右移"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Dpad 置中"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"已將「<xliff:g id="PACKAGE_NAME">%1$s</xliff:g>」移入受限制的值區"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"傳送了一張圖片"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"地圖"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"應用程式"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"系統無法再辨識你的指紋,請重新設定「指紋解鎖」。"</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index a2827799c252..3eb20d6da55b 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -2088,6 +2088,12 @@ <string name="unpin_target" msgid="3963318576590204447">"Susa ukuphina"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"Susa ukuphina ku-<xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="app_info" msgid="6113278084877079851">"Ulwazi nge-app"</string> + <!-- no translation found for shortcut_group_a11y_title (2992150163811583865) --> + <skip /> + <!-- no translation found for suggested_apps_group_a11y_title (2804876567839501831) --> + <skip /> + <!-- no translation found for all_apps_group_a11y_title (7020352520224108745) --> + <skip /> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"Iqalisa i-demo..."</string> <string name="demo_restarting_message" msgid="1160053183701746766">"Isetha kabusha idivayisi..."</string> @@ -2242,6 +2248,14 @@ <string name="accessibility_system_action_dpad_left_label" msgid="6557647179116479152">"Ngakwesokunxele se-Dpad"</string> <string name="accessibility_system_action_dpad_right_label" msgid="9180196950365804081">"Ngakwesokudla se-Dpad"</string> <string name="accessibility_system_action_dpad_center_label" msgid="8149791419358224893">"Isikhungo se-Dpad"</string> + <!-- no translation found for accessibility_autoclick_type_settings_panel_title (7354373370578758696) --> + <skip /> + <!-- no translation found for accessibility_autoclick_left_click (2301793352260551080) --> + <skip /> + <!-- no translation found for accessibility_autoclick_pause (3272200156172573568) --> + <skip /> + <!-- no translation found for accessibility_autoclick_position (2933660969907663545) --> + <skip /> <string name="as_app_forced_to_restricted_bucket" msgid="8233871289353898964">"I-<xliff:g id="PACKAGE_NAME">%1$s</xliff:g> ifakwe kubhakede LOKUKHAWULELWE"</string> <string name="conversation_single_line_name_display" msgid="8958948312915255999">"<xliff:g id="SENDER_NAME">%1$s</xliff:g>:"</string> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"uthumele isithombe"</string> @@ -2516,4 +2530,12 @@ <string name="keyboard_shortcut_group_applications_maps" msgid="7950000659522589471">"Amamephu"</string> <string name="keyboard_shortcut_group_applications" msgid="3010389163951364798">"Ama-application"</string> <string name="fingerprint_loe_notification_msg" msgid="3927447270148854546">"Isigxivizo somunwe wakho ngeke zisakwazi ukubonwa. Setha Ukuvula Ngesigxivizo Somunwe futhi."</string> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_title (468577168569874967) --> + <skip /> + <!-- no translation found for usb_apm_usb_plugged_in_when_locked_notification_text (6695268246267993166) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_title (3461195995882871461) --> + <skip /> + <!-- no translation found for usb_apm_usb_suspicious_activity_notification_text (6537085605929303187) --> + <skip /> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 800f98d9a234..7ed52004d282 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -5888,6 +5888,7 @@ <java-symbol type="bool" name="config_deviceSupportsWifiUsd" /> <java-symbol type="array" name="config_notificationDefaultUnsupportedAdjustments" /> + <java-symbol type="drawable" name="ic_notification_summarization" /> <!-- Advanced Protection Service USB feature --> <java-symbol type="string" name="usb_apm_usb_plugged_in_when_locked_notification_title" /> diff --git a/core/tests/coretests/src/android/app/NotificationChannelTest.java b/core/tests/coretests/src/android/app/NotificationChannelTest.java index e4b54071e892..b1d995a2eb9d 100644 --- a/core/tests/coretests/src/android/app/NotificationChannelTest.java +++ b/core/tests/coretests/src/android/app/NotificationChannelTest.java @@ -69,6 +69,9 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import platform.test.runner.parameterized.ParameterizedAndroidJunit4; +import platform.test.runner.parameterized.Parameters; + import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; @@ -78,9 +81,6 @@ import java.util.Arrays; import java.util.List; import java.util.function.Consumer; -import platform.test.runner.parameterized.ParameterizedAndroidJunit4; -import platform.test.runner.parameterized.Parameters; - @RunWith(ParameterizedAndroidJunit4.class) @UsesFlags(android.app.Flags.class) @SmallTest @@ -92,7 +92,8 @@ public class NotificationChannelTest { @Parameters(name = "{0}") public static List<FlagsParameterization> getParams() { return FlagsParameterization.allCombinationsOf( - Flags.FLAG_NOTIF_CHANNEL_CROP_VIBRATION_EFFECTS); + Flags.FLAG_NOTIF_CHANNEL_CROP_VIBRATION_EFFECTS, + Flags.FLAG_NOTIF_CHANNEL_ESTIMATE_EFFECT_SIZE); } @Rule @@ -282,6 +283,59 @@ public class NotificationChannelTest { } @Test + @EnableFlags({Flags.FLAG_NOTIFICATION_CHANNEL_VIBRATION_EFFECT_API, + Flags.FLAG_NOTIF_CHANNEL_CROP_VIBRATION_EFFECTS, + Flags.FLAG_NOTIF_CHANNEL_ESTIMATE_EFFECT_SIZE}) + public void testVibrationEffect_droppedIfTooLargeAndNotTrimmable() { + NotificationChannel channel = new NotificationChannel("id", "name", 3); + // populate pattern with contents + long[] pattern = new long[65550 / 2]; + for (int i = 0; i < pattern.length; i++) { + pattern[i] = 100; + } + // repeating effects cannot be trimmed + VibrationEffect effect = VibrationEffect.createWaveform(pattern, 1); + channel.setVibrationEffect(effect); + + NotificationChannel result = writeToAndReadFromParcel(channel); + assertThat(result.getVibrationEffect()).isNull(); + } + + @Test + @EnableFlags({Flags.FLAG_NOTIFICATION_CHANNEL_VIBRATION_EFFECT_API, + Flags.FLAG_NOTIF_CHANNEL_CROP_VIBRATION_EFFECTS, + Flags.FLAG_NOTIF_CHANNEL_ESTIMATE_EFFECT_SIZE}) + public void testVibrationEffect_trimmedIfLargeAndTrimmable() { + NotificationChannel channel = new NotificationChannel("id", "name", 3); + // populate pattern with contents + long[] pattern = new long[65550 / 2]; + for (int i = 0; i < pattern.length; i++) { + pattern[i] = 100; + } + // Effect is equivalent to the pattern + VibrationEffect effect = VibrationEffect.createWaveform(pattern, -1); + channel.setVibrationEffect(effect); + + NotificationChannel result = writeToAndReadFromParcel(channel); + assertThat(result.getVibrationEffect()).isNotNull(); + assertThat(result.getVibrationEffect().computeCreateWaveformOffOnTimingsOrNull()).hasLength( + NotificationChannel.MAX_VIBRATION_LENGTH); + } + + @Test + @EnableFlags({Flags.FLAG_NOTIFICATION_CHANNEL_VIBRATION_EFFECT_API, + Flags.FLAG_NOTIF_CHANNEL_CROP_VIBRATION_EFFECTS, + Flags.FLAG_NOTIF_CHANNEL_ESTIMATE_EFFECT_SIZE}) + public void testVibrationEffect_keptIfSmall() { + NotificationChannel channel = new NotificationChannel("id", "name", 3); + VibrationEffect effect = VibrationEffect.createOneShot(1, 100); + channel.setVibrationEffect(effect); + + NotificationChannel result = writeToAndReadFromParcel(channel); + assertThat(result.getVibrationEffect()).isEqualTo(effect); + } + + @Test public void testRestoreSoundUri_customLookup() throws Exception { Uri uriToBeRestoredUncanonicalized = Uri.parse("content://media/1"); Uri uriToBeRestoredCanonicalized = Uri.parse("content://media/1?title=Song&canonical=1"); diff --git a/core/tests/coretests/src/android/app/NotificationManagerTest.java b/core/tests/coretests/src/android/app/NotificationManagerTest.java index 9b97c8feaf12..d816039d0d3c 100644 --- a/core/tests/coretests/src/android/app/NotificationManagerTest.java +++ b/core/tests/coretests/src/android/app/NotificationManagerTest.java @@ -51,6 +51,7 @@ import org.junit.runner.RunWith; import java.time.Instant; import java.time.InstantSource; +import java.util.ArrayList; import java.util.List; @RunWith(AndroidJUnit4.class) @@ -72,7 +73,7 @@ public class NotificationManagerTest { // Caches must be in test mode in order to be used in tests. PropertyInvalidatedCache.setTestMode(true); - mNotificationManager.setChannelCacheToTestMode(); + mNotificationManager.setChannelCachesToTestMode(); } @After @@ -347,8 +348,8 @@ public class NotificationManagerTest { when(mNotificationManager.mBackendService.getNotificationChannels(any(), any(), anyInt())).thenReturn(new ParceledListSlice<>(List.of(exampleChannel()))); - // ask for channels 100 times without invalidating the cache - for (int i = 0; i < 100; i++) { + // ask for channels 5 times without invalidating the cache + for (int i = 0; i < 5; i++) { List<NotificationChannel> unused = mNotificationManager.getNotificationChannels(); } @@ -440,6 +441,86 @@ public class NotificationManagerTest { } @Test + @EnableFlags(Flags.FLAG_NM_BINDER_PERF_CACHE_CHANNELS) + public void getNotificationChannelGroup_cachedUntilInvalidated() throws Exception { + // Data setup: group has some channels in it + NotificationChannelGroup g1 = new NotificationChannelGroup("g1", "group one"); + + NotificationChannel nc1 = new NotificationChannel("nc1", "channel one", + NotificationManager.IMPORTANCE_DEFAULT); + nc1.setGroup("g1"); + NotificationChannel nc2 = new NotificationChannel("nc2", "channel two", + NotificationManager.IMPORTANCE_DEFAULT); + nc2.setGroup("g1"); + + NotificationManager.invalidateNotificationChannelCache(); + NotificationManager.invalidateNotificationChannelGroupCache(); + when(mNotificationManager.mBackendService.getNotificationChannelGroupsWithoutChannels( + any())).thenReturn(new ParceledListSlice<>(List.of(g1))); + + // getting notification channel groups also involves looking for channels + when(mNotificationManager.mBackendService.getNotificationChannels(any(), any(), anyInt())) + .thenReturn(new ParceledListSlice<>(List.of(nc1, nc2))); + + // ask for group 5 times without invalidating the cache + for (int i = 0; i < 5; i++) { + NotificationChannelGroup unused = mNotificationManager.getNotificationChannelGroup( + "g1"); + } + + // invalidate group cache but not channels cache; then ask for groups again + NotificationManager.invalidateNotificationChannelGroupCache(); + NotificationChannelGroup receivedG1 = mNotificationManager.getNotificationChannelGroup( + "g1"); + + verify(mNotificationManager.mBackendService, times(1)) + .getNotificationChannels(any(), any(), anyInt()); + verify(mNotificationManager.mBackendService, + times(2)).getNotificationChannelGroupsWithoutChannels(any()); + + // Also confirm that we got sensible information in the return value + assertThat(receivedG1).isNotNull(); + assertThat(receivedG1.getChannels()).hasSize(2); + } + + @Test + @EnableFlags(Flags.FLAG_NM_BINDER_PERF_CACHE_CHANNELS) + public void getNotificationChannelGroups_cachedUntilInvalidated() throws Exception { + NotificationChannelGroup g1 = new NotificationChannelGroup("g1", "group one"); + NotificationChannelGroup g2 = new NotificationChannelGroup("g2", "group two"); + NotificationChannel nc1 = new NotificationChannel("nc1", "channel one", + NotificationManager.IMPORTANCE_DEFAULT); + nc1.setGroup("g1"); + + NotificationManager.invalidateNotificationChannelCache(); + NotificationManager.invalidateNotificationChannelGroupCache(); + when(mNotificationManager.mBackendService.getNotificationChannelGroupsWithoutChannels( + any())).thenReturn(new ParceledListSlice<>(List.of(g1, g2))); + when(mNotificationManager.mBackendService.getNotificationChannels(any(), any(), anyInt())) + .thenReturn(new ParceledListSlice<>(List.of(nc1))); + + // ask for groups 5 times without invalidating the cache + for (int i = 0; i < 5; i++) { + List<NotificationChannelGroup> unused = + mNotificationManager.getNotificationChannelGroups(); + } + + // invalidate group cache; ask again + NotificationManager.invalidateNotificationChannelGroupCache(); + List<NotificationChannelGroup> result = mNotificationManager.getNotificationChannelGroups(); + + verify(mNotificationManager.mBackendService, + times(2)).getNotificationChannelGroupsWithoutChannels(any()); + + NotificationChannelGroup expectedG1 = g1.clone(); + expectedG1.setChannels(List.of(nc1)); + NotificationChannelGroup expectedG2 = g2.clone(); + expectedG2.setChannels(new ArrayList<>()); + + assertThat(result).containsExactly(expectedG1, expectedG2); + } + + @Test @EnableFlags({Flags.FLAG_MODES_API, Flags.FLAG_MODES_UI}) public void areAutomaticZenRulesUserManaged_handheld_isTrue() { PackageManager pm = mock(PackageManager.class); diff --git a/core/tests/coretests/src/android/os/PerfettoTraceTest.java b/core/tests/coretests/src/android/os/PerfettoTraceTest.java index 91efacf0dcc3..c5c2554c2a67 100644 --- a/core/tests/coretests/src/android/os/PerfettoTraceTest.java +++ b/core/tests/coretests/src/android/os/PerfettoTraceTest.java @@ -249,7 +249,7 @@ public class PerfettoTraceTest { PerfettoTrace.end(FOO_CATEGORY) - .usingThreadNamedTrack(Process.myTid(), "%s-%s", "bar", "stool") + .usingThreadNamedTrack(Process.myTid(), "bar") .emit(); Trace trace = Trace.parseFrom(session.close()); @@ -281,7 +281,7 @@ public class PerfettoTraceTest { assertThat(hasTrackUuid).isTrue(); assertThat(mCategoryNames).contains(FOO); assertThat(mTrackNames).contains(FOO); - assertThat(mTrackNames).contains("bar-stool"); + assertThat(mTrackNames).contains("bar"); } @Test @@ -339,7 +339,7 @@ public class PerfettoTraceTest { PerfettoTrace.counter(FOO_CATEGORY, 3.14) .usingCounterTrack(PerfettoTrace.getThreadTrackUuid(Process.myTid()), - "%s-%s", "bar", "stool").emit(); + "bar").emit(); Trace trace = Trace.parseFrom(session.close()); @@ -370,7 +370,7 @@ public class PerfettoTraceTest { assertThat(hasCounterValue).isTrue(); assertThat(hasDoubleCounterValue).isTrue(); assertThat(mTrackNames).contains(FOO); - assertThat(mTrackNames).contains("bar-stool"); + assertThat(mTrackNames).contains("bar"); } @Test @@ -383,7 +383,7 @@ public class PerfettoTraceTest { PerfettoTrace.counter(FOO_CATEGORY, 16).usingProcessCounterTrack(FOO).emit(); PerfettoTrace.counter(FOO_CATEGORY, 3.14) - .usingThreadCounterTrack(Process.myTid(), "%s-%s", "bar", "stool").emit(); + .usingThreadCounterTrack(Process.myTid(), "bar").emit(); Trace trace = Trace.parseFrom(session.close()); @@ -414,7 +414,7 @@ public class PerfettoTraceTest { assertThat(hasCounterValue).isTrue(); assertThat(hasDoubleCounterValue).isTrue(); assertThat(mTrackNames).contains(FOO); - assertThat(mTrackNames).contains("bar-stool"); + assertThat(mTrackNames).contains("bar"); } @Test diff --git a/core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java b/core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java index 7541a844c1da..52ff79da26ea 100644 --- a/core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java +++ b/core/tests/coretests/src/com/android/internal/util/RateLimitingCacheTest.java @@ -18,11 +18,15 @@ package com.android.internal.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import android.os.SystemClock; import androidx.test.runner.AndroidJUnit4; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.CountDownLatch; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -40,7 +44,7 @@ public class RateLimitingCacheTest { mCounter = -1; } - RateLimitingCache.ValueFetcher<Integer> mFetcher = () -> { + private final RateLimitingCache.ValueFetcher<Integer> mFetcher = () -> { return ++mCounter; }; @@ -50,13 +54,13 @@ public class RateLimitingCacheTest { */ @Test public void testTtl_Zero() { - RateLimitingCache<Integer> s = new RateLimitingCache<>(0); + TestRateLimitingCache<Integer> s = new TestRateLimitingCache<>(0); int first = s.get(mFetcher); assertEquals(first, 0); int second = s.get(mFetcher); assertEquals(second, 1); - SystemClock.sleep(20); + s.advanceTime(20); int third = s.get(mFetcher); assertEquals(third, 2); } @@ -67,14 +71,14 @@ public class RateLimitingCacheTest { */ @Test public void testTtl_100() { - RateLimitingCache<Integer> s = new RateLimitingCache<>(100); + TestRateLimitingCache<Integer> s = new TestRateLimitingCache<>(100); int first = s.get(mFetcher); assertEquals(first, 0); int second = s.get(mFetcher); // Too early to change assertEquals(second, 0); - SystemClock.sleep(150); + s.advanceTime(150); int third = s.get(mFetcher); // Changed by now assertEquals(third, 1); @@ -89,11 +93,11 @@ public class RateLimitingCacheTest { */ @Test public void testTtl_Negative() { - RateLimitingCache<Integer> s = new RateLimitingCache<>(-1); + TestRateLimitingCache<Integer> s = new TestRateLimitingCache<>(-1); int first = s.get(mFetcher); assertEquals(first, 0); - SystemClock.sleep(200); + s.advanceTime(200); // Should return the original value every time int second = s.get(mFetcher); assertEquals(second, 0); @@ -105,7 +109,7 @@ public class RateLimitingCacheTest { */ @Test public void testTtl_Spam() { - RateLimitingCache<Integer> s = new RateLimitingCache<>(100); + TestRateLimitingCache<Integer> s = new TestRateLimitingCache<>(100); assertCount(s, 1000, 7, 15); } @@ -115,25 +119,147 @@ public class RateLimitingCacheTest { */ @Test public void testRate_10hz() { - RateLimitingCache<Integer> s = new RateLimitingCache<>(1000, 10); + TestRateLimitingCache<Integer> s = new TestRateLimitingCache<>(1000, 10); // At 10 per second, 2 seconds should not exceed about 30, assuming overlap into left and // right windows that allow 10 each assertCount(s, 2000, 20, 33); } /** - * Test that using a different timebase works correctly. + * Exercises concurrent access to the cache. */ @Test - public void testTimebase() { - RateLimitingCache<Integer> s = new RateLimitingCache<>(1000, 10) { + public void testMultipleThreads() throws InterruptedException { + final long periodMillis = 1000; + final int maxCountPerPeriod = 10; + final RateLimitingCache<Integer> s = + new RateLimitingCache<>(periodMillis, maxCountPerPeriod); + + Thread t1 = new Thread(() -> { + for (int i = 0; i < 100; i++) { + s.get(mFetcher); + } + }); + Thread t2 = new Thread(() -> { + for (int i = 0; i < 100; i++) { + s.get(mFetcher); + } + }); + + final long startTimeMillis = SystemClock.elapsedRealtime(); + t1.start(); + t2.start(); + t1.join(); + t2.join(); + final long endTimeMillis = SystemClock.elapsedRealtime(); + + final long periodsElapsed = 1 + ((endTimeMillis - startTimeMillis) / periodMillis); + final long expected = Math.min(100 + 100, periodsElapsed * maxCountPerPeriod) - 1; + assertEquals(mCounter, expected); + } + + /** + * Multiple threads calling get() on the cache while the cached value is stale are allowed + * to fetch, regardless of the rate limiting. + * This is to prevent a slow getting thread from blocking other threads from getting a fresh + * value. + */ + @Test + public void testMultipleThreads_oneThreadIsSlow() throws InterruptedException { + final long periodMillis = 1000; + final int maxCountPerPeriod = 1; + final RateLimitingCache<Integer> s = + new RateLimitingCache<>(periodMillis, maxCountPerPeriod); + + final CountDownLatch latch1 = new CountDownLatch(2); + final CountDownLatch latch2 = new CountDownLatch(1); + final AtomicInteger counter = new AtomicInteger(); + final RateLimitingCache.ValueFetcher<Integer> fetcher = () -> { + latch1.countDown(); + try { + latch2.await(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + return counter.incrementAndGet(); + }; + + Thread t1 = new Thread(() -> { + for (int i = 0; i < 100; i++) { + s.get(fetcher); + } + }); + Thread t2 = new Thread(() -> { + for (int i = 0; i < 100; i++) { + s.get(fetcher); + } + }); + + t1.start(); + t2.start(); + // Both threads should be admitted to fetch because there is no fresh cached value, + // even though this exceeds the rate limit of at most 1 call per period. + // Wait for both threads to be fetching. + latch1.await(); + // Allow the fetcher to return. + latch2.countDown(); + // Wait for both threads to finish their fetches. + t1.join(); + t2.join(); + + assertEquals(counter.get(), 2); + } + + /** + * Even if multiple threads race to refresh the cache, only one thread gets to set a new value. + * This ensures, among other things, that the cache never returns values that were fetched out + * of order. + */ + @Test + public void testMultipleThreads_cachedValueNeverGoesBackInTime() throws InterruptedException { + final long periodMillis = 10; + final int maxCountPerPeriod = 3; + final RateLimitingCache<Integer> s = + new RateLimitingCache<>(periodMillis, maxCountPerPeriod); + final AtomicInteger counter = new AtomicInteger(); + final RateLimitingCache.ValueFetcher<Integer> fetcher = () -> { + // Note that this fetcher has a side effect, which is strictly not allowed for + // RateLimitingCache users, but we make an exception for the purpose of this test. + return counter.incrementAndGet(); + }; + + // Make three threads that spin on getting from the cache + final AtomicBoolean shouldRun = new AtomicBoolean(true); + Runnable worker = new Runnable() { @Override - protected long getTime() { - return SystemClock.elapsedRealtime() / 2; + public void run() { + while (shouldRun.get()) { + s.get(fetcher); + } } }; - // Timebase is moving at half the speed, so only allows for 1 second worth in 2 seconds. - assertCount(s, 2000, 10, 22); + Thread t1 = new Thread(worker); + Thread t2 = new Thread(worker); + Thread t3 = new Thread(worker); + t1.start(); + t2.start(); + t3.start(); + + // Get values until a sufficiently convincing high value while ensuring that values are + // monotonically non-decreasing. + int lastSeen = 0; + while (lastSeen < 10000) { + int value = s.get(fetcher); + if (value < lastSeen) { + fail("Unexpectedly saw decreasing value " + value + " after " + lastSeen); + } + lastSeen = value; + } + + shouldRun.set(false); + t1.join(); + t2.join(); + t3.join(); } /** @@ -144,15 +270,36 @@ public class RateLimitingCacheTest { * @param minCount the lower end of the expected number of fetches, with a margin for error * @param maxCount the higher end of the expected number of fetches, with a margin for error */ - private void assertCount(RateLimitingCache<Integer> cache, long period, + private void assertCount(TestRateLimitingCache<Integer> cache, long period, int minCount, int maxCount) { - long startTime = SystemClock.elapsedRealtime(); - while (SystemClock.elapsedRealtime() < startTime + period) { + long startTime = cache.getTime(); + while (cache.getTime() < startTime + period) { int value = cache.get(mFetcher); - SystemClock.sleep(5); + cache.advanceTime(5); } int latest = cache.get(mFetcher); assertTrue("Latest should be between " + minCount + " and " + maxCount + " but is " + latest, latest <= maxCount && latest >= minCount); } + + private static class TestRateLimitingCache<Value> extends RateLimitingCache<Value> { + private long mTime; + + public TestRateLimitingCache(long periodMillis) { + super(periodMillis); + } + + public TestRateLimitingCache(long periodMillis, int count) { + super(periodMillis, count); + } + + public void advanceTime(long time) { + mTime += time; + } + + @Override + public long getTime() { + return mTime; + } + } } diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerTest.kt index cec67f26af92..71097aba87e2 100644 --- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerTest.kt +++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/BubbleControllerTest.kt @@ -64,7 +64,7 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import java.util.Optional -/** Tests for [BubbleControllerTest] */ +/** Tests for [BubbleController] */ @SmallTest @RunWith(AndroidJUnit4::class) class BubbleControllerTest { @@ -140,7 +140,7 @@ class BubbleControllerTest { assertThat(bubbleController.hasBubbles()).isTrue() assertThat(bubbleData.getAnyBubbleWithKey(expectedKey)).isNotNull() - assertThat(bubbleData.getAnyBubbleWithKey(expectedKey)!!.isNoteBubble).isTrue() + assertThat(bubbleData.getAnyBubbleWithKey(expectedKey)!!.isNote).isTrue() } diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml index 206a8de81386..9a6869a64f3f 100644 --- a/libs/WindowManager/Shell/res/values-ar/strings.xml +++ b/libs/WindowManager/Shell/res/values-ar/strings.xml @@ -126,7 +126,7 @@ <string name="float_button_text" msgid="9221657008391364581">"نافذة عائمة"</string> <string name="select_text" msgid="5139083974039906583">"اختيار"</string> <string name="screenshot_text" msgid="1477704010087786671">"لقطة شاشة"</string> - <string name="open_in_browser_text" msgid="9181692926376072904">"فتح في المتصفِّح"</string> + <string name="open_in_browser_text" msgid="9181692926376072904">"الفتح في المتصفِّح"</string> <string name="open_in_app_text" msgid="2874590745116268525">"فتح في التطبيق"</string> <string name="new_window_text" msgid="6318648868380652280">"نافذة جديدة"</string> <string name="manage_windows_text" msgid="5567366688493093920">"إدارة النوافذ"</string> diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml index 28acb1056083..0f433479e130 100644 --- a/libs/WindowManager/Shell/res/values-as/strings.xml +++ b/libs/WindowManager/Shell/res/values-as/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"বাওঁফালৰ স্ক্ৰীনখন ৫০% কৰক"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"বাওঁফালৰ স্ক্ৰীনখন ৩০% কৰক"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"সোঁফালৰ স্ক্ৰীনখন সম্পূৰ্ণ স্ক্ৰীন কৰক"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"এপ্সমূহ সলনাসলনি কৰক"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"শীৰ্ষ স্ক্ৰীনখন সম্পূৰ্ণ স্ক্ৰীন কৰক"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"শীর্ষ স্ক্ৰীনখন ৭০% কৰক"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"শীর্ষ স্ক্ৰীনখন ৫০% কৰক"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"পুনঃস্থাপন কৰক"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"বাওঁফাললৈ স্নেপ কৰক"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"সোঁফাললৈ স্নেপ কৰক"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"বাওঁফালে এপ্ ৱিণ্ড’ৰ আকাৰ সলনি কৰক"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"সোঁফালে এপ্ ৱিণ্ড’ৰ আকাৰ সলনি কৰক"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ৱিণ্ড’ৰ আকাৰ মেক্সিমাইজ বা পুনঃস্থাপন কৰক"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"বিভাজিত-স্ক্ৰীন ম’ড দিয়ক"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ডেস্কটপ ৱিণ্ড’ইং ম’ড দিয়ক"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"সোঁফাললৈ ৱিণ্ড’ৰ আকাৰ সলনি কৰক"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"বাওঁফাললৈ ৱিণ্ড’ৰ আকাৰ সলনি কৰক"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ৱিণ্ড’ৰ আকাৰ মেক্সিমাইজ বা পুনঃস্থাপন কৰক"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ৱিণ্ড’ৰ আকাৰ মেক্সিমাইজ বা পুনঃস্থাপন কৰক"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"এপ্ ৱিণ্ড’ মিনিমাইজ কৰক"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"ডিফ’ল্ট ছেটিং খোলক"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"এই এপ্টোৰ বাবে কিদৰে ৱেব লিংক খুলিব পাৰি সেয়া বাছনি কৰক"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"এপ্টোত"</string> diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml index 207ac27fd917..92580d39f12c 100644 --- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml +++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Levi ekran 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Levi ekran 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Režim celog ekrana za donji ekran"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Zamenite mesta aplikacijama"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Režim celog ekrana za gornji ekran"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Gornji ekran 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Gornji ekran 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Vratite"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Prikačite levo"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Prikačite desno"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Promenite veličinu prozora aplikacije nalevo"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Promenite veličinu prozora aplikacije nadesno"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Uvećajte ili vratite veličinu prozora"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Uđite u režim podeljenog ekrana"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Uđite u režim prozora na računaru"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Promenite veličinu prozora nalevo"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Promenite veličinu prozora nadesno"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Uvećajte ili vratite veličinu prozora"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Uvećajte ili vratite veličinu prozora"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Umanjite prozor aplikacije"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Podešavanje Podrazumevano otvaraj"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Odaberite način otvaranja veb-linkova za ovu aplikaciju"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"U aplikaciji"</string> diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml index abaa83482523..4c2950b5afa1 100644 --- a/libs/WindowManager/Shell/res/values-be/strings.xml +++ b/libs/WindowManager/Shell/res/values-be/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Левы экран – 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Левы экран – 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Правы экран – поўнаэкранны рэжым"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Пераключыць праграмы"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Верхні экран – поўнаэкранны рэжым"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Верхні экран – 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Верхні экран – 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Аднавіць"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Размясціць злева"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Размясціць справа"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Змяніць памер акна (злева)"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Змяніць памер акна (справа)"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Разгарнуць акно ці аднавіць яго памер"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Уключыць рэжым падзеленага экрана"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Уключыць рэжым вокнаў працоўнага стала"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Змяніць памер акна і перамясціць да левага краю"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Змяніць памер акна і перамясціць да правага краю"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Разгарнуць акно ці аднавіць яго памер"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Разгарнуць акно ці аднавіць яго памер"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Згарнуць акно праграмы"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Налады параметра \"Адкрываць стандартна\""</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Выберыце, як гэта праграма будзе адкрываць вэб-спасылкі"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"У праграме"</string> diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml index 8982d61a39e7..12e4fc2700ed 100644 --- a/libs/WindowManager/Shell/res/values-bs/strings.xml +++ b/libs/WindowManager/Shell/res/values-bs/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Lijevo 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Lijevo 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Desno cijeli ekran"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Zamijeni aplikacije"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Gore cijeli ekran"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Gore 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Gore 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Vraćanje"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pomicanje ulijevo"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pomicanje udesno"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Promijeni veličinu prozora aplikacije ulijevo"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Promijeni veličinu prozora aplikacije udesno"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimiziraj ili vrati veličinu prozora"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Pokreni način podijeljenog zaslona"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Pokreni način prikaza u prozorima na računalu"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Promijeni veličinu prozora ulijevo"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Promijeni veličinu prozora udesno"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimiziraj ili vrati veličinu prozora"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimiziraj ili vrati veličinu prozora"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimiziraj prozor aplikacije"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Otvaranje prema zadanim postavkama"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Odaberite način otvaranja web linkova za ovu aplikaciju"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"U aplikaciji"</string> diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml index 2cf725e5a235..e662a16ced1e 100644 --- a/libs/WindowManager/Shell/res/values-da/strings.xml +++ b/libs/WindowManager/Shell/res/values-da/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Venstre 50 %"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Venstre 30 %"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Vis højre del i fuld skærm"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Byt apps"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Vis øverste del i fuld skærm"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Øverste 70 %"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Øverste 50 %"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Gendan"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Fastgør til venstre"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Fastgør til højre"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Juster størrelsen på appvinduet til venstre"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Juster størrelsen på appvinduet til højre"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimer eller gendan vinduesstørrelse"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Åbn opdelt skærm"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Åbn tilstanden for vinduer på computeren"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Juster størrelsen på vinduet til venstre"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Juster størrelsen på vinduet til højre"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimer eller gendan vinduesstørrelse"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimer eller gendan vinduesstørrelse"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimer appvindue"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Indstillinger for automatisk åbning"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Vælg, hvordan denne app skal åben weblinks"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"I appen"</string> diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml index c8fa76e37a92..24c2bed5e79e 100644 --- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml +++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Izquierda: 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Izquierda: 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pantalla derecha completa"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Intercambiar apps"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Pantalla superior completa"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Superior: 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Superior: 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restablecer"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajustar a la izquierda"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajustar a la derecha"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Ajustar el tamaño de la ventana de la app hacia la izquierda"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Ajustar el tamaño de la ventana de la app hacia la derecha"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximizar o restablecer el tamaño de la ventana"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Activar el modo de pantalla dividida"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Ingresar al modo ventana de computadora"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ajustar el tamaño de la ventana hacia la izquierda"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ajustar el tamaño de la ventana hacia la derecha"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximizar o restablecer el tamaño de la ventana"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximizar o restablecer el tamaño de la ventana"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizar ventana de la app"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Abrir con la configuración predeterminada"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Elige cómo abrir vínculos web para esta app"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"En la app"</string> diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml index 28943a73d96a..56b5f0bb0874 100644 --- a/libs/WindowManager/Shell/res/values-et/strings.xml +++ b/libs/WindowManager/Shell/res/values-et/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vasak: 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Vasak: 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Parem täisekraan"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Rakenduste vahetamine"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Ülemine täisekraan"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Ülemine: 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Ülemine: 50%"</string> @@ -126,7 +125,7 @@ <string name="float_button_text" msgid="9221657008391364581">"Hõljuv"</string> <string name="select_text" msgid="5139083974039906583">"Vali"</string> <string name="screenshot_text" msgid="1477704010087786671">"Ekraanipilt"</string> - <string name="open_in_browser_text" msgid="9181692926376072904">"Avamine brauseris"</string> + <string name="open_in_browser_text" msgid="9181692926376072904">"Ava brauseris"</string> <string name="open_in_app_text" msgid="2874590745116268525">"Ava rakenduses"</string> <string name="new_window_text" msgid="6318648868380652280">"Uus aken"</string> <string name="manage_windows_text" msgid="5567366688493093920">"Akende haldamine"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Taasta"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Tõmmake vasakule"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Tõmmake paremale"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Rakenduse akna suuruse muutmine vasakul"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Rakenduse akna suuruse muutmine paremal"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Akna suuruse maksimeerimine või taastamine"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Poolitatud ekraani režiimi sisenemine"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Töölaua akende kuvamise režiimi sisenemine"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Akna suuruse muutmine, vasakule"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Akna suuruse muutmine, paremale"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Akna suuruse maksimeerimine või taastamine"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Akna suuruse maksimeerimine või taastamine"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Rakenduse akna minimeerimine"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Avamisviisi vaikeseaded"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Valige, kuidas avada selle rakenduse puhul veebilinke"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Rakenduses"</string> diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml index fba9aa2b9a6e..22ef61f62e13 100644 --- a/libs/WindowManager/Shell/res/values-fa/strings.xml +++ b/libs/WindowManager/Shell/res/values-fa/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"٪۵۰ چپ"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"٪۳۰ چپ"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"تمامصفحه راست"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"جابهجا کردن برنامهها"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"تمامصفحه بالا"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"٪۷۰ بالا"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"٪۵۰ بالا"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"بازیابی کردن"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"کشیدن بهچپ"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"کشیدن بهراست"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"تغییر اندازه پنجره برنامه در چپ"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"تغییر اندازه پنجره برنامه در راست"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"بیشینهسازی یا بازیابی اندازه پنجره"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"ورود به حالت صفحه تقسیمشده"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"رفتن به حالت پردازش پنجرهای میز کار"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"تغییر اندازه پنجره به چپ"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"تغییر اندازه پنجره به راست"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"بیشینهسازی یا بازیابی اندازه پنجره"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"بیشینهسازی یا بازیابی اندازه پنجره"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"کمینهسازی پنجره برنامه"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"تنظیمات باز کردن بهطور پیشفرض"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"انتخاب روش باز کردن پیوندهای وب مربوط به این برنامه"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"در برنامه"</string> diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml index b967784a3db7..aa2f6392842b 100644 --- a/libs/WindowManager/Shell/res/values-gl/strings.xml +++ b/libs/WindowManager/Shell/res/values-gl/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50 % á esquerda"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30 % á esquerda"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pantalla completa á dereita"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Cambiar as aplicacións"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Pantalla completa arriba"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70 % arriba"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50 % arriba"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restaurar"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Axustar á esquerda"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Axustar á dereita"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Axustar o tamaño da ventá da aplicación á esquerda"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Axustar o tamaño da ventá da aplicación á dereita"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximizar ou restaurar o tamaño da ventá"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Entrar no modo de pantalla dividida"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Entrar no modo de ventás do ordenador"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Axustar o tamaño da ventá á esquerda"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Axustar o tamaño da ventá á dereita"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximizar ou restaurar o tamaño da ventá"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximizar ou restaurar o tamaño da ventá"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizar a ventá da aplicación"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Abrir coa configuración predeterminada"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Escoller como abrir as ligazóns web para esta aplicación"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Na aplicación"</string> diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml index 7f29c057e366..157822c5dc4f 100644 --- a/libs/WindowManager/Shell/res/values-hr/strings.xml +++ b/libs/WindowManager/Shell/res/values-hr/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Lijevi zaslon na 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Lijevi zaslon na 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Desni zaslon u cijeli zaslon"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Zamijeni aplikacije"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Gornji zaslon u cijeli zaslon"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Gornji zaslon na 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Gornji zaslon na 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Vrati"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Poravnaj lijevo"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Poravnaj desno"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Promijeni veličinu prozora aplikacije ulijevo"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Promijeni veličinu prozora aplikacije udesno"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimiziraj ili vrati veličinu prozora"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Pokreni način podijeljenog zaslona"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Pokreni način prikaza u prozorima na računalu"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Promijeni veličinu prozora ulijevo"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Promijeni veličinu prozora udesno"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimiziraj ili vrati veličinu prozora"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimiziraj ili vrati veličinu prozora"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimiziraj prozor aplikacije"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Otvori prema zadanim postavkama"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Odaberite način otvaranja web-veza za ovu aplikaciju"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"U aplikaciji"</string> diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml index 98d6809dee95..61c1d0e7759c 100644 --- a/libs/WindowManager/Shell/res/values-is/strings.xml +++ b/libs/WindowManager/Shell/res/values-is/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Vinstri 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Vinstri 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Hægri á öllum skjánum"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Skipta á milli forrita"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Efri á öllum skjánum"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Efri 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Efri 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Endurheimta"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Smella til vinstri"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Smella til hægri"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Breyta stærð forritsglugga til vinstri"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Breyta stærð forritsglugga til hægri"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Hámarka eða endurheimta stærð glugga"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Skipta skjánum"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Opna gluggastillingu í tölvu"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Breyta stærð glugga til vinstri"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Breyta stærð glugga til hægri"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Hámarka eða endurheimta stærð glugga"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Hámarka eða endurheimta stærð glugga"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Lágmarka stærð forritsglugga"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Stillingar sjálfvirkrar opnunar"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Veldu hvernig veftenglar opnast í forritinu"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Í forritinu"</string> diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml index 4217e8d471f0..fab259e03b3b 100644 --- a/libs/WindowManager/Shell/res/values-it/strings.xml +++ b/libs/WindowManager/Shell/res/values-it/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Schermata sinistra al 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Schermata sinistra al 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Schermata destra a schermo intero"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Scambia app"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Schermata superiore a schermo intero"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Schermata superiore al 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Schermata superiore al 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Ripristina"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Aggancia a sinistra"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Aggancia a destra"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Ridimensiona la finestra dell\'app a sinistra"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Ridimensiona la finestra dell\'app a destra"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Ingrandisci o ripristina le dimensioni della finestra"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Attiva la modalità schermo diviso"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Attiva la modalità finestre del desktop"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ridimensiona la finestra a sinistra"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ridimensiona la finestra a destra"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Ingrandisci o ripristina le dimensioni della finestra"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Ingrandisci o ripristina le dimensioni della finestra"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Riduci a icona la finestra dell\'app"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Apri in base alle impostazioni predefinite"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Scegli come aprire i link web per questa app"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"All\'interno dell\'app"</string> diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml index 3d169e0830d9..3fe2a515437f 100644 --- a/libs/WindowManager/Shell/res/values-ja/strings.xml +++ b/libs/WindowManager/Shell/res/values-ja/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"左 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"左 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"右全画面"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"アプリを切り替える"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"上部全画面"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"上 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"上 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"復元"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"左にスナップ"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"右にスナップ"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"アプリ ウィンドウを左側にサイズ変更する"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"アプリ ウィンドウを右側にサイズ変更する"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ウィンドウを最大化する、またはウィンドウを元のサイズに戻す"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"分割画面モードに切り替える"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"デスクトップ ウィンドウ モードに切り替える"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ウィンドウを左側にサイズ変更する"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ウィンドウを右側にサイズ変更する"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ウィンドウを最大化する、またはウィンドウを元のサイズに戻す"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ウィンドウを最大化する、またはウィンドウを元のサイズに戻す"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"アプリ ウィンドウを最小化する"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"デフォルトの設定で開く"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"このアプリのウェブリンクを開く方法を選択"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"アプリ内"</string> diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml index 4ab4a648ab98..f5118972d93f 100644 --- a/libs/WindowManager/Shell/res/values-km/strings.xml +++ b/libs/WindowManager/Shell/res/values-km/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ឆ្វេង 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ឆ្វេង 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"អេក្រង់ពេញខាងស្តាំ"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ប្ដូរកម្មវិធី"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"អេក្រង់ពេញខាងលើ"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ខាងលើ 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ខាងលើ 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ស្ដារ"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ផ្លាស់ទីទៅឆ្វេង"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ផ្លាស់ទីទៅស្ដាំ"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ប្ដូរទំហំវិនដូកម្មវិធីទៅឆ្វេង"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ប្ដូរទំហំវិនដូកម្មវិធីទៅស្ដាំ"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ស្ដារ ឬបង្កើនទំហំវិនដូជាអតិបរមា"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"ចូលទៅមុខងារបំបែកអេក្រង់"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ចូលទៅមុខងារវិនដូកុំព្យូទ័រ"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ប្ដូរទំហំវិនដូទៅឆ្វេង"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ប្ដូរទំហំវិនដូទៅស្ដាំ"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ស្ដារ ឬបង្កើនទំហំវិនដូជាអតិបរមា"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ស្ដារ ឬបង្កើនទំហំវិនដូជាអតិបរមា"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"បង្រួមវិនដូកម្មវិធី"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"ការកំណត់បើកតាមលំនាំដើម"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ជ្រើសរើសរបៀបបើកតំណបណ្ដាញសម្រាប់កម្មវិធីនេះ"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"នៅក្នុងកម្មវិធី"</string> diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml index c4ce890e1685..3bd5527a9fe5 100644 --- a/libs/WindowManager/Shell/res/values-kn/strings.xml +++ b/libs/WindowManager/Shell/res/values-kn/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% ಎಡಕ್ಕೆ"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30% ಎಡಕ್ಕೆ"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ಬಲ ಫುಲ್ ಸ್ಕ್ರೀನ್"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ಆ್ಯಪ್ಗಳನ್ನು ಸ್ವ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ಮೇಲಿನ ಫುಲ್ ಸ್ಕ್ರೀನ್"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70% ಮೇಲಕ್ಕೆ"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50% ಮೇಲಕ್ಕೆ"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ಮರುಸ್ಥಾಪಿಸಿ"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ಎಡಕ್ಕೆ ಸ್ನ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ಬಲಕ್ಕೆ ಸ್ನ್ಯಾಪ್ ಮಾಡಿ"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ಮರುಗಾತ್ರಗೊಳಿಸಿ ಆ್ಯಪ್ ವಿಂಡೋ ಎಡ"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ಮರುಗಾತ್ರಗೊಳಿಸಿ ಆ್ಯಪ್ ವಿಂಡೋ ಬಲ"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ವಿಂಡೋ ಗಾತ್ರವನ್ನು ಗರಿಷ್ಠಗೊಳಿಸಿ ಅಥವಾ ಮರುಸ್ಥಾಪಿಸಿ"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಮೋಡ್ಗೆ ಪ್ರವೇಶಿಸಿ"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ಡೆಸ್ಕ್ಟಾಪ್ ವಿಂಡೋಯಿಂಗ್ ಮೋಡ್ಗೆ ಪ್ರವೇಶಿಸಿ"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ಮರುಗಾತ್ರಗೊಳಿಸಿ ವಿಂಡೋವನ್ನು ಎಡಕ್ಕೆ ಸರಿಸಿ"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ಮರುಗಾತ್ರಗೊಳಿಸಿ ವಿಂಡೋವನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ವಿಂಡೋ ಗಾತ್ರವನ್ನು ಗರಿಷ್ಠಗೊಳಿಸಿ ಅಥವಾ ಮರುಸ್ಥಾಪಿಸಿ"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ವಿಂಡೋ ಗಾತ್ರವನ್ನು ಗರಿಷ್ಠಗೊಳಿಸಿ ಅಥವಾ ಮರುಸ್ಥಾಪಿಸಿ"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ಆ್ಯಪ್ ವಿಂಡೋವನ್ನು ಮಿನಿಮೈಜ್ ಮಾಡಿ"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"ಡೀಫಾಲ್ಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳಿಂದ ತೆರೆಯಿರಿ"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ಈ ಆ್ಯಪ್ಗೆ ವೆಬ್ ಲಿಂಕ್ಗಳನ್ನು ಹೇಗೆ ತೆರೆಯಬೇಕು ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ಆ್ಯಪ್ನಲ್ಲಿ"</string> diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml index c8079714fc13..ede25645c76c 100644 --- a/libs/WindowManager/Shell/res/values-lt/strings.xml +++ b/libs/WindowManager/Shell/res/values-lt/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kairysis ekranas 50 %"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kairysis ekranas 30 %"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Dešinysis ekranas viso ekrano režimu"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Programų keitimas"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Viršutinis ekranas viso ekrano režimu"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Viršutinis ekranas 70 %"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Viršutinis ekranas 50 %"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Atkurti"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pritraukti kairėje"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pritraukti dešinėje"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Pakeisti programos lango dydį kairėje"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Pakeisti programos lango dydį dešinėje"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Padidinti arba atkurti lango dydį"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Išskaidyto ekrano režimo įjungimas"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Įjungti darbalaukio pateikimo lange režimą"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Pakeisti lango dydį kairėje"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Pakeisti lango dydį dešinėje"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Padidinti arba atkurti lango dydį"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Padidinti arba atkurti lango dydį"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Sumažinti programos langą"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Atidaryti pagal numatytuosius nustatymus"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Pasirinkite, kaip atidaryti šios programos žiniatinklio nuorodas"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Programoje"</string> diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml index 01136c32890c..6593e2d9e66b 100644 --- a/libs/WindowManager/Shell/res/values-mk/strings.xml +++ b/libs/WindowManager/Shell/res/values-mk/strings.xml @@ -135,7 +135,7 @@ <string name="collapse_menu_text" msgid="7515008122450342029">"Затворете го менито"</string> <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Отвори го менито"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Максимизирај го екранот"</string> - <string name="desktop_mode_maximize_menu_snap_text" msgid="5673738963174074006">"Промени ја големината"</string> + <string name="desktop_mode_maximize_menu_snap_text" msgid="5673738963174074006">"Промени ја гол."</string> <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Апликацијата не може да се премести овде"</string> <string name="desktop_mode_maximize_menu_immersive_button_text" msgid="559492223133829481">"Реалистично"</string> <string name="desktop_mode_maximize_menu_immersive_restore_button_text" msgid="4900114367354709257">"Врати"</string> diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml index c2a942d19946..89215b66ba01 100644 --- a/libs/WindowManager/Shell/res/values-ml/strings.xml +++ b/libs/WindowManager/Shell/res/values-ml/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ഇടത് 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ഇടത് 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"വലത് പൂർണ്ണ സ്ക്രീൻ"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ആപ്പുകൾ സ്വാപ്പ് ചെയ്യുക"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"മുകളിൽ പൂർണ്ണ സ്ക്രീൻ"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"മുകളിൽ 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"മുകളിൽ 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"പുനഃസ്ഥാപിക്കുക"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ഇടതുവശത്തേക്ക് സ്നാപ്പ് ചെയ്യുക"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"വലതുവശത്തേക്ക് സ്നാപ്പ് ചെയ്യുക"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ഇടത് ആപ്പ് വിൻഡോ വലുപ്പം മാറ്റുക"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"വലത് ആപ്പ് വിൻഡോ വലുപ്പം മാറ്റുക"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"വിന്ഡോ വലുപ്പം വലുതാക്കുക അല്ലെങ്കിൽ പഴയത് പുനഃസ്ഥാപിക്കുക"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"സ്പ്ലിറ്റ് സ്ക്രീൻ മോഡിൽ പ്രവേശിക്കുക"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ഡെസ്ക്ടോപ്പ് വിൻഡോയിംഗ് മോഡിൽ പ്രവേശിക്കുക"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ഇടത്തേക്ക് ആപ്പ് വിൻഡോ വലുപ്പം മാറ്റുക"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"വലത്തേക്ക് ആപ്പ് വിൻഡോ വലുപ്പം മാറ്റുക"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"വിന്ഡോ വലുപ്പം വലുതാക്കുക അല്ലെങ്കിൽ പഴയത് പുനഃസ്ഥാപിക്കുക"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"വിന്ഡോ വലുപ്പം വലുതാക്കുക അല്ലെങ്കിൽ പഴയത് പുനഃസ്ഥാപിക്കുക"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ആപ്പ് വിന്ഡോ ചെറുതാക്കുക"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"ഡിഫോൾട്ട് ക്രമീകരണം ഉപയോഗിച്ച് തുറക്കുക"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ഈ ആപ്പിനായി വെബ് ലിങ്കുകൾ എങ്ങനെ തുറക്കണമെന്ന് തിരഞ്ഞെടുക്കൂ"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ആപ്പിൽ"</string> diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml index 56b2c2c617ce..a54ef140c9a1 100644 --- a/libs/WindowManager/Shell/res/values-ms/strings.xml +++ b/libs/WindowManager/Shell/res/values-ms/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Kiri 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Kiri 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Skrin penuh kanan"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Tukar Apl"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Skrin penuh atas"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Atas 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Atas 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Pulihkan"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Autojajar ke kiri"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Autojajar ke kanan"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Butang kiri ubah saiz tetingkap apl"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Butang kanan ubah saiz tetingkap apl"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maksimumkan atau pulihkan saiz tetingkap"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Masuki mod skrin pisah"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Masuki mod tetingkap desktop"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Ubah saiz tetingkap ke sebelah kiri"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Ubah saiz tetingkap ke sebelah kanan"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maksimumkan atau pulihkan saiz tetingkap"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maksimumkan atau pulihkan saiz tetingkap"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimumkan tetingkap apl"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Buka tetapan secara lalai"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Pilih cara membuka pautan web untuk apl ini"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Pada apl"</string> diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml index 80c588fdf401..20bc65abab18 100644 --- a/libs/WindowManager/Shell/res/values-nl/strings.xml +++ b/libs/WindowManager/Shell/res/values-nl/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Linkerscherm 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Linkerscherm 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Rechterscherm op volledig scherm"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Apps wisselen"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Bovenste scherm op volledig scherm"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Bovenste scherm 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Bovenste scherm 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Herstellen"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Links uitlijnen"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Rechts uitlijnen"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Formaat van app-venster naar links aanpassen"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Formaat van app-venster naar rechts aanpassen"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Formaat van venster maximaliseren of herstellen"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Modus voor gesplitst scherm openen"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Modus voor desktopvensterfuncties openen"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Formaat van venster naar links aanpassen"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Formaat van venster naar rechts aanpassen"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Formaat van venster maximaliseren of herstellen"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Formaat van venster maximaliseren of herstellen"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"App-venster minimaliseren"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Instellingen voor Standaard openen"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Kies hoe je weblinks voor deze app wilt openen"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"In de app"</string> diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml index 6015e93da327..29de4c45217f 100644 --- a/libs/WindowManager/Shell/res/values-pa/strings.xml +++ b/libs/WindowManager/Shell/res/values-pa/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ਖੱਬੇ 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ਖੱਬੇ 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"ਸੱਜੇ ਪੂਰੀ ਸਕ੍ਰੀਨ"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"ਐਪਾਂ ਨੂੰ ਸਵੈਪ ਕਰੋ"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ਉੱਪਰ ਪੂਰੀ ਸਕ੍ਰੀਨ"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ਉੱਪਰ 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ਉੱਪਰ 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ਮੁੜ-ਬਹਾਲ ਕਰੋ"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ਖੱਬੇ ਪਾਸੇ ਸਨੈਪ ਕਰੋ"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ਸੱਜੇ ਪਾਸੇ ਸਨੈਪ ਕਰੋ"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ਐਪ ਵਿੰਡੋ ਦਾ ਆਕਾਰ ਬਦਲ ਕੇ ਖੱਬੇ ਪਾਸੇ ਕਰੋ"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ਐਪ ਵਿੰਡੋ ਦਾ ਆਕਾਰ ਬਦਲ ਕੇ ਸੱਜੇ ਪਾਸੇ ਕਰੋ"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ਵਿੰਡੋ ਦਾ ਆਕਾਰ ਵਧਾਓ ਜਾਂ ਮੁੜ-ਬਹਾਲ ਕਰੋ"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਮੋਡ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ਡੈਸਕਟਾਪ ਵਿੰਡੋ ਮੋਡ ਵਿੱਚ ਦਾਖਲ ਹੋਵੋ"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ਵਿੰਡੋ ਦਾ ਆਕਾਰ ਬਦਲ ਕੇ ਖੱਬੇ ਪਾਸੇ ਕਰੋ"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ਵਿੰਡੋ ਦਾ ਆਕਾਰ ਬਦਲ ਕੇ ਸੱਜੇ ਪਾਸੇ ਕਰੋ"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ਵਿੰਡੋ ਦਾ ਆਕਾਰ ਵਧਾਓ ਜਾਂ ਮੁੜ-ਬਹਾਲ ਕਰੋ"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ਵਿੰਡੋ ਦਾ ਆਕਾਰ ਵਧਾਓ ਜਾਂ ਮੁੜ-ਬਹਾਲ ਕਰੋ"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ਐਪ ਵਿੰਡੋ ਨੂੰ ਛੋਟਾ ਕਰੋ"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਸੈਟਿੰਗਾਂ ਮੁਤਾਬਕ ਖੋਲ੍ਹੋ"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ਇਸ ਐਪ ਲਈ ਵੈੱਬ ਲਿੰਕਾਂ ਨੂੰ ਖੋਲ੍ਹਣ ਦਾ ਤਰੀਕਾ ਚੁਣੋ"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ਐਪ ਵਿੱਚ"</string> diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml index d881abab2450..0a3ea7011e1e 100644 --- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Esquerda a 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Esquerda a 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Lado direito em tela cheia"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Trocar apps"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Parte superior em tela cheia"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Parte superior a 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Parte superior a 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restaurar"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajustar à esquerda"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajustar à direita"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Redimensionar janela do app para a esquerda"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Redimensionar janela do app para a direita"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximizar ou restaurar o tamanho da janela"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Entrar no modo de tela dividida"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Entrar no modo de janela do computador"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Redimensionar janela para a esquerda"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Redimensionar janela para a direita"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximizar ou restaurar o tamanho da janela"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximizar ou restaurar o tamanho da janela"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizar janela do app"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Configurações \"Abrir por padrão\""</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Escolha como abrir links da Web para este app"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"No app"</string> diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml index dcbec8656a28..c9d196b922db 100644 --- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"50% no ecrã esquerdo"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"30% no ecrã esquerdo"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Ecrã direito inteiro"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Trocar apps"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Ecrã superior inteiro"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"70% no ecrã superior"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50% no ecrã superior"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restaurar"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Encaixar à esquerda"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Encaixar à direita"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Redimensionar janela da app para a esquerda"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Redimensionar janela da app para a direita"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximizar ou restaurar tamanho da janela"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Aceder ao modo de ecrã dividido"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Aceder ao modo de janelas de computador"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Redimensionar janela para a esquerda"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Redimensionar janela para a direita"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximizar ou restaurar tamanho da janela"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximizar ou restaurar tamanho da janela"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizar janela da app"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Definições de Abrir por predefinição"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Escolha como abrir links da Web para esta app"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Na app"</string> diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml index d881abab2450..0a3ea7011e1e 100644 --- a/libs/WindowManager/Shell/res/values-pt/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Esquerda a 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Esquerda a 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Lado direito em tela cheia"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Trocar apps"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Parte superior em tela cheia"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Parte superior a 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Parte superior a 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Restaurar"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajustar à esquerda"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajustar à direita"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Redimensionar janela do app para a esquerda"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Redimensionar janela do app para a direita"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximizar ou restaurar o tamanho da janela"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Entrar no modo de tela dividida"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Entrar no modo de janela do computador"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Redimensionar janela para a esquerda"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Redimensionar janela para a direita"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximizar ou restaurar o tamanho da janela"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximizar ou restaurar o tamanho da janela"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimizar janela do app"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Configurações \"Abrir por padrão\""</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Escolha como abrir links da Web para este app"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"No app"</string> diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml index 1fc0e6f1d5e4..5b20b2bd6499 100644 --- a/libs/WindowManager/Shell/res/values-ru/strings.xml +++ b/libs/WindowManager/Shell/res/values-ru/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Левый на 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Левый на 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Правый во весь экран"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Поменять приложения местами"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Верхний во весь экран"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Верхний на 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Верхний на 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Восстановить"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Привязать слева"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Привязать справа"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Растянуть окно приложения влево"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Растянуть окно приложения вправо"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Развернуть окно или восстановить его размер"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Перейти в режим разделения экрана"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Перейти в режим компьютера"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Растянуть окно влево"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Растянуть окно вправо"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Развернуть окно или восстановить его размер"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Развернуть окно или восстановить его размер"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Свернуть окно приложения"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Настройки, регулирующие, как по умолчанию открываются ссылки"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Выберите, где будут открываться ссылки из этого приложения"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"В приложении"</string> diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml index f1116c0d1dd2..f0ef1d1bc658 100644 --- a/libs/WindowManager/Shell/res/values-si/strings.xml +++ b/libs/WindowManager/Shell/res/values-si/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"වම් 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"වම් 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"දකුණු පූර්ණ තිරය"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"යෙදුම් හුවමාරු කරන්න"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ඉහළම පූර්ණ තිරය"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ඉහළම 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ඉහළම 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"ප්රතිසාධනය කරන්න"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"වමට ස්නැප් කරන්න"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"දකුණට ස්නැප් කරන්න"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"යෙදුම් කවුළුව වමට ප්රතිප්රමාණ කරන්න"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"යෙදුම් කවුළුව දකුණට ප්රතිප්රමාණ කරන්න"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"කවුළු ප්රමාණය උපරිම කරන්න හෝ ප්රතිසාධනය කරන්න"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"බෙදුම් තිර මාදිලියට ඇතුළු වන්න"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"ඩෙස්ක්ටොප කවුළුකරණ මාදිලියට ඇතුළු වන්න"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"කවුළුව වමට ප්රතිප්රමාණ කරන්න"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"කවුළුව දකුණට ප්රතිප්රමාණ කරන්න"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"කවුළු ප්රමාණය උපරිම කරන්න හෝ ප්රතිසාධනය කරන්න"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"කවුළු ප්රමාණය උපරිම කරන්න හෝ ප්රතිසාධනය කරන්න"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"යෙදුම් කවුළුව අවම කරන්න"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"පෙරනිමි සැකසීම් මඟින් විවෘත කරන්න"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"මෙම යෙදුම සඳහා වෙබ් සබැඳි විවෘත කරන ආකාරය තෝරා ගන්න"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"යෙදුම තුළ"</string> diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml index a6c734322015..688c217b8d32 100644 --- a/libs/WindowManager/Shell/res/values-sk/strings.xml +++ b/libs/WindowManager/Shell/res/values-sk/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Ľavá – 50 %"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Ľavá – 30 %"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Pravá– na celú obrazovku"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Vymeniť aplikácie"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Horná – na celú obrazovku"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Horná – 70 %"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Horná – 50 %"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Obnoviť"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Prichytiť vľavo"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Prichytiť vpravo"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Zmeniť veľkosť okna aplikácie vľavo"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Zmeniť veľkosť okna aplikácie vpravo"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Maximalizovať alebo obnoviť veľkosť okna"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Spustiť režim rozdelenej obrazovky"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Prejsť na režim okien na pracovnej ploche"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Zmeniť veľkosť okna vľavo"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Zmeniť veľkosť okna vpravo"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Maximalizovať alebo obnoviť veľkosť okna"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Maximalizovať alebo obnoviť veľkosť okna"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Minimalizovať okno aplikácie"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Otvárať podľa predvolených nastavení"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Vyberte, ako sa majú v tejto aplikácii otvárať webové odkazy"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"V aplikácii"</string> diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml index 02ced0dc0d12..69eb3e311726 100644 --- a/libs/WindowManager/Shell/res/values-sl/strings.xml +++ b/libs/WindowManager/Shell/res/values-sl/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Levi 50 %"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Levi 30 %"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Desni v celozaslonski način"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Zamenjava aplikacij"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Zgornji v celozaslonski način"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Zgornji 70 %"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Zgornji 50 %"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Obnovi"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pripni levo"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pripni desno"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Sprememba velikosti okna aplikacije na levi"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Sprememba velikosti okna aplikacije na desni"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Povečava ali obnovitev velikosti okna"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Vklop načina razdeljenega zaslona"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Vklop načina prikaza v oknu na namizju"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Sprememba velikosti okna na levi"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Sprememba velikosti okna na desni"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Povečava ali obnovitev velikosti okna"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Povečava ali obnovitev velikosti okna"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Pomanjšava okna aplikacije"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Nastavitve privzetega odpiranja"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Izberite način odpiranja spletnih povezav za to aplikacijo"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"V aplikaciji"</string> diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml index e3cb1f332c15..5163fc69dfb5 100644 --- a/libs/WindowManager/Shell/res/values-sr/strings.xml +++ b/libs/WindowManager/Shell/res/values-sr/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Леви екран 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Леви екран 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"Режим целог екрана за доњи екран"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Замените места апликацијама"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Режим целог екрана за горњи екран"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Горњи екран 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Горњи екран 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Вратите"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Прикачите лево"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Прикачите десно"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Промените величину прозора апликације налево"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Промените величину прозора апликације надесно"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Увећајте или вратите величину прозора"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Уђите у режим подељеног екрана"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Уђите у режим прозора на рачунару"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Промените величину прозора налево"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Промените величину прозора надесно"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Увећајте или вратите величину прозора"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Увећајте или вратите величину прозора"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Умањите прозор апликације"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Подешавање Подразумевано отварај"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Одаберите начин отварања веб-линкова за ову апликацију"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"У апликацији"</string> diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml index af8abaaf91b0..932f831c537d 100644 --- a/libs/WindowManager/Shell/res/values-te/strings.xml +++ b/libs/WindowManager/Shell/res/values-te/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ఎడమవైపు 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ఎడమవైపు 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"కుడివైపు ఫుల్-స్క్రీన్"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"యాప్లను మార్చండి"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"ఎగువ ఫుల్-స్క్రీన్"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ఎగువ 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ఎగువ 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"రీస్టోర్ చేయండి"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ఎడమ వైపున స్నాప్ చేయండి"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"కుడి వైపున స్నాప్ చేయండి"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"యాప్ విండో ఎడమ వైపు సైజ్ మార్చండి"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"యాప్ విండో కుడి వైపు సైజ్ మార్చండి"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"విండో సైజ్ను మ్యాగ్జిమైజ్ చేయండి లేదా రీస్టోర్ చేయండి"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"స్ప్లిట్ స్క్రీన్ మోడ్ను ఉపయోగించండి"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"డెస్క్టాప్ విండోయింగ్ మోడ్ను ఎంటర్ చేయండి"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"విండో ఎడమ వైపునకు సైజ్ను మార్చండి"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"విండో కుడి వైపునకు సైజ్ను మార్చండి"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"విండో సైజ్ను మ్యాగ్జిమైజ్ చేయండి లేదా రీస్టోర్ చేయండి"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"విండో సైజ్ను మ్యాగ్జిమైజ్ చేయండి లేదా రీస్టోర్ చేయండి"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"యాప్ విండోను కుదించండి"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"ఆటోమేటిక్ సెట్టింగ్ల ద్వారా తెరవండి"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"ఈ యాప్నకు సంబంధించిన వెబ్ లింక్లను ఎలా తెరవాలో ఎంచుకోండి"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"యాప్లో"</string> diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml index 565b4ee7cf45..e157474d34fa 100644 --- a/libs/WindowManager/Shell/res/values-th/strings.xml +++ b/libs/WindowManager/Shell/res/values-th/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"ซ้าย 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"ซ้าย 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"เต็มหน้าจอทางขวา"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"สลับแอป"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"เต็มหน้าจอด้านบน"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"ด้านบน 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ด้านบน 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"คืนค่า"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"จัดพอดีกับทางซ้าย"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"จัดพอดีกับทางขวา"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"ปรับขนาดหน้าต่างแอปไปทางซ้าย"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"ปรับขนาดหน้าต่างแอปไปทางขวา"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"ขยายหรือคืนค่าขนาดหน้าต่าง"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"เข้าสู่โหมดแยกหน้าจอ"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"เข้าสู่โหมดหน้าต่างเดสก์ท็อป"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"ปรับขนาดหน้าต่างไปทางซ้าย"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"ปรับขนาดหน้าต่างไปทางขวา"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"ขยายหรือคืนค่าขนาดหน้าต่าง"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"ขยายหรือคืนค่าขนาดหน้าต่าง"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"ย่อหน้าต่างแอป"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"เปิดตามการตั้งค่าเริ่มต้น"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"เลือกวิธีเปิดเว็บลิงก์สำหรับแอปนี้"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"ในแอป"</string> diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml index e8cb1d2253a9..7f2970453072 100644 --- a/libs/WindowManager/Shell/res/values-tl/strings.xml +++ b/libs/WindowManager/Shell/res/values-tl/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Gawing 50% ang nasa kaliwa"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Gawing 30% ang nasa kaliwa"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"I-full screen ang nasa kanan"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Pagpalitin ang Mga App"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"I-full screen ang nasa itaas"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Gawing 70% ang nasa itaas"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Gawing 50% ang nasa itaas"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"I-restore"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"I-snap pakaliwa"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"I-snap pakanan"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"I-resize pakaliwa ang window ng app"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"I-resize pakanan ang window ng app"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"I-maximize o i-restore ang laki ng window"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Pumunta sa split screen mode"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Pumunta sa desktop windowing mode"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"I-resize pakaliwa ang window"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"I-resize pakanan ang window"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"I-maximize o i-restore ang laki ng window"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"I-maximize o i-restore ang laki ng window"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"I-minimize ang window ng app"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Buksan sa pamamagitan ng mga default na setting"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Piliin kung paano magbukas ng web link para sa app na ito"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Sa app"</string> diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml index 63d82bf1b1a5..7c6a2a20aa80 100644 --- a/libs/WindowManager/Shell/res/values-uz/strings.xml +++ b/libs/WindowManager/Shell/res/values-uz/strings.xml @@ -43,8 +43,7 @@ <string name="accessibility_action_divider_left_50" msgid="3488317024557521561">"Chapda 50%"</string> <string name="accessibility_action_divider_left_30" msgid="6023611335723838727">"Chapda 30%"</string> <string name="accessibility_action_divider_right_full" msgid="3408505054325944903">"O‘ngda to‘liq ekran"</string> - <!-- no translation found for accessibility_action_divider_swap (7026003137401725787) --> - <skip /> + <string name="accessibility_action_divider_swap" msgid="7026003137401725787">"Ilovalarni almashtirish"</string> <string name="accessibility_action_divider_top_full" msgid="3495871951082107594">"Tepada to‘liq ekran"</string> <string name="accessibility_action_divider_top_70" msgid="1779164068887875474">"Tepada 70%"</string> <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Tepada 50%"</string> @@ -143,26 +142,16 @@ <string name="desktop_mode_maximize_menu_restore_button_text" msgid="4234449220944704387">"Tiklash"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Chapga tortish"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Oʻngga tortish"</string> - <!-- no translation found for desktop_mode_a11y_action_snap_left (2932955411661734668) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_snap_right (4577032451624261787) --> - <skip /> - <!-- no translation found for desktop_mode_a11y_action_maximize_restore (8026037983417986686) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_split_screen_mode_button_text (7182959681057464802) --> - <skip /> - <!-- no translation found for app_handle_menu_talkback_desktop_mode_button_text (1230110046930843630) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_left_text (500309467459084564) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_snap_right_text (7010831426654467163) --> - <skip /> - <!-- no translation found for maximize_menu_talkback_action_maximize_restore_text (4942610897847934859) --> - <skip /> - <!-- no translation found for maximize_button_talkback_action_maximize_restore_text (4122441323153198455) --> - <skip /> - <!-- no translation found for minimize_button_talkback_action_maximize_restore_text (8890767445425625935) --> - <skip /> + <string name="desktop_mode_a11y_action_snap_left" msgid="2932955411661734668">"Ilova chap oynasi oʻlchamini oʻzgartirish"</string> + <string name="desktop_mode_a11y_action_snap_right" msgid="4577032451624261787">"Ilova oʻng oynasi oʻlchamini oʻzgartirish"</string> + <string name="desktop_mode_a11y_action_maximize_restore" msgid="8026037983417986686">"Oyna oʻlchamini kengaytirish yoki asliga qaytarish"</string> + <string name="app_handle_menu_talkback_split_screen_mode_button_text" msgid="7182959681057464802">"Ajratilgan ekran rejimiga kirish"</string> + <string name="app_handle_menu_talkback_desktop_mode_button_text" msgid="1230110046930843630">"Kompyuter rejimiga kirish"</string> + <string name="maximize_menu_talkback_action_snap_left_text" msgid="500309467459084564">"Oyna oʻlchamini chapga oʻzgartirish"</string> + <string name="maximize_menu_talkback_action_snap_right_text" msgid="7010831426654467163">"Oyna oʻlchamini oʻngga oʻzgartirish"</string> + <string name="maximize_menu_talkback_action_maximize_restore_text" msgid="4942610897847934859">"Oyna oʻlchamini kengaytirish yoki asliga qaytarish"</string> + <string name="maximize_button_talkback_action_maximize_restore_text" msgid="4122441323153198455">"Oyna oʻlchamini kengaytirish yoki asliga qaytarish"</string> + <string name="minimize_button_talkback_action_maximize_restore_text" msgid="8890767445425625935">"Ilova oynasini kichraytirish"</string> <string name="open_by_default_settings_text" msgid="2526548548598185500">"Birlamchi sozlamalar asosida ochish"</string> <string name="open_by_default_dialog_subheader_text" msgid="1729599730664063881">"Bu ilovalardagi veb havolalar qanday ochilishini tanlang"</string> <string name="open_by_default_dialog_in_app_text" msgid="6978022419634199806">"Ilovada"</string> diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/DragZoneFactory.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/DragZoneFactory.kt index c2eef33881be..aa523f57c469 100644 --- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/DragZoneFactory.kt +++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/DragZoneFactory.kt @@ -44,8 +44,8 @@ class DragZoneFactory( private val hSplitFromExpandedViewDragZoneWidth = 60 private val vSplitFromExpandedViewDragZoneWidth = 200 private val vSplitFromExpandedViewDragZoneHeightTablet = 285 - private val vSplitFromExpandedViewDragZoneHeightFold = 150 - private val vUnevenSplitFromExpandedViewDragZoneHeight = 96 + private val vSplitFromExpandedViewDragZoneHeightFoldTall = 150 + private val vSplitFromExpandedViewDragZoneHeightFoldShort = 100 /** * Creates the list of drag zones for the dragged object. @@ -360,7 +360,7 @@ class DragZoneFactory( fullScreenDragZoneHeight, splitZoneLeft + fullScreenDragZoneWidth, fullScreenDragZoneHeight + - vSplitFromExpandedViewDragZoneHeightFold + vSplitFromExpandedViewDragZoneHeightFoldTall ), ), DragZone.Split.Bottom( @@ -370,12 +370,32 @@ class DragZoneFactory( windowBounds.bottom / 2, splitZoneLeft + fullScreenDragZoneWidth, windowBounds.bottom / 2 + - vSplitFromExpandedViewDragZoneHeightFold + vSplitFromExpandedViewDragZoneHeightFoldTall + ), + ) + ) + SplitScreenMode.SPLIT_10_90 -> + listOf( + DragZone.Split.Top( + bounds = + Rect( + 0, + 0, + windowBounds.right, + vSplitFromExpandedViewDragZoneHeightFoldShort + ), + ), + DragZone.Split.Bottom( + bounds = + Rect( + splitZoneLeft, + vSplitFromExpandedViewDragZoneHeightFoldShort, + splitZoneLeft + fullScreenDragZoneWidth, + vSplitFromExpandedViewDragZoneHeightFoldShort + + vSplitFromExpandedViewDragZoneHeightFoldTall ), ) ) - // TODO b/393172431: add this zone when it's defined - SplitScreenMode.SPLIT_10_90 -> listOf() SplitScreenMode.SPLIT_90_10 -> listOf( DragZone.Split.Top( @@ -385,7 +405,7 @@ class DragZoneFactory( fullScreenDragZoneHeight, splitZoneLeft + fullScreenDragZoneWidth, fullScreenDragZoneHeight + - vUnevenSplitFromExpandedViewDragZoneHeight + vSplitFromExpandedViewDragZoneHeightFoldTall ), ), DragZone.Split.Bottom( @@ -393,7 +413,7 @@ class DragZoneFactory( Rect( 0, windowBounds.bottom - - vUnevenSplitFromExpandedViewDragZoneHeight, + vSplitFromExpandedViewDragZoneHeightFoldShort, windowBounds.right, windowBounds.bottom ), diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java index c1dadada505a..5bd8d86f1144 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BadgedImageView.java @@ -357,9 +357,9 @@ public class BadgedImageView extends ConstraintLayout { void showBadge() { Bitmap appBadgeBitmap = mBubble.getAppBadge(); - final boolean isAppLaunchIntent = (mBubble instanceof Bubble) - && ((Bubble) mBubble).isAppLaunchIntent(); - if (appBadgeBitmap == null || isAppLaunchIntent) { + final boolean showAppBadge = (mBubble instanceof Bubble) + && ((Bubble) mBubble).showAppBadge(); + if (appBadgeBitmap == null || !showAppBadge) { mAppIcon.setVisibility(GONE); return; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java index d77c177437b8..50ff58d7cf22 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java @@ -56,7 +56,6 @@ import com.android.wm.shell.bubbles.bar.BubbleBarExpandedView; import com.android.wm.shell.bubbles.bar.BubbleBarLayerView; import com.android.wm.shell.shared.annotations.ShellBackgroundThread; import com.android.wm.shell.shared.annotations.ShellMainThread; -import com.android.wm.shell.shared.bubbles.BubbleAnythingFlagHelper; import com.android.wm.shell.shared.bubbles.BubbleInfo; import com.android.wm.shell.shared.bubbles.ParcelableFlyoutMessage; import com.android.wm.shell.taskview.TaskView; @@ -78,11 +77,19 @@ public class Bubble implements BubbleViewProvider { /** A string prefix used in note bubbles' {@link #mKey}. */ public static final String KEY_NOTE_BUBBLE = "key_note_bubble"; - /** Whether the bubble is an app bubble. */ - private final boolean mIsAppBubble; + /** The possible types a bubble may be. */ + public enum BubbleType { + /** Chat is from a notification. */ + TYPE_CHAT, + /** Notes are from the note taking API. */ + TYPE_NOTE, + /** Shortcuts from bubble anything, based on {@link ShortcutInfo}. */ + TYPE_SHORTCUT, + /** Apps are from bubble anything. */ + TYPE_APP, + } - /** Whether the bubble is a notetaking bubble. */ - private final boolean mIsNoteBubble; + private final BubbleType mType; private final String mKey; @Nullable @@ -221,7 +228,6 @@ public class Bubble implements BubbleViewProvider { * Create a bubble with limited information based on given {@link ShortcutInfo}. * Note: Currently this is only being used when the bubble is persisted to disk. */ - @VisibleForTesting(visibility = PRIVATE) public Bubble(@NonNull final String key, @NonNull final ShortcutInfo shortcutInfo, final int desiredHeight, final int desiredHeightResId, @Nullable final String title, int taskId, @Nullable final String locus, boolean isDismissable, @@ -248,16 +254,15 @@ public class Bubble implements BubbleViewProvider { mBgExecutor = bgExecutor; mTaskId = taskId; mBubbleMetadataFlagListener = listener; - mIsAppBubble = false; - mIsNoteBubble = false; + // TODO (b/394085999) read/write type to xml + mType = BubbleType.TYPE_CHAT; } private Bubble( Intent intent, UserHandle user, @Nullable Icon icon, - boolean isAppBubble, - boolean isNoteBubble, + BubbleType type, String key, @ShellMainThread Executor mainExecutor, @ShellBackgroundThread Executor bgExecutor) { @@ -266,8 +271,7 @@ public class Bubble implements BubbleViewProvider { mFlags = 0; mUser = user; mIcon = icon; - mIsAppBubble = isAppBubble; - mIsNoteBubble = isNoteBubble; + mType = type; mKey = key; mShowBubbleUpdateDot = false; mMainExecutor = mainExecutor; @@ -285,8 +289,7 @@ public class Bubble implements BubbleViewProvider { mFlags = 0; mUser = info.getUserHandle(); mIcon = info.getIcon(); - mIsAppBubble = false; - mIsNoteBubble = false; + mType = BubbleType.TYPE_SHORTCUT; mKey = getBubbleKeyForShortcut(info); mShowBubbleUpdateDot = false; mMainExecutor = mainExecutor; @@ -310,8 +313,7 @@ public class Bubble implements BubbleViewProvider { mFlags = 0; mUser = user; mIcon = icon; - mIsAppBubble = true; - mIsNoteBubble = false; + mType = BubbleType.TYPE_APP; mKey = key; mShowBubbleUpdateDot = false; mMainExecutor = mainExecutor; @@ -322,15 +324,14 @@ public class Bubble implements BubbleViewProvider { mPackageName = task.baseActivity.getPackageName(); } - /** Creates a notetaking bubble. */ + /** Creates a note taking bubble. */ public static Bubble createNotesBubble(Intent intent, UserHandle user, @Nullable Icon icon, @ShellMainThread Executor mainExecutor, @ShellBackgroundThread Executor bgExecutor) { return new Bubble(intent, user, icon, - /* isAppBubble= */ true, - /* isNoteBubble= */ true, - /* key= */ getNoteBubbleKeyForApp(intent.getPackage(), user), + BubbleType.TYPE_NOTE, + getNoteBubbleKeyForApp(intent.getPackage(), user), mainExecutor, bgExecutor); } @@ -340,9 +341,8 @@ public class Bubble implements BubbleViewProvider { return new Bubble(intent, user, icon, - /* isAppBubble= */ true, - /* isNoteBubble= */ false, - /* key= */ getAppBubbleKeyForApp(intent.getPackage(), user), + BubbleType.TYPE_APP, + getAppBubbleKeyForApp(intent.getPackage(), user), mainExecutor, bgExecutor); } @@ -400,13 +400,15 @@ public class Bubble implements BubbleViewProvider { return KEY_APP_BUBBLE + ":" + taskInfo.taskId; } + /** + * Creates a chat bubble based on a notification (contents of {@link BubbleEntry}. + */ @VisibleForTesting(visibility = PRIVATE) public Bubble(@NonNull final BubbleEntry entry, final Bubbles.BubbleMetadataFlagListener listener, final Bubbles.PendingIntentCanceledListener intentCancelListener, @ShellMainThread Executor mainExecutor, @ShellBackgroundThread Executor bgExecutor) { - mIsAppBubble = false; - mIsNoteBubble = false; + mType = BubbleType.TYPE_CHAT; mKey = entry.getKey(); mGroupKey = entry.getGroupKey(); mLocusId = entry.getLocusId(); @@ -436,7 +438,7 @@ public class Bubble implements BubbleViewProvider { getTitle(), getAppName(), isImportantConversation(), - !isAppLaunchIntent(), + showAppBadge(), getParcelableFlyoutMessage()); } @@ -1005,13 +1007,6 @@ public class Bubble implements BubbleViewProvider { } /** - * Whether this bubble is conversation - */ - public boolean isConversation() { - return null != mShortcutInfo; - } - - /** * Sets whether this notification should be suppressed in the shade. */ @VisibleForTesting @@ -1128,14 +1123,10 @@ public class Bubble implements BubbleViewProvider { } /** - * Whether this bubble represents the full app, i.e. the intent used is the launch - * intent for an app. In this case we don't show a badge on the icon. + * Whether an app badge should be shown for this bubble. */ - public boolean isAppLaunchIntent() { - if (BubbleAnythingFlagHelper.enableCreateAnyBubble() && mIntent != null) { - return mIntent.hasCategory("android.intent.category.LAUNCHER"); - } - return false; + public boolean showAppBadge() { + return isChat() || isShortcut() || isNote(); } /** @@ -1162,17 +1153,31 @@ public class Bubble implements BubbleViewProvider { } /** - * Returns whether this bubble is from an app (as well as notetaking) versus a notification. + * Returns whether this bubble is a conversation from the notification API. + */ + public boolean isChat() { + return mType == BubbleType.TYPE_CHAT; + } + + /** + * Returns whether this bubble is a note from the note taking API. + */ + public boolean isNote() { + return mType == BubbleType.TYPE_NOTE; + } + + /** + * Returns whether this bubble is a shortcut. */ - public boolean isAppBubble() { - return mIsAppBubble; + public boolean isShortcut() { + return mType == BubbleType.TYPE_SHORTCUT; } /** - * Returns whether this bubble is specific from the notetaking API. + * Returns whether this bubble is an app. */ - public boolean isNoteBubble() { - return mIsNoteBubble; + public boolean isApp() { + return mType == BubbleType.TYPE_APP; } /** Creates open app settings intent */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index 10efd8e164e4..66abcabed109 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -2890,7 +2890,7 @@ public class BubbleController implements ConfigurationChangeListener, mShortcutIdToBubble.put(b.getShortcutId(), b); updateBubbleSuppressedState(b); - if (b.isNoteBubble()) { + if (b.isNote()) { mNoteBubbleTaskIds.put(b.getKey(), b.getTaskId()); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEducationController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEducationController.kt index bd4708259b50..ed23986d0f64 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEducationController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleEducationController.kt @@ -83,4 +83,4 @@ class BubbleEducationController(private val context: Context) { /** Convenience extension method to check if the bubble is a conversation bubble */ private val BubbleViewProvider.isConversationBubble: Boolean - get() = if (this is Bubble) isConversation else false + get() = if (this is Bubble) isChat else false diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java index ad9ab7a722ee..3f607a9c52ef 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java @@ -227,10 +227,11 @@ public class BubbleExpandedView extends LinearLayout { MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS); final boolean isShortcutBubble = (mBubble.hasMetadataShortcutId() - || (mBubble.getShortcutInfo() != null + || (mBubble.isShortcut() && BubbleAnythingFlagHelper.enableCreateAnyBubble())); - if (mBubble.isAppBubble()) { + // TODO - currently based on type, really it's what the "launch item" is. + if (mBubble.isApp() || mBubble.isNote()) { Context context = mContext.createContextAsUser( mBubble.getUser(), Context.CONTEXT_RESTRICTED); @@ -284,7 +285,7 @@ public class BubbleExpandedView extends LinearLayout { // The taskId is saved to use for removeTask, preventing appearance in recent tasks. mTaskId = taskId; - if (mBubble != null && mBubble.isNoteBubble()) { + if (mBubble != null && mBubble.isNote()) { // Let the controller know sooner what the taskId is. mManager.setNoteBubbleTaskId(mBubble.getKey(), mTaskId); } 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 3babc0d801c4..dad627f85d95 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 @@ -1385,16 +1385,16 @@ public class BubbleStackView extends FrameLayout /** * Whether the selected bubble is conversation bubble */ - private boolean isConversationBubble() { + private boolean isChat() { BubbleViewProvider bubble = mBubbleData.getSelectedBubble(); - return bubble instanceof Bubble && ((Bubble) bubble).isConversation(); + return bubble instanceof Bubble && ((Bubble) bubble).isChat(); } /** * Whether the educational view should show for the expanded view "manage" menu. */ private boolean shouldShowManageEdu() { - if (!isConversationBubble()) { + if (!isChat()) { // We only show user education for conversation bubbles right now return false; } @@ -1441,7 +1441,7 @@ public class BubbleStackView extends FrameLayout * Whether education view should show for the collapsed stack. */ private boolean shouldShowStackEdu() { - if (!isConversationBubble()) { + if (!isChat()) { // We only show user education for conversation bubbles right now return false; } @@ -1976,7 +1976,7 @@ public class BubbleStackView extends FrameLayout return; } - if (firstBubble && bubble.isNoteBubble() && !mPositioner.hasUserModifiedDefaultPosition()) { + if (firstBubble && bubble.isNote() && !mPositioner.hasUserModifiedDefaultPosition()) { // If it's an note bubble and we don't have a previous resting position, update the // controllers to use the default position for the note bubble (it'd be different from // the position initialized with the controllers originally). @@ -3322,20 +3322,16 @@ public class BubbleStackView extends FrameLayout // name and icon. if (show) { final Bubble bubble = mBubbleData.getBubbleInStackWithKey(mExpandedBubble.getKey()); - if (bubble != null && !bubble.isAppBubble()) { - // Setup options for non app bubbles + if (bubble != null && bubble.isChat()) { + // Setup options for chat bubbles mManageDontBubbleView.setVisibility(VISIBLE); mManageSettingsIcon.setImageBitmap(bubble.getRawAppBadge()); mManageSettingsText.setText(getResources().getString( R.string.bubbles_app_settings, bubble.getAppName())); mManageSettingsView.setVisibility(VISIBLE); } else { - // Setup options for app bubbles - // App bubbles have no conversations - // so we don't show the option to not bubble conversation + // Not a chat bubble, so don't show conversation / notification settings mManageDontBubbleView.setVisibility(GONE); - // App bubbles are not notification based - // so we don't show the option to go to notification settings mManageSettingsView.setVisibility(GONE); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTaskViewHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTaskViewHelper.java index 0d89bb260bf5..4a0eee861d21 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTaskViewHelper.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleTaskViewHelper.java @@ -100,6 +100,7 @@ public class BubbleTaskViewHelper { // TODO: I notice inconsistencies in lifecycle // Post to keep the lifecycle normal + // TODO - currently based on type, really it's what the "launch item" is. mParentView.post(() -> { ProtoLog.d(WM_SHELL_BUBBLES, "onInitialized: calling startActivity, bubble=%s", getBubbleKey()); @@ -108,11 +109,11 @@ public class BubbleTaskViewHelper { options.setPendingIntentBackgroundActivityStartMode( MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS); final boolean isShortcutBubble = (mBubble.hasMetadataShortcutId() - || (mBubble.getShortcutInfo() != null + || (mBubble.isShortcut() && BubbleAnythingFlagHelper.enableCreateAnyBubble())); if (mBubble.getPreparingTransition() != null) { mBubble.getPreparingTransition().surfaceCreated(); - } else if (mBubble.isAppBubble()) { + } else if (mBubble.isApp() || mBubble.isNote()) { Context context = mContext.createContextAsUser( mBubble.getUser(), Context.CONTEXT_RESTRICTED); @@ -167,7 +168,7 @@ public class BubbleTaskViewHelper { // The taskId is saved to use for removeTask, preventing appearance in recent tasks. mTaskId = taskId; - if (mBubble != null && mBubble.isNoteBubble()) { + if (mBubble != null && mBubble.isNote()) { // Let the controller know sooner what the taskId is. mExpandedViewManager.setNoteBubbleTaskId(mBubble.getKey(), mTaskId); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java index 5f437d4af40f..b7761ec75782 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarMenuViewController.java @@ -222,7 +222,7 @@ class BubbleBarMenuViewController { Resources resources = mContext.getResources(); int tintColor = mContext.getColor(com.android.internal.R.color.materialColorOnSurface); - if (bubble.isConversation()) { + if (bubble.isChat()) { // Don't bubble conversation action menuActions.add(new BubbleBarMenuView.MenuAction( Icon.createWithResource(mContext, R.drawable.bubble_ic_stop_bubble), diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index d26789d2781a..b2b99d648bf4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -81,9 +81,9 @@ import com.android.wm.shell.dagger.pip.PipModule; import com.android.wm.shell.desktopmode.CloseDesktopTaskTransitionHandler; import com.android.wm.shell.desktopmode.DefaultDragToDesktopTransitionHandler; import com.android.wm.shell.desktopmode.DesktopActivityOrientationChangeHandler; -import com.android.wm.shell.desktopmode.DesktopBackNavigationTransitionHandler; import com.android.wm.shell.desktopmode.DesktopDisplayEventHandler; import com.android.wm.shell.desktopmode.DesktopImmersiveController; +import com.android.wm.shell.desktopmode.DesktopMinimizationTransitionHandler; import com.android.wm.shell.desktopmode.DesktopMixedTransitionHandler; import com.android.wm.shell.desktopmode.DesktopModeDragAndDropTransitionHandler; import com.android.wm.shell.desktopmode.DesktopModeEventLogger; @@ -1073,11 +1073,11 @@ public abstract class WMShellModule { @WMSingleton @Provides - static DesktopBackNavigationTransitionHandler provideDesktopBackNavigationTransitionHandler( + static DesktopMinimizationTransitionHandler provideDesktopMinimizationTransitionHandler( @ShellMainThread ShellExecutor mainExecutor, @ShellAnimationThread ShellExecutor animExecutor, DisplayController displayController) { - return new DesktopBackNavigationTransitionHandler(mainExecutor, animExecutor, + return new DesktopMinimizationTransitionHandler(mainExecutor, animExecutor, displayController); } @@ -1173,7 +1173,7 @@ public abstract class WMShellModule { FreeformTaskTransitionHandler freeformTaskTransitionHandler, CloseDesktopTaskTransitionHandler closeDesktopTaskTransitionHandler, Optional<DesktopImmersiveController> desktopImmersiveController, - DesktopBackNavigationTransitionHandler desktopBackNavigationTransitionHandler, + DesktopMinimizationTransitionHandler desktopMinimizationTransitionHandler, InteractionJankMonitor interactionJankMonitor, @ShellMainThread Handler handler, ShellInit shellInit, @@ -1191,7 +1191,7 @@ public abstract class WMShellModule { freeformTaskTransitionHandler, closeDesktopTaskTransitionHandler, desktopImmersiveController.get(), - desktopBackNavigationTransitionHandler, + desktopMinimizationTransitionHandler, interactionJankMonitor, handler, shellInit, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopBackNavigationTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMinimizationTransitionHandler.kt index 56c50ff484d4..728638d9bbd3 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopBackNavigationTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMinimizationTransitionHandler.kt @@ -31,10 +31,13 @@ import com.android.wm.shell.shared.animation.MinimizeAnimator.create import com.android.wm.shell.transition.Transitions /** - * The [Transitions.TransitionHandler] that handles transitions for tasks that are closing or going - * to back as part of back navigation. This handler is used only for animating transitions. + * The [Transitions.TransitionHandler] that handles transitions for tasks that are: + * - Closing or going to back as part of back navigation + * - Going to back as part of minimization button usage. + * + * Note that this handler is used only for animating transitions. */ -class DesktopBackNavigationTransitionHandler( +class DesktopMinimizationTransitionHandler( private val mainExecutor: ShellExecutor, private val animExecutor: ShellExecutor, private val displayController: DisplayController, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt index 3356a1ce10f2..c9b3ec0d3a11 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt @@ -52,7 +52,7 @@ class DesktopMixedTransitionHandler( private val freeformTaskTransitionHandler: FreeformTaskTransitionHandler, private val closeDesktopTaskTransitionHandler: CloseDesktopTaskTransitionHandler, private val desktopImmersiveController: DesktopImmersiveController, - private val desktopBackNavigationTransitionHandler: DesktopBackNavigationTransitionHandler, + private val desktopMinimizationTransitionHandler: DesktopMinimizationTransitionHandler, private val interactionJankMonitor: InteractionJankMonitor, @ShellMainThread private val handler: Handler, shellInit: ShellInit, @@ -316,8 +316,8 @@ class DesktopMixedTransitionHandler( ) } - // Animate minimizing desktop task transition with [DesktopBackNavigationTransitionHandler]. - return desktopBackNavigationTransitionHandler.startAnimation( + // Animate minimizing desktop task transition with [DesktopMinimizationTransitionHandler]. + return desktopMinimizationTransitionHandler.startAnimation( transition, info, startTransaction, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DisplayDeskState.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DisplayDeskState.aidl new file mode 100644 index 000000000000..59add47fc79d --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DisplayDeskState.aidl @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.desktopmode; + +/** + * Defines the state of desks on a display whose ID is `displayId`, which is: + * - `canCreateDesks`: whether it's possible to create new desks on this display. + * - `activeDeskId`: the currently active desk Id, or `-1` if none is active. + * - `deskId`: the list of desk Ids of the available desks on this display. + */ +parcelable DisplayDeskState { + int displayId; + boolean canCreateDesk; + int activeDeskId; + int[] deskIds; +} + diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopTaskListener.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopTaskListener.aidl index 6002a4dfe0d9..7ed1581cdfdb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopTaskListener.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopTaskListener.aidl @@ -16,27 +16,56 @@ package com.android.wm.shell.desktopmode; +import com.android.wm.shell.desktopmode.DisplayDeskState; + /** * Allows external processes to register a listener in WMShell to get updates about desktop task * state. */ -interface IDesktopTaskListener { +oneway interface IDesktopTaskListener { + + /** + * Called once when the listener first gets connected to initialize it with the current state of + * desks in Shell. + */ + void onListenerConnected(in DisplayDeskState[] displayDeskStates); /** Desktop tasks visibility has changed. Visible if at least 1 task is visible. */ - oneway void onTasksVisibilityChanged(int displayId, int visibleTasksCount); + void onTasksVisibilityChanged(int displayId, int visibleTasksCount); /** @deprecated this is no longer supported. */ - oneway void onStashedChanged(int displayId, boolean stashed); + void onStashedChanged(int displayId, boolean stashed); /** * Shows taskbar corner radius when running desktop tasks are updated if * [hasTasksRequiringTaskbarRounding] is true. */ - oneway void onTaskbarCornerRoundingUpdate(boolean hasTasksRequiringTaskbarRounding); + void onTaskbarCornerRoundingUpdate(boolean hasTasksRequiringTaskbarRounding); /** Entering desktop mode transition is started, send the signal with transition duration. */ - oneway void onEnterDesktopModeTransitionStarted(int transitionDuration); + void onEnterDesktopModeTransitionStarted(int transitionDuration); /** Exiting desktop mode transition is started, send the signal with transition duration. */ - oneway void onExitDesktopModeTransitionStarted(int transitionDuration); + void onExitDesktopModeTransitionStarted(int transitionDuration); + + /** + * Called when the conditions that allow the creation of a new desk on the display whose ID is + * `displayId` changes to `canCreateDesks`. It's also called when a new display is added. + */ + void onCanCreateDesksChanged(int displayId, boolean canCreateDesks); + + /** Called when a desk whose ID is `deskId` is added to the display whose ID is `displayId`. */ + void onDeskAdded(int displayId, int deskId); + + /** + * Called when a desk whose ID is `deskId` is removed from the display whose ID is `displayId`. + */ + void onDeskRemoved(int displayId, int deskId); + + /** + * Called when the active desk changes on the display whose ID is `displayId`. + * If `newActiveDesk` is -1, it means a desk is no longer active on the display. + * If `oldActiveDesk` is -1, it means a desk was not active on the display. + */ + void onActiveDeskChanged(int displayId, int newActiveDesk, int oldActiveDesk); }
\ No newline at end of file diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java index ea0f09af2d3b..2571e0e36cd9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragLayout.java @@ -413,6 +413,8 @@ public class DragLayout extends LinearLayout } private void updateDropZoneSizesForSingleTask() { + resetDropZoneTranslations(); + final LinearLayout.LayoutParams dropZoneView1 = (LayoutParams) mDropZoneView1.getLayoutParams(); final LinearLayout.LayoutParams dropZoneView2 = @@ -427,6 +429,19 @@ public class DragLayout extends LinearLayout mDropZoneView2.setLayoutParams(dropZoneView2); } + /** Zeroes out translationX and translationY on all drop zone views. */ + void resetDropZoneTranslations() { + setDropZoneTranslations(0, 0); + } + + /** Sets translationX and translationY on all drop zone views. */ + void setDropZoneTranslations(int x, int y) { + mDropZoneView1.setTranslationX(x); + mDropZoneView1.setTranslationY(y); + mDropZoneView2.setTranslationX(x); + mDropZoneView2.setTranslationY(y); + } + /** * Sets the size of the two drop zones based on the provided bounds. The divider sits between * the views and its size is included in the calculations. @@ -435,6 +450,15 @@ public class DragLayout extends LinearLayout * @param bounds2 bounds to apply to the second dropzone view, null if split in half. */ private void updateDropZoneSizes(Rect bounds1, Rect bounds2) { + if (bounds1 == null || bounds2 == null) { + // We're entering 50:50 split screen from a single app, no need for any translations. + resetDropZoneTranslations(); + } else { + // We're already in split, so align our drop zones to match the left/top app edge. This + // is necessary because the left/top app can be offscreen. + setDropZoneTranslations(bounds1.left, bounds1.top); + } + final int halfDivider = mDividerSize / 2; final LinearLayout.LayoutParams dropZoneView1 = (LayoutParams) mDropZoneView1.getLayoutParams(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/PipSurfaceTransactionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/PipSurfaceTransactionHelper.java index 026482004d51..c4d065f158a4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/PipSurfaceTransactionHelper.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/PipSurfaceTransactionHelper.java @@ -19,7 +19,6 @@ package com.android.wm.shell.pip2; import android.content.Context; import android.graphics.Matrix; import android.graphics.Rect; -import android.graphics.RectF; import android.view.Choreographer; import android.view.SurfaceControl; @@ -29,99 +28,19 @@ import com.android.wm.shell.R; * Abstracts the common operations on {@link SurfaceControl.Transaction} for PiP transition. */ public class PipSurfaceTransactionHelper { - /** for {@link #scale(SurfaceControl.Transaction, SurfaceControl, Rect, Rect)} operation */ private final Matrix mTmpTransform = new Matrix(); private final float[] mTmpFloat9 = new float[9]; - private final RectF mTmpSourceRectF = new RectF(); - private final RectF mTmpDestinationRectF = new RectF(); private final Rect mTmpDestinationRect = new Rect(); - private int mCornerRadius; - private int mShadowRadius; + private final int mCornerRadius; + private final int mShadowRadius; public PipSurfaceTransactionHelper(Context context) { - onDensityOrFontScaleChanged(context); - } - - /** - * Called when display size or font size of settings changed - * - * @param context the current context - */ - public void onDensityOrFontScaleChanged(Context context) { mCornerRadius = context.getResources().getDimensionPixelSize(R.dimen.pip_corner_radius); mShadowRadius = context.getResources().getDimensionPixelSize(R.dimen.pip_shadow_radius); } /** - * Operates the alpha on a given transaction and leash - * @return same {@link PipSurfaceTransactionHelper} instance for method chaining - */ - public PipSurfaceTransactionHelper alpha(SurfaceControl.Transaction tx, SurfaceControl leash, - float alpha) { - tx.setAlpha(leash, alpha); - return this; - } - - /** - * Operates the crop (and position) on a given transaction and leash - * @return same {@link PipSurfaceTransactionHelper} instance for method chaining - */ - public PipSurfaceTransactionHelper crop(SurfaceControl.Transaction tx, SurfaceControl leash, - Rect destinationBounds) { - tx.setWindowCrop(leash, destinationBounds.width(), destinationBounds.height()) - .setPosition(leash, destinationBounds.left, destinationBounds.top); - return this; - } - - /** - * Operates the scale (setMatrix) on a given transaction and leash - * @return same {@link PipSurfaceTransactionHelper} instance for method chaining - */ - public PipSurfaceTransactionHelper scale(SurfaceControl.Transaction tx, SurfaceControl leash, - Rect sourceBounds, Rect destinationBounds) { - mTmpDestinationRectF.set(destinationBounds); - return scale(tx, leash, sourceBounds, mTmpDestinationRectF, 0 /* degrees */); - } - - /** - * Operates the scale (setMatrix) on a given transaction and leash - * @return same {@link PipSurfaceTransactionHelper} instance for method chaining - */ - public PipSurfaceTransactionHelper scale(SurfaceControl.Transaction tx, SurfaceControl leash, - Rect sourceBounds, RectF destinationBounds) { - return scale(tx, leash, sourceBounds, destinationBounds, 0 /* degrees */); - } - - /** - * Operates the scale (setMatrix) on a given transaction and leash - * @return same {@link PipSurfaceTransactionHelper} instance for method chaining - */ - public PipSurfaceTransactionHelper scale(SurfaceControl.Transaction tx, SurfaceControl leash, - Rect sourceBounds, Rect destinationBounds, float degrees) { - mTmpDestinationRectF.set(destinationBounds); - return scale(tx, leash, sourceBounds, mTmpDestinationRectF, degrees); - } - - /** - * Operates the scale (setMatrix) on a given transaction and leash, along with a rotation. - * @return same {@link PipSurfaceTransactionHelper} instance for method chaining - */ - public PipSurfaceTransactionHelper scale(SurfaceControl.Transaction tx, SurfaceControl leash, - Rect sourceBounds, RectF destinationBounds, float degrees) { - mTmpSourceRectF.set(sourceBounds); - // We want the matrix to position the surface relative to the screen coordinates so offset - // the source to 0,0 - mTmpSourceRectF.offsetTo(0, 0); - mTmpDestinationRectF.set(destinationBounds); - mTmpTransform.setRectToRect(mTmpSourceRectF, mTmpDestinationRectF, Matrix.ScaleToFit.FILL); - mTmpTransform.postRotate(degrees, - mTmpDestinationRectF.centerX(), mTmpDestinationRectF.centerY()); - tx.setMatrix(leash, mTmpTransform, mTmpFloat9); - return this; - } - - /** * Operates the scale (setMatrix) on a given transaction and leash * @return same {@link PipSurfaceTransactionHelper} instance for method chaining */ @@ -205,19 +124,6 @@ public class PipSurfaceTransactionHelper { } /** - * Resets the scale (setMatrix) on a given transaction and leash if there's any - * - * @return same {@link PipSurfaceTransactionHelper} instance for method chaining - */ - public PipSurfaceTransactionHelper resetScale(SurfaceControl.Transaction tx, - SurfaceControl leash, - Rect destinationBounds) { - tx.setMatrix(leash, Matrix.IDENTITY_MATRIX, mTmpFloat9) - .setPosition(leash, destinationBounds.left, destinationBounds.top); - return this; - } - - /** * Operates the round corner radius on a given transaction and leash * @return same {@link PipSurfaceTransactionHelper} instance for method chaining */ @@ -228,18 +134,6 @@ public class PipSurfaceTransactionHelper { } /** - * Operates the round corner radius on a given transaction and leash, scaled by bounds - * @return same {@link PipSurfaceTransactionHelper} instance for method chaining - */ - public PipSurfaceTransactionHelper round(SurfaceControl.Transaction tx, SurfaceControl leash, - Rect fromBounds, Rect toBounds) { - final float scale = (float) (Math.hypot(fromBounds.width(), fromBounds.height()) - / Math.hypot(toBounds.width(), toBounds.height())); - tx.setCornerRadius(leash, mCornerRadius * scale); - return this; - } - - /** * Operates the shadow radius on a given transaction and leash * @return same {@link PipSurfaceTransactionHelper} instance for method chaining */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java index 3fcb09349033..127a09c571a7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java @@ -302,7 +302,11 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> Trace.endSection(); Trace.beginSection("WindowDecoration#relayout-updateViewHost"); - outResult.mRootView.setPadding(0, params.mCaptionTopPadding, 0, 0); + outResult.mRootView.setPadding( + outResult.mRootView.getPaddingLeft(), + params.mCaptionTopPadding, + outResult.mRootView.getPaddingRight(), + outResult.mRootView.getPaddingBottom()); final Rect localCaptionBounds = new Rect( outResult.mCaptionX, outResult.mCaptionY, diff --git a/libs/WindowManager/Shell/tests/e2e/desktopmode/flicker-service/src/com/android/wm/shell/flicker/DesktopModeFlickerScenarios.kt b/libs/WindowManager/Shell/tests/e2e/desktopmode/flicker-service/src/com/android/wm/shell/flicker/DesktopModeFlickerScenarios.kt index 9b402734a4c4..4c443d7501f7 100644 --- a/libs/WindowManager/Shell/tests/e2e/desktopmode/flicker-service/src/com/android/wm/shell/flicker/DesktopModeFlickerScenarios.kt +++ b/libs/WindowManager/Shell/tests/e2e/desktopmode/flicker-service/src/com/android/wm/shell/flicker/DesktopModeFlickerScenarios.kt @@ -36,7 +36,6 @@ import android.tools.flicker.assertors.assertions.AppWindowHasMaxDisplayHeight import android.tools.flicker.assertors.assertions.AppWindowHasMaxDisplayWidth import android.tools.flicker.assertors.assertions.AppWindowHasSizeOfAtLeast import android.tools.flicker.assertors.assertions.AppWindowInsideDisplayBoundsAtEnd -import android.tools.flicker.assertors.assertions.AppWindowIsBiggerThanInitialBoundsAtEnd import android.tools.flicker.assertors.assertions.AppWindowIsInvisibleAtEnd import android.tools.flicker.assertors.assertions.AppWindowIsVisibleAlways import android.tools.flicker.assertors.assertions.AppWindowMaintainsAspectRatioAlways @@ -172,7 +171,6 @@ class DesktopModeFlickerScenarios { assertions = AssertionTemplates.DESKTOP_MODE_APP_VISIBILITY_ASSERTIONS + listOf( ResizeVeilKeepsIncreasingInSize(DESKTOP_MODE_APP), - AppWindowIsBiggerThanInitialBoundsAtEnd(DESKTOP_MODE_APP), ).associateBy({ it }, { AssertionInvocationGroup.BLOCKING }) ) @@ -189,7 +187,6 @@ class DesktopModeFlickerScenarios { assertions = AssertionTemplates.DESKTOP_MODE_APP_VISIBILITY_ASSERTIONS + listOf( ResizeVeilKeepsIncreasingInSize(DESKTOP_MODE_APP), - AppWindowIsBiggerThanInitialBoundsAtEnd(DESKTOP_MODE_APP), ).associateBy({ it }, { AssertionInvocationGroup.BLOCKING }), ) diff --git a/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/MinimizeAutoPipAppWindow.kt b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/MinimizeAutoPipAppWindow.kt index d6c3266e915c..b5d4dbaa6f37 100644 --- a/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/MinimizeAutoPipAppWindow.kt +++ b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/MinimizeAutoPipAppWindow.kt @@ -54,6 +54,7 @@ abstract class MinimizeAutoPipAppWindow { fun setup() { Assume.assumeTrue(Flags.enableDesktopWindowingMode() && tapl.isTablet) Assume.assumeTrue(Flags.enableMinimizeButton()) + Assume.assumeTrue(com.android.wm.shell.Flags.enablePip2()) testApp.enterDesktopMode(wmHelper, device) pipApp.launchViaIntent(wmHelper) pipApp.enableAutoEnterForPipActivity() diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTest.java index dca5fc4c2fe0..2c0ced4fd8de 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleTest.java @@ -22,18 +22,22 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; +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.app.Notification; import android.app.PendingIntent; +import android.app.TaskInfo; +import android.content.ComponentName; import android.content.Intent; import android.content.pm.ShortcutInfo; import android.content.res.Resources; import android.graphics.drawable.Icon; import android.os.Bundle; import android.os.UserHandle; +import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -60,13 +64,17 @@ public class BubbleTest extends ShellTestCase { @Mock private StatusBarNotification mSbn; @Mock + private NotificationListenerService.Ranking mRanking; + @Mock private ShellExecutor mMainExecutor; @Mock private ShellExecutor mBgExecutor; - private BubbleEntry mBubbleEntry; private Bundle mExtras; - private Bubble mBubble; + + // This entry / bubble are set up with PendingIntent / Icon API for chat + private BubbleEntry mBubbleEntry; + private Bubble mChatBubble; @Mock private Bubbles.BubbleMetadataFlagListener mBubbleMetadataFlagListener; @@ -83,11 +91,16 @@ public class BubbleTest extends ShellTestCase { PendingIntent.getActivity(mContext, 0, target, PendingIntent.FLAG_MUTABLE), Icon.createWithResource(mContext, R.drawable.bubble_ic_create_bubble)) .build(); + ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mContext) + .setId("shortcutId") + .build(); when(mSbn.getNotification()).thenReturn(mNotif); when(mNotif.getBubbleMetadata()).thenReturn(metadata); when(mSbn.getKey()).thenReturn("mock"); - mBubbleEntry = new BubbleEntry(mSbn, null, true, false, false, false); - mBubble = new Bubble(mBubbleEntry, mBubbleMetadataFlagListener, null, mMainExecutor, + when(mRanking.getConversationShortcutInfo()).thenReturn(shortcutInfo); + + mBubbleEntry = new BubbleEntry(mSbn, mRanking, true, false, false, false); + mChatBubble = new Bubble(mBubbleEntry, mBubbleMetadataFlagListener, null, mMainExecutor, mBgExecutor); } @@ -152,42 +165,113 @@ public class BubbleTest extends ShellTestCase { @Test public void testBubbleMetadataFlagListener_change_notified() { - assertThat(mBubble.showInShade()).isTrue(); + assertThat(mChatBubble.showInShade()).isTrue(); - mBubble.setSuppressNotification(true); + mChatBubble.setSuppressNotification(true); - assertThat(mBubble.showInShade()).isFalse(); + assertThat(mChatBubble.showInShade()).isFalse(); - verify(mBubbleMetadataFlagListener).onBubbleMetadataFlagChanged(mBubble); + verify(mBubbleMetadataFlagListener).onBubbleMetadataFlagChanged(mChatBubble); } @Test public void testBubbleMetadataFlagListener_noChange_doesntNotify() { - assertThat(mBubble.showInShade()).isTrue(); + assertThat(mChatBubble.showInShade()).isTrue(); - mBubble.setSuppressNotification(false); + mChatBubble.setSuppressNotification(false); verify(mBubbleMetadataFlagListener, never()).onBubbleMetadataFlagChanged(any()); } @Test - public void testBubbleIsConversation_hasConversationShortcut() { - Bubble bubble = createBubbleWithShortcut(); - assertThat(bubble.getShortcutInfo()).isNotNull(); - assertThat(bubble.isConversation()).isTrue(); + public void testBubbleType_conversationShortcut() { + Bubble bubble = createChatBubble(true /* useShortcut */); + assertThat(bubble.isChat()).isTrue(); } @Test - public void testBubbleIsConversation_hasNoShortcut() { - Bubble bubble = new Bubble(mBubbleEntry, mBubbleMetadataFlagListener, null, mMainExecutor, - mBgExecutor); - assertThat(bubble.getShortcutInfo()).isNull(); - assertThat(bubble.isConversation()).isFalse(); + public void testBubbleType_conversationPendingIntent() { + Bubble bubble = createChatBubble(false /* useShortcut */); + assertThat(bubble.isChat()).isTrue(); + } + + @Test + public void testBubbleType_note() { + Bubble bubble = Bubble.createNotesBubble(createIntent(), UserHandle.of(0), + mock(Icon.class), + mMainExecutor, mBgExecutor); + assertThat(bubble.isNote()).isTrue(); + } + + @Test + public void testBubbleType_shortcut() { + ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mContext) + .setId("mockShortcutId") + .build(); + Bubble bubble = Bubble.createShortcutBubble(shortcutInfo, mMainExecutor, mBgExecutor); + assertThat(bubble.isShortcut()).isTrue(); + } + + @Test + public void testBubbleType_intent() { + Bubble bubble = Bubble.createAppBubble(createIntent(), UserHandle.of(0), + mock(Icon.class), + mMainExecutor, mBgExecutor); + assertThat(bubble.isApp()).isTrue(); + } + + @Test + public void testBubbleType_taskId() { + TaskInfo info = mock(TaskInfo.class); + ComponentName componentName = mock(ComponentName.class); + when(componentName.getPackageName()).thenReturn(mContext.getPackageName()); + info.taskId = 1; + info.baseActivity = componentName; + Bubble bubble = Bubble.createTaskBubble(info, UserHandle.of(0), + mock(Icon.class), + mMainExecutor, mBgExecutor); + assertThat(bubble.isApp()).isTrue(); + } + + @Test + public void testShowAppBadge_chat() { + Bubble bubble = createChatBubble(true /* useShortcut */); + assertThat(bubble.isChat()).isTrue(); + assertThat(bubble.showAppBadge()).isTrue(); + } + + @Test + public void testShowAppBadge_note() { + Bubble bubble = Bubble.createNotesBubble(createIntent(), UserHandle.of(0), + mock(Icon.class), + mMainExecutor, mBgExecutor); + assertThat(bubble.isNote()).isTrue(); + assertThat(bubble.showAppBadge()).isTrue(); + } + + @Test + public void testShowAppBadge_app() { + Bubble bubble = Bubble.createAppBubble(createIntent(), UserHandle.of(0), + mock(Icon.class), + mMainExecutor, mBgExecutor); + assertThat(bubble.isApp()).isTrue(); + assertThat(bubble.showAppBadge()).isFalse(); + } + + @Test + public void testShowAppBadge_shortcut() { + ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mContext) + .setId("mockShortcutId") + .build(); + Bubble bubble = Bubble.createShortcutBubble(shortcutInfo, + mMainExecutor, mBgExecutor); + assertThat(bubble.isShortcut()).isTrue(); + assertThat(bubble.showAppBadge()).isTrue(); } @Test public void testBubbleAsBubbleBarBubble_withShortcut() { - Bubble bubble = createBubbleWithShortcut(); + Bubble bubble = createChatBubble(true /* useShortcut */); BubbleInfo bubbleInfo = bubble.asBubbleBarBubble(); assertThat(bubble.getShortcutInfo()).isNotNull(); @@ -199,7 +283,7 @@ public class BubbleTest extends ShellTestCase { } @Test - public void testBubbleAsBubbleBarBubble_withoutShortcut() { + public void testBubbleAsBubbleBarBubble_withIntent() { Intent intent = new Intent(mContext, BubblesTestActivity.class); intent.setPackage(mContext.getPackageName()); Bubble bubble = Bubble.createAppBubble(intent, new UserHandle(1 /* userId */), @@ -213,12 +297,23 @@ public class BubbleTest extends ShellTestCase { assertThat(bubbleInfo.getPackageName()).isEqualTo(bubble.getPackageName()); } - private Bubble createBubbleWithShortcut() { - ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mContext) - .setId("mockShortcutId") - .build(); - return new Bubble("mockKey", shortcutInfo, 10, Resources.ID_NULL, - "mockTitle", 0 /* taskId */, "mockLocus", true /* isDismissible */, - mMainExecutor, mBgExecutor, mBubbleMetadataFlagListener); + private Intent createIntent() { + Intent intent = new Intent(mContext, BubblesTestActivity.class); + intent.setPackage(mContext.getPackageName()); + return intent; + } + + private Bubble createChatBubble(boolean useShortcut) { + if (useShortcut) { + ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mContext) + .setId("mockShortcutId") + .build(); + return new Bubble("mockKey", shortcutInfo, 10, Resources.ID_NULL, + "mockTitle", 0 /* taskId */, "mockLocus", true /* isDismissible */, + mMainExecutor, mBgExecutor, mBubbleMetadataFlagListener); + } else { + return new Bubble(mBubbleEntry, mBubbleMetadataFlagListener, null, mMainExecutor, + mBgExecutor); + } } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopBackNavigationTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMinimizationTransitionHandlerTest.kt index c705f5a5ac87..4c3325d4d1de 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopBackNavigationTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMinimizationTransitionHandlerTest.kt @@ -45,18 +45,18 @@ import org.mockito.kotlin.whenever @SmallTest @RunWithLooper @RunWith(AndroidTestingRunner::class) -class DesktopBackNavigationTransitionHandlerTest : ShellTestCase() { +class DesktopMinimizationTransitionHandlerTest : ShellTestCase() { private val testExecutor = mock<ShellExecutor>() private val closingTaskLeash = mock<SurfaceControl>() private val displayController = mock<DisplayController>() - private lateinit var handler: DesktopBackNavigationTransitionHandler + private lateinit var handler: DesktopMinimizationTransitionHandler @Before fun setUp() { handler = - DesktopBackNavigationTransitionHandler(testExecutor, testExecutor, displayController) + DesktopMinimizationTransitionHandler(testExecutor, testExecutor, displayController) whenever(displayController.getDisplayContext(any())).thenReturn(mContext) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt index f48bc99a8cfa..0b41952a89d7 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt @@ -84,8 +84,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() { @Mock lateinit var userRepositories: DesktopUserRepositories @Mock lateinit var freeformTaskTransitionHandler: FreeformTaskTransitionHandler @Mock lateinit var closeDesktopTaskTransitionHandler: CloseDesktopTaskTransitionHandler - @Mock - lateinit var desktopBackNavigationTransitionHandler: DesktopBackNavigationTransitionHandler + @Mock lateinit var desktopMinimizationTransitionHandler: DesktopMinimizationTransitionHandler @Mock lateinit var desktopImmersiveController: DesktopImmersiveController @Mock lateinit var interactionJankMonitor: InteractionJankMonitor @Mock lateinit var mockHandler: Handler @@ -108,7 +107,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() { freeformTaskTransitionHandler, closeDesktopTaskTransitionHandler, desktopImmersiveController, - desktopBackNavigationTransitionHandler, + desktopMinimizationTransitionHandler, interactionJankMonitor, mockHandler, shellInit, @@ -642,12 +641,12 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION) - fun startAnimation_withMinimizingDesktopTask_callsBackNavigationHandler() { + fun startAnimation_withMinimizingDesktopTask_callsMinimizationHandler() { val minimizingTask = createTask(WINDOWING_MODE_FREEFORM) val transition = Binder() whenever(desktopRepository.getExpandedTaskCount(any())).thenReturn(2) whenever( - desktopBackNavigationTransitionHandler.startAnimation( + desktopMinimizationTransitionHandler.startAnimation( any(), any(), any(), @@ -675,7 +674,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() { ) assertTrue("Should delegate animation to back navigation transition handler", started) - verify(desktopBackNavigationTransitionHandler) + verify(desktopMinimizationTransitionHandler) .startAnimation( eq(transition), argThat { info -> info.changes.contains(minimizingTaskChange) }, @@ -692,7 +691,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() { val transition = Binder() whenever(desktopRepository.getExpandedTaskCount(any())).thenReturn(2) whenever( - desktopBackNavigationTransitionHandler.startAnimation( + desktopMinimizationTransitionHandler.startAnimation( any(), any(), any(), diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip2/PipSurfaceTransactionHelperTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip2/PipSurfaceTransactionHelperTest.java new file mode 100644 index 000000000000..a2253cfc95d9 --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip2/PipSurfaceTransactionHelperTest.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.pip2; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyFloat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.res.Resources; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; +import android.view.SurfaceControl; + +import androidx.test.filters.SmallTest; + +import com.android.wm.shell.R; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +/** + * Unit test against {@link PipSurfaceTransactionHelper}. + */ +@SmallTest +@TestableLooper.RunWithLooper +@RunWith(AndroidTestingRunner.class) +public class PipSurfaceTransactionHelperTest { + + private static final int CORNER_RADIUS = 10; + private static final int SHADOW_RADIUS = 20; + + @Mock private Context mMockContext; + @Mock private Resources mMockResources; + @Mock private SurfaceControl.Transaction mMockTransaction; + + private PipSurfaceTransactionHelper mPipSurfaceTransactionHelper; + private SurfaceControl mTestLeash; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mMockContext.getResources()).thenReturn(mMockResources); + when(mMockResources.getDimensionPixelSize(eq(R.dimen.pip_corner_radius))) + .thenReturn(CORNER_RADIUS); + when(mMockResources.getDimensionPixelSize(eq(R.dimen.pip_shadow_radius))) + .thenReturn(SHADOW_RADIUS); + when(mMockTransaction.setCornerRadius(any(SurfaceControl.class), anyFloat())) + .thenReturn(mMockTransaction); + when(mMockTransaction.setShadowRadius(any(SurfaceControl.class), anyFloat())) + .thenReturn(mMockTransaction); + + mPipSurfaceTransactionHelper = new PipSurfaceTransactionHelper(mMockContext); + mTestLeash = new SurfaceControl.Builder() + .setContainerLayer() + .setName("PipSurfaceTransactionHelperTest") + .setCallsite("PipSurfaceTransactionHelperTest") + .build(); + } + + @Test + public void round_doNotApply_setZeroCornerRadius() { + mPipSurfaceTransactionHelper.round(mMockTransaction, mTestLeash, false /* apply */); + + verify(mMockTransaction).setCornerRadius(eq(mTestLeash), eq(0f)); + } + + @Test + public void round_doApply_setExactCornerRadius() { + mPipSurfaceTransactionHelper.round(mMockTransaction, mTestLeash, true /* apply */); + + verify(mMockTransaction).setCornerRadius(eq(mTestLeash), eq((float) CORNER_RADIUS)); + } + + @Test + public void shadow_doNotApply_setZeroShadowRadius() { + mPipSurfaceTransactionHelper.shadow(mMockTransaction, mTestLeash, false /* apply */); + + verify(mMockTransaction).setShadowRadius(eq(mTestLeash), eq(0f)); + } + + @Test + public void shadow_doApply_setExactShadowRadius() { + mPipSurfaceTransactionHelper.shadow(mMockTransaction, mTestLeash, true /* apply */); + + verify(mMockTransaction).setShadowRadius(eq(mTestLeash), eq((float) SHADOW_RADIUS)); + } +} diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java index 371b47fe3421..22f4182ee37b 100644 --- a/media/java/android/media/session/MediaSessionManager.java +++ b/media/java/android/media/session/MediaSessionManager.java @@ -155,11 +155,6 @@ public final class MediaSessionManager { } /** - * This API is not generally intended for third party application developers. - * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a> - * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session - * Library</a> for consistent behavior across all devices. - * <p> * Notifies that a new {@link MediaSession2} with type {@link Session2Token#TYPE_SESSION} is * created. * <p> @@ -283,16 +278,16 @@ public final class MediaSessionManager { } /** - * This API is not generally intended for third party application developers. - * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a> - * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session - * Library</a> for consistent behavior across all devices. - * <p> * Gets a list of {@link Session2Token} with type {@link Session2Token#TYPE_SESSION} for the * current user. * <p> * Although this API can be used without any restriction, each session owners can accept or * reject your uses of {@link MediaSession2}. + * <p> + * This API is not generally intended for third party application developers. Apps wanting media + * session functionality should use the + * <a href="{@docRoot}reference/androidx/media3/session/package-summary.html">AndroidX Media3 + * Session Library</a>. * * @return A list of {@link Session2Token}. */ @@ -417,12 +412,12 @@ public final class MediaSessionManager { } /** - * This API is not generally intended for third party application developers. - * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a> - * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session - * Library</a> for consistent behavior across all devices. - * <p> * Adds a listener to be notified when the {@link #getSession2Tokens()} changes. + * <p> + * This API is not generally intended for third party application developers. Apps wanting media + * session functionality should use the + * <a href="{@docRoot}reference/androidx/media3/session/package-summary.html">AndroidX Media3 + * Session Library</a>. * * @param listener The listener to add */ @@ -433,12 +428,12 @@ public final class MediaSessionManager { } /** - * This API is not generally intended for third party application developers. - * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a> - * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session - * Library</a> for consistent behavior across all devices. - * <p> * Adds a listener to be notified when the {@link #getSession2Tokens()} changes. + * <p> + * This API is not generally intended for third party application developers. Apps wanting media + * session functionality should use the + * <a href="{@docRoot}reference/androidx/media3/session/package-summary.html">AndroidX Media3 + * Session Library</a>. * * @param listener The listener to add * @param handler The handler to call listener on. @@ -451,16 +446,16 @@ public final class MediaSessionManager { } /** - * This API is not generally intended for third party application developers. - * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a> - * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session - * Library</a> for consistent behavior across all devices. - * <p> * Adds a listener to be notified when the {@link #getSession2Tokens()} changes. * <p> * The calling application needs to hold the * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} permission in order to * add listeners for user ids that do not belong to current process. + * <p> + * This API is not generally intended for third party application developers. Apps wanting media + * session functionality should use the + * <a href="{@docRoot}reference/androidx/media3/session/package-summary.html">AndroidX Media3 + * Session Library</a>. * * @param userHandle The userHandle to listen for changes on * @param listener The listener to add @@ -496,12 +491,12 @@ public final class MediaSessionManager { } /** - * This API is not generally intended for third party application developers. - * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a> - * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session - * Library</a> for consistent behavior across all devices. - * <p> * Removes the {@link OnSession2TokensChangedListener} to stop receiving session token updates. + * <p> + * This API is not generally intended for third party application developers. Apps wanting media + * session functionality should use the + * <a href="{@docRoot}reference/androidx/media3/session/package-summary.html">AndroidX Media3 + * Session Library</a>. * * @param listener The listener to remove. */ @@ -1061,13 +1056,13 @@ public final class MediaSessionManager { } /** - * This API is not generally intended for third party application developers. - * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a> - * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session - * Library</a> for consistent behavior across all devices. - * <p> * Listens for changes to the {@link #getSession2Tokens()}. This can be added * using {@link #addOnSession2TokensChangedListener(OnSession2TokensChangedListener, Handler)}. + * <p> + * This API is not generally intended for third party application developers. Apps wanting media + * session functionality should use the + * <a href="{@docRoot}reference/androidx/media3/session/package-summary.html">AndroidX Media3 + * Session Library</a>. */ public interface OnSession2TokensChangedListener { /** diff --git a/packages/CompanionDeviceManager/res/values-ne/strings.xml b/packages/CompanionDeviceManager/res/values-ne/strings.xml index b363c4bdcfbb..694abdd20814 100644 --- a/packages/CompanionDeviceManager/res/values-ne/strings.xml +++ b/packages/CompanionDeviceManager/res/values-ne/strings.xml @@ -65,7 +65,7 @@ <string name="permission_nearby_devices" msgid="7530973297737123481">"नजिकैका डिभाइसहरू"</string> <string name="permission_media_routing_control" msgid="5498639511586715253">"मिडिया आउटपुट बदल्नुहोस्"</string> <string name="permission_storage" msgid="6831099350839392343">"फोटो र मिडिया"</string> - <string name="permission_notifications" msgid="4099418516590632909">"सूचनाहरू"</string> + <string name="permission_notifications" msgid="4099418516590632909">"नोटिफिकेसनहरू"</string> <string name="permission_phone_summary" msgid="8246321093970051702">"फोन कल गर्ने र व्यवस्थापन गर्ने"</string> <string name="permission_call_logs_summary" msgid="7545243592757693321">"फोन कलको लग रिड र राइट गर्ने"</string> <string name="permission_sms_summary" msgid="8499509535410068616">"SMS म्यासेज पठाउने र हेर्ने"</string> diff --git a/packages/PackageInstaller/res/values-sk/strings.xml b/packages/PackageInstaller/res/values-sk/strings.xml index ce186f247b20..fcc06ca3c82f 100644 --- a/packages/PackageInstaller/res/values-sk/strings.xml +++ b/packages/PackageInstaller/res/values-sk/strings.xml @@ -96,7 +96,7 @@ <string name="app_name_unknown" msgid="6881210203354323926">"Neznáma"</string> <string name="untrusted_external_source_warning" product="tablet" msgid="7067510047443133095">"Váš tablet momentálne nemôže z bezpečnostných dôvodov inštalovať neznáme aplikácie z tohto zdroja. Môžete to zmeniť v Nastaveniach."</string> <string name="untrusted_external_source_warning" product="tv" msgid="7057271609532508035">"Váš televízor momentálne nemôže z bezpečnostných dôvodov inštalovať neznáme aplikácie z tohto zdroja. Môžete to zmeniť v Nastaveniach."</string> - <string name="untrusted_external_source_warning" product="watch" msgid="7195163388090818636">"Z bezpečnostných dôvodov momentálne nemôžete v hodnikách inštalovať neznáme aplikácie z tohto zdroja. Môžete to zmeniť v Nastaveniach."</string> + <string name="untrusted_external_source_warning" product="watch" msgid="7195163388090818636">"Z bezpečnostných dôvodov momentálne nemôžete v hodinkách inštalovať neznáme aplikácie z tohto zdroja. Môžete to zmeniť v Nastaveniach."</string> <string name="untrusted_external_source_warning" product="default" msgid="8444191224459138919">"Váš telefón momentálne nemôže z bezpečnostných dôvodov inštalovať neznáme aplikácie z tohto zdroja. Môžete to zmeniť v nastaveniach."</string> <string name="anonymous_source_warning" product="default" msgid="2784902545920822500">"Váš telefón a osobné údaje sú zraniteľnejšie voči útoku z neznámych aplikácií. Inštaláciou tejto aplikácie vyjadrujete súhlas s tým, že nesiete zodpovednosť za akékoľvek poškodenie telefónu alebo stratu údajov, ktoré by mohli nastať pri jej používaní."</string> <string name="anonymous_source_warning" product="tablet" msgid="3939101621438855516">"Váš tablet a osobné dáta sú náchylnejšie na útok z neznámych aplikácií. Inštaláciou tejto aplikácie vyjadrujete súhlas s tým, že nesiete zodpovednosť za akékoľvek poškodenie tabletu alebo stratu dát, ktoré by mohli nastať pri jej používaní."</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 4d359a801953..675a6a6077ba 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"جارٍ الشحن السريع"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"إعدادات يتحكم فيها المشرف"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"يتحكّم فيه إعداد محظور"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"غير متاح أثناء المكالمات"</string> <string name="disabled" msgid="8017887509554714950">"غير مفعّل"</string> <string name="external_source_trusted" msgid="1146522036773132905">"تطبيق مسموح به"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"تطبيق غير مسموح به"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 3f11056ac599..7a00b96e0ed7 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Brzo punjenje"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontroliše administrator"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolišu ograničena podešavanja"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nedostupno tokom poziva"</string> <string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Dozvoljeno"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Nije dozvoljeno"</string> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index ec3d5e90d755..98e07b9e8749 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Brzo punjenje"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Pod kontrolom administratora"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolira ograničena postavka"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nije dostupno tijekom poziva"</string> <string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Dozvoljeno"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Nije dozvoljeno"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 54a4af835dc9..a774a1d9bffc 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Rychlé nabíjení"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Spravováno administrátorem"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Spravováno omezeným nastavením"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Při volání nedostupné"</string> <string name="disabled" msgid="8017887509554714950">"Deaktivováno"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Povoleno"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Není povoleno"</string> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 3b35b97592d6..748d7b11d7ed 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Fast charging"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlled by admin"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlled by Restricted Setting"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Unavailable during calls"</string> <string name="disabled" msgid="8017887509554714950">"Disabled"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Allowed"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Not allowed"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 524310d2fb37..acd67908dfba 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carga rápida"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlada por el administrador"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Función controlada por configuración restringida"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"No disponible durante llamadas"</string> <string name="disabled" msgid="8017887509554714950">"Inhabilitada"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Con permiso"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"No permitida"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index e089655707b6..b442ed3c6578 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Kiirlaadimine"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Juhib administraator"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Haldavad piiranguga seaded"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Pole kõnede ajal saadaval"</string> <string name="disabled" msgid="8017887509554714950">"Keelatud"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Lubatud"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Pole lubatud"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 431977664f4f..e883615477fe 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -506,7 +506,7 @@ <string name="power_charging_future_paused" msgid="1809543660923642799">"<xliff:g id="LEVEL">%1$s</xliff:g> - चार्ज हो रही है"</string> <string name="power_fast_charging_duration_v2" msgid="3797735998640359490">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATUS">%2$s</xliff:g> - बैटरी <xliff:g id="TIME">%3$s</xliff:g> में पूरी चार्ज हो जाएगी"</string> <string name="power_charging_duration_v2" msgid="2938998284074003248">"<xliff:g id="LEVEL">%1$s</xliff:g> - बैटरी <xliff:g id="TIME">%2$s</xliff:g> में पूरी चार्ज हो जाएगी"</string> - <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"बैटरी <xliff:g id="TIME">%1$s</xliff:g> में पूरी चार्ज हो जाएगी"</string> + <string name="power_remaining_charging_duration_only_v2" msgid="5358176435722950193">"बैटरी <xliff:g id="TIME">%1$s</xliff:g> तक पूरी चार्ज हो जाएगी"</string> <string name="power_remaining_fast_charging_duration_only_v2" msgid="6270950195810579563">"बैटरी <xliff:g id="TIME">%1$s</xliff:g> तक पूरी चार्ज हो जाएगी"</string> <string name="battery_info_status_unknown" msgid="268625384868401114">"अज्ञात"</string> <string name="battery_info_status_charging" msgid="4279958015430387405">"चार्ज हो रही है"</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 076378847a82..131195e42e48 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Brzo punjenje"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Kontrolira administrator"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kontrolira ograničena postavka"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Nije dostupno tijekom poziva"</string> <string name="disabled" msgid="8017887509554714950">"Onemogućeno"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Dopušteno"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Nije dopušteno"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 114a998cc1f6..320c707a92a0 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"急速充電中"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"管理者により管理されています"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"制限付き設定によって管理されています"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"通話中は利用できません"</string> <string name="disabled" msgid="8017887509554714950">"無効"</string> <string name="external_source_trusted" msgid="1146522036773132905">"許可"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"許可しない"</string> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 8a2fd357cd40..6503795b3634 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"სწრაფი დატენა"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"იმართება ადმინისტრატორის მიერ"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"კონტროლდება შეზღუდული რეჟიმის პარამეტრით"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"მიუწვდომელია ზარების განხორციელებისას"</string> <string name="disabled" msgid="8017887509554714950">"გამორთული"</string> <string name="external_source_trusted" msgid="1146522036773132905">"დაშვებულია"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"დაუშვებელია"</string> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index cd36e49d358c..3cc214e91f9a 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ការសាកថ្មរហ័ស"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"គ្រប់គ្រងដោយអ្នកគ្រប់គ្រង"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"គ្រប់គ្រងដោយការកំណត់ដែលបានរឹតបន្តឹង"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"មិនអាចប្រើបានទេអំឡុងពេលហៅទូរសព្ទ"</string> <string name="disabled" msgid="8017887509554714950">"បិទ"</string> <string name="external_source_trusted" msgid="1146522036773132905">"បានអនុញ្ញាត"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"មិនបានអនុញ្ញាត"</string> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index e919f42ec99b..3046b4fab03e 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ກຳລັງສາກໄວ"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ຄວບຄຸມໂດຍຜູ້ເບິ່ງແຍງ"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ຄວບຄຸມໂດຍການຕັ້ງຄ່າທີ່ຈຳກັດໄວ້"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"ບໍ່ສາມາດໃຊ້ໄດ້ລະຫວ່າງການໂທ"</string> <string name="disabled" msgid="8017887509554714950">"ປິດການນຳໃຊ້"</string> <string name="external_source_trusted" msgid="1146522036773132905">"ອະນຸຍາດແລ້ວ"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"ບໍ່ອະນຸຍາດ"</string> diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml index cf9b8d870b43..6129af9b5a15 100644 --- a/packages/SettingsLib/res/values-lt/arrays.xml +++ b/packages/SettingsLib/res/values-lt/arrays.xml @@ -207,7 +207,7 @@ <string-array name="window_animation_scale_entries"> <item msgid="2675263395797191850">"Animacija išjungta"</item> <item msgid="5790132543372767872">"Animacijos mastelis 0,5x"</item> - <item msgid="2529692189302148746">"Animacijos mastelis 1x"</item> + <item msgid="2529692189302148746">"Animacijos mastelis 1 x"</item> <item msgid="8072785072237082286">"Animacijos mastelis 1,5x"</item> <item msgid="3531560925718232560">"Animacijos mastelis 2x"</item> <item msgid="4542853094898215187">"Animacijos mastelis 5x"</item> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index b405963dca9b..3e59d9f0b586 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"അതിവേഗ ചാർജിംഗ്"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"അഡ്മിൻ നിയന്ത്രിക്കുന്നത്"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"നിയന്ത്രിത ക്രമീകരണം ഉപയോഗിച്ച് നിയന്ത്രിക്കുന്നത്"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"കോളുകൾ ചെയ്യുമ്പോൾ ലഭ്യമല്ല"</string> <string name="disabled" msgid="8017887509554714950">"പ്രവർത്തനരഹിതമാക്കി"</string> <string name="external_source_trusted" msgid="1146522036773132905">"അനുവദനീയം"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"അനുവദിച്ചിട്ടില്ല"</string> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 478e8d259343..412100c07009 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Pengecasan pantas"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Dikawal oleh pentadbir"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Dikawal oleh Tetapan Terhad"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Tidak tersedia semasa panggilan berlangsung"</string> <string name="disabled" msgid="8017887509554714950">"Dilumpuhkan"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Dibenarkan"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Tidak dibenarkan"</string> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 00917c5f355b..481479e21f74 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Snel opladen"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Ingesteld door beheerder"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Beheerd door beperkte instelling"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Niet beschikbaar tijdens gesprekken"</string> <string name="disabled" msgid="8017887509554714950">"Uitgezet"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Toegestaan"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Niet toegestaan"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index ca9724417b90..e12c2c01e6ae 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ਤੇਜ਼ ਚਾਰਜਿੰਗ"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਕੰਟਰੋਲ ਕੀਤੀ ਗਈ"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ਪ੍ਰਤਿਬੰਧਿਤ ਸੈਟਿੰਗ ਰਾਹੀਂ ਕੰਟਰੋਲ ਕੀਤੀ ਜਾਂਦੀ ਹੈ"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"ਕਾਲਾਂ ਦੌਰਾਨ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string> <string name="disabled" msgid="8017887509554714950">"ਅਯੋਗ ਬਣਾਇਆ"</string> <string name="external_source_trusted" msgid="1146522036773132905">"ਮਨਜ਼ੂਰਸ਼ੁਦਾ"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"ਗੈਰ-ਮਨਜ਼ੂਰਸ਼ੁਦਾ"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index bf2146308e7a..d09caadb6328 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Carregamento rápido"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Controlado pelo gestor"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Controlado por uma definição restrita"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Indisponível durante as chamadas"</string> <string name="disabled" msgid="8017887509554714950">"Desativada"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Autorizada"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Não autorizada"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index b42e4e1eaa5e..bf92e20fe4d7 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Быстрая зарядка"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролируется администратором"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Контролируется настройками с ограниченным доступом"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Недоступно во время вызовов"</string> <string name="disabled" msgid="8017887509554714950">"Отключено"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Разрешено"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Запрещено"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 267193a9d9b1..6170ac53255e 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Nabíja sa rýchlo"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Ovládané správcom"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Ovládané obmedzeným nastavením"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Počas hovorov nie je k dispozícii"</string> <string name="disabled" msgid="8017887509554714950">"Deaktivované"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Povolené"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Nie je povolené"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index f85a17d76c43..39b61d9c331f 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Hitro polnjenje"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Nadzira skrbnik"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Pod nadzorom omejene nastavitve"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Ni na voljo med klici"</string> <string name="disabled" msgid="8017887509554714950">"Onemogočeno"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Dovoljene"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Ni dovoljeno"</string> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 693e43522d57..c053094f3915 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Брзо пуњење"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Контролише администратор"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Контролишу ограничена подешавања"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Недоступно током позива"</string> <string name="disabled" msgid="8017887509554714950">"Онемогућено"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Дозвољено"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Није дозвољено"</string> diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml index c69f01e8691c..b5ae7ddf7a31 100644 --- a/packages/SettingsLib/res/values-sv/arrays.xml +++ b/packages/SettingsLib/res/values-sv/arrays.xml @@ -288,12 +288,16 @@ <item msgid="3753634915787796632">"2"</item> <item msgid="4779928470672877922">"3"</item> </string-array> - <!-- no translation found for shade_display_awareness_entries:0 (816770658383209617) --> - <!-- no translation found for shade_display_awareness_entries:1 (9161645858025071955) --> - <!-- no translation found for shade_display_awareness_entries:2 (114384731934682483) --> - <!-- no translation found for shade_display_awareness_summaries:0 (2964753205732912921) --> - <!-- no translation found for shade_display_awareness_summaries:1 (7795034287069726554) --> - <!-- no translation found for shade_display_awareness_summaries:2 (5280431949814340475) --> + <string-array name="shade_display_awareness_entries"> + <item msgid="816770658383209617">"Endast enhetens skärm (standard)"</item> + <item msgid="9161645858025071955">"Extern skärm"</item> + <item msgid="114384731934682483">"Fokusbaserad"</item> + </string-array> + <string-array name="shade_display_awareness_summaries"> + <item msgid="2964753205732912921">"Visa endast skugga på enhetens skärm"</item> + <item msgid="7795034287069726554">"Visa skugga på en enda extern skärm"</item> + <item msgid="5280431949814340475">"Visa enheten på skärmen som sist var i fokus"</item> + </string-array> <string-array name="shade_display_awareness_values"> <item msgid="3055776101992426514">"default_display"</item> <item msgid="774789415968826925">"any_external_display"</item> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index bc110c6da7bf..4f8ea1e03219 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -424,8 +424,7 @@ <string name="transition_animation_scale_title" msgid="1278477690695439337">"Skala – övergångsanimering"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"Längdskala för Animator"</string> <string name="overlay_display_devices_title" msgid="5411894622334469607">"Simulera sekundär skärm"</string> - <!-- no translation found for shade_display_awareness_title (8000009404669495876) --> - <skip /> + <string name="shade_display_awareness_title" msgid="8000009404669495876">"Panelens placering på skärmen"</string> <string name="debug_applications_category" msgid="5394089406638954196">"Appar"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"Behåll inte aktiviteter"</string> <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"Förstör aktiviteter så fort användaren lämnar dem"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 65db65364332..9b4d408c4cf1 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"ชาร์จเร็ว"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"ผู้ดูแลระบบเป็นผู้ควบคุม"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"ควบคุมโดยการตั้งค่าที่จำกัด"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"ใช้งานไม่ได้ขณะสนทนาโทรศัพท์"</string> <string name="disabled" msgid="8017887509554714950">"ปิดอยู่"</string> <string name="external_source_trusted" msgid="1146522036773132905">"อนุญาต"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"ไม่อนุญาต"</string> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 959a0b3e4895..4cd2f5f3c675 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Fast charging"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Pinapamahalaan ng admin"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Kinokontrol ng Pinaghihigpitang Setting"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Hindi available habang may tawag"</string> <string name="disabled" msgid="8017887509554714950">"Naka-disable"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Pinapayagan"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Hindi pinapayagan"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index fbf9b4aa4810..04bd7fccefaa 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -523,8 +523,7 @@ <string name="battery_info_status_charging_fast_v2" msgid="1825439848151256589">"Tezkor quvvatlash"</string> <string name="disabled_by_admin_summary_text" msgid="5343911767402923057">"Administrator tomonidan boshqariladi"</string> <string name="disabled_by_app_ops_text" msgid="8373595926549098012">"Cheklangan sozlama tomonidan boshqariladi"</string> - <!-- no translation found for disabled_in_phone_call_text (6568931334337318320) --> - <skip /> + <string name="disabled_in_phone_call_text" msgid="6568931334337318320">"Chaqiruv vaqtida ishlamaydi"</string> <string name="disabled" msgid="8017887509554714950">"Oʻchiq"</string> <string name="external_source_trusted" msgid="1146522036773132905">"Ruxsat berilgan"</string> <string name="external_source_untrusted" msgid="5037891688911672227">"Ruxsat berilmagan"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java index ceb6f7b080df..13276608c03d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InfoMediaManager.java @@ -864,8 +864,7 @@ public abstract class InfoMediaManager { } // Add selected routes first. - if (com.android.media.flags.Flags.enableOutputSwitcherSessionGrouping() - && sortedRouteIds.size() != selectedRoutes.size()) { + if (sortedRouteIds.size() != selectedRoutes.size()) { for (MediaRoute2Info selectedRoute : selectedRoutes) { sortedRouteIds.add(selectedRoute.getId()); } diff --git a/packages/SettingsLib/src/com/android/settingslib/supervision/OWNERS b/packages/SettingsLib/src/com/android/settingslib/supervision/OWNERS new file mode 100644 index 000000000000..04e7058b4384 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/supervision/OWNERS @@ -0,0 +1 @@ +file:platform/frameworks/base:/core/java/android/app/supervision/OWNERS diff --git a/packages/SettingsLib/src/com/android/settingslib/supervision/SupervisionIntentProvider.kt b/packages/SettingsLib/src/com/android/settingslib/supervision/SupervisionIntentProvider.kt new file mode 100644 index 000000000000..749c2edba4d4 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/supervision/SupervisionIntentProvider.kt @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.supervision + +import android.app.supervision.SupervisionManager +import android.content.Context +import android.content.Intent + +/** Helper class meant to provide an intent to launch the supervision settings page. */ +object SupervisionIntentProvider { + private const val ACTION_SHOW_PARENTAL_CONTROLS = "android.settings.SHOW_PARENTAL_CONTROLS" + + /** + * Returns an [Intent] to the supervision settings page or null if supervision is disabled or + * the intent is not resolvable. + */ + @JvmStatic + fun getSettingsIntent(context: Context): Intent? { + val supervisionManager = context.getSystemService(SupervisionManager::class.java) + val supervisionAppPackage = supervisionManager?.activeSupervisionAppPackage ?: return null + + val intent = + Intent(ACTION_SHOW_PARENTAL_CONTROLS) + .setPackage(supervisionAppPackage) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + val activities = + context.packageManager.queryIntentActivitiesAsUser(intent, 0, context.userId) + return if (activities.isNotEmpty()) intent else null + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioSharingRepository.kt b/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioSharingRepository.kt index 01bf0c8335d1..8771ba05a6a8 100644 --- a/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioSharingRepository.kt +++ b/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioSharingRepository.kt @@ -150,27 +150,13 @@ class AudioSharingRepositoryImpl( BluetoothCsipSetCoordinator.GROUP_ID_INVALID ) - override val secondaryGroupId: StateFlow<Int> = - secondaryDevice - .map { BluetoothUtils.getGroupId(it) } - .onEach { logger.onSecondaryGroupIdChanged(it) } - .flowOn(backgroundCoroutineContext) - .stateIn( - coroutineScope, - SharingStarted.WhileSubscribed(), - BluetoothCsipSetCoordinator.GROUP_ID_INVALID - ) + override val primaryDevice: StateFlow<CachedBluetoothDevice?> = + primaryGroupId + .map { getCachedDeviceFromGroupId(it) } + .stateIn(coroutineScope, SharingStarted.WhileSubscribed(), null) - override val primaryDevice: StateFlow<CachedBluetoothDevice?> - get() = primaryGroupId.map { getCachedDeviceFromGroupId(it) } - .stateIn( - coroutineScope, - SharingStarted.WhileSubscribed(), - null - ) - - override val secondaryDevice: StateFlow<CachedBluetoothDevice?> - get() = merge( + override val secondaryDevice: StateFlow<CachedBluetoothDevice?> = + merge( isAudioSharingProfilesReady.flatMapLatest { ready -> if (ready) { btManager.profileManager.leAudioBroadcastAssistantProfile @@ -196,6 +182,17 @@ class AudioSharingRepositoryImpl( null ) + override val secondaryGroupId: StateFlow<Int> = + secondaryDevice + .map { BluetoothUtils.getGroupId(it) } + .onEach { logger.onSecondaryGroupIdChanged(it) } + .flowOn(backgroundCoroutineContext) + .stateIn( + coroutineScope, + SharingStarted.WhileSubscribed(), + BluetoothCsipSetCoordinator.GROUP_ID_INVALID + ) + override val volumeMap: StateFlow<GroupIdToVolumes> = inAudioSharing.flatMapLatest { isSharing -> if (isSharing) { diff --git a/packages/SettingsLib/tests/robotests/Android.bp b/packages/SettingsLib/tests/robotests/Android.bp index 117ca85c2761..54fe40ad14c4 100644 --- a/packages/SettingsLib/tests/robotests/Android.bp +++ b/packages/SettingsLib/tests/robotests/Android.bp @@ -46,16 +46,17 @@ android_robolectric_test { "src/**/*.kt", ], static_libs: [ - "Settings_robolectric_meta_service_file", "Robolectric_shadows_androidx_fragment_upstream", "SettingsLib-robo-testutils", + "Settings_robolectric_meta_service_file", + "androidx.core_core", "androidx.fragment_fragment", "androidx.test.core", - "androidx.core_core", - "kotlinx_coroutines_test", + "androidx.test.ext.junit", "flag-junit", - "settingslib_media_flags_lib", + "kotlinx_coroutines_test", "settingslib_illustrationpreference_flags_lib", + "settingslib_media_flags_lib", "settingslib_selectorwithwidgetpreference_flags_lib", "testng", // TODO: remove once JUnit on Android provides assertThrows ], @@ -87,8 +88,8 @@ java_library { "testutils/com/android/settingslib/testutils/**/*.java", ], javacflags: [ - "-Aorg.robolectric.annotation.processing.shadowPackage=com.android.settingslib.testutils.shadow", "-Aorg.robolectric.annotation.processing.sdkCheckMode=ERROR", + "-Aorg.robolectric.annotation.processing.shadowPackage=com.android.settingslib.testutils.shadow", // Uncomment the below to debug annotation processors not firing. //"-verbose", //"-XprintRounds", @@ -97,9 +98,9 @@ java_library { //"-J-verbose", ], plugins: [ - "auto_value_plugin_1.9", - "auto_value_builder_plugin_1.9", "Robolectric_processor", + "auto_value_builder_plugin_1.9", + "auto_value_plugin_1.9", ], libs: [ "Robolectric_all-target", diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java index 219ad6ca3f1a..93ebc84374b2 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InfoMediaManagerTest.java @@ -1003,4 +1003,21 @@ public class InfoMediaManagerTest { assertThat(routeOrder.get(2).getId()).isEqualTo(TEST_ID_4); assertThat(routeOrder.get(3).getId()).isEqualTo(TEST_ID_1); } + + @Test + public void selectedRouteAppearsFirst() { + RouteListingPreference routeListingPreference = + setUpPreferenceList(TEST_PACKAGE_NAME, true); + List<MediaRoute2Info> routes = setAvailableRoutesList(TEST_PACKAGE_NAME); + List<MediaRoute2Info> selectedRoutes = List.of(routes.get(2)); + + List<MediaRoute2Info> routeOrder = + Api34Impl.arrangeRouteListByPreference( + selectedRoutes, routes, routeListingPreference); + + assertThat(routeOrder.stream().map(MediaRoute2Info::getId).toArray()) + .asList() + .containsExactly(TEST_ID_4, TEST_ID_1, TEST_ID_3) + .inOrder(); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/supervision/SupervisionIntentProviderTest.kt b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/supervision/SupervisionIntentProviderTest.kt new file mode 100644 index 000000000000..2ceed2875cb4 --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/supervision/SupervisionIntentProviderTest.kt @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settingslib.supervision + +import android.app.supervision.SupervisionManager +import android.content.Context +import android.content.ContextWrapper +import android.content.pm.PackageManager +import android.content.pm.ResolveInfo +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.any +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.junit.MockitoJUnit +import org.mockito.junit.MockitoRule + +/** + * Unit tests for [SupervisionIntentProvider]. + * + * Run with `atest SupervisionIntentProviderTest`. + */ +@RunWith(AndroidJUnit4::class) +class SupervisionIntentProviderTest { + @get:Rule val mocks: MockitoRule = MockitoJUnit.rule() + + @Mock private lateinit var mockPackageManager: PackageManager + + @Mock private lateinit var mockSupervisionManager: SupervisionManager + + private lateinit var context: Context + + @Before + fun setUp() { + context = + object : ContextWrapper(InstrumentationRegistry.getInstrumentation().context) { + override fun getPackageManager() = mockPackageManager + + override fun getSystemService(name: String) = + when (name) { + Context.SUPERVISION_SERVICE -> mockSupervisionManager + else -> super.getSystemService(name) + } + } + } + + @Test + fun getSettingsIntent_nullSupervisionPackage() { + `when`(mockSupervisionManager.activeSupervisionAppPackage).thenReturn(null) + + val intent = SupervisionIntentProvider.getSettingsIntent(context) + + assertThat(intent).isNull() + } + + @Test + fun getSettingsIntent_unresolvedIntent() { + `when`(mockSupervisionManager.activeSupervisionAppPackage) + .thenReturn(SUPERVISION_APP_PACKAGE) + `when`(mockPackageManager.queryIntentActivitiesAsUser(any(), anyInt(), anyInt())) + .thenReturn(emptyList()) + + val intent = SupervisionIntentProvider.getSettingsIntent(context) + + assertThat(intent).isNull() + } + + @Test + fun getSettingsIntent_resolvedIntent() { + `when`(mockSupervisionManager.activeSupervisionAppPackage) + .thenReturn(SUPERVISION_APP_PACKAGE) + `when`(mockPackageManager.queryIntentActivitiesAsUser(any(), anyInt(), anyInt())) + .thenReturn(listOf(ResolveInfo())) + + val intent = SupervisionIntentProvider.getSettingsIntent(context) + + assertThat(intent).isNotNull() + assertThat(intent?.action).isEqualTo("android.settings.SHOW_PARENTAL_CONTROLS") + assertThat(intent?.`package`).isEqualTo(SUPERVISION_APP_PACKAGE) + } + + private companion object { + const val SUPERVISION_APP_PACKAGE = "app.supervision" + } +} diff --git a/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespaces.java b/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespaces.java index 6d30f492075e..0c5e7376bcfe 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespaces.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/WritableNamespaces.java @@ -39,6 +39,7 @@ final class WritableNamespaces { "captive_portal_login", "connectivity", "exo", + "location", "nearby", "netd_native", "network_security", diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt index a137891f2d01..f8bcb81dc073 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt @@ -24,6 +24,7 @@ import android.util.MathUtils import androidx.annotation.VisibleForTesting import java.lang.Float.max import java.lang.Float.min +import kotlin.math.roundToInt private const val TAG_WGHT = "wght" private const val TAG_ITAL = "ital" @@ -89,7 +90,7 @@ class FontCacheImpl(override val animationFrameCount: Int = DEFAULT_FONT_CACHE_M /** Provide interpolation of two fonts by adjusting font variation settings. */ class FontInterpolator(val fontCache: FontCache = FontCacheImpl()) { /** Linear interpolate the font variation settings. */ - fun lerp(start: Font, end: Font, progress: Float): Font { + fun lerp(start: Font, end: Font, progress: Float, linearProgress: Float): Font { if (progress == 0f) { return start } else if (progress == 1f) { @@ -105,7 +106,8 @@ class FontInterpolator(val fontCache: FontCache = FontCacheImpl()) { // Check we already know the result. This is commonly happens since we draws the different // text chunks with the same font. - val iKey = InterpKey(start, end, (progress * fontCache.animationFrameCount).toInt()) + val iKey = + InterpKey(start, end, (linearProgress * fontCache.animationFrameCount).roundToInt()) fontCache.get(iKey)?.let { if (DEBUG) { Log.d(LOG_TAG, "[$progress] Interp. cache hit for $iKey") diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt index eef26b67614b..b9f9bc7e2daa 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt @@ -25,9 +25,8 @@ import android.graphics.Typeface import android.graphics.fonts.Font import android.graphics.fonts.FontVariationAxis import android.text.Layout -import android.util.LruCache -import kotlin.math.roundToInt import android.util.Log +import android.util.LruCache private const val DEFAULT_ANIMATION_DURATION: Long = 300 private const val TYPEFACE_CACHE_MAX_ENTRIES = 5 @@ -37,6 +36,7 @@ typealias GlyphCallback = (TextAnimator.PositionedGlyph, Float) -> Unit interface TypefaceVariantCache { val fontCache: FontCache val animationFrameCount: Int + fun getTypefaceForVariant(fvar: String?): Typeface? companion object { @@ -45,24 +45,25 @@ interface TypefaceVariantCache { return baseTypeface } - val axes = FontVariationAxis.fromFontVariationSettings(fVar) - ?.toMutableList() - ?: mutableListOf() + val axes = + FontVariationAxis.fromFontVariationSettings(fVar)?.toMutableList() + ?: mutableListOf() axes.removeIf { !baseTypeface.isSupportedAxes(it.getOpenTypeTagValue()) } + if (axes.isEmpty()) { return baseTypeface + } else { + return Typeface.createFromTypefaceWithVariation(baseTypeface, axes) } - return Typeface.createFromTypefaceWithVariation(baseTypeface, axes) } } } -class TypefaceVariantCacheImpl( - var baseTypeface: Typeface, - override val animationFrameCount: Int, -) : TypefaceVariantCache { +class TypefaceVariantCacheImpl(var baseTypeface: Typeface, override val animationFrameCount: Int) : + TypefaceVariantCache { private val cache = LruCache<String, Typeface>(TYPEFACE_CACHE_MAX_ENTRIES) override val fontCache = FontCacheImpl(animationFrameCount) + override fun getTypefaceForVariant(fvar: String?): Typeface? { if (fvar == null) { return baseTypeface @@ -113,29 +114,20 @@ class TextAnimator( ValueAnimator.ofFloat(1f).apply { duration = DEFAULT_ANIMATION_DURATION addUpdateListener { - textInterpolator.progress = - calculateProgress(it.animatedValue as Float, typefaceCache.animationFrameCount) + textInterpolator.progress = it.animatedValue as Float + textInterpolator.linearProgress = + it.currentPlayTime.toFloat() / it.duration.toFloat() invalidateCallback() } addListener( object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) = textInterpolator.rebase() + override fun onAnimationCancel(animation: Animator) = textInterpolator.rebase() } ) } - private fun calculateProgress(animProgress: Float, numberOfAnimationSteps: Int?): Float { - if (numberOfAnimationSteps != null) { - // This clamps the progress to the nearest value of "numberOfAnimationSteps" - // discrete values between 0 and 1f. - return (animProgress * numberOfAnimationSteps).roundToInt() / - numberOfAnimationSteps.toFloat() - } - - return animProgress - } - sealed class PositionedGlyph { /** Mutable X coordinate of the glyph position relative from drawing offset. */ var x: Float = 0f @@ -209,12 +201,14 @@ class TextAnimator( * * Here is an example of font runs: "fin. 終わり" * + * ``` * Characters : f i n . _ 終 わ り * Code Points: \u0066 \u0069 \u006E \u002E \u0020 \u7D42 \u308F \u308A * Font Runs : <-- Roboto-Regular.ttf --><-- NotoSans-CJK.otf --> * runStart = 0, runLength = 5 runStart = 5, runLength = 3 * Glyph IDs : 194 48 7 8 4367 1039 1002 * Glyph Index: 0 1 2 3 0 1 2 + * ``` * * In this example, the "fi" is converted into ligature form, thus the single glyph ID is * assigned for two characters, f and i. @@ -246,22 +240,24 @@ class TextAnimator( /** * Set text style with animation. * + * ``` * By passing -1 to weight, the view preserve the current weight. * By passing -1 to textSize, the view preserve the current text size. - * Bu passing -1 to duration, the default text animation, 1000ms, is used. + * By passing -1 to duration, the default text animation, 1000ms, is used. * By passing false to animate, the text will be updated without animation. + * ``` * * @param fvar an optional text fontVariationSettings. * @param textSize an optional font size. - * @param colors an optional colors array that must be the same size as numLines passed to - * the TextInterpolator + * @param colors an optional colors array that must be the same size as numLines passed to the + * TextInterpolator * @param strokeWidth an optional paint stroke width * @param animate an optional boolean indicating true for showing style transition as animation, - * false for immediate style transition. True by default. + * false for immediate style transition. True by default. * @param duration an optional animation duration in milliseconds. This is ignored if animate is - * false. + * false. * @param interpolator an optional time interpolator. If null is passed, last set interpolator - * will be used. This is ignored if animate is false. + * will be used. This is ignored if animate is false. */ fun setTextStyle( fvar: String? = "", @@ -273,8 +269,20 @@ class TextAnimator( interpolator: TimeInterpolator? = null, delay: Long = 0, onAnimationEnd: Runnable? = null, - ) = setTextStyleInternal(fvar, textSize, color, strokeWidth, animate, duration, - interpolator, delay, onAnimationEnd, updateLayoutOnFailure = true) + ) { + setTextStyleInternal( + fvar, + textSize, + color, + strokeWidth, + animate, + duration, + interpolator, + delay, + onAnimationEnd, + updateLayoutOnFailure = true, + ) + } private fun setTextStyleInternal( fvar: String?, @@ -310,24 +318,21 @@ class TextAnimator( if (animate) { animator.startDelay = delay - animator.duration = - if (duration == -1L) { - DEFAULT_ANIMATION_DURATION - } else { - duration - } + animator.duration = if (duration == -1L) DEFAULT_ANIMATION_DURATION else duration interpolator?.let { animator.interpolator = it } if (onAnimationEnd != null) { - val listener = object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - onAnimationEnd.run() - animator.removeListener(this) - } - override fun onAnimationCancel(animation: Animator) { - animator.removeListener(this) + animator.addListener( + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + onAnimationEnd.run() + animator.removeListener(this) + } + + override fun onAnimationCancel(animation: Animator) { + animator.removeListener(this) + } } - } - animator.addListener(listener) + ) } animator.start() } else { @@ -338,11 +343,26 @@ class TextAnimator( } } catch (ex: IllegalArgumentException) { if (updateLayoutOnFailure) { - Log.e(TAG, "setTextStyleInternal: Exception caught but retrying. This is usually" + - " due to the layout having changed unexpectedly without being notified.", ex) + Log.e( + TAG, + "setTextStyleInternal: Exception caught but retrying. This is usually" + + " due to the layout having changed unexpectedly without being notified.", + ex, + ) + updateLayout(textInterpolator.layout) - setTextStyleInternal(fvar, textSize, color, strokeWidth, animate, duration, - interpolator, delay, onAnimationEnd, updateLayoutOnFailure = false) + setTextStyleInternal( + fvar, + textSize, + color, + strokeWidth, + animate, + duration, + interpolator, + delay, + onAnimationEnd, + updateLayoutOnFailure = false, + ) } else { throw ex } @@ -351,6 +371,8 @@ class TextAnimator( /** * Set text style with animation. Similar as + * + * ``` * fun setTextStyle( * fvar: String? = "", * textSize: Float = -1f, @@ -362,6 +384,7 @@ class TextAnimator( * delay: Long = 0, * onAnimationEnd: Runnable? = null * ) + * ``` * * @param weight an optional style value for `wght` in fontVariationSettings. * @param width an optional style value for `wdth` in fontVariationSettings. @@ -380,14 +403,16 @@ class TextAnimator( duration: Long = -1L, interpolator: TimeInterpolator? = null, delay: Long = 0, - onAnimationEnd: Runnable? = null - ) = setTextStyleInternal( - fvar = fontVariationUtils.updateFontVariation( - weight = weight, - width = width, - opticalSize = opticalSize, - roundness = roundness, - ), + onAnimationEnd: Runnable? = null, + ) { + setTextStyleInternal( + fvar = + fontVariationUtils.updateFontVariation( + weight = weight, + width = width, + opticalSize = opticalSize, + roundness = roundness, + ), textSize = textSize, color = color, strokeWidth = strokeWidth, @@ -398,6 +423,7 @@ class TextAnimator( onAnimationEnd = onAnimationEnd, updateLayoutOnFailure = true, ) + } companion object { private val TAG = TextAnimator::class.simpleName!! diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/TextInterpolator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/TextInterpolator.kt index 9c0c0ffc8d41..457f45388062 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/TextInterpolator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/TextInterpolator.kt @@ -98,6 +98,9 @@ class TextInterpolator(layout: Layout, var typefaceCache: TypefaceVariantCache) */ var progress: Float = 0f + /** Linear progress value (not interpolated) */ + var linearProgress: Float = 0f + /** * The layout used for drawing text. * @@ -217,7 +220,12 @@ class TextInterpolator(layout: Layout, var typefaceCache: TypefaceVariantCache) } run.fontRuns.forEach { fontRun -> fontRun.baseFont = - fontInterpolator.lerp(fontRun.baseFont, fontRun.targetFont, progress) + fontInterpolator.lerp( + fontRun.baseFont, + fontRun.targetFont, + progress, + linearProgress, + ) val fvar = FontVariationAxis.toFontVariationSettings(fontRun.baseFont.axes) basePaint.typeface = typefaceCache.getTypefaceForVariant(fvar) } @@ -358,7 +366,7 @@ class TextInterpolator(layout: Layout, var typefaceCache: TypefaceVariantCache) // Draws single font run. private fun drawFontRun(c: Canvas, line: Run, run: FontRun, lineNo: Int, paint: Paint) { var arrayIndex = 0 - val font = fontInterpolator.lerp(run.baseFont, run.targetFont, progress) + val font = fontInterpolator.lerp(run.baseFont, run.targetFont, progress, linearProgress) val glyphFilter = glyphFilter if (glyphFilter == null) { diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt index 44c375d6ac5e..62aa31b49870 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/ResponsiveLazyHorizontalGrid.kt @@ -48,6 +48,9 @@ import androidx.compose.ui.unit.coerceAtMost import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.times import androidx.window.layout.WindowMetricsCalculator +import com.android.systemui.communal.util.WindowSizeUtils.COMPACT_HEIGHT +import com.android.systemui.communal.util.WindowSizeUtils.COMPACT_WIDTH +import com.android.systemui.communal.util.WindowSizeUtils.MEDIUM_WIDTH /** * Renders a responsive [LazyHorizontalGrid] with dynamic columns and rows. Each cell will maintain @@ -266,14 +269,14 @@ fun calculateWindowSize(): DpSize { private fun calculateNumCellsWidth(width: Dp) = // See https://developer.android.com/develop/ui/views/layout/use-window-size-classes when { - width >= 840.dp -> 3 - width >= 600.dp -> 2 + width >= MEDIUM_WIDTH -> 3 + width >= COMPACT_WIDTH -> 2 else -> 1 } private fun calculateNumCellsHeight(height: Dp) = when { height >= 1000.dp -> 3 - height >= 480.dp -> 2 + height >= COMPACT_HEIGHT -> 2 else -> 1 } 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 fa5e8aceef1d..6e25c8a5bc42 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 @@ -113,7 +113,7 @@ constructor( AodPromotedNotificationArea( modifier = Modifier.fillMaxWidth(0.5f) - .align(alignment = Alignment.TopStart) + .align(alignment = Alignment.TopEnd) ) Notifications( areNotificationsVisible = areNotificationsVisible, @@ -129,6 +129,10 @@ constructor( } } + // Not a mistake; reusing below_clock_padding_start_icons as AOD RON top + // padding for now. + val aodPromotedNotifTopPadding: Dp = + dimensionResource(R.dimen.below_clock_padding_start_icons) val aodIconPadding: Dp = dimensionResource(R.dimen.below_clock_padding_start_icons) @@ -136,7 +140,10 @@ constructor( if (!isShadeLayoutWide && !isBypassEnabled) { Box(modifier = Modifier.weight(weight = 1f)) { Column(Modifier.align(alignment = Alignment.TopStart)) { - AodPromotedNotificationArea() + AodPromotedNotificationArea( + modifier = + Modifier.padding(top = aodPromotedNotifTopPadding) + ) AodNotificationIcons( modifier = Modifier.padding(start = aodIconPadding) ) @@ -150,7 +157,10 @@ constructor( } else { Column { if (!isShadeLayoutWide) { - AodPromotedNotificationArea() + AodPromotedNotificationArea( + modifier = + Modifier.padding(top = aodPromotedNotifTopPadding) + ) } AodNotificationIcons( modifier = diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt index b53cc898be01..5dcec5b8836d 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/OverlayShade.kt @@ -107,7 +107,10 @@ private fun ContentScope.Panel( header: (@Composable () -> Unit)?, content: @Composable () -> Unit, ) { - Box(modifier = modifier.clip(OverlayShade.Shapes.RoundedCornerPanel)) { + Box( + modifier = + modifier.clip(OverlayShade.Shapes.RoundedCornerPanel).disableSwipesWhenScrolling() + ) { Spacer( modifier = Modifier.element(OverlayShade.Elements.PanelBackground) 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 4e10ff689b19..b11c83c778f4 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 @@ -67,6 +67,7 @@ import com.android.systemui.Flags import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.ui.compose.Icon import com.android.systemui.compose.modifiers.sysuiResTag +import com.android.systemui.haptics.slider.SliderHapticFeedbackFilter import com.android.systemui.haptics.slider.compose.ui.SliderHapticsViewModel import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.res.R @@ -104,7 +105,13 @@ fun VolumeSlider( val value by valueState(state) val interactionSource = remember { MutableInteractionSource() } val hapticsViewModel: SliderHapticsViewModel? = - setUpHapticsViewModel(value, state.valueRange, interactionSource, hapticsViewModelFactory) + setUpHapticsViewModel( + value, + state.valueRange, + state.hapticFilter, + interactionSource, + hapticsViewModelFactory, + ) Column(modifier = modifier.animateContentSize(), verticalArrangement = Arrangement.Top) { Row( @@ -220,7 +227,13 @@ private fun LegacyVolumeSlider( val value by valueState(state) val interactionSource = remember { MutableInteractionSource() } val hapticsViewModel: SliderHapticsViewModel? = - setUpHapticsViewModel(value, state.valueRange, interactionSource, hapticsViewModelFactory) + setUpHapticsViewModel( + value, + state.valueRange, + state.hapticFilter, + interactionSource, + hapticsViewModelFactory, + ) PlatformSlider( modifier = @@ -338,6 +351,7 @@ private fun SliderIcon( fun setUpHapticsViewModel( value: Float, valueRange: ClosedFloatingPointRange<Float>, + hapticFilter: SliderHapticFeedbackFilter, interactionSource: MutableInteractionSource, hapticsViewModelFactory: SliderHapticsViewModel.Factory?, ): SliderHapticsViewModel? { @@ -347,7 +361,10 @@ fun setUpHapticsViewModel( interactionSource, valueRange, Orientation.Horizontal, - VolumeHapticsConfigsProvider.sliderHapticFeedbackConfig(valueRange), + VolumeHapticsConfigsProvider.sliderHapticFeedbackConfig( + valueRange, + hapticFilter, + ), VolumeHapticsConfigsProvider.seekableSliderTrackerConfig, ) } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/ui/composable/VerticalVolumePanelContent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/ui/composable/VerticalVolumePanelContent.kt index bc3013239289..6349c1406a12 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/ui/composable/VerticalVolumePanelContent.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/ui/composable/VerticalVolumePanelContent.kt @@ -37,17 +37,18 @@ fun VolumePanelComposeScope.VerticalVolumePanelContent( layout: ComponentsLayout, modifier: Modifier = Modifier, ) { - Column(modifier = modifier, verticalArrangement = Arrangement.spacedBy(20.dp)) { + Column( + modifier = modifier.verticalScroll(rememberScrollState()), + verticalArrangement = Arrangement.spacedBy(20.dp), + ) { for (component in layout.headerComponents) { AnimatedVisibility(component.isVisible) { with(component.component as ComposeVolumePanelUiComponent) { Content(Modifier) } } } - Column(Modifier.verticalScroll(rememberScrollState())) { - for (component in layout.contentComponents) { - AnimatedVisibility(component.isVisible) { - with(component.component as ComposeVolumePanelUiComponent) { Content(Modifier) } - } + for (component in layout.contentComponents) { + AnimatedVisibility(component.isVisible) { + with(component.component as ComposeVolumePanelUiComponent) { Content(Modifier) } } } diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt index 8a8d98c863af..3fd796a9481a 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt @@ -109,7 +109,8 @@ class DefaultClockProvider( companion object { // 750ms @ 120hz -> 90 frames of animation - const val NUM_CLOCK_FONT_ANIMATION_STEPS = 90 + // In practice, 45 looks good enough + const val NUM_CLOCK_FONT_ANIMATION_STEPS = 45 val FLEX_TYPEFACE by lazy { // TODO(b/364680873): Move constant to config_clockFontFamily when shipping diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/common/ui/view/LongPressHandlingViewInteractionHandlerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/common/ui/view/LongPressHandlingViewInteractionHandlerTest.kt index 262c5903ec83..30da8d8d47ad 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/common/ui/view/LongPressHandlingViewInteractionHandlerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/common/ui/view/LongPressHandlingViewInteractionHandlerTest.kt @@ -44,7 +44,7 @@ class LongPressHandlingViewInteractionHandlerTest : SysuiTestCase() { @Mock private lateinit var postDelayed: (Runnable, Long) -> DisposableHandle @Mock private lateinit var onLongPressDetected: (Int, Int) -> Unit - @Mock private lateinit var onSingleTapDetected: () -> Unit + @Mock private lateinit var onSingleTapDetected: (Int, Int) -> Unit private lateinit var underTest: LongPressHandlingViewInteractionHandler @@ -76,74 +76,51 @@ class LongPressHandlingViewInteractionHandlerTest : SysuiTestCase() { val downX = 123 val downY = 456 dispatchTouchEvents( - Down( - x = downX, - y = downY, - ), - Move( - distanceMoved = ViewConfiguration.getTouchSlop() - 0.1f, - ), + Down(x = downX, y = downY), + Move(distanceMoved = ViewConfiguration.getTouchSlop() - 0.1f), ) delayedRunnable?.run() verify(onLongPressDetected).invoke(downX, downY) - verify(onSingleTapDetected, never()).invoke() + verify(onSingleTapDetected, never()).invoke(any(), any()) } @Test fun longPressButFeatureNotEnabled() = runTest { underTest.isLongPressHandlingEnabled = false - dispatchTouchEvents( - Down( - x = 123, - y = 456, - ), - ) + dispatchTouchEvents(Down(x = 123, y = 456)) assertThat(delayedRunnable).isNull() verify(onLongPressDetected, never()).invoke(any(), any()) - verify(onSingleTapDetected, never()).invoke() + verify(onSingleTapDetected, never()).invoke(any(), any()) } @Test fun longPressButViewNotAttached() = runTest { isAttachedToWindow = false - dispatchTouchEvents( - Down( - x = 123, - y = 456, - ), - ) + dispatchTouchEvents(Down(x = 123, y = 456)) delayedRunnable?.run() verify(onLongPressDetected, never()).invoke(any(), any()) - verify(onSingleTapDetected, never()).invoke() + verify(onSingleTapDetected, never()).invoke(any(), any()) } @Test fun draggedTooFarToBeConsideredAlongPress() = runTest { dispatchTouchEvents( - Down( - x = 123, - y = 456, - ), - Move( - distanceMoved = ViewConfiguration.getTouchSlop() + 0.1f, - ), + Down(x = 123, y = 456), + Move(distanceMoved = ViewConfiguration.getTouchSlop() + 0.1f), ) assertThat(delayedRunnable).isNull() verify(onLongPressDetected, never()).invoke(any(), any()) - verify(onSingleTapDetected, never()).invoke() + verify(onSingleTapDetected, never()).invoke(any(), any()) } @Test fun heldDownTooBrieflyToBeConsideredAlongPress() = runTest { dispatchTouchEvents( - Down( - x = 123, - y = 456, - ), + Down(x = 123, y = 456), Up( distanceMoved = ViewConfiguration.getTouchSlop().toFloat(), gestureDuration = ViewConfiguration.getLongPressTimeout() - 1L, @@ -152,12 +129,10 @@ class LongPressHandlingViewInteractionHandlerTest : SysuiTestCase() { assertThat(delayedRunnable).isNull() verify(onLongPressDetected, never()).invoke(any(), any()) - verify(onSingleTapDetected).invoke() + verify(onSingleTapDetected).invoke(123, 456) } - private fun dispatchTouchEvents( - vararg models: MotionEventModel, - ) { + private fun dispatchTouchEvents(vararg models: MotionEventModel) { models.forEach { model -> underTest.onTouchEvent(model) } } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationHostViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationHostViewControllerTest.java index 2ae611d236e9..3e5e72deb208 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationHostViewControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationHostViewControllerTest.java @@ -22,8 +22,12 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.res.Configuration; +import android.graphics.Rect; import android.os.UserHandle; import android.provider.Settings; +import android.testing.TestableLooper; +import android.testing.ViewUtils; import android.view.View; import androidx.constraintlayout.widget.ConstraintLayout; @@ -35,6 +39,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.dreams.DreamOverlayStateController; +import com.android.systemui.kosmos.KosmosJavaAdapter; import com.android.systemui.util.settings.FakeSettings; import com.android.systemui.util.settings.SecureSettings; @@ -52,8 +57,8 @@ import java.util.HashSet; @SmallTest @RunWith(AndroidJUnit4.class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) public class ComplicationHostViewControllerTest extends SysuiTestCase { - @Mock ConstraintLayout mComplicationHostView; @Mock @@ -99,6 +104,10 @@ public class ComplicationHostViewControllerTest extends SysuiTestCase { private SecureSettings mSecureSettings; + private KosmosJavaAdapter mKosmos; + + private TestableLooper mLooper; + private static final int CURRENT_USER_ID = UserHandle.USER_SYSTEM; @Before @@ -113,9 +122,12 @@ public class ComplicationHostViewControllerTest extends SysuiTestCase { when(mViewHolder.getLayoutParams()).thenReturn(mComplicationLayoutParams); when(mComplicationView.getParent()).thenReturn(mComplicationHostView); + mLooper = TestableLooper.get(this); + mKosmos = new KosmosJavaAdapter(this); mSecureSettings = new FakeSettings(); + mComplicationHostView = new ConstraintLayout(getContext()); mSecureSettings.putFloatForUser( - Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f, CURRENT_USER_ID); + Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f, CURRENT_USER_ID); mController = new ComplicationHostViewController( mComplicationHostView, @@ -123,12 +135,35 @@ public class ComplicationHostViewControllerTest extends SysuiTestCase { mDreamOverlayStateController, mLifecycleOwner, mViewModel, - mSecureSettings); + mSecureSettings, + mKosmos.getConfigurationInteractor(), + mKosmos.getTestDispatcher() + ); mController.init(); } /** + * Ensures layout engine update is called on configuration change. + */ + @Test + public void testUpdateLayoutEngineOnConfigurationChange() { + mController.onViewAttached(); + // Attach the complication host view so flows collecting on it start running. + ViewUtils.attachView(mComplicationHostView); + mLooper.processAllMessages(); + + // emit configuration change + Rect bounds = new Rect(0, 0, 2000, 2000); + Configuration config = new Configuration(); + config.windowConfiguration.setMaxBounds(bounds); + mKosmos.getConfigurationRepository().onConfigurationChange(config); + mKosmos.getTestScope().getTestScheduler().runCurrent(); + + verify(mLayoutEngine).updateLayoutEngine(bounds); + } + + /** * Ensures the lifecycle of complications is properly handled. */ @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationLayoutEngineTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationLayoutEngineTest.java index 383e0fab73ff..35eb2527bd1d 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationLayoutEngineTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/complication/ComplicationLayoutEngineTest.java @@ -18,10 +18,12 @@ package com.android.systemui.complication; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.graphics.Rect; import android.view.View; import androidx.constraintlayout.widget.ConstraintLayout; @@ -56,12 +58,14 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Mock TouchInsetManager.TouchInsetSession mTouchSession; + Margins mMargins = new Margins(0, 0, 0, 0); + ComplicationLayoutEngine createComplicationLayoutEngine() { return createComplicationLayoutEngine(0); } ComplicationLayoutEngine createComplicationLayoutEngine(int spacing) { - return new ComplicationLayoutEngine(mLayout, spacing, 0, 0, 0, 0, mTouchSession, 0, 0); + return new ComplicationLayoutEngine(mLayout, spacing, () -> mMargins, mTouchSession, 0, 0); } @Before @@ -84,7 +88,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { ConstraintLayout layout) { this.lp = params; this.category = category; - this.view = Mockito.mock(View.class); + this.view = mock(View.class); this.id = sFactory.getNextId(); when(view.getId()).thenReturn(sNextId++); when(view.getParent()).thenReturn(layout); @@ -131,15 +135,10 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Test public void testComplicationMarginPosition() { final Random rand = new Random(); - final int startMargin = rand.nextInt(); - final int topMargin = rand.nextInt(); - final int endMargin = rand.nextInt(); - final int bottomMargin = rand.nextInt(); final int spacing = rand.nextInt(); - - final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout, spacing, - startMargin, topMargin, endMargin, bottomMargin, mTouchSession, 0, 0); - + mMargins = new Margins(rand.nextInt(), rand.nextInt(), rand.nextInt(), + rand.nextInt()); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(spacing); final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( 100, @@ -167,17 +166,67 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { addComplication(engine, secondViewInfo); - // The first added view should have margins from both directions from the corner position. verifyChange(firstViewInfo, false, lp -> { - assertThat(lp.topMargin).isEqualTo(topMargin); - assertThat(lp.getMarginEnd()).isEqualTo(endMargin); + assertThat(lp.topMargin).isEqualTo(mMargins.top); + assertThat(lp.getMarginEnd()).isEqualTo(mMargins.end); }); // The second view should be spaced below the first view and have the side end margin. verifyChange(secondViewInfo, false, lp -> { assertThat(lp.topMargin).isEqualTo(spacing); - assertThat(lp.getMarginEnd()).isEqualTo(endMargin); + assertThat(lp.getMarginEnd()).isEqualTo(mMargins.end); + }); + } + + @Test + public void testComplicationMarginsOnScreenSizeChange() { + final Random rand = new Random(); + final int spacing = rand.nextInt(); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(spacing); + final ViewInfo firstViewInfo = new ViewInfo( + new ComplicationLayoutParams( + 100, + 100, + ComplicationLayoutParams.POSITION_TOP + | ComplicationLayoutParams.POSITION_END, + ComplicationLayoutParams.DIRECTION_DOWN, + 0), + Complication.CATEGORY_SYSTEM, + mLayout); + + addComplication(engine, firstViewInfo); + + final ViewInfo secondViewInfo = new ViewInfo( + new ComplicationLayoutParams( + 100, + 100, + ComplicationLayoutParams.POSITION_TOP + | ComplicationLayoutParams.POSITION_END, + ComplicationLayoutParams.DIRECTION_DOWN, + 0), + Complication.CATEGORY_STANDARD, + mLayout); + + addComplication(engine, secondViewInfo); + + firstViewInfo.clearInvocations(); + secondViewInfo.clearInvocations(); + + // Triggers an update to the layout engine with new margins. + final int newTopMargin = rand.nextInt(); + final int newEndMargin = rand.nextInt(); + mMargins = new Margins(0, newTopMargin, newEndMargin, 0); + engine.updateLayoutEngine(new Rect(0, 0, 800, 1000)); + + // Ensure complication view have new margins + verifyChange(firstViewInfo, false, lp -> { + assertThat(lp.topMargin).isEqualTo(newTopMargin); + assertThat(lp.getMarginEnd()).isEqualTo(newEndMargin); + }); + verifyChange(secondViewInfo, false, lp -> { + assertThat(lp.topMargin).isEqualTo(spacing); + assertThat(lp.getMarginEnd()).isEqualTo(newEndMargin); }); } @@ -241,7 +290,6 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Test public void testDirectionLayout() { final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); - final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( 100, @@ -289,7 +337,6 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Test public void testPositionLayout() { final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); - final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( 100, @@ -376,7 +423,6 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { public void testDefaultMargin() { final int margin = 5; final ComplicationLayoutEngine engine = createComplicationLayoutEngine(margin); - final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( 100, @@ -452,7 +498,6 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { final int defaultMargin = 5; final int complicationMargin = 10; final ComplicationLayoutEngine engine = createComplicationLayoutEngine(defaultMargin); - final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( 100, @@ -518,7 +563,6 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { public void testWidthConstraint() { final int maxWidth = 20; final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); - final ViewInfo viewStartDirection = new ViewInfo( new ComplicationLayoutParams( 100, @@ -566,7 +610,6 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { public void testHeightConstraint() { final int maxHeight = 20; final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); - final ViewInfo viewUpDirection = new ViewInfo( new ComplicationLayoutParams( 100, @@ -613,7 +656,6 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Test public void testConstraintNotSetWhenNotSpecified() { final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); - final ViewInfo view = new ViewInfo( new ComplicationLayoutParams( 100, @@ -641,7 +683,6 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Test public void testRemoval() { final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); - final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( 100, @@ -687,7 +728,6 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Test public void testDoubleRemoval() { final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); - final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( 100, @@ -716,7 +756,6 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Test public void testGetViews() { final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); - final ViewInfo topEndView = new ViewInfo( new ComplicationLayoutParams( 100, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt index 72cf63749284..7e93f5a8c9a8 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt @@ -45,6 +45,8 @@ import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepos import com.android.systemui.keyguard.data.repository.keyguardOcclusionRepository import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository import com.android.systemui.keyguard.shared.model.BiometricUnlockMode +import com.android.systemui.keyguard.shared.model.DozeStateModel +import com.android.systemui.keyguard.shared.model.DozeTransitionModel import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState.GONE import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN @@ -155,6 +157,22 @@ class FromDozingTransitionInteractorTest(flags: FlagsParameterization?) : SysuiT } @Test + fun testTransitionToDreaming() = + kosmos.runTest { + // Ensure dozing is off + fakeKeyguardRepository.setDozeTransitionModel( + DozeTransitionModel(from = DozeStateModel.DOZE, to = DozeStateModel.FINISH) + ) + testScope.advanceTimeBy(600L) + + keyguardInteractor.setDreaming(true) + testScope.advanceTimeBy(60L) + + assertThat(transitionRepository) + .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.DREAMING) + } + + @Test @EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR) @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR, FLAG_GLANCEABLE_HUB_V2) fun testTransitionToLockscreen_onWake_canDream_glanceableHubAvailable() = diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLockWhileAwakeInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardShowWhileAwakeInteractorTest.kt index 3eacc28c0bd0..cfe382696414 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardLockWhileAwakeInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardShowWhileAwakeInteractorTest.kt @@ -39,42 +39,39 @@ import org.mockito.kotlin.whenever @SmallTest @RunWith(AndroidJUnit4::class) -class KeyguardLockWhileAwakeInteractorTest : SysuiTestCase() { +@kotlinx.coroutines.ExperimentalCoroutinesApi +class KeyguardShowWhileAwakeInteractorTest : SysuiTestCase() { private val kosmos = testKosmos() private val testScope = kosmos.testScope - private lateinit var underTest: KeyguardLockWhileAwakeInteractor + private lateinit var underTest: KeyguardShowWhileAwakeInteractor @Before fun setup() { - underTest = kosmos.keyguardLockWhileAwakeInteractor + underTest = kosmos.keyguardShowWhileAwakeInteractor } @Test fun emitsMultipleTimeoutEvents() = testScope.runTest { - val values by collectValues(underTest.lockWhileAwakeEvents) + val values by collectValues(underTest.showWhileAwakeEvents) kosmos.keyguardEnabledInteractor.notifyKeyguardEnabled(true) runCurrent() - kosmos.keyguardServiceLockNowInteractor.onKeyguardServiceDoKeyguardTimeout( - options = null - ) + kosmos.keyguardServiceShowLockscreenInteractor.onKeyguardServiceDoKeyguardTimeout() runCurrent() assertThat(values) - .containsExactly(LockWhileAwakeReason.KEYGUARD_TIMEOUT_WHILE_SCREEN_ON) + .containsExactly(ShowWhileAwakeReason.KEYGUARD_TIMEOUT_WHILE_SCREEN_ON) advanceTimeBy(1000) - kosmos.keyguardServiceLockNowInteractor.onKeyguardServiceDoKeyguardTimeout( - options = null - ) + kosmos.keyguardServiceShowLockscreenInteractor.onKeyguardServiceDoKeyguardTimeout() runCurrent() assertThat(values) .containsExactly( - LockWhileAwakeReason.KEYGUARD_TIMEOUT_WHILE_SCREEN_ON, - LockWhileAwakeReason.KEYGUARD_TIMEOUT_WHILE_SCREEN_ON, + ShowWhileAwakeReason.KEYGUARD_TIMEOUT_WHILE_SCREEN_ON, + ShowWhileAwakeReason.KEYGUARD_TIMEOUT_WHILE_SCREEN_ON, ) } @@ -88,7 +85,7 @@ class KeyguardLockWhileAwakeInteractorTest : SysuiTestCase() { @Test fun emitsWhenKeyguardReenabled_onlyIfShowingWhenDisabled() = testScope.runTest { - val values by collectValues(underTest.lockWhileAwakeEvents) + val values by collectValues(underTest.showWhileAwakeEvents) kosmos.biometricSettingsRepository.setIsUserInLockdown(false) runCurrent() @@ -101,7 +98,7 @@ class KeyguardLockWhileAwakeInteractorTest : SysuiTestCase() { kosmos.keyguardEnabledInteractor.notifyKeyguardEnabled(true) runCurrent() - assertThat(values).containsExactly(LockWhileAwakeReason.KEYGUARD_REENABLED) + assertThat(values).containsExactly(ShowWhileAwakeReason.KEYGUARD_REENABLED) kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps( from = KeyguardState.LOCKSCREEN, @@ -112,7 +109,7 @@ class KeyguardLockWhileAwakeInteractorTest : SysuiTestCase() { kosmos.keyguardEnabledInteractor.notifyKeyguardEnabled(true) runCurrent() - assertThat(values).containsExactly(LockWhileAwakeReason.KEYGUARD_REENABLED) + assertThat(values).containsExactly(ShowWhileAwakeReason.KEYGUARD_REENABLED) } /** @@ -122,7 +119,7 @@ class KeyguardLockWhileAwakeInteractorTest : SysuiTestCase() { @Test fun doesNotEmit_keyguardNoLongerSuppressed() = testScope.runTest { - val values by collectValues(underTest.lockWhileAwakeEvents) + val values by collectValues(underTest.showWhileAwakeEvents) // Enable keyguard and then suppress it. kosmos.keyguardEnabledInteractor.notifyKeyguardEnabled(true) @@ -144,14 +141,14 @@ class KeyguardLockWhileAwakeInteractorTest : SysuiTestCase() { @Test fun doesNotEmit_fromLockdown_orFromLockNow_ifEnabledButSuppressed() = testScope.runTest { - val values by collectValues(underTest.lockWhileAwakeEvents) + val values by collectValues(underTest.showWhileAwakeEvents) // Set keyguard enabled, but then disable lockscreen (suppress it). kosmos.keyguardEnabledInteractor.notifyKeyguardEnabled(true) whenever(kosmos.lockPatternUtils.isLockScreenDisabled(anyInt())).thenReturn(true) runCurrent() - kosmos.keyguardServiceLockNowInteractor.onKeyguardServiceDoKeyguardTimeout(null) + kosmos.keyguardServiceShowLockscreenInteractor.onKeyguardServiceDoKeyguardTimeout() runCurrent() kosmos.biometricSettingsRepository.setIsUserInLockdown(true) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractorTest.kt index a814953f707b..561eee7db50b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractorTest.kt @@ -185,7 +185,7 @@ class KeyguardWakeDirectlyToGoneInteractorTest : SysuiTestCase() { canWake, ) - kosmos.keyguardServiceLockNowInteractor.onKeyguardServiceDoKeyguardTimeout(null) + kosmos.keyguardServiceShowLockscreenInteractor.onKeyguardServiceDoKeyguardTimeout() runCurrent() assertEquals( @@ -209,7 +209,7 @@ class KeyguardWakeDirectlyToGoneInteractorTest : SysuiTestCase() { canWake, ) - kosmos.keyguardServiceLockNowInteractor.onKeyguardServiceDoKeyguardTimeout(null) + kosmos.keyguardServiceShowLockscreenInteractor.onKeyguardServiceDoKeyguardTimeout() runCurrent() assertEquals( diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java index 3078a943be32..71cc369e4327 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/media/dialog/MediaOutputAdapterTest.java @@ -246,6 +246,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase { assertThat(mViewHolder.mSubTitleText.getVisibility()).isEqualTo(View.GONE); assertThat(mViewHolder.mProgressBar.getVisibility()).isEqualTo(View.GONE); assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(mViewHolder.mEndClickIcon.getVisibility()).isEqualTo(View.GONE); assertThat(mViewHolder.mSeekBar.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mViewHolder.mEndTouchArea.getVisibility()).isEqualTo(View.VISIBLE); } @@ -297,6 +298,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase { assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.GONE); assertThat(mViewHolder.mSeekBar.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mViewHolder.mEndTouchArea.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(mViewHolder.mEndClickIcon.getVisibility()).isEqualTo(View.VISIBLE); } @Test @@ -312,12 +314,12 @@ public class MediaOutputAdapterTest extends SysuiTestCase { assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mViewHolder.mTitleText.getText().toString()).isEqualTo(TEST_DEVICE_NAME_1); assertThat(mViewHolder.mStatusIcon.getVisibility()).isEqualTo(View.GONE); - assertThat(mViewHolder.mEndClickIcon.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mViewHolder.mSubTitleText.getVisibility()).isEqualTo(View.GONE); assertThat(mViewHolder.mProgressBar.getVisibility()).isEqualTo(View.GONE); assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.GONE); assertThat(mViewHolder.mSeekBar.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mViewHolder.mEndTouchArea.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(mViewHolder.mEndClickIcon.getVisibility()).isEqualTo(View.VISIBLE); } @Test @@ -327,6 +329,7 @@ public class MediaOutputAdapterTest extends SysuiTestCase { mMediaOutputAdapter.onBindViewHolder(mViewHolder, 0); assertThat(mViewHolder.mProgressBar.getVisibility()).isEqualTo(View.GONE); + assertThat(mViewHolder.mSeekBar.getVisibility()).isEqualTo(View.GONE); assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.GONE); assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mViewHolder.mTitleText.getText().toString()).isEqualTo(TEST_DEVICE_NAME_1); @@ -342,6 +345,8 @@ public class MediaOutputAdapterTest extends SysuiTestCase { mMediaOutputAdapter.onBindViewHolder(mViewHolder, 0); assertThat(mViewHolder.mProgressBar.getVisibility()).isEqualTo(View.GONE); + assertThat(mViewHolder.mSeekBar.getVisibility()).isEqualTo(View.GONE); + assertThat(mViewHolder.mContainerLayout.isFocusable()).isTrue(); assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.GONE); assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mViewHolder.mTitleText.getText().toString()).isEqualTo(TEST_DEVICE_NAME_1); @@ -383,7 +388,9 @@ public class MediaOutputAdapterTest extends SysuiTestCase { mMediaOutputAdapter.onBindViewHolder(mViewHolder, 1); assertThat(mViewHolder.mProgressBar.getVisibility()).isEqualTo(View.GONE); + assertThat(mViewHolder.mEndTouchArea.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(mViewHolder.mEndClickIcon.getVisibility()).isEqualTo(View.GONE); assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mViewHolder.mTitleText.getText().toString()).isEqualTo(TEST_DEVICE_NAME_2); assertThat(mViewHolder.mContainerLayout.isFocusable()).isTrue(); @@ -618,6 +625,25 @@ public class MediaOutputAdapterTest extends SysuiTestCase { } @Test + public void onItemClick_selectionBehaviorGoToApp_sendsLaunchIntent() { + when(mMediaSwitchingController.isCurrentOutputDeviceHasSessionOngoing()).thenReturn(true); + when(mMediaDevice2.getState()).thenReturn( + LocalMediaManager.MediaDeviceState.STATE_DISCONNECTED); + when(mMediaDevice2.getSelectionBehavior()).thenReturn(SELECTION_BEHAVIOR_GO_TO_APP); + mMediaOutputAdapter = new MediaOutputAdapter(mMediaSwitchingController); + mMediaOutputAdapter.updateItems(); + mViewHolder = (MediaOutputAdapter.MediaDeviceViewHolder) mMediaOutputAdapter + .onCreateViewHolder(new LinearLayout(mContext), 0); + MediaOutputAdapter.MediaDeviceViewHolder spyMediaDeviceViewHolder = spy(mViewHolder); + + mMediaOutputAdapter.onBindViewHolder(spyMediaDeviceViewHolder, 1); + spyMediaDeviceViewHolder.mContainerLayout.performClick(); + + verify(mMediaSwitchingController).tryToLaunchInAppRoutingIntent(TEST_DEVICE_ID_2, + mViewHolder.mContainerLayout); + } + + @Test public void onItemClick_clicksWithMutingExpectedDeviceExist_cancelsMuteAwaitConnection() { when(mMediaSwitchingController.isAnyDeviceTransferring()).thenReturn(false); when(mMediaSwitchingController.hasMutingExpectedDevice()).thenReturn(true); @@ -918,6 +944,8 @@ public class MediaOutputAdapterTest extends SysuiTestCase { mMediaOutputAdapter.onBindViewHolder(mViewHolder, 0); assertThat(mViewHolder.mSeekBar.getVisibility()).isEqualTo(View.VISIBLE); + assertThat(mViewHolder.mSeekBar.getContentDescription()).isNotNull(); + assertThat(mViewHolder.mContainerLayout.isFocusable()).isFalse(); assertThat(mViewHolder.mTitleText.getVisibility()).isEqualTo(View.VISIBLE); assertThat(mViewHolder.mCheckBox.getVisibility()).isEqualTo(View.GONE); assertThat(mViewHolder.mEndTouchArea.getVisibility()).isEqualTo(View.VISIBLE); diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerBaseSceneContainerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerBaseSceneContainerTest.kt index 32e5fa1a8d59..5c560caaae04 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerBaseSceneContainerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerBaseSceneContainerTest.kt @@ -36,6 +36,7 @@ import com.android.systemui.lifecycle.InstantTaskExecutorRule import com.android.systemui.media.controls.ui.view.MediaHost import com.android.systemui.qs.customize.QSCustomizerController import com.android.systemui.qs.logging.QSLogger +import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.SplitShadeStateController import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat @@ -80,6 +81,7 @@ class QSPanelControllerBaseSceneContainerTest : SysuiTestCase() { private val configuration = Configuration() @Mock private lateinit var viewTreeObserver: ViewTreeObserver @Mock private lateinit var mediaHost: MediaHost + @Mock private lateinit var configurationController: ConfigurationController private var isSplitShade = false private val splitShadeStateController = @@ -258,6 +260,7 @@ class QSPanelControllerBaseSceneContainerTest : SysuiTestCase() { splitShadeStateController, longPressEffectProvider, mediaVisible, + configurationController, ) } @@ -272,7 +275,8 @@ class QSPanelControllerBaseSceneContainerTest : SysuiTestCase() { dumpManager: DumpManager, splitShadeStateController: SplitShadeStateController, longPressEffectProvider: Provider<QSLongPressEffect>, - private val mediaVisibleFlow: StateFlow<Boolean> + private val mediaVisibleFlow: StateFlow<Boolean>, + configurationController: ConfigurationController, ) : QSPanelControllerBase<QSPanel>( view, @@ -285,12 +289,14 @@ class QSPanelControllerBaseSceneContainerTest : SysuiTestCase() { qsLogger, dumpManager, splitShadeStateController, - longPressEffectProvider + longPressEffectProvider, + configurationController, ) { init { whenever(view.dumpableTag).thenReturn(hashCode().toString()) } + override fun getMediaVisibleFlow(): StateFlow<Boolean> { return mediaVisibleFlow } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java index ff005c2b767a..0846b06cce03 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java @@ -40,6 +40,7 @@ import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow; import android.content.res.Configuration; import android.content.res.Resources; +import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.FlagsParameterization; import android.testing.TestableLooper.RunWithLooper; import android.view.ContextThemeWrapper; @@ -51,6 +52,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.testing.UiEventLoggerFake; +import com.android.systemui.Flags; import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.DisableSceneContainer; @@ -64,6 +66,7 @@ import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.res.R; import com.android.systemui.scene.shared.flag.SceneContainerFlag; +import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController; import com.android.systemui.util.animation.DisappearParameters; @@ -134,6 +137,8 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { Runnable mHorizontalLayoutListener; @Mock private ViewTreeObserver mViewTreeObserver; + @Mock + ConfigurationController mConfigurationController; private boolean mPagedTileLayoutListening = false; @@ -151,7 +156,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { super(view, host, qsCustomizerController, usingMediaPlayer(), mediaHost, metricsLogger, uiEventLogger, qsLogger, dumpManager, new ResourcesSplitShadeStateController(), - mLongPressEffectProvider); + mLongPressEffectProvider, mConfigurationController); } private MutableStateFlow<Boolean> mMediaVisible = MutableStateFlow(false); @@ -633,6 +638,19 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { ); } + @Test + @EnableFlags(Flags.FLAG_SHADE_WINDOW_GOES_AROUND) + public void onViewAttached_registersConfigListener() { + reset(mConfigurationController); + mController.onViewAttached(); + + verify(mConfigurationController).addCallback(any()); + + mController.onViewDetached(); + + verify(mConfigurationController).removeCallback(any()); + } + private boolean usingMediaPlayer() { return !SceneContainerFlag.isEnabled(); diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerTest.kt index 96f6a622e2f3..0d4bc8c7a4e1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QSPanelControllerTest.kt @@ -22,6 +22,7 @@ import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.settings.brightness.BrightnessController import com.android.systemui.settings.brightness.BrightnessSliderController import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager +import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController import com.android.systemui.tuner.TunerService import com.google.common.truth.Truth.assertThat @@ -66,6 +67,7 @@ class QSPanelControllerTest : SysuiTestCase() { @Mock private lateinit var pagedTileLayout: PagedTileLayout @Mock private lateinit var longPressEffectProvider: Provider<QSLongPressEffect> @Mock private lateinit var mediaCarouselInteractor: MediaCarouselInteractor + @Mock private lateinit var configurationController: ConfigurationController private val usingMediaPlayer: Boolean by lazy { !SceneContainerFlag.isEnabled } @@ -108,6 +110,7 @@ class QSPanelControllerTest : SysuiTestCase() { ResourcesSplitShadeStateController(), longPressEffectProvider, mediaCarouselInteractor, + configurationController, ) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt index 7880aceb53be..896ca26e3e79 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt @@ -32,6 +32,7 @@ import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.customize.QSCustomizerController import com.android.systemui.qs.logging.QSLogger import com.android.systemui.res.R +import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ResourcesSplitShadeStateController import com.android.systemui.util.leak.RotationUtils import javax.inject.Provider @@ -64,6 +65,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() { @Captor private lateinit var captor: ArgumentCaptor<QSPanel.OnConfigurationChangedListener> @Mock private lateinit var longPressEffectProvider: Provider<QSLongPressEffect> @Mock private lateinit var mediaCarouselInteractor: MediaCarouselInteractor + @Mock private lateinit var configurationController: ConfigurationController private val usingMediaPlayer: Boolean get() = false @@ -100,6 +102,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() { dumpManager, longPressEffectProvider, mediaCarouselInteractor, + configurationController, ) controller.init() @@ -171,6 +174,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() { dumpManager: DumpManager, longPressEffectProvider: Provider<QSLongPressEffect>, mediaCarouselInteractor: MediaCarouselInteractor, + configurationController: ConfigurationController, ) : QuickQSPanelController( view, @@ -186,6 +190,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() { ResourcesSplitShadeStateController(), longPressEffectProvider, mediaCarouselInteractor, + configurationController, ) { private var rotation = RotationUtils.ROTATION_NONE diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/InternetTileNewImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/InternetTileNewImplTest.kt index 41d7e490ddc2..64e6f4bd48b8 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/InternetTileNewImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/InternetTileNewImplTest.kt @@ -17,8 +17,6 @@ package com.android.systemui.qs.tiles import android.os.Handler -import android.platform.test.annotations.DisableFlags -import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.FlagsParameterization import android.platform.test.flag.junit.FlagsParameterization.allCombinationsOf import android.service.quicksettings.Tile @@ -26,23 +24,19 @@ import android.testing.TestableLooper import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest import com.android.internal.logging.MetricsLogger -import com.android.systemui.Flags.FLAG_SCENE_CONTAINER import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingManagerFake -import com.android.systemui.keyguard.KeyguardWmStateRefactor import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.qs.QSHost import com.android.systemui.qs.QsEventLogger import com.android.systemui.qs.flags.QSComposeFragment -import com.android.systemui.qs.flags.QsDetailedView import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.tiles.dialog.InternetDetailsViewModel import com.android.systemui.qs.tiles.dialog.InternetDialogManager import com.android.systemui.qs.tiles.dialog.WifiStateWorker import com.android.systemui.res.R import com.android.systemui.statusbar.connectivity.AccessPointController -import com.android.systemui.statusbar.notification.shared.NotificationThrottleHun import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.ethernet.domain.EthernetInteractor import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconsInteractor @@ -271,44 +265,6 @@ class InternetTileNewImplTest(flags: FlagsParameterization) : SysuiTestCase() { verify(wifiStateWorker, times(1)).isWifiEnabled = eq(true) } - @Test - @DisableFlags(QsDetailedView.FLAG_NAME) - fun click_withQsDetailedViewDisabled() { - underTest.click(null) - looper.processAllMessages() - - verify(dialogManager, times(1)) - .create( - aboveStatusBar = true, - accessPointController.canConfigMobileData(), - accessPointController.canConfigWifi(), - null, - ) - } - - @Test - @EnableFlags( - value = - [ - QsDetailedView.FLAG_NAME, - FLAG_SCENE_CONTAINER, - KeyguardWmStateRefactor.FLAG_NAME, - NotificationThrottleHun.FLAG_NAME, - ] - ) - fun click_withQsDetailedViewEnabled() { - underTest.click(null) - looper.processAllMessages() - - verify(dialogManager, times(0)) - .create( - aboveStatusBar = true, - accessPointController.canConfigMobileData(), - accessPointController.canConfigWifi(), - null, - ) - } - companion object { const val WIFI_SSID = "test ssid" val ACTIVE_WIFI = diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java index 85e59364d6b6..2dce4aa01d24 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -167,6 +167,7 @@ import com.android.systemui.user.domain.interactor.UserSwitcherInteractor; import com.android.systemui.util.kotlin.JavaAdapter; import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.util.time.SystemClock; +import com.android.systemui.wallpapers.ui.viewmodel.WallpaperFocalAreaViewModel; import com.android.wm.shell.animation.FlingAnimationUtils; import dagger.Lazy; @@ -270,6 +271,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mDreamingToLockscreenTransitionViewModel; @Mock protected KeyguardTransitionInteractor mKeyguardTransitionInteractor; @Mock protected KeyguardTouchHandlingViewModel mKeyuardTouchHandlingViewModel; + @Mock protected WallpaperFocalAreaViewModel mWallpaperFocalAreaViewModel; @Mock protected AlternateBouncerInteractor mAlternateBouncerInteractor; @Mock protected MotionEvent mDownMotionEvent; @Mock protected CoroutineDispatcher mMainDispatcher; @@ -574,6 +576,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mKeyguardTransitionInteractor, mDumpManager, mKeyuardTouchHandlingViewModel, + mWallpaperFocalAreaViewModel, mKeyguardInteractor, mActivityStarter, mSharedNotificationContainerInteractor, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt index 72a57831e61a..a8b48363fe07 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt @@ -249,15 +249,6 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { @Test @EnableFlags(AConfigFlags.FLAG_SHADE_WINDOW_GOES_AROUND) - fun onConfigurationChanged_configForwarderSet_propagatesConfig() { - val config = Configuration() - underTest.onConfigurationChanged(config) - - verify(configurationForwarder).onConfigurationChanged(eq(config)) - } - - @Test - @EnableFlags(AConfigFlags.FLAG_SHADE_WINDOW_GOES_AROUND) fun onMovedToDisplay_configForwarderSet_propagatesConfig() { val config = Configuration() diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt index 246283c236fe..0ad60b617194 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorTest.kt @@ -184,4 +184,11 @@ class ShadeDisplaysInteractorTest : SysuiTestCase() { verify(notificationStackRebindingHider).setVisible(eq(true), eq(true)) } + + @Test + fun start_registersConfigChangeListener() { + underTest.start() + + verify(shadeContext).registerComponentCallbacks(any()) + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchControllerTest.kt deleted file mode 100644 index 2e43e5273766..000000000000 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchControllerTest.kt +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ - -package com.android.systemui.statusbar.policy - -import android.testing.TestableLooper -import android.testing.ViewUtils -import android.view.LayoutInflater -import android.view.View -import android.widget.FrameLayout -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.SmallTest -import com.android.internal.logging.UiEventLogger -import com.android.systemui.SysuiTestCase -import com.android.systemui.plugins.FalsingManager -import com.android.systemui.qs.user.UserSwitchDialogController -import com.android.systemui.res.R -import com.android.systemui.statusbar.phone.DozeParameters -import com.android.systemui.statusbar.phone.LockscreenGestureLogger -import com.android.systemui.statusbar.phone.ScreenOffAnimationController -import com.google.common.truth.Truth.assertThat -import org.junit.After -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mock -import org.mockito.Mockito.times -import org.mockito.Mockito.verify -import org.mockito.Mockito.`when` -import org.mockito.MockitoAnnotations - -@SmallTest -@TestableLooper.RunWithLooper -@RunWith(AndroidJUnit4::class) -class KeyguardQsUserSwitchControllerTest : SysuiTestCase() { - @Mock private lateinit var userSwitcherController: UserSwitcherController - - @Mock private lateinit var keyguardStateController: KeyguardStateController - - @Mock private lateinit var falsingManager: FalsingManager - - @Mock private lateinit var configurationController: ConfigurationController - - @Mock private lateinit var dozeParameters: DozeParameters - - @Mock private lateinit var screenOffAnimationController: ScreenOffAnimationController - - @Mock private lateinit var userSwitchDialogController: UserSwitchDialogController - - @Mock private lateinit var uiEventLogger: UiEventLogger - - private lateinit var view: FrameLayout - private lateinit var testableLooper: TestableLooper - private lateinit var keyguardQsUserSwitchController: KeyguardQsUserSwitchController - - @Before - fun setUp() { - MockitoAnnotations.initMocks(this) - testableLooper = TestableLooper.get(this) - - view = - LayoutInflater.from(context).inflate(R.layout.keyguard_qs_user_switch, null) - as FrameLayout - - keyguardQsUserSwitchController = - KeyguardQsUserSwitchController( - view, - context, - context.resources, - userSwitcherController, - keyguardStateController, - falsingManager, - configurationController, - dozeParameters, - screenOffAnimationController, - userSwitchDialogController, - uiEventLogger, - ) - - ViewUtils.attachView(view) - testableLooper.processAllMessages() - `when`(userSwitcherController.isKeyguardShowing).thenReturn(true) - `when`(keyguardStateController.isShowing).thenReturn(true) - `when`(keyguardStateController.isKeyguardGoingAway).thenReturn(false) - keyguardQsUserSwitchController.init() - } - - @After - fun tearDown() { - if (::view.isInitialized) { - ViewUtils.detachView(view) - } - } - - @Test - fun testUiEventLogged() { - view.findViewById<View>(R.id.kg_multi_user_avatar)?.performClick() - verify(uiEventLogger, times(1)) - .log(LockscreenGestureLogger.LockscreenUiEvent.LOCKSCREEN_SWITCH_USER_TAP) - } - - @Test - fun testAvatarExistsWhenKeyguardGoingAway() { - `when`(keyguardStateController.isShowing).thenReturn(false) - `when`(keyguardStateController.isKeyguardGoingAway).thenReturn(true) - keyguardQsUserSwitchController.updateKeyguardShowing(true /* forceViewUpdate */) - assertThat(keyguardQsUserSwitchController.mUserAvatarView.isEmpty).isFalse() - } - - @Test - fun testAvatarExistsWhenKeyguardShown() { - `when`(keyguardStateController.isShowing).thenReturn(true) - `when`(keyguardStateController.isKeyguardGoingAway).thenReturn(false) - keyguardQsUserSwitchController.updateKeyguardShowing(true /* forceViewUpdate */) - assertThat(keyguardQsUserSwitchController.mUserAvatarView.isEmpty).isFalse() - } - - @Test - fun testAvatarGoneWhenKeyguardGone() { - `when`(keyguardStateController.isShowing).thenReturn(false) - `when`(keyguardStateController.isKeyguardGoingAway).thenReturn(false) - keyguardQsUserSwitchController.updateKeyguardShowing(true /* forceViewUpdate */) - assertThat(keyguardQsUserSwitchController.mUserAvatarView.isEmpty).isTrue() - } -} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/util/WallpaperControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/util/WallpaperControllerTest.kt index 6271904b2f04..9f2f60342d7c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/util/WallpaperControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/util/WallpaperControllerTest.kt @@ -86,7 +86,7 @@ class WallpaperControllerTest : SysuiTestCase() { @Test fun setUnfoldTransitionZoom_defaultUnfoldTransitionIsDisabled_doesNotUpdateWallpaperZoom() { - wallpaperRepository.wallpaperInfo.value = createWallpaperInfo(useDefaultTransition = false) + wallpaperRepository.setWallpaperInfo(createWallpaperInfo(useDefaultTransition = false)) wallaperController.setUnfoldTransitionZoom(0.5f) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt index 1f5e7cace8eb..5afc6b1b85a3 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryImplTest.kt @@ -27,8 +27,6 @@ import androidx.test.filters.SmallTest import com.android.internal.R import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue -import com.android.systemui.keyguard.data.repository.FakeKeyguardClockRepository -import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.res.R as SysUIR import com.android.systemui.shared.Flags as SharedFlags import com.android.systemui.user.data.model.SelectedUserModel @@ -53,8 +51,7 @@ class WallpaperRepositoryImplTest : SysuiTestCase() { private val testDispatcher = StandardTestDispatcher() private val testScope = TestScope(testDispatcher) private val userRepository = FakeUserRepository() - private val keyguardClockRepository = FakeKeyguardClockRepository() - private val keyguardRepository = FakeKeyguardRepository() + private val wallpaperFocalAreaRepository = FakeWallpaperFocalAreaRepository() private val wallpaperManager: WallpaperManager = mock() private val underTest: WallpaperRepositoryImpl by lazy { @@ -63,7 +60,7 @@ class WallpaperRepositoryImplTest : SysuiTestCase() { testDispatcher, fakeBroadcastDispatcher, userRepository, - keyguardRepository, + wallpaperFocalAreaRepository, wallpaperManager, context, ) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractorTest.kt new file mode 100644 index 000000000000..cd6e18a69c4d --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractorTest.kt @@ -0,0 +1,312 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallpapers.domain.interactor + +import android.content.mockedContext +import android.content.res.Resources +import android.graphics.PointF +import android.graphics.RectF +import android.util.DisplayMetrics +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.kosmos.currentValue +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.data.repository.shadeRepository +import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository +import com.android.systemui.statusbar.notification.data.repository.setActiveNotifs +import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor +import com.android.systemui.testKosmos +import com.android.systemui.wallpapers.data.repository.fakeWallpaperFocalAreaRepository +import com.android.systemui.wallpapers.data.repository.wallpaperFocalAreaRepository +import com.android.systemui.wallpapers.data.repository.wallpaperRepository +import com.android.systemui.wallpapers.ui.viewmodel.wallpaperFocalAreaViewModel +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.MockitoAnnotations +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever + +@ExperimentalCoroutinesApi +@SmallTest +@RunWith(AndroidJUnit4::class) +class WallpaperFocalAreaInteractorTest : SysuiTestCase() { + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + lateinit var shadeRepository: ShadeRepository + private lateinit var mockedResources: Resources + lateinit var underTest: WallpaperFocalAreaInteractor + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + mockedResources = mock<Resources>() + whenever(kosmos.mockedContext.resources).thenReturn(mockedResources) + whenever( + mockedResources.getFloat( + Resources.getSystem() + .getIdentifier( + /* name= */ "config_wallpaperMaxScale", + /* defType= */ "dimen", + /* defPackage= */ "android", + ) + ) + ) + .thenReturn(2f) + underTest = + WallpaperFocalAreaInteractor( + applicationScope = testScope.backgroundScope, + context = kosmos.mockedContext, + wallpaperFocalAreaRepository = kosmos.fakeWallpaperFocalAreaRepository, + shadeRepository = kosmos.shadeRepository, + activeNotificationsInteractor = kosmos.activeNotificationsInteractor, + wallpaperRepository = kosmos.wallpaperRepository, + ) + } + + private fun overrideMockedResources(overrideResources: OverrideResources) { + val displayMetrics = + DisplayMetrics().apply { + widthPixels = overrideResources.screenWidth + heightPixels = overrideResources.screenHeight + density = 2f + } + whenever(mockedResources.displayMetrics).thenReturn(displayMetrics) + whenever(mockedResources.getBoolean(R.bool.center_align_focal_area_shape)) + .thenReturn(overrideResources.centerAlignFocalArea) + } + + @Test + fun focalAreaBounds_withoutNotifications_inHandheldDevices() = + testScope.runTest { + overrideMockedResources( + OverrideResources( + screenWidth = 1000, + screenHeight = 2000, + centerAlignFocalArea = false, + ) + ) + val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds) + kosmos.shadeRepository.setShadeLayoutWide(false) + kosmos.activeNotificationListRepository.setActiveNotifs(0) + kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1800F) + kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F) + kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(400F) + + assertThat(bounds).isEqualTo(RectF(250f, 700F, 750F, 1400F)) + } + + @Test + fun focalAreaBounds_withNotifications_inHandheldDevices() = + testScope.runTest { + overrideMockedResources( + OverrideResources( + screenWidth = 1000, + screenHeight = 2000, + centerAlignFocalArea = false, + ) + ) + val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds) + kosmos.shadeRepository.setShadeLayoutWide(false) + kosmos.activeNotificationListRepository.setActiveNotifs(1) + kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1800F) + kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F) + kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(600F) + + assertThat(bounds).isEqualTo(RectF(250f, 800F, 750F, 1400F)) + } + + @Test + fun focalAreaBounds_withNotifications_inUnfoldLandscape() = + testScope.runTest { + overrideMockedResources( + OverrideResources( + screenWidth = 2000, + screenHeight = 1600, + centerAlignFocalArea = false, + ) + ) + val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds) + kosmos.shadeRepository.setShadeLayoutWide(true) + kosmos.activeNotificationListRepository.setActiveNotifs(1) + kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1400F) + kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F) + kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(600F) + + assertThat(bounds).isEqualTo(RectF(500f, 600F, 1000F, 1100F)) + } + + @Test + fun focalAreaBounds_withoutNotifications_inUnfoldLandscape() = + testScope.runTest { + overrideMockedResources( + OverrideResources( + screenWidth = 2000, + screenHeight = 1600, + centerAlignFocalArea = false, + ) + ) + val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds) + kosmos.shadeRepository.setShadeLayoutWide(true) + kosmos.activeNotificationListRepository.setActiveNotifs(0) + kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1400F) + kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F) + kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(400F) + + assertThat(bounds).isEqualTo(RectF(1000f, 600F, 1500F, 1100F)) + } + + @Test + fun focalAreaBounds_withNotifications_inUnfoldPortrait() = + testScope.runTest { + overrideMockedResources( + OverrideResources( + screenWidth = 1600, + screenHeight = 2000, + centerAlignFocalArea = false, + ) + ) + val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds) + kosmos.shadeRepository.setShadeLayoutWide(false) + kosmos.activeNotificationListRepository.setActiveNotifs(1) + kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1800F) + kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F) + kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(600F) + + assertThat(bounds).isEqualTo(RectF(400f, 800F, 1200F, 1400F)) + } + + @Test + fun focalAreaBounds_withoutNotifications_inUnfoldPortrait() = + testScope.runTest { + overrideMockedResources( + OverrideResources( + screenWidth = 1600, + screenHeight = 2000, + centerAlignFocalArea = false, + ) + ) + val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds) + kosmos.shadeRepository.setShadeLayoutWide(false) + kosmos.activeNotificationListRepository.setActiveNotifs(0) + kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1800F) + kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F) + kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(600F) + + assertThat(bounds).isEqualTo(RectF(400f, 800F, 1200F, 1400F)) + } + + @Test + fun focalAreaBounds_withNotifications_inTabletLandscape() = + testScope.runTest { + overrideMockedResources( + OverrideResources( + screenWidth = 3000, + screenHeight = 2000, + centerAlignFocalArea = true, + ) + ) + val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds) + kosmos.shadeRepository.setShadeLayoutWide(true) + kosmos.activeNotificationListRepository.setActiveNotifs(1) + kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1800F) + kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(200F) + kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(200F) + + assertThat(bounds).isEqualTo(RectF(1000f, 600F, 2000F, 1400F)) + } + + @Test + fun focalAreaBounds_withoutNotifications_inTabletLandscape() = + testScope.runTest { + overrideMockedResources( + OverrideResources( + screenWidth = 3000, + screenHeight = 2000, + centerAlignFocalArea = true, + ) + ) + val bounds by collectLastValue(underTest.wallpaperFocalAreaBounds) + kosmos.shadeRepository.setShadeLayoutWide(true) + kosmos.activeNotificationListRepository.setActiveNotifs(0) + kosmos.wallpaperFocalAreaRepository.setShortcutAbsoluteTop(1800F) + kosmos.wallpaperFocalAreaRepository.setNotificationDefaultTop(400F) + kosmos.wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(400F) + + assertThat(bounds).isEqualTo(RectF(1000f, 600F, 2000F, 1400F)) + } + + @Test + fun onTap_inFocalBounds() = + testScope.runTest { + kosmos.wallpaperFocalAreaRepository.setTapPosition(PointF(0F, 0F)) + overrideMockedResources( + OverrideResources( + screenWidth = 1000, + screenHeight = 2000, + centerAlignFocalArea = false, + ) + ) + kosmos.wallpaperFocalAreaRepository.setWallpaperFocalAreaBounds( + RectF(250f, 700F, 750F, 1400F) + ) + advanceUntilIdle() + assertThat(currentValue(kosmos.wallpaperFocalAreaRepository.wallpaperFocalAreaBounds)) + .isEqualTo(RectF(250f, 700F, 750F, 1400F)) + underTest.setTapPosition(750F, 750F) + assertThat( + currentValue(kosmos.wallpaperFocalAreaRepository.wallpaperFocalAreaTapPosition) + ) + .isEqualTo(PointF(625F, 875F)) + } + + @Test + fun onTap_outFocalBounds() = + testScope.runTest { + kosmos.wallpaperFocalAreaRepository.setTapPosition(PointF(0F, 0F)) + overrideMockedResources( + OverrideResources( + screenWidth = 1000, + screenHeight = 2000, + centerAlignFocalArea = false, + ) + ) + kosmos.wallpaperFocalAreaViewModel = mock() + kosmos.wallpaperFocalAreaRepository.setWallpaperFocalAreaBounds( + RectF(500F, 500F, 1000F, 1000F) + ) + underTest.setTapPosition(250F, 250F) + assertThat( + currentValue(kosmos.wallpaperFocalAreaRepository.wallpaperFocalAreaTapPosition) + ) + .isEqualTo(PointF(0F, 0F)) + } + + data class OverrideResources( + val screenWidth: Int, + val screenHeight: Int, + val centerAlignFocalArea: Boolean, + ) +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractorTest.kt index 79edc223bc83..9ca2aea4e963 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractorTest.kt @@ -20,7 +20,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository -import com.android.systemui.coroutines.collectLastValue import com.android.systemui.kosmos.testScope import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat @@ -37,18 +36,6 @@ class WindowRootViewBlurInteractorTest : SysuiTestCase() { val underTest by lazy { kosmos.windowRootViewBlurInteractor } @Test - fun bouncerBlurIsAppliedImmediately() = - testScope.runTest { - val blurRadius by collectLastValue(underTest.blurRadius) - val isBlurOpaque by collectLastValue(underTest.isBlurOpaque) - - underTest.requestBlurForBouncer(10) - - assertThat(blurRadius).isEqualTo(10) - assertThat(isBlurOpaque).isFalse() - } - - @Test fun shadeBlurIsNotAppliedWhenBouncerBlurIsActive() = testScope.runTest { kosmos.fakeKeyguardBouncerRepository.setPrimaryShow(true) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt index 3c4e3612c053..61ee5e04afd9 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt @@ -46,12 +46,14 @@ class WindowRootViewModelTest : SysuiTestCase() { @Test fun bouncerTransitionChangesWindowBlurRadius() = testScope.runTest { - val blurState by collectLastValue(underTest.blurState) + val blurRadius by collectLastValue(underTest.blurRadius) + val isBlurOpaque by collectLastValue(underTest.isBlurOpaque) runCurrent() kosmos.fakeBouncerTransitions.first().windowBlurRadius.value = 30.0f runCurrent() - assertThat(blurState).isEqualTo(BlurState(radius = 30, isOpaque = false)) + assertThat(blurRadius).isEqualTo(30) + assertThat(isBlurOpaque).isEqualTo(false) } } diff --git a/packages/SystemUI/pods/com/android/systemui/util/settings/SettingsProxy.kt b/packages/SystemUI/pods/com/android/systemui/util/settings/SettingsProxy.kt index 154d3cc9eda1..597276a66dfa 100644 --- a/packages/SystemUI/pods/com/android/systemui/util/settings/SettingsProxy.kt +++ b/packages/SystemUI/pods/com/android/systemui/util/settings/SettingsProxy.kt @@ -24,12 +24,10 @@ import androidx.annotation.AnyThread import androidx.annotation.WorkerThread import com.android.app.tracing.TraceUtils.trace import com.android.app.tracing.coroutines.launchTraced as launch -import com.android.app.tracing.coroutines.nameCoroutine -import kotlin.coroutines.CoroutineContext -import kotlin.coroutines.EmptyCoroutineContext +import com.android.app.tracing.coroutines.withContextTraced as withContext +import kotlin.coroutines.coroutineContext import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.withContext /** * Used to interact with mainly with Settings.Global, but can also be used for Settings.System and @@ -53,9 +51,16 @@ interface SettingsProxy { val settingsScope: CoroutineScope @OptIn(ExperimentalStdlibApi::class) - fun settingsDispatcherContext(name: String): CoroutineContext { - return (settingsScope.coroutineContext[CoroutineDispatcher] ?: EmptyCoroutineContext) + - nameCoroutine(name) + suspend fun executeOnSettingsScopeDispatcher(name: String, block: () -> Unit) { + val settingsDispatcher = settingsScope.coroutineContext[CoroutineDispatcher] + if ( + settingsDispatcher != null && + settingsDispatcher != coroutineContext[CoroutineDispatcher] + ) { + withContext(name, settingsDispatcher) { block() } + } else { + trace(name) { block() } + } } /** @@ -87,7 +92,7 @@ interface SettingsProxy { * wish to synchronize execution. */ suspend fun registerContentObserver(name: String, settingsObserver: ContentObserver) { - withContext(settingsDispatcherContext("registerContentObserver-A")) { + executeOnSettingsScopeDispatcher("registerContentObserver-A") { registerContentObserverSync(getUriFor(name), settingsObserver) } } @@ -139,7 +144,7 @@ interface SettingsProxy { * wish to synchronize execution. */ suspend fun registerContentObserver(uri: Uri, settingsObserver: ContentObserver) { - withContext(settingsDispatcherContext("registerContentObserver-B")) { + executeOnSettingsScopeDispatcher("registerContentObserver-B") { registerContentObserverSync(uri, settingsObserver) } } @@ -197,7 +202,7 @@ interface SettingsProxy { notifyForDescendants: Boolean, settingsObserver: ContentObserver, ) { - withContext(settingsDispatcherContext("registerContentObserver-C")) { + executeOnSettingsScopeDispatcher("registerContentObserver-C") { registerContentObserverSync(getUriFor(name), notifyForDescendants, settingsObserver) } } @@ -266,7 +271,7 @@ interface SettingsProxy { notifyForDescendants: Boolean, settingsObserver: ContentObserver, ) { - withContext(settingsDispatcherContext("registerContentObserver-D")) { + executeOnSettingsScopeDispatcher("registerContentObserver-D") { registerContentObserverSync(uri, notifyForDescendants, settingsObserver) } } @@ -326,7 +331,7 @@ interface SettingsProxy { * async block if they wish to synchronize execution. */ suspend fun unregisterContentObserver(settingsObserver: ContentObserver) { - withContext(settingsDispatcherContext("unregisterContentObserver")) { + executeOnSettingsScopeDispatcher("unregisterContentObserver") { unregisterContentObserverSync(settingsObserver) } } diff --git a/packages/SystemUI/pods/com/android/systemui/util/settings/UserSettingsProxy.kt b/packages/SystemUI/pods/com/android/systemui/util/settings/UserSettingsProxy.kt index 68ad11e3ec01..3ccac9e374a2 100644 --- a/packages/SystemUI/pods/com/android/systemui/util/settings/UserSettingsProxy.kt +++ b/packages/SystemUI/pods/com/android/systemui/util/settings/UserSettingsProxy.kt @@ -28,7 +28,6 @@ import com.android.systemui.util.settings.SettingsProxy.Companion.parseFloat import com.android.systemui.util.settings.SettingsProxy.Companion.parseFloatOrThrow import com.android.systemui.util.settings.SettingsProxy.Companion.parseLongOrThrow import com.android.systemui.util.settings.SettingsProxy.Companion.parseLongOrUseDefault -import kotlinx.coroutines.withContext /** * Used to interact with per-user Settings.Secure and Settings.System settings (but not @@ -71,7 +70,7 @@ interface UserSettingsProxy : SettingsProxy { } override suspend fun registerContentObserver(uri: Uri, settingsObserver: ContentObserver) { - withContext(settingsDispatcherContext("registerContentObserver-A")) { + executeOnSettingsScopeDispatcher("registerContentObserver-A") { registerContentObserverForUserSync(uri, settingsObserver, userId) } } @@ -96,7 +95,7 @@ interface UserSettingsProxy : SettingsProxy { notifyForDescendants: Boolean, settingsObserver: ContentObserver, ) { - withContext(settingsDispatcherContext("registerContentObserver-B")) { + executeOnSettingsScopeDispatcher("registerContentObserver-B") { registerContentObserverForUserSync(uri, notifyForDescendants, settingsObserver, userId) } } @@ -141,7 +140,7 @@ interface UserSettingsProxy : SettingsProxy { settingsObserver: ContentObserver, userHandle: Int, ) { - withContext(settingsDispatcherContext("registerContentObserverForUser-A")) { + executeOnSettingsScopeDispatcher("registerContentObserverForUser-A") { registerContentObserverForUserSync(name, settingsObserver, userHandle) } } @@ -186,7 +185,7 @@ interface UserSettingsProxy : SettingsProxy { settingsObserver: ContentObserver, userHandle: Int, ) { - withContext(settingsDispatcherContext("registerContentObserverForUser-B")) { + executeOnSettingsScopeDispatcher("registerContentObserverForUser-B") { registerContentObserverForUserSync(uri, settingsObserver, userHandle) } } @@ -264,7 +263,7 @@ interface UserSettingsProxy : SettingsProxy { settingsObserver: ContentObserver, userHandle: Int, ) { - withContext(settingsDispatcherContext("registerContentObserverForUser-C")) { + executeOnSettingsScopeDispatcher("registerContentObserverForUser-C") { registerContentObserverForUserSync( name, notifyForDescendants, @@ -332,7 +331,7 @@ interface UserSettingsProxy : SettingsProxy { settingsObserver: ContentObserver, userHandle: Int, ) { - withContext(settingsDispatcherContext("registerContentObserverForUser-D")) { + executeOnSettingsScopeDispatcher("registerContentObserverForUser-D") { registerContentObserverForUserSync( uri, notifyForDescendants, diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml index fe9036bb2252..1a49bbb27c8f 100644 --- a/packages/SystemUI/res-keyguard/values-ar/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml @@ -36,7 +36,7 @@ <string name="keyguard_plugged_in_charging_limited" msgid="5369697538556777542">"<xliff:g id="PERCENTAGE">%s</xliff:g> • الشحن معلّق لحماية البطارية"</string> <string name="keyguard_plugged_in_incompatible_charger" msgid="6384203333154532125">"<xliff:g id="PERCENTAGE">%s</xliff:g> • يُرجى فحص ملحق الشحن."</string> <string name="keyguard_network_locked_message" msgid="407096292844868608">"الشبكة مؤمّنة"</string> - <string name="keyguard_missing_sim_message_short" msgid="685029586173458728">"لا تتوفر شريحة SIM."</string> + <string name="keyguard_missing_sim_message_short" msgid="685029586173458728">"لا تتوفر شريحة SIM"</string> <string name="keyguard_permanent_disabled_sim_message_short" msgid="3955052454216046100">"شريحة SIM غير قابلة للاستخدام."</string> <string name="keyguard_sim_locked_message" msgid="7095293254587575270">"شريحة SIM مُقفَلة."</string> <string name="keyguard_sim_puk_locked_message" msgid="2503428315518592542">"شريحة SIM مُقفَلة برمز PUK."</string> diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index 2d18c1c75057..33a7346b3769 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -25,7 +25,7 @@ <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Introduce tu patrón"</string> <string name="keyguard_enter_pattern" msgid="7616595160901084119">"Dibuja el patrón"</string> <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Introduce tu contraseña"</string> - <string name="keyguard_enter_password" msgid="6483623792371009758">"Escribe la contraseña"</string> + <string name="keyguard_enter_password" msgid="6483623792371009758">"Introduce la contraseña"</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Tarjeta no válida."</string> <string name="keyguard_charged" msgid="5478247181205188995">"Cargado"</string> <string name="keyguard_plugged_in_wireless" msgid="2537874724955057383">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Cargando sin cables"</string> diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml index 6c57d89a36af..61a7f8ffde52 100644 --- a/packages/SystemUI/res-keyguard/values-mk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml @@ -23,7 +23,7 @@ <string name="keyguard_enter_your_pin" msgid="5429932527814874032">"Внесете го PIN-кодот"</string> <string name="keyguard_enter_pin" msgid="8114529922480276834">"Внесете PIN"</string> <string name="keyguard_enter_your_pattern" msgid="351503370332324745">"Внесете ја шемата"</string> - <string name="keyguard_enter_pattern" msgid="7616595160901084119">"Нацртај шема"</string> + <string name="keyguard_enter_pattern" msgid="7616595160901084119">"Нацртајте шема"</string> <string name="keyguard_enter_your_password" msgid="7225626204122735501">"Внесете ја лозинката"</string> <string name="keyguard_enter_password" msgid="6483623792371009758">"Внесете лозинка"</string> <string name="keyguard_sim_error_message_short" msgid="633630844240494070">"Неважечка картичка."</string> diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml index c761799594b6..e5c3a35fee4f 100644 --- a/packages/SystemUI/res-keyguard/values-sl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml @@ -36,7 +36,7 @@ <string name="keyguard_plugged_in_charging_limited" msgid="5369697538556777542">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Zaradi zaščite baterije je polnjenje na čakanju"</string> <string name="keyguard_plugged_in_incompatible_charger" msgid="6384203333154532125">"<xliff:g id="PERCENTAGE">%s</xliff:g> • Preverite pripomoček za polnjenje"</string> <string name="keyguard_network_locked_message" msgid="407096292844868608">"Omrežje je zaklenjeno"</string> - <string name="keyguard_missing_sim_message_short" msgid="685029586173458728">"Ni kartice SIM."</string> + <string name="keyguard_missing_sim_message_short" msgid="685029586173458728">"Ni kartice SIM"</string> <string name="keyguard_permanent_disabled_sim_message_short" msgid="3955052454216046100">"Kartica SIM je neuporabna."</string> <string name="keyguard_sim_locked_message" msgid="7095293254587575270">"Kartica SIM je zaklenjena."</string> <string name="keyguard_sim_puk_locked_message" msgid="2503428315518592542">"Kartica SIM je zaklenjena s kodo PUK."</string> diff --git a/packages/SystemUI/res/drawable/media_output_item_background.xml b/packages/SystemUI/res/drawable/media_output_item_background.xml index ea77f1be1053..b454b91e8886 100644 --- a/packages/SystemUI/res/drawable/media_output_item_background.xml +++ b/packages/SystemUI/res/drawable/media_output_item_background.xml @@ -17,6 +17,6 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners - android:radius="16dp"/> + android:radius="@dimen/media_output_dialog_background_radius"/> <solid android:color="@color/media_dialog_item_background" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 6c86200f2f9c..e1ad98fe6aab 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Word aan die bokant van gesprekskennisgewings en as \'n profielfoto op sluitskerm gewys, verskyn as \'n borrel, onderbreek Moenie Steur Nie"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> steun nie gesprekskenmerke nie"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Maak toe"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Moenie weer wys nie"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Hierdie kennisgewings kan nie gewysig word nie."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Wissel taaisleutels"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Wissel stadige sleutels"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Wissel stemtoegang"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Wissel TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Wissel vergroting"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktiveer Hardoplees"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Moenie Steur Nie"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Volumeknoppieskortpad"</string> <string name="battery" msgid="769686279459897127">"Battery"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index fc92f4b16694..feee18ff7219 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"በውይይት ማሳወቂያዎች አናት ላይ እና በማያ ገፅ መቆለፊያ ላይ እንደ መገለጫ ምስል ይታያል፣ እንደ አረፋ ሆኖ ይታያል፣ አትረብሽን ያቋርጣል"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ቅድሚያ"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> የውይይት ባህሪያትን አይደግፍም"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"አሰናብት"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ዳግም አታሳይ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"እነዚህ ማሳወቂያዎች ሊሻሻሉ አይችሉም።"</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"ተጣባቂ ቁልፎችን ይቀያይሩ"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"ቀርፋፋ ቁልፎችን ይቀያይሩ"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"የድምፅ መዳረሻን ይቀያይሩ"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"TalkBackን ይቀያይሩ"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"ማጉላት ይቀያይሩ"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"ለመናገር ምረጥን ያግብሩ"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"አትረብሽ"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"የድምፅ አዝራሮች አቋራጭ"</string> <string name="battery" msgid="769686279459897127">"ባትሪ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 7245e933a177..31bbbb63f7ef 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -142,7 +142,7 @@ <string name="share_to_app_stop_dialog_title_generic" msgid="9079161538135843648">"هل تريد إيقاف المشاركة؟"</string> <string name="share_to_app_stop_dialog_message_entire_screen_with_host_app" msgid="522823522115375414">"تتم حاليًا مشاركة محتوى الشاشة بأكمله مع \"<xliff:g id="HOST_APP_NAME">%1$s</xliff:g>\""</string> <string name="share_to_app_stop_dialog_message_entire_screen" msgid="5090115386271179270">"تتم حاليًا مشاركة محتوى الشاشة بأكمله مع تطبيق"</string> - <string name="share_to_app_stop_dialog_message_single_app_specific" msgid="5923772039347985172">"تتم حاليًا مشاركة محتوى \"<xliff:g id="APP_BEING_SHARED_NAME">%1$s</xliff:g>\""</string> + <string name="share_to_app_stop_dialog_message_single_app_specific" msgid="5923772039347985172">"تتم حاليًا مشاركة شاشة تطبيق \"<xliff:g id="APP_BEING_SHARED_NAME">%1$s</xliff:g>\""</string> <string name="share_to_app_stop_dialog_message_single_app_generic" msgid="6681016774654578261">"تتم حاليًا مشاركة محتوى تطبيق"</string> <string name="share_to_app_stop_dialog_message_generic" msgid="7622174291691249392">"تتم حاليًا مشاركة المحتوى مع تطبيق"</string> <string name="share_to_app_stop_dialog_button" msgid="6334056916284230217">"إيقاف المشاركة"</string> @@ -566,17 +566,17 @@ <string name="media_projection_sys_service_dialog_warning" msgid="2443872865267330320">"ستتمكن الخدمة التي تقدّم هذه الوظيفة من الوصول إلى كل المحتوى المعروض على شاشتك أو الذي يتم تشغيله على جهازك أثناء التسجيل أو البثّ. ويشمل ذلك معلومات، مثل كلمات المرور وتفاصيل الدفع والصور والرسائل والمقاطع الصوتية التي تشغِّلها."</string> <string name="screen_share_generic_app_selector_title" msgid="8331515850599218288">"مشاركة محتوى تطبيق أو تسجيله"</string> <string name="media_projection_entry_app_permission_dialog_title" msgid="4613857256721708062">"هل تريد مشاركة الشاشة مع تطبيق \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\"؟"</string> - <string name="screen_share_permission_dialog_option_single_app" msgid="2974054871681567314">"مشاركة تطبيق واحد"</string> + <string name="screen_share_permission_dialog_option_single_app" msgid="2974054871681567314">"مشاركة شاشة تطبيق واحد"</string> <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_single_app (2308901434964846084) --> <skip /> <string name="screen_share_permission_dialog_option_entire_screen" msgid="4493174362775038997">"مشاركة الشاشة بأكملها"</string> <!-- no translation found for media_projection_entry_app_permission_dialog_option_text_entire_screen (5100078808078139706) --> <skip /> <string name="media_projection_entry_app_permission_dialog_warning_entire_screen" msgid="5504288438067851086">"أثناء مشاركة محتوى الشاشة بالكامل، سيكون كل المحتوى المعروض على شاشتك مرئيًا لتطبيق \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\". لذا يُرجى توخي الحذر بشأن المعلومات، مثل كلمات المرور وتفاصيل الدفع والرسائل والصور وملفات الصوت والفيديو."</string> - <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"أثناء مشاركة محتوى تطبيق، سيكون كل المحتوى المعروض أو الذي يتم تشغيله في ذلك التطبيق مرئيًا لتطبيق \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\". لذا يُرجى توخي الحذر بشأن المعلومات، مثل كلمات المرور وتفاصيل الدفع والرسائل والصور وملفات الصوت والفيديو."</string> + <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"ستتم مشاركة كل المحتوى المعروض أو المشغَّل على شاشة هذا التطبيق مع تطبيق \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\"، لذا يُرجى توخي الحذر بشأن المعلومات الظاهرة على الشاشة، مثل كلمات المرور وتفاصيل الدفع والرسائل والصور والمقاطع الصوتية والفيديوهات."</string> <string name="media_projection_entry_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"مشاركة الشاشة"</string> <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"تم إيقاف هذا الخيار من خلال تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> - <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"اختيار تطبيق لمشاركة محتواه"</string> + <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"يُرجى اختيار تطبيق لمشاركة محتواه"</string> <string name="media_projection_entry_cast_permission_dialog_title" msgid="752756942658159416">"هل تريد بث محتوى الشاشة؟"</string> <string name="media_projection_entry_cast_permission_dialog_option_text_single_app" msgid="6073353940838561981">"بث محتوى تطبيق واحد"</string> <string name="media_projection_entry_cast_permission_dialog_option_text_entire_screen" msgid="8389508187954155307">"بث محتوى الشاشة بالكامل"</string> @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"تظهر في أعلى إشعارات المحادثات وكصورة ملف شخصي على شاشة القفل وتظهر على شكل فقاعة لمقاطعة ميزة \"عدم الإزعاج\"."</string> <string name="notification_priority_title" msgid="2079708866333537093">"الأولوية"</string> <string name="no_shortcut" msgid="8257177117568230126">"لا يدعم تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> ميزات المحادثات."</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"إغلاق"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"عدم الإظهار مرة أخرى"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"يتعذّر تعديل هذه الإشعارات."</string> @@ -1420,7 +1422,7 @@ <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> - <string name="dismissible_keyguard_swipe" msgid="8377597870094949432">"التمرير سريعًا للأعلى للمتابعة"</string> + <string name="dismissible_keyguard_swipe" msgid="8377597870094949432">"مرِّر سريعًا للأعلى للمتابعة"</string> <string name="connected_display_dialog_start_mirroring" msgid="6237895789920854982">"هل تريد بث محتوى جهازك على الشاشة الخارجية؟"</string> <string name="connected_display_dialog_dual_display_stop_warning" msgid="4174707498892447947">"سيتم النسخ المطابق لمحتوى الشاشة الداخلية، وإيقاف الشاشة الأمامية."</string> <string name="mirror_display" msgid="2515262008898122928">"بث المحتوى على الشاشة"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 407897a7965c..7d7e4f759bb7 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"বেটাৰীৰ চাৰ্জৰ শতাংশ অজ্ঞাত।"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>ৰ লগত সংযোগ কৰা হ’ল।"</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>ত সংযোগ হ’ল।"</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"গোট বিস্তাৰ কৰক।"</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"এপ্লিকেশ্বনটো খোলক।"</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"সংযোগ হৈ থকা নাই।"</string> <string name="data_connection_roaming" msgid="375650836665414797">"ৰ\'মিং"</string> <string name="cell_data_off" msgid="4886198950247099526">"অফ অৱস্থাত আছে"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"হাব ম’ড অন্বেষণ কৰক"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"চাৰ্জ কৰি থাকোঁতে আপোনাৰ প্ৰিয় ৱিজেট আৰু স্ক্ৰীন ছেভাৰসমূহ এক্সেছ কৰক।"</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"আৰম্ভ কৰোঁ আহক"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"চাৰ্জ কৰাৰ সময়ত আপোনাৰ প্ৰিয় স্ক্ৰীনছেভাৰ দেখুৱাওক"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"বাৰ্তালাপৰ জাননীৰ শীৰ্ষত আৰু প্ৰ’ফাইল চিত্ৰ হিচাপে লক স্ক্ৰীনত দেখুৱায়, এটা বাবল হিচাপে দেখা পোৱা যায়, অসুবিধা নিদিব ম’ডত ব্যাঘাত জন্মায়"</string> <string name="notification_priority_title" msgid="2079708866333537093">"অগ্ৰাধিকাৰ"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ বাৰ্তালাপৰ সুবিধাসমূহ সমৰ্থন নকৰে"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"অগ্ৰাহ্য কৰক"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"পুনৰাই নেদেখুৱাব"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"এই জাননীসমূহ সংশোধন কৰিব নোৱাৰি।"</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"খুলিবলৈ ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰক"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"বিশ্বাসযোগ্যতা প্ৰমাণীকৰণৰ আৱশ্যক। বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ কৰিবলৈ ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক।"</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"চলি থকা কল"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"চলিত"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"ম’বাইল ডেটা"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"সংযোজিত হৈ আছে"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"অস্থায়ীভাৱে সংযোগ কৰা হৈছে"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 13c82e8b5a97..2551d9cfafa0 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Söhbət bildirişlərinin yuxarısında və kilid ekranında profil şəkli kimi göstərilir, baloncuq kimi görünür, Narahat Etməyin rejimini kəsir"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> söhbət funksiyalarını dəstəkləmir"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Rədd edin"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Yenidən göstərməyin"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirişlər dəyişdirilə bilməz."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Əvəzedici düymələri aktiv/deaktiv edin"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Asta düymələri aktiv/deaktiv edin"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Səs girişini aktiv/deaktiv edin"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Talkback-i aktiv/deaktiv edin"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Böyütməni aktiv/deaktiv edin"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Basıb dinləyin funksiyasını aktivləşdirin"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Narahat Etməyin"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Səs düymələri qısayolu"</string> <string name="battery" msgid="769686279459897127">"Batareya"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index b63e5538ab6f..b01d83736dc0 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Procenat napunjenosti baterije nije poznat."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezani ste sa <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Povezani smo sa uređajem <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Proširite grupu."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Otvorite aplikaciju."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Nije povezano."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Isključeno"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Istražite režim centra"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Pristupajte omiljenim vidžetima i čuvarima ekrana tokom punjenja."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Idemo"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Prikazujte omiljene čuvare ekrana tokom punjenja"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikazuje se u vrhu obaveštenja o konverzacijama i kao slika profila na zaključanom ekranu, pojavljuje se kao oblačić, prekida režim Ne uznemiravaj"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetno"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava funkcije konverzacije"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Odbaci"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ne prikazuj ponovo"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ova obaveštenja ne mogu da se menjaju."</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Otvorite pomoću otiska prsta"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Potrebna je potvrda identiteta. Dodirnite senzor za otisak prsta da biste potvrdili identitet."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Poziv je u toku"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Aktivno"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobilni podaci"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Povezano"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Privremeno povezano"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index cbb8268cf72c..8f1af5f6e944 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Працэнт зараду акумулятара невядомы."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Падлучаны да <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Ёсць падключэнне да <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Разгарнуць групу."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Адкрыць праграму."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Няма падключэння."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Роўмінг"</string> <string name="cell_data_off" msgid="4886198950247099526">"Выключана"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Паспрабуйце рэжым хаба"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Доступ да любімых віджэтаў і заставак падчас зарадкі."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Пачаць"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Паказваць падчас зарадкі любімую застаўку"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"З’яўляецца ўверсе раздзела размоў як усплывальнае апавяшчэнне, якое перарывае рэжым \"Не турбаваць\" і паказвае на экране блакіроўкі відарыс профілю"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Прыярытэт"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не падтрымлівае функцыі размовы"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Закрыць"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Больш не паказваць"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Гэтыя апавяшчэнні нельга змяніць."</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Каб адкрыць, скарыстайце адбітак пальца"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Патрабуецца аўтэнтыфікацыя. Дакраніцеся да сканера адбіткаў пальцаў."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Актыўны выклік"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Бягучае дзеянне"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мабільная перадача даных"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Падключана"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Падключана часова"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 31e4d33f6c75..353815293907 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Показва се в горната част на известията за разговори и като снимка на потребителския профил на заключения екран, изглежда като балонче, прекъсва режима „Не безпокойте“"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не поддържа функциите за разговор"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Отхвърляне"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Да не се показва отново"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Тези известия не могат да бъдат променяни."</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index e9b6cf3c7cc3..4d885942e779 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"কথোপকথনের বিজ্ঞপ্তির উপরের দিকে এবং প্রোফাইল ছবি হিসেবে লক স্ক্রিনে দেখানো হয়, বাবল হিসেবেও এটি দেখা যায় এবং এর ফলে \'বিরক্ত করবে না\' মোডে কাজ করতে অসুবিধা হয়"</string> <string name="notification_priority_title" msgid="2079708866333537093">"অগ্রাধিকার"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এ কথোপকথন ফিচার কাজ করে না"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"বাতিল করুন"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"আর দেখতে চাই না"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"এই বিজ্ঞপ্তিগুলি পরিবর্তন করা যাবে না।"</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"স্টিকি \'কী\' টগল করুন"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"স্লো \'কী\' টগল করুন"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Voice Access টগল করুন"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"\'টকব্যাক\' ফিচার টগল করুন"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"\'বড় করে দেখা\' ফিচার টগল করুন"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"\'বাছুন ও শুনুন\' ফিচার চালু করুন"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"বিরক্ত করবে না"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"ভলিউম বোতামের শর্টকাট"</string> <string name="battery" msgid="769686279459897127">"ব্যাটারি"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 53b0e7826717..9e86aa96bab5 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Postotak napunjenosti baterije nije poznat"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezan na <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Povezan na <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Proširite grupu."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Otvorite aplikaciju."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Nije povezano."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Isključeno"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Istražite način rada središta"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Pristupajte svojim omiljenim vidžetima i čuvarima ekrana tokom punjenja."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Započnimo"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Prikaz vaših omiljenih čuvara zaslona tijekom punjenja"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikazuje se na vrhu obavještenja u razgovorima i kao slika profila na zaključanom ekranu, izgleda kao oblačić, prekida funkciju Ne ometaj"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetno"</string> <string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava funkcije razgovora"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Odbaci"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ne prikazuj ponovo"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ta obavještenja se ne mogu izmijeniti."</string> @@ -924,9 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Uključivanje/isključivanje ljepljivih tipki"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Uključivanje/isključivanje sporog reagiranja tipki"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Uključivanje/isključivanje Pristupa glasom"</string> - <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Uključi/isključi TalkBack"</string> - <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Uključi/isključi povećavanje"</string> - <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktiviraj Odabir za govor"</string> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Uključivanje/isključivanje Talkbacka"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Uključivanje/isključivanje uvećavanja"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktiviranje funkcije Odaberite za govor"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ne ometaj"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Prečica za dugmad za Jačinu zvuka"</string> <string name="battery" msgid="769686279459897127">"Baterija"</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Otvorite pomoću otiska prsta"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Potrebna je autentifikacija. Dodirnite senzor za otisak prsta da autentificirate."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Poziv u toku"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"U tijeku"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Prijenos podataka na mobilnoj mreži"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Povezano"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Privremeno povezano"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 4490513948a8..25b236de53a0 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Es mostra a la part superior de les notificacions de les converses i com a foto de perfil a la pantalla de bloqueig, apareix com una bombolla, interromp el mode No molestis"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritat"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admet les funcions de converses"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Ignora"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"No ho tornis a mostrar"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Aquestes notificacions no es poden modificar."</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index ce66f83c3022..26105c70ba2e 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Zobrazuje se v horní části sekce konverzací a na obrazovce uzamčení se objevuje jako profilová fotka, má podobu bubliny a deaktivuje režim Nerušit"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritní"</string> <string name="no_shortcut" msgid="8257177117568230126">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> funkce konverzace nepodporuje"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Zavřít"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Už nezobrazovat"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tato oznámení nelze upravit."</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 251b38a8c874..2fe576f53f54 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batteriniveauet er ukendt."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Forbundet med <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Forbundet til <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Udvid gruppe."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Åbn app."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Ikke tilsluttet."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Fra"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Udforsk i Hub-tilstand"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Få adgang til dine foretrukne widgets og pauseskærme under opladning."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Kom i gang"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Vis dine foretrukne pauseskærme under opladning"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Vises øverst i samtalenotifikationer og som et profilbillede på låseskærmen. Vises som en boble, der afbryder Forstyr ikke"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> understøtter ikke samtalefunktioner"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Luk"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Vis ikke igen"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse notifikationer kan ikke redigeres."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Slå træge taster til/fra"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Slå langsomtaster til/fra"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Slå Stemmeadgang til/fra"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Slå TalkBack til/fra"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Slå forstørrelse til/fra"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktivér Tekstoplæsning"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Forstyr ikke"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Genvej til lydstyrkeknapper"</string> <string name="battery" msgid="769686279459897127">"Batteri"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Brug fingeraftryk for at åbne"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Godkendelse er påkrævet. Sæt fingeren på fingeraftrykssensoren for at godkende."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Igangværende opkald"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"I gang"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobildata"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Forbundet"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Midlertidigt forbundet"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index c55075031afb..68f3a4101128 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Wird oben im Bereich „Unterhaltungen“ sowie als Profilbild auf dem Sperrbildschirm angezeigt, erscheint als Bubble, unterbricht „Bitte nicht stören“"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorität"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> unterstützt keine Funktionen für Unterhaltungen"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Schließen"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Nicht mehr anzeigen"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Diese Benachrichtigungen können nicht geändert werden."</string> @@ -879,7 +881,7 @@ <string name="keyboard_shortcut_a11y_filter_input" msgid="4589316004510335529">"Tastenkombinationen für die Eingabe werden angezeigt"</string> <string name="keyboard_shortcut_a11y_filter_open_apps" msgid="6175417687221004059">"Tastenkombinationen zum Öffnen von Apps werden angezeigt"</string> <string name="keyboard_shortcut_a11y_filter_current_app" msgid="7944592357493737911">"Tastenkombinationen für die aktuelle App werden angezeigt"</string> - <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Benachrichtigungen ansehen"</string> + <string name="group_system_access_notification_shade" msgid="1619028907006553677">"Benachrichtigungen ansehen"</string> <string name="group_system_full_screenshot" msgid="5742204844232667785">"Screenshot erstellen"</string> <string name="group_system_access_system_app_shortcuts" msgid="8562482996626694026">"Tastenkürzel anzeigen"</string> <string name="group_system_go_back" msgid="2730322046244918816">"Zurück"</string> @@ -1391,7 +1393,7 @@ <string name="rear_display_bottom_sheet_cancel" msgid="3461468855493357248">"Abbrechen"</string> <string name="rear_display_bottom_sheet_confirm" msgid="1507591562761552899">"Jetzt umdrehen"</string> <string name="rear_display_folded_bottom_sheet_title" msgid="3930008746560711990">"Smartphone auffalten"</string> - <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Bildschirm wechseln?"</string> + <string name="rear_display_unfolded_bottom_sheet_title" msgid="6291111173057304055">"Display wechseln?"</string> <string name="rear_display_folded_bottom_sheet_description" msgid="6842767125783222695">"Mit der Rückkamera lassen sich Fotos mit höherer Auflösung aufnehmen"</string> <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> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index ae16cc0cf793..412e3156f6c8 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Εμφανίζεται στην κορυφή των ειδοποιήσεων συζήτησης και ως φωτογραφία προφίλ στην οθόνη κλειδώματος, εμφανίζεται ως συννεφάκι, διακόπτει τη λειτουργία Μην ενοχλείτε"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Προτεραιότητα"</string> <string name="no_shortcut" msgid="8257177117568230126">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν υποστηρίζει τις λειτουργίες συζήτησης"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Παράβλεψη"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Να μην εμφανιστεί ξανά"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Δεν είναι δυνατή η τροποποίηση αυτών των ειδοποιήσεων"</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Εναλλαγή ασύγχρονων πλήκτρων"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Εναλλαγή αργών πλήκτρων"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Εναλλαγή Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Εναλλαγή TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Εναλλαγή Μεγιστοποίησης"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Ενεργοποίηση της λειτουργίας Επιλέξτε για αυτόματη ανάγνωση"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Μην ενοχλείτε"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Συντόμευση κουμπιών έντασης ήχου"</string> <string name="battery" msgid="769686279459897127">"Μπαταρία"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 13fdb0b2f069..d5c5666d6983 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Dismiss"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Don\'t show again"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Toggle sticky keys"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Toggle slow keys"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Toggle Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Toggle Talkback"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Toggle magnification"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Activate Select to Speak"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Do Not Disturb"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Volume buttons shortcut"</string> <string name="battery" msgid="769686279459897127">"Battery"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index ab418b530781..b3010e2b7d1a 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -804,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Dismiss"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Don\'t show again"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 13fdb0b2f069..d5c5666d6983 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Dismiss"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Don\'t show again"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Toggle sticky keys"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Toggle slow keys"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Toggle Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Toggle Talkback"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Toggle magnification"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Activate Select to Speak"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Do Not Disturb"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Volume buttons shortcut"</string> <string name="battery" msgid="769686279459897127">"Battery"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 13fdb0b2f069..d5c5666d6983 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shows at the top of conversation notifications and as a profile picture on lock screen, appears as a bubble, interrupts Do Not Disturb"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priority"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> doesn’t support conversation features"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Dismiss"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Don\'t show again"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"These notifications can\'t be modified."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Toggle sticky keys"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Toggle slow keys"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Toggle Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Toggle Talkback"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Toggle magnification"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Activate Select to Speak"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Do Not Disturb"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Volume buttons shortcut"</string> <string name="battery" msgid="769686279459897127">"Battery"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 793207d61757..966c9f36cf3b 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Se desconoce el porcentaje de la batería."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>"</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Conectado a <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Expandir grupo."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Abrir aplicación."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"No conectado"</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Desactivados"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Explora el modo Hub"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Accede a tus widgets y protectores de pantalla favoritos mientras se carga el dispositivo."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Comenzar"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Muestra tus protectores de pantalla favoritos mientras se carga el dispositivo"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Aparece en forma de burbuja y como foto de perfil en la parte superior de las notificaciones de conversación, en la pantalla de bloqueo, y detiene el modo No interrumpir"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaria"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admite funciones de conversación"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Descartar"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"No volver a mostrar"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"No se pueden modificar estas notificaciones."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Activar o desactivar las teclas especiales"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Activar o desactivar las teclas lentas"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Activar o desactivar el Acceso por voz"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Activar o desactivar TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Activar o desactivar la ampliación"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Activar Seleccionar para pronunciar"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"No interrumpir"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Combinación de teclas de botones de volumen"</string> <string name="battery" msgid="769686279459897127">"Batería"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Usa la huella dactilar para abrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Se requiere de una autenticación. Toca el sensor de huellas dactilares para autenticarte."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Llamada en curso"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"En curso"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Datos móviles"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Conexión establecida"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Conectado temporalmente"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index d5ace642003c..3c052beeb2b8 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -116,7 +116,7 @@ <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Cuando grabas toda la pantalla, se graba todo lo que se muestre en ella. Debes tener cuidado con elementos como contraseñas, detalles de pagos, mensajes, fotos, audio y vídeo."</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="3738199712880063924">"Cuando grabas una aplicación, se graba todo lo que se muestre o reproduzca en ella. Debes tener cuidado con elementos como contraseñas, detalles de pagos, mensajes, fotos, audio y vídeo."</string> <string name="screenrecord_permission_dialog_continue_entire_screen" msgid="5557974446773486600">"Grabar pantalla"</string> - <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"Elegir una aplicación para grabar"</string> + <string name="screenrecord_app_selector_title" msgid="3854492366333954736">"Elige la aplicación que quieres grabar"</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Grabar audio"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Audio del dispositivo"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sonido de tu dispositivo, como música, llamadas y tonos de llamada"</string> @@ -576,7 +576,7 @@ <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Cuando compartes una aplicación, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> puede ver todo lo que se muestra o reproduce en ella. Debes tener cuidado con elementos como contraseñas, detalles de pagos, mensajes, fotos, audio y vídeo."</string> <string name="media_projection_entry_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"Compartir pantalla"</string> <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"<xliff:g id="APP_NAME">%1$s</xliff:g> ha inhabilitado esta opción"</string> - <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"Elegir una aplicación para compartir"</string> + <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"Elige la aplicación que quieres compartir"</string> <string name="media_projection_entry_cast_permission_dialog_title" msgid="752756942658159416">"¿Enviar tu pantalla?"</string> <string name="media_projection_entry_cast_permission_dialog_option_text_single_app" msgid="6073353940838561981">"Enviar una aplicación"</string> <string name="media_projection_entry_cast_permission_dialog_option_text_entire_screen" msgid="8389508187954155307">"Enviar toda la pantalla"</string> @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Se muestra encima de las notificaciones de conversaciones y como imagen de perfil en la pantalla de bloqueo, aparece como burbuja e interrumpe el modo No molestar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admite funciones de conversación"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Cerrar"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"No volver a mostrar"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificaciones no se pueden modificar."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Activar/Desactivar teclas persistentes"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Activar/Desactivar teclas lentas"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Activar/Desactivar Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Activar/Desactivar TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Activar/Desactivar ampliación"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Activar Enunciar selección"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"No molestar"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Acceso directo de los botones de volumen"</string> <string name="battery" msgid="769686279459897127">"Batería"</string> @@ -1464,7 +1463,7 @@ <string name="shortcut_customize_mode_add_shortcut_description" msgid="7636040209946696120">"Para crear esta combinación de teclas, pulsa la tecla de acción y una o varias teclas a la vez"</string> <string name="shortcut_customize_mode_remove_shortcut_description" msgid="6851287900585057128">"Se eliminará tu combinación de teclas personalizada de forma permanente."</string> <string name="shortcut_customize_mode_reset_shortcut_description" msgid="2081849715634358684">"Se eliminarán todos tus accesos directos personalizados de forma permanente."</string> - <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Buscar accesos directos"</string> + <string name="shortcut_helper_search_placeholder" msgid="5488547526269871819">"Buscar combinaciones de teclas"</string> <string name="shortcut_helper_no_search_results" msgid="8554756497996692160">"No hay resultados de búsqueda"</string> <string name="shortcut_helper_content_description_collapse_icon" msgid="8028015738431664954">"Icono de contraer"</string> <string name="shortcut_helper_content_description_meta_key" msgid="3989315044342124818">"Icono de la tecla de acción o de la tecla Meta"</string> @@ -1478,7 +1477,7 @@ <string name="shortcut_helper_key_combinations_forward_slash" msgid="1238652537199346970">"barra inclinada"</string> <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"Controlador de arrastre"</string> <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"Ajustes del teclado"</string> - <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Establecer combinación de teclas"</string> + <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"Establecer combinación"</string> <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"Eliminar"</string> <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"Sí, restablecer"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"Cancelar"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 77fe2e7b0caa..defaa77a0935 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Aku laetuse protsent on teadmata."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ühendatud: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Ühendatud ülekandega <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Grupi laiendamine."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Rakenduse avamine."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Ühendus puudub."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Rändlus"</string> <string name="cell_data_off" msgid="4886198950247099526">"Väljas"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Tutvuge dokirežiimiga"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Saate laadimise ajal juurdepääsu oma lemmikumatele vidinatele ja ekraanisäästjatele."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Alustame"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Saate laadimise ajal kuvada oma lemmikekraanisäästjaid"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Kuvatakse mullina vestluste märguannete ülaosas ja profiilipildina lukustuskuval ning katkestab režiimi Mitte segada"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteetne"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei toeta vestlusfunktsioone"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Loobu"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ära enam näita"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Neid märguandeid ei saa muuta."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Nakkeklahvide vahetamine"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Aeglaste klahvide vahetamine"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Voice Accessi vahetamine"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"TalkBacki lüliti"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Suurenduse lüliti"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Funktsiooni Vali ja kuula aktiveerimine"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Mitte segada"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Helitugevuse nuppude otsetee"</string> <string name="battery" msgid="769686279459897127">"Aku"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Kasutage avamiseks sõrmejälge"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Vajalik on autentimine. Puudutage autentimiseks sõrmejäljeandurit."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Käimasolev kõne"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Pooleli"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobiilne andmeside"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Ühendatud"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Ajutiselt ühendatud"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index c4545f8f1152..02da5a1619d2 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Elkarrizketen jakinarazpenen goialdean eta profileko argazki gisa agertzen da pantaila blokeatuan, burbuila batean, eta ez molestatzeko modua eteten du"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Lehentasuna"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak ez ditu onartzen elkarrizketetarako eginbideak"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Baztertu"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ez erakutsi berriro"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Jakinarazpen horiek ezin dira aldatu."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Aktibatu/Desaktibatu tekla itsaskorrak"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Aktibatu/Desaktibatu tekla motelak"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Aktibatu/Desaktibatu Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Aktibatu edo desaktibatu Talkback"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Aktibatu edo desaktibatu lupa"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktibatu \"Hautatu ozen irakurtzeko\""</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ez molestatzeko modua"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Bolumen-botoietarako lasterbidea"</string> <string name="battery" msgid="769686279459897127">"Bateria"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 1521914157af..52538971217e 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"درصد شارژ باتری مشخص نیست."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"به <xliff:g id="BLUETOOTH">%s</xliff:g> متصل شد."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"به <xliff:g id="CAST">%s</xliff:g> متصل شد."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"گروه را از هم باز میکند."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"برنامه را باز میکند."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"متصل نیست."</string> <string name="data_connection_roaming" msgid="375650836665414797">"فراگردی"</string> <string name="cell_data_off" msgid="4886198950247099526">"خاموش"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"کاوش کردن حالت متصل"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"در حین شارژ، به ابزارهها و محافظهای صفحهنمایش دلخواهتان دسترسی داشته باشید."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"بیایید شروع کنیم"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"نمایش محافظهای صفحهنمایش دلخواه درحین شارژ"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"در بالای اعلانهای مکالمه و بهصورت عکس نمایه در صفحه قفل نشان داده میشود، بهصورت حبابک ظاهر میشود، در حالت «مزاحم نشوید» وقفه ایجاد میکند"</string> <string name="notification_priority_title" msgid="2079708866333537093">"اولویت"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> از ویژگیهای مکالمه پشتیبانی نمیکند"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"بستن"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"دیگر نشان داده نشود"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"این اعلانها قابل اصلاح نیستند."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"تغییر وضعیت کلیدهای چسبان"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"تغییر وضعیت کلیدهای آهسته"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"تغییر وضعیت «دسترسی صوتی»"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"روشن/خاموش کردن TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"روشن/خاموش کردن درشتنمایی"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"فعال کردن «انتخاب برای شنیدن»"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"مزاحم نشوید"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"میانبر دکمههای صدا"</string> <string name="battery" msgid="769686279459897127">"باتری"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"از اثر انگشت برای باز کردن قفل استفاده کنید"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"اصالتسنجی لازم است. برای اصالتسنجی، حسگر اثر انگشت را لمس کنید."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"تماس درحال انجام"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"درحال انجام"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"داده تلفن همراه"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"متصل است"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"موقتاً متصل است"</string> @@ -1479,7 +1474,7 @@ <string name="shortcut_helper_content_description_drag_handle" msgid="5092426406009848110">"دستگیره کشاندن"</string> <string name="shortcut_helper_keyboard_settings_buttons_label" msgid="6720967595915985259">"تنظیمات صفحهکلید"</string> <string name="shortcut_helper_customize_dialog_set_shortcut_button_label" msgid="4754492225010429382">"تنظیم میانبر"</string> - <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"حذف"</string> + <string name="shortcut_helper_customize_dialog_remove_button_label" msgid="6546386970440176552">"برداشتن"</string> <string name="shortcut_helper_customize_dialog_reset_button_label" msgid="7645535254306312685">"بله، بازنشانی شود"</string> <string name="shortcut_helper_customize_dialog_cancel_button_label" msgid="5595546460431741178">"لغو"</string> <string name="shortcut_helper_add_shortcut_dialog_placeholder" msgid="9154297849458741995">"کلید را فشار دهید"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index caf8f295d3e4..1bd952eeff9d 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -809,6 +809,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Näkyy keskusteluilmoitusten yläosassa ja profiilikuvana lukitusnäytöllä, näkyy kuplana, keskeyttää Älä häiritse ‑tilan"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Tärkeä"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ei tue keskusteluominaisuuksia"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Hylkää"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Älä näytä uudelleen"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Näitä ilmoituksia ei voi muokata"</string> @@ -926,12 +928,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Laita päälle jäävät näppäimet päälle/pois"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Laita hitaat näppäimet päälle/pois"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Voice Access päälle/pois"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"TalkBack päälle/pois"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Suurennus päälle/pois"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktivoi Teksti puhuttuna"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Älä häiritse"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Äänenvoimakkuuspainikkeiden pikanäppäin"</string> <string name="battery" msgid="769686279459897127">"Akku"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 4595e10330cf..6360a12a4176 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"S\'affiche dans le haut des notifications de conversation et comme photo de profil à l\'écran de verrouillage, s\'affiche comme bulle, interrompt le mode Ne pas déranger"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ne prend pas en charge les fonctionnalités de conversation"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Fermer"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ne plus afficher"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ces notifications ne peuvent pas être modifiées"</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Activer/Désactiver les touches rémanentes"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Activer/Désactiver les touches lentes"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Activer/Désactiver l\'Accès vocal"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Activer/Désactiver TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Activer/Désactiver l\'agrandissement"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Activer la fonctionnalité Sélectionner pour énoncer"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ne pas déranger"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Raccourci des boutons de volume"</string> <string name="battery" msgid="769686279459897127">"Pile"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index b2e0edcecfee..6d9760c48044 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"S\'affiche en haut des notifications de conversation et en tant que photo de profil sur l\'écran de verrouillage, apparaît sous forme de bulle, interrompt le mode Ne pas déranger"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaire"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> n\'est pas compatible avec les fonctionnalités de conversation"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Ignorer"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ne plus afficher"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossible de modifier ces notifications."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Activer/Désactiver les touches rémanentes"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Activer/Désactiver les touches lentes"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Activer/Désactiver Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Activer/Désactiver TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Activer/Désactiver la loupe"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Activer Sélectionner pour écouter"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ne pas déranger"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Raccourci des boutons de volume"</string> <string name="battery" msgid="769686279459897127">"Batterie"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index eef5c9194b43..3195ff506213 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Descoñécese a porcentaxe da batería."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Dispositivo conectado: <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Despregar o grupo."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Abrir a aplicación."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Non conectada"</string> <string name="data_connection_roaming" msgid="375650836665414797">"Itinerancia"</string> <string name="cell_data_off" msgid="4886198950247099526">"Desactivados"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Explorar o modo Hub"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Accede aos teus widgets e protectores de pantalla favoritos durante a carga."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Comezar"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Mostrar os teus protectores de pantalla favoritos durante a carga"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Móstrase na parte superior das notificacións das conversas e como imaxe do perfil na pantalla de bloqueo, aparece como unha burbulla e interrompe o modo Non molestar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> non admite funcións de conversa"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Pechar"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Non volver mostrar"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Estas notificacións non se poden modificar."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Activar ou desactivar as teclas presas"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Activar ou desactivar as teclas lentas"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Activar ou desactivar Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Activar ou desactivar Talkback"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Activar ou desactivar a ampliación"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Activa Escoitar selección"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Non molestar"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Atallo dos botóns de volume"</string> <string name="battery" msgid="769686279459897127">"Batería"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Usa a impresión dixital para abrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Requírese autenticación. Para autenticarte, toca o sensor de impresión dixital."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Chamada en curso"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"En curso"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Datos móbiles"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Conectada"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Conectada temporalmente"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 0ba9cf414584..7ad58e97ab7e 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"વાતચીતના નોટિફિકેશન વિભાગની ટોચ પર અને લૉક કરેલી સ્ક્રીન પર પ્રોફાઇલ ફોટો તરીકે બતાવે છે, બબલ તરીકે દેખાય છે, ખલેલ પાડશો નહીં મોડમાં વિક્ષેપ ઊભો કરે છે"</string> <string name="notification_priority_title" msgid="2079708866333537093">"પ્રાધાન્યતા"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> વાતચીતની સુવિધાઓને સપોર્ટ આપતી નથી"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"છોડી દો"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ફરી બતાવશો નહીં"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"આ નોટિફિકેશનમાં કોઈ ફેરફાર થઈ શકશે નહીં."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"સ્ટીકી કીને ટૉગલ કરો"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"ધીમી કીને ટૉગલ કરો"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Voice Accessને ટૉગલ કરો"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Talkbackની સુવિધાને ટૉગલ કરો"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"મોટું કરવાની સુવિધાને ટૉગલ કરો"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"\'સાંભળવા માટે પસંદ કરો\' સુવિધાને સક્રિય કરો"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ખલેલ પાડશો નહીં"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"વૉલ્યૂમ બટન્સ શૉર્ટકટ"</string> <string name="battery" msgid="769686279459897127">"બૅટરી"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 8b301fdc8581..f629f221bdf5 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -734,7 +734,7 @@ <string name="volume_panel_hint_muted" msgid="1124844870181285320">"म्यूट किया गया"</string> <string name="volume_panel_hint_vibrate" msgid="4136223145435914132">"वाइब्रेट"</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="media_output_title_without_playing" msgid="3825663683169305013">"ऑडियो चलेगा"</string> <string name="media_output_title_ongoing_call" msgid="208426888064112006">"कॉल चालू है"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"सिस्टम यूज़र इंटरफ़ेस (यूआई) ट्यूनर"</string> <string name="status_bar" msgid="4357390266055077437">"स्टेटस बार"</string> @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"यह कई तरीकों से दिखती है, जैसे कि बातचीत वाली सूचनाओं में सबसे ऊपर, बबल के तौर पर, और लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो के तौर पर. साथ ही, यह \'परेशान न करें\' मोड को बायपास कर सकती है"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> पर बातचीत की सुविधाएं काम नहीं करतीं"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"खारिज करें"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"फिर से न दिखाएं"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ये सूचनाएं नहीं बदली जा सकती हैं."</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 86e509840047..dd0a6c1e729e 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Postotak baterije nije poznat."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Spojen na <xliff:g id="BLUETOOTH">%s</xliff:g> ."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Povezani ste sa sljedećim uređajem: <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Proširite grupu."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Otvorite aplikaciju."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Nije povezano."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Isključeno"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Istraži način Huba"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Pristupite omiljenim widgetima i čuvarima zaslona tijekom punjenja."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Započnimo"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Prikaz vaših omiljenih čuvara zaslona tijekom punjenja"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikazuje se pri vrhu obavijesti razgovora i kao profilna slika na zaključanom zaslonu, izgleda kao oblačić, prekida Ne uznemiravaj"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetno"</string> <string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podržava značajke razgovora"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Odbaci"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ne prikazuj ponovo"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Te se obavijesti ne mogu izmijeniti."</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Otvorite pomoću otiska prsta"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Potrebna je autentifikacija. Dodirnite senzor otiska prsta da biste se autentificirali."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Poziv u tijeku"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"U tijeku"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobilni podaci"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Povezano"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Privremeno povezano"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index bbe5b65c4b04..56270b4062a9 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"A beszélgetésekre vonatkozó értesítések tetején, lebegő buborékként látható, megjeleníti a profilképet a lezárási képernyőn, és megszakítja a Ne zavarjanak funkciót"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritás"</string> <string name="no_shortcut" msgid="8257177117568230126">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> nem támogatja a beszélgetési funkciókat"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Elvetés"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ne jelenjen meg újra"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ezeket az értesítéseket nem lehet módosítani."</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 6d179c0d8a7b..bb92212f0004 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Ցուցադրվում է զրույցների ծանուցումների վերևում, ինչպես նաև կողպէկրանին որպես պրոֆիլի նկար, հայտնվում է ամպիկի տեսքով, ընդհատում է «Չանհանգստացնել» ռեժիմը"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Կարևոր"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը զրույցի գործառույթներ չի աջակցում"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Փակել"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Այլևս ցույց չտալ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Այս ծանուցումները չեն կարող փոփոխվել:"</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Միացնել/անջատել կպչուն ստեղները"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Միացնել/անջատել ստեղների երկար սեղմումը"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Միացնել/անջատել Voice Access-ը"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Միացնել/անջատել TalkBack-ը"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Միացնել/անջատել խոշորացումը"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Ակտիվացնել «Ընտրեք և լսեք» գործառույթը"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Չանհանգստացնել"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Ձայնի կոճակների դյուրանցում"</string> <string name="battery" msgid="769686279459897127">"Մարտկոց"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index e6695bd42444..60f8ea7f60fa 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -721,7 +721,7 @@ <string name="volume_ringer_change" msgid="3574969197796055532">"Ketuk untuk mengubah mode pendering"</string> <string name="volume_ringer_mode" msgid="6867838048430807128">"mode pendering"</string> <string name="volume_ringer_drawer_closed_content_description" msgid="4737792429808781745">"<xliff:g id="VOLUME_RINGER_STATUS">%1$s</xliff:g>, ketuk untuk mengubah mode pendering"</string> - <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"Tanpa suara"</string> + <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"bisukan"</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> @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Muncul teratas di notifikasi percakapan dan sebagai foto profil di layar kunci, ditampilkan sebagai balon, menimpa mode Jangan Ganggu"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritas"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak mendukung fitur percakapan"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Tutup"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Jangan tampilkan lagi"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Notifikasi ini tidak dapat diubah."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Aktifkan/nonaktifkan tombol lekat"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Aktifkan/nonaktifkan tombol lambat"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Aktifkan/nonaktifkan Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Aktifkan/nonaktifkan TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Aktifkan/nonaktifkan Pembesaran"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktifkan fitur Klik untuk Diucapkan"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Jangan Ganggu"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Pintasan tombol volume"</string> <string name="battery" msgid="769686279459897127">"Baterai"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index fd2d666ceb1a..68e395b3498d 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Staða rafhlöðu óþekkt."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Tengt við <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Tengt við <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Stækka hóp."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Opna forrit."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Engin tenging."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Reiki"</string> <string name="cell_data_off" msgid="4886198950247099526">"Slökkt"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Kynntu þér dokkustillingu"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Hafðu aðgang að uppáhaldsgræjunum og -skjávörunum þínum á meðan tækið er í hleðslu."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Kýlum á þetta"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Sýna uppáhaldsskjávarana þína á meðan tækið er í hleðslu"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Birtist efst í samtalstilkynningum og sem prófílmynd á lásskjánum. Birtist sem blaðra sem truflar „Ónáðið ekki“"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Forgangur"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> styður ekki samtalseiginleika"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Loka"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ekki sýna aftur"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ekki er hægt að breyta þessum tilkynningum."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Velja/afvelja festilykla"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Velja/afvelja hæga lykla"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Velja/afvelja Raddskipanir"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Kveikja/slökkva á Talkback"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Kveikja/slökkva á stækkun"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Kveikja á textaupplestri"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ónáðið ekki"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Flýtihnappar fyrir hljóðstyrk"</string> <string name="battery" msgid="769686279459897127">"Rafhlaða"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Opna með fingrafari"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Auðkenningar krafist. Auðkenndu með því að snerta fingrafaralesarann."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Símtal í gangi"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Í gangi"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Farsímagögn"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Tengt"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Tímabundin tenging"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 875461237246..c839a7b89106 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Percentuale della batteria sconosciuta."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Connesso a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Connesso a: <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Espandi il gruppo."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Apri l\'applicazione."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Non connesso."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Off"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Esplora la modalità Hub"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Accedi ai tuoi widget e salvaschermo preferiti durante la ricarica."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Iniziamo"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Mostra i tuoi salvaschermo preferiti durante la ricarica"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Appare in cima alle notifiche delle conversazioni, come immagine del profilo nella schermata di blocco e sotto forma di bolla, inoltre interrompe la modalità Non disturbare"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorità"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> non supporta le funzionalità delle conversazioni"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Ignora"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Non mostrare più"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Impossibile modificare queste notifiche."</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Usa l\'impronta per aprire"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autenticazione obbligatoria. Eseguila toccando il sensore di impronte digitali."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Chiamata in corso"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"In corso"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Dati mobili"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Connessa"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Connessa temporaneamente"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 882807972ef4..fe5d6f3ebfed 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"מוצגת בחלק העליון של קטע התראות השיחה וכתמונת פרופיל במסך הנעילה, מופיעה בבועה צפה ומפריעה במצב \'נא לא להפריע\'"</string> <string name="notification_priority_title" msgid="2079708866333537093">"בעדיפות גבוהה"</string> <string name="no_shortcut" msgid="8257177117568230126">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לא תומכת בתכונות השיחה"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"סגירה"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"לא להציג את זה שוב"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"לא ניתן לשנות את ההתראות האלה."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"הפעלה או השבתה של מקשים \"דביקים\""</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"הפעלה או השבתה של מקשים איטיים"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"הפעלה או השבתה של Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"הפעלה או השבתה של TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"החלפת מצב ההגדלה"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"הפעלת ההקראה"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"נא לא להפריע"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"קיצור דרך לכפתורי עוצמת קול"</string> <string name="battery" msgid="769686279459897127">"סוללה"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index c76082734539..810fef9c3942 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"バッテリー残量は不明です。"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>に接続しました。"</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>に接続されています。"</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"グループを開きます。"</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"アプリを開きます。"</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"接続されていません。"</string> <string name="data_connection_roaming" msgid="375650836665414797">"ローミング"</string> <string name="cell_data_off" msgid="4886198950247099526">"OFF"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"ハブモードの詳細を見る"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"充電中にお気に入りのウィジェットやスクリーン セーバーにアクセスできます。"</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"使ってみる"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"お気に入りのスクリーンセーバーを充電中に表示"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"会話通知の一番上に表示されると同時に、ロック画面にプロフィール写真として表示されるほか、バブルとして表示され、サイレント モードが中断されます"</string> <string name="notification_priority_title" msgid="2079708866333537093">"優先"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>は会話機能に対応していません"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"閉じる"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"次回から表示しない"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"これらの通知は変更できません。"</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"指紋を使って開いてください"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"認証が必要です。指紋認証センサーをタッチして認証してください。"</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"通話中"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"実行中"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"モバイルデータ"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"接続済み"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"一時的に接続されています"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 0b700df538a0..a8fd410b6dff 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"გამოჩნდება საუბრის შეტყობინებების თავში და პროფილის სურათის სახით ჩაკეტილ ეკრანზე, ჩნდება ბუშტის სახით, წყვეტს ფუნქციას „არ შემაწუხოთ“"</string> <string name="notification_priority_title" msgid="2079708866333537093">"პრიორიტეტი"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ს არ აქვს მიმოწერის ფუნქციების მხარდაჭერა"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"დახურვა"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"აღარ მაჩვენო"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ამ შეტყობინებების შეცვლა შეუძლებელია."</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 9413dd0cc3ea..16569fe52a00 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Әңгіме туралы хабарландырулардың жоғарғы жағында тұрады және құлыптаулы экранда профиль суреті болып көрсетіледі, қалқыма хабар түрінде шығады, Мазаламау режимін тоқтатады."</string> <string name="notification_priority_title" msgid="2079708866333537093">"Маңызды"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> әңгіме функцияларын қолдамайды."</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Жабу"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Қайта көрсетілмесін"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Бұл хабарландыруларды өзгерту мүмкін емес."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Жабысқан пернелерді қосу/өшіру"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Баяу пернелерді қосу/өшіру"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Voice Access мүмкіндігін қосу/өшіру"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"TalkBack-ті қосу/өшіру"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Ұлғайту функциясын қосу/өшіру"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Select to Speak функциясын қосу"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Мазаламау"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Дыбыс деңгейі түймелерінің төте жолы"</string> <string name="battery" msgid="769686279459897127">"Батарея"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index bd3f777def36..1cf437c9e949 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"មិនដឹងអំពីភាគរយថ្មទេ។"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"បានភ្ជាប់ទៅ <xliff:g id="BLUETOOTH">%s</xliff:g> ។"</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"បានភ្ជាប់ទៅ <xliff:g id="CAST">%s</xliff:g>"</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"ពង្រីកក្រុម។"</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"បើកកម្មវិធី។"</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"មិនបានតភ្ជាប់។"</string> <string name="data_connection_roaming" msgid="375650836665414797">"រ៉ូមីង"</string> <string name="cell_data_off" msgid="4886198950247099526">"បិទ"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"រុករកមុខងារមណ្ឌល"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"ចូលប្រើប្រាស់ធាតុក្រាហ្វិក និងធាតុរក្សាអេក្រង់ដែលអ្នកពេញចិត្តពេលសាកថ្ម។"</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"ចាប់ផ្ដើម"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"បង្ហាញធាតុរក្សាអេក្រង់សំណព្វរបស់អ្នក ពេលកំពុងសាកថ្ម"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"បង្ហាញនៅខាងលើការជូនដំណឹងអំពីការសន្ទនា និងជារូបភាពកម្រងព័ត៌មាននៅលើអេក្រង់ចាក់សោ បង្ហាញជាពពុះ បង្អាក់មុខងារកុំរំខាន"</string> <string name="notification_priority_title" msgid="2079708866333537093">"អាទិភាព"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> មិនអាចប្រើមុខងារសន្ទនាបានទេ"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"ច្រានចោល"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"កុំបង្ហាញម្ដងទៀត"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"មិនអាចកែប្រែការជូនដំណឹងទាំងនេះបានទេ។"</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"បិទ/បើកគ្រាប់ចុចស្អិត"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"បិទ/បើកគ្រាប់ចុចយឺត"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"បិទ/បើកការចូលប្រើប្រាស់តាមរយៈសំឡេង"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"បិទ/បើក TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"បើក/បិទការពង្រីក"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"បើកដំណើរការ \"ជ្រើសរើសដើម្បីអាន\""</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"កុំរំខាន"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"ផ្លូវកាត់ប៊ូតុងកម្រិតសំឡេង"</string> <string name="battery" msgid="769686279459897127">"ថ្ម"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ប្រើស្នាមម្រាមដៃ ដើម្បីបើក"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"តម្រូវឱ្យមានការផ្ទៀងផ្ទាត់។ សូមចុចឧបករណ៍ចាប់ស្នាមម្រាមដៃ ដើម្បីផ្ទៀងផ្ទាត់។"</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"ការហៅដែលកំពុងដំណើរការ"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"កំពុងដំណើរការ"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"ទិន្នន័យទូរសព្ទចល័ត"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"បានភ្ជាប់"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"បានភ្ជាប់ជាបណ្ដោះអាសន្ន"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 032a80abf71b..5cfb42cf5091 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ಬ್ಯಾಟರಿ ಶೇಕಡಾವಾರು ತಿಳಿದಿಲ್ಲ."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> ಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"ಗುಂಪು ವಿಸ್ತರಿಸಿ."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"ಸಂಪರ್ಕಗೊಂಡಿಲ್ಲ."</string> <string name="data_connection_roaming" msgid="375650836665414797">"ರೋಮಿಂಗ್"</string> <string name="cell_data_off" msgid="4886198950247099526">"ಆಫ್"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"ಹಬ್ ಮೋಡ್ ಅನ್ನು ಎಕ್ಸ್ಪ್ಲೋರ್ ಮಾಡಿ"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"ಚಾರ್ಜ್ ಮಾಡುವಾಗ ನಿಮ್ಮ ನೆಚ್ಚಿನ ವಿಜೆಟ್ಗಳು ಮತ್ತು ಸ್ಕ್ರೀನ್ ಸೇವರ್ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"ಪ್ರಾರಂಭಿಸೋಣ"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"ಚಾರ್ಜ್ ಮಾಡುವಾಗ ನಿಮ್ಮ ನೆಚ್ಚಿನ ಸ್ಕ್ರೀನ್ಸೇವರ್ಗಳನ್ನು ತೋರಿಸಿ"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"ಸಂಭಾಷಣೆ ಅಧಿಸೂಚನೆಗಳ ಮೇಲ್ಭಾಗದಲ್ಲಿ ಹಾಗೂ ಲಾಕ್ ಸ್ಕ್ರೀನ್ನ ಮೇಲೆ ಪ್ರೊಫೈಲ್ ಚಿತ್ರವಾಗಿ ತೋರಿಸುತ್ತದೆ, ಬಬಲ್ನಂತೆ ಗೋಚರಿಸುತ್ತದೆ, ಅಡಚಣೆ ಮಾಡಬೇಡ ಮೋಡ್ಗೆ ಅಡ್ಡಿಯುಂಟುಮಾಡುತ್ತದೆ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ಆದ್ಯತೆ"</string> <string name="no_shortcut" msgid="8257177117568230126">"ಸಂವಾದ ಫೀಚರ್ಗಳನ್ನು <xliff:g id="APP_NAME">%1$s</xliff:g> ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"ವಜಾಗೊಳಿಸಿ"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ಮತ್ತೊಮ್ಮೆ ತೋರಿಸಬೇಡಿ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಮಾರ್ಪಡಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"ಸ್ಟಿಕಿ ಕೀಗಳನ್ನು ಟಾಗಲ್ ಮಾಡಿ"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"ನಿಧಾನ ಕೀಗಳನ್ನು ಟಾಗಲ್ ಮಾಡಿ"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"ಧ್ವನಿ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಟಾಗಲ್ ಮಾಡಿ"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"ಟಾಗಲ್ TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"ಟಾಗಲ್ ಮ್ಯಾಗ್ನಿಫಿಕೇಶನ್"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"\'ಆಯ್ಕೆಮಾಡಿ ಮತ್ತು ಆಲಿಸಿ\' ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"ವಾಲ್ಯೂಮ್ ಬಟನ್ಗಳ ಶಾರ್ಟ್ಕಟ್"</string> <string name="battery" msgid="769686279459897127">"ಬ್ಯಾಟರಿ"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ತೆರೆಯುವುದಕ್ಕಾಗಿ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ಬಳಸಿ"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ದೃಢೀಕರಣದ ಅವಶ್ಯಕತೆಯಿದೆ. ದೃಢೀಕರಿಸಲು ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆ"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"ಚಾಲ್ತಿಯಲ್ಲಿದೆ"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"ಮೊಬೈಲ್ ಡೇಟಾ"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"ಕನೆಕ್ಟ್ ಆಗಿದೆ"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"ತಾತ್ಕಾಲಿಕವಾಗಿ ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 4910e8ce700f..78f87a2cdfa3 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -540,12 +540,9 @@ <string name="communal_widgets_disclaimer_text" msgid="1423545475160506349">"위젯을 사용하여 앱을 열려면 본인 인증을 해야 합니다. 또한 태블릿이 잠겨 있더라도 누구나 볼 수 있다는 점을 유의해야 합니다. 일부 위젯은 잠금 화면에 적합하지 않고 여기에 추가하기에 안전하지 않을 수 있습니다."</string> <string name="communal_widgets_disclaimer_button" msgid="4423059765740780753">"확인"</string> <string name="accessibility_glanceable_hub_to_dream_button" msgid="7552776300297055307">"화면 보호기 버튼 표시"</string> - <!-- no translation found for hub_onboarding_bottom_sheet_title (162092881395529947) --> - <skip /> - <!-- no translation found for hub_onboarding_bottom_sheet_text (8589816797970240544) --> - <skip /> - <!-- no translation found for hub_onboarding_bottom_sheet_action_button (6161983690157872829) --> - <skip /> + <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"허브 모드 살펴보기"</string> + <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"충전하는 동안 즐겨 찾는 위젯과 화면 보호기에 액세스하세요."</string> + <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"시작"</string> <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> <skip /> <string name="accessibility_multi_user_switch_switcher" msgid="5330448341251092660">"사용자 전환"</string> @@ -810,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"대화 알림 상단에 표시, 잠금 화면에 프로필 사진으로 표시, 대화창으로 표시, 방해 금지 모드를 무시함"</string> <string name="notification_priority_title" msgid="2079708866333537093">"우선순위"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱은 대화 기능을 지원하지 않습니다."</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"닫기"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"다시 표시하지 않음"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"이 알림은 수정할 수 없습니다."</string> @@ -927,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"고정키 전환"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"느린 키 전환"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"음성 액세스 전환"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"TalkBack 전환"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"확대 전환"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"텍스트 읽어주기 활성화"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"방해 금지 모드"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"볼륨 버튼 단축키"</string> <string name="battery" msgid="769686279459897127">"배터리"</string> @@ -1519,12 +1515,10 @@ <string name="touchpad_recent_apps_gesture_success_body" msgid="4334263906697493273">"최근 앱 보기 동작을 완료했습니다."</string> <string name="touchpad_recent_gesture_error_body" msgid="8695535720378462022">"최근 앱을 보려면 터치패드에서 세 손가락을 사용해 위로 스와이프한 채로 유지하세요."</string> <string name="touchpad_switch_apps_gesture_action_title" msgid="6835222344612924512">"앱 전환"</string> - <!-- no translation found for touchpad_switch_apps_gesture_guidance (2554844933805502538) --> - <skip /> + <string name="touchpad_switch_apps_gesture_guidance" msgid="2554844933805502538">"네 손가락을 사용해 터치패드에서 오른쪽으로 스와이프하세요."</string> <string name="touchpad_switch_apps_gesture_success_title" msgid="4894947244328032458">"잘하셨습니다"</string> <string name="touchpad_switch_apps_gesture_success_body" msgid="8151089866035126312">"앱 전환 동작을 완료했습니다."</string> - <!-- no translation found for touchpad_switch_gesture_error_body (5895231916964677918) --> - <skip /> + <string name="touchpad_switch_gesture_error_body" msgid="5895231916964677918">"앱을 전환하려면 네 손가락을 사용해 터치패드에서 오른쪽으로 스와이프하세요"</string> <string name="tutorial_action_key_title" msgid="8172535792469008169">"모든 앱 보기"</string> <string name="tutorial_action_key_guidance" msgid="5040613427202799294">"키보드의 작업 키를 누르세요."</string> <string name="tutorial_action_key_success_title" msgid="2371827347071979571">"잘하셨습니다"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 6619ad0b2762..bdbbf049376a 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Cүйлөшүүлөр тууралуу билдирмелердин жогору жагында жана кулпуланган экранда профилдин сүрөтү, ошондой эле калкып чыкма билдирме түрүндө көрүнүп, \"Тынчымды алба\" режимин токтотот"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Маанилүүлүгү"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосунда оозеки сүйлөшкөнгө болбойт"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Жабуу"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Экинчи көрсөтүлбөсүн"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Бул билдирмелерди өзгөртүүгө болбойт."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Жабышма баскычтарды өчүрүү/күйгүзүү"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Жай баскычтарды өчүрүү/күйгүзүү"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Voice Access\'ти өчүрүү/күйгүзүү"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Talkback функциясын өчүрүү/күйгүзүү"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Чоңойтууну өчүрүү/күйгүзүү"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"\"Басып туруп угуңуз\" функциясын иштетүү"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Тынчымды алба"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Үндү көзөмөлдөөчү баскычтардын кыска жолдору"</string> <string name="battery" msgid="769686279459897127">"Батарея"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 0f4ec94a461f..1acb34a9cccb 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"ສະແດງຢູ່ເທິງສຸດຂອງການແຈ້ງເຕືອນການສົນທະນາ ແລະ ເປັນຮູບໂປຣໄຟລ໌ຢູ່ໜ້າຈໍລັອກ, ປາກົດເປັນຟອງ, ສະແດງໃນໂໝດຫ້າມລົບກວນໄດ້"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ສຳຄັນ"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ບໍ່ຮອງຮັບຄຸນສົມບັດການສົນທະນາ"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"ປິດໄວ້"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ບໍ່ຕ້ອງສະແດງອີກ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ບໍ່ສາມາດແກ້ໄຂການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້."</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 1c514c4ce440..dc182c7dea53 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Akumuliatoriaus energija procentais nežinoma."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Prisijungta prie „<xliff:g id="BLUETOOTH">%s</xliff:g>“."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Prisijungta prie <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Išskleisti grupę."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Atidaryti programą."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Neprijungta."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Tarptinklinis ryšys"</string> <string name="cell_data_off" msgid="4886198950247099526">"Išjungta"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Naršymas centro režimu"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Įkraudami pasiekite mėgstamiausius valdiklius ir ekrano užsklandas."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Pirmyn"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Įkraunant rodyti mėgstamiausias ekrano užsklandas"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Rodoma pokalbių pranešimų viršuje ir kaip profilio nuotrauka užrakinimo ekrane, burbule, pertraukia netrukdymo režimą"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritetiniai"</string> <string name="no_shortcut" msgid="8257177117568230126">"Programa „<xliff:g id="APP_NAME">%1$s</xliff:g>“ nepalaiko pokalbių funkcijų"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Uždaryti"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Neberodyti"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Šių pranešimų keisti negalima."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Perjungti atmeniuosius klavišus"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Perjungti lėtuosius klavišus"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Perjungti „Voice Access“"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Perjungti „TalkBack“"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Perjungti didinimą"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Suaktyvinti funkciją „Teksto ištarimas“"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Netrukdymo režimas"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Garsumo mygtukų spartusis klavišas"</string> <string name="battery" msgid="769686279459897127">"Akumuliatorius"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Naudokite kontrolinį kodą, kad atidarytumėte"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Reikia nustatyti tapatybę. Nustatykite tapatybę palietę kontrolinio kodo jutiklį."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Vykstantis skambutis"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Vyksta"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobiliojo ryšio duomenys"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Prisijungta"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Laikinai prijungta"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 633af09096df..5d7d87a0ac70 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Parādās sarunu paziņojumu augšdaļā un kā profila attēls bloķēšanas ekrānā, arī kā burbulis, pārtrauc režīmu “Netraucēt”."</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritārs"</string> <string name="no_shortcut" msgid="8257177117568230126">"Lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g> netiek atbalstītas sarunu funkcijas."</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Nerādīt"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Vairs nerādīt"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Šos paziņojumus nevar modificēt."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Pārslēgt taustiņu ķēdi"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Pārslēgt lēnos taustiņus"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Pārslēgt lietotni “Balss piekļuve”"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Pārslēgt funkciju TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Pārslēgt funkciju Palielinājums"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktivizēt pakalpojumu “Atlasīt, lai izrunātu”"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Režīms “Netraucēt”"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Skaļuma pogu saīsne"</string> <string name="battery" msgid="769686279459897127">"Akumulators"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 8324cdb54d37..22b5ff4823bf 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -110,7 +110,7 @@ <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Се обработува снимка од екран"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Тековно известување за сесија за снимање на екранот"</string> <string name="screenrecord_permission_dialog_title" msgid="7415261783188749730">"Да се снима екранот?"</string> - <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Снимање на една апликација"</string> + <string name="screenrecord_permission_dialog_option_text_single_app" msgid="1996450687814647583">"Снимање една апликација"</string> <string name="screenrecord_permission_dialog_option_text_entire_screen" msgid="4882406311415082016">"Снимај го екранов"</string> <string name="screenrecord_permission_dialog_option_text_entire_screen_for_display" msgid="4169494703993148253">"Снимај го екранот %s"</string> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="1321758636709366068">"Додека го снимате целиот екран, сѐ што е прикажано на екранот се снима. Затоа, бидете внимателни со лозинките, деталите за плаќање, пораките, фотографиите и аудиото и видеото."</string> @@ -126,7 +126,7 @@ <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Се снима екранот"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Се снима екранот и аудиото"</string> <string name="screenrecord_taps_label" msgid="1595690528298857649">"Прикажувај допири на екранот"</string> - <string name="screenrecord_stop_label" msgid="72699670052087989">"Сопри"</string> + <string name="screenrecord_stop_label" msgid="72699670052087989">"Сопрете"</string> <string name="screenrecord_share_label" msgid="5025590804030086930">"Сподели"</string> <string name="screenrecord_save_title" msgid="1886652605520893850">"Снимката од екранот е зачувана"</string> <string name="screenrecord_save_text" msgid="3008973099800840163">"Допрете за прегледување"</string> @@ -145,7 +145,7 @@ <string name="share_to_app_stop_dialog_message_single_app_specific" msgid="5923772039347985172">"Во моментов ја споделувате <xliff:g id="APP_BEING_SHARED_NAME">%1$s</xliff:g>"</string> <string name="share_to_app_stop_dialog_message_single_app_generic" msgid="6681016774654578261">"Во моментов споделувате апликација"</string> <string name="share_to_app_stop_dialog_message_generic" msgid="7622174291691249392">"Во моментов споделувате со апликација"</string> - <string name="share_to_app_stop_dialog_button" msgid="6334056916284230217">"Сопри го споделувањето"</string> + <string name="share_to_app_stop_dialog_button" msgid="6334056916284230217">"Сопрете го споделувањето"</string> <string name="cast_screen_to_other_device_chip_accessibility_label" msgid="4687917476203009885">"Се емитува екранот"</string> <string name="cast_to_other_device_stop_dialog_title" msgid="7836517190930357326">"Да се сопре емитувањето?"</string> <string name="cast_to_other_device_stop_dialog_message_entire_screen_with_device" msgid="1474703115926205251">"Во моментов го емитувате целиот екран на <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Се прикажува најгоре во известувањата за разговор и како профилна слика на заклучен екран, се појавува како балонче, го прекинува „Не вознемирувај“"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритетно"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не поддржува функции за разговор"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Отфрли"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Не прикажувај повторно"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Овие известувања не може да се изменат"</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Вклучи/исклучи „Лепливи копчиња“"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Вклучи/исклучи „Бавни копчиња“"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Вклучи/исклучи „Пристап со глас“"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Вклучете/исклучете TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Вклучете/исклучете зголемување"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Активирајте ја „Изберете за говор“"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Не вознемирувај"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Кратенка за копчињата за јачина на звук"</string> <string name="battery" msgid="769686279459897127">"Батерија"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 267d00b426ca..753b325df6b0 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ബാറ്ററി ശതമാനം അജ്ഞാതമാണ്."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തു."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തു."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"ഗ്രൂപ്പ് വികസിപ്പിക്കുക."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"ആപ്പ് തുറക്കുക."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"കണക്റ്റുചെയ്തിട്ടില്ല."</string> <string name="data_connection_roaming" msgid="375650836665414797">"റോമിംഗ്"</string> <string name="cell_data_off" msgid="4886198950247099526">"ഓഫ്"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"ഹബ് മോഡ് അടുത്തറിയുക"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"ചാർജ് ചെയ്യുമ്പോൾ നിങ്ങളുടെ പ്രിയപ്പെട്ട വിജറ്റുകളും സ്ക്രീൻ സേവറുകളും ആക്സസ് ചെയ്യുക."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"തുടങ്ങാം"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"ചാർജ് ചെയ്യുമ്പോൾ നിങ്ങളുടെ പ്രിയപ്പെട്ട സ്ക്രീൻ സേവറുകൾ കാണിക്കുക"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"സംഭാഷണ അറിയിപ്പുകളുടെ മുകളിലും സ്ക്രീൻ ലോക്കായിരിക്കുമ്പോൾ ഒരു പ്രൊഫൈൽ ചിത്രമായും ബബിൾ രൂപത്തിൽ ദൃശ്യമാകുന്നു, ശല്യപ്പെടുത്തരുത് മോഡ് തടസ്സപ്പെടുത്തുന്നു"</string> <string name="notification_priority_title" msgid="2079708866333537093">"മുൻഗണന"</string> <string name="no_shortcut" msgid="8257177117568230126">"സംഭാഷണ ഫീച്ചറുകളെ <xliff:g id="APP_NAME">%1$s</xliff:g> പിന്തുണയ്ക്കുന്നില്ല"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"ഡിസ്മിസ് ചെയ്യുക"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"വീണ്ടും കാണിക്കരുത്"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ഈ അറിയിപ്പുകൾ പരിഷ്ക്കരിക്കാനാവില്ല."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"സ്റ്റിക്കി കീകൾ ടോഗിൾ ചെയ്യുക"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"സ്ലോ കീകൾ ടോഗിൾ ചെയ്യുക"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Voice Access ടോഗിൾ ചെയ്യുക"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"TalkBack ടോഗിൾ ചെയ്യുക"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"മാഗ്നിഫിക്കേഷൻ ടോഗിൾ ചെയ്യുക"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"\'വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക\' സജീവമാക്കുക"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ശല്യപ്പെടുത്തരുത്"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"വോളിയം ബട്ടൺ കുറുക്കുവഴി"</string> <string name="battery" msgid="769686279459897127">"ബാറ്ററി"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"തുറക്കുന്നതിന് നിങ്ങളുടെ ഫിംഗർപ്രിന്റ് ഉപയോഗിക്കുക"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"പരിശോധിച്ചുറപ്പിക്കേണ്ടതുണ്ട്. പരിശോധിച്ചുറപ്പിക്കാൻ, വിരലടയാള സെൻസറിൽ സ്പർശിക്കുക."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"കോളിലാണ്"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"നടന്നുകൊണ്ടിരിക്കുന്നവ"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"മൊബൈൽ ഡാറ്റ"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"കണക്റ്റ് ചെയ്തു"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"താൽക്കാലികമായി കണക്റ്റ് ചെയ്തിരിക്കുന്നു"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index e0cd2a6b5537..9ef7ebd66cb3 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Харилцан ярианы мэдэгдлийн дээд талд болон түгжигдсэн дэлгэц дээр профайл зураг байдлаар харуулах бөгөөд бөмбөлөг хэлбэрээр харагдана. Бүү саад бол горимыг тасалдуулна"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Чухал"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> нь харилцан ярианы онцлогуудыг дэмждэггүй"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Хаах"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Дахиж бүү харуул"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Эдгээр мэдэгдлийг өөрчлөх боломжгүй."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Бэхэлсэн товчийг асаах/унтраах"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Удаан товчийг асаах/унтраах"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Voice Access-г асаах/унтраах"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"TalkBack-г асаах/унтраах"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Томруулахыг асаах/унтраах"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Ярихаар сонгохыг идэвхжүүлэх"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Бүү саад бол"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Дууны түвшний товчлуурын товчлол"</string> <string name="battery" msgid="769686279459897127">"Батарей"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 4adaa29efab1..1327a48a1533 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"संभाषण सूचनांच्या वरती आणि लॉक स्क्रीनवरील प्रोफाइल फोटो म्हणून दिसते, बबल म्हणून दिसते, व्यत्यय आणू नका यामध्ये अडथळा आणते"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राधान्य"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे संभाषण वैशिष्ट्यांना सपोर्ट करत नाही"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"डिसमिस करा"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"पुन्हा दाखवू नका"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"स्टिकी की टॉगल करा"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"स्लो की टॉगल करा"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Voice Access टॉगल करा"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Talkback टॉगल करा"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"मॅग्निफिकेशन टॉगल करा"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"बोलण्यासाठी निवडा सुरू करा"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"व्यत्यय आणू नका"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"आवाजाच्या बटणांचा शार्टकट"</string> <string name="battery" msgid="769686279459897127">"बॅटरी"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 8d38af47eb3b..91901145c731 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Peratusan kuasa bateri tidak diketahui."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Disambungkan kepada <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Disambungkan ke <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Kembangkan kumpulan."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Buka aplikasi."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Tidak disambungkan."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Perayauan"</string> <string name="cell_data_off" msgid="4886198950247099526">"Mati"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Terokai mod hab"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Akses widget dan penyelamat skrin kegemaran anda semasa melakukan pengecasan."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Mari mulakan"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Paparkan penyelamat skrin kegemaran anda semasa pengecasan"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Ditunjukkan di bahagian atas pemberitahuan perbualan dan sebagai gambar profil pada skrin kunci, muncul sebagai gelembung, mengganggu Jangan Ganggu"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Keutamaan"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> tidak menyokong ciri perbualan"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Ketepikan"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Jangan tunjukkan lagi"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Pemberitahuan ini tidak boleh diubah suai."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Togol kekunci lekit"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Togol kekunci perlahan"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Togol Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Togol Talkback"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Togol Pembesaran"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktifkan Pilih untuk Bercakap"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Jangan Ganggu"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Pintasan butang kelantangan"</string> <string name="battery" msgid="769686279459897127">"Bateri"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Gunakan cap jari untuk membuka"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Pengesahan diperlukan. Sentuh penderia cap jari untuk pengesahan."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Panggilan sedang berlangsung"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Sedang berlangsung"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Data mudah alih"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Disambungkan"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Disambungkan buat sementara waktu"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index c971e3a131a7..43f545dc4fbe 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"စကားဝိုင်း အကြောင်းကြားချက်များ၏ ထိပ်ပိုင်းနှင့် ပရိုဖိုင်ပုံအဖြစ် လော့ခ်မျက်နှာပြင်တွင် ပြသည်။ ပူဖောင်းကွက်အဖြစ် မြင်ရပြီး ‘မနှောင့်ယှက်ရ’ ကို ကြားဖြတ်သည်"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ဦးစားပေး"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> က စကားဝိုင်းဝန်ဆောင်မှုများကို မပံ့ပိုးပါ"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"ပယ်ရန်"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ထပ်မပြပါနှင့်"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ဤအကြောင်းကြားချက်များကို ပြုပြင်၍ မရပါ။"</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"ကပ်ခွာကီးများ ပြောင်းရန်"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"အနှေးကီးများ ပြောင်းရန်"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"အသံဖြင့်ထိန်းချုပ်ခြင်း ပြောင်းရန်"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Talkback ခလုတ်"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"ချဲ့ခြင်း ခလုတ်"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"စကားပြော ရွေးခြင်းကို စတင်ရန်"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"မနှောင့်ယှက်ရ"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"အသံထိန်းချုပ်သည့်ခလုတ် ဖြတ်လမ်း"</string> <string name="battery" msgid="769686279459897127">"ဘက်ထရီ"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 44686a4c882e..cc0574cc78ff 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Vises øverst på samtalevarsler og som et profilbilde på låseskjermen, vises som en boble, avbryter «Ikke forstyrr»"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> støtter ikke samtalefunksjoner"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Lukk"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ikke vis igjen"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Disse varslene kan ikke endres."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Slå trege taster av eller på"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Slå hengende taster av eller på"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Slå taletilgang av eller på"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Slå TalkBack av/på"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Slå forstørrelse av/på"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktiver tekstopplesing"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ikke forstyrr"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Hurtigtast for volumknappene"</string> <string name="battery" msgid="769686279459897127">"Batteri"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 0e479ec0bcce..cb0db8db416e 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -602,7 +602,7 @@ <string name="notification_history_button_description" msgid="1578657591405033383">"नोटिफिकेसनसम्बन्धी हिस्ट्री"</string> <string name="notification_section_header_incoming" msgid="850925217908095197">"नयाँ"</string> <string name="notification_section_header_gentle" msgid="6804099527336337197">"साइलेन्ट"</string> - <string name="notification_section_header_alerting" msgid="5581175033680477651">"सूचनाहरू"</string> + <string name="notification_section_header_alerting" msgid="5581175033680477651">"नोटिफिकेसनहरू"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"वार्तालापहरू"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"सबै मौन सूचनाहरू हटाउनुहोस्"</string> <string name="accessibility_notification_section_header_open_settings" msgid="6235202417954844004">"नोटिफिकेसन सेटिङ खोल्नुहोस्"</string> @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"यो वार्तालापका सूचनाहरूको सिरानमा, बबलका रूपमा र लक स्क्रिनमा प्रोफाइल फोटोका रूपमा देखिन्छ। साथै, यसले गर्दा \'बाधा नपुऱ्याउनुहोस्\' नामक सुविधामा अवरोध आउँछ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा वार्तालापसम्बन्धी सुविधा प्रयोग गर्न मिल्दैन"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"हटाउनुहोस्"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"फेरि नदेखाउनुहोस्"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"यी सूचनाहरू परिमार्जन गर्न मिल्दैन।"</string> @@ -863,7 +865,7 @@ <string name="keyboard_shortcut_group_system_home" msgid="7465138628692109907">"गृह"</string> <string name="keyboard_shortcut_group_system_recents" msgid="8628108256824616927">"हालैका"</string> <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"पछाडि"</string> - <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"सूचनाहरू"</string> + <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"नोटिफिकेसनहरू"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"किबोर्ड सर्टकटहरू"</string> <string name="keyboard_shortcut_join" msgid="3578314570034512676">"वा"</string> <string name="keyboard_shortcut_clear_text" msgid="6631051796030377857">"किवर्ड हटाउनुहोस्"</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"स्टिकी कीहरू टगल गर्नुहोस्"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"स्लो कीहरू टगल गर्नुहोस्"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Voice Access टगल गर्नुहोस्"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"TalkBack टगल गर्नुहोस्"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"जुम इन गर्ने सुविधा टगल गर्नुहोस्"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"सेलेक्ट टु स्पिक एक्टिभेट गर्नुहोस्"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"बाधा नपुऱ्याउनुहोस्"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"भोल्युम बटनका सर्टकट"</string> <string name="battery" msgid="769686279459897127">"ब्याट्री"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 9e3ed9bc2a12..26b88a951632 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batterijpercentage onbekend."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Verbonden met <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Verbonden met <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Groep uitvouwen."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"App openen."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Niet verbonden."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Uit"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Hub-modus verkennen"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Krijg toegang tot je favoriete widgets en screensavers terwijl je apparaat wordt opgeladen."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Aan de slag"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Je favoriete screensavers tonen tijdens het opladen"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Wordt getoond bovenaan gespreksmeldingen en als profielfoto op het vergrendelscherm, verschijnt als bubbel, onderbreekt Niet storen"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ondersteunt geen gespreksfuncties"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Sluiten"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Niet meer tonen"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Deze meldingen kunnen niet worden aangepast."</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Gebruik vingerafdruk om te openen"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Verificatie vereist. Raak de vingerafdruksensor aan om de verificatie uit te voeren."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Actief gesprek"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Actief"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobiele data"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Verbonden"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Tijdelijk verbonden"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 181980ba57a6..768ab7acc026 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"ବାର୍ତ୍ତାଳାପ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକର ଶୀର୍ଷରେ ଏବଂ ଲକ୍ ସ୍କ୍ରିନରେ ଏକ ପ୍ରୋଫାଇଲ୍ ଛବି ଭାବେ ଦେଖାଏ, ଏକ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ, \'ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\'କୁ ବାଧା ଦିଏ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ପ୍ରାଥମିକତା"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବାର୍ତ୍ତାଳାପ ଫିଚରଗୁଡ଼ିକୁ ସମର୍ଥନ କରେ ନାହିଁ"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"ଖାରଜ କରନ୍ତୁ"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ପୁଣି ଶୋ କରନ୍ତୁ ନାହିଁ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରିହେବ ନାହିଁ।"</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"ଷ୍ଟିକି କୀ ଟୋଗଲ କରନ୍ତୁ"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"ଧିର କୀ ଟୋଗଲ କରନ୍ତୁ"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Voice Access ଟୋଗଲ କରନ୍ତୁ"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"TalkBack ଟୋଗଲ କରନ୍ତୁ"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"ମେଗ୍ନିଫିକେସନ ଟୋଗଲ କରନ୍ତୁ"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"ସିଲେକ୍ଟ ଟୁ ସ୍ପିକକୁ ସକ୍ରିୟ କରନ୍ତୁ"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"ଭଲ୍ୟୁମ ବଟନ୍ ଶର୍ଟକଟ୍"</string> <string name="battery" msgid="769686279459897127">"ବେଟେରୀ"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index b338e1b5376a..a61ea1a37a7f 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ਬੈਟਰੀ ਪ੍ਰਤੀਸ਼ਤ ਅਗਿਆਤ ਹੈ।"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ।"</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ।"</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"ਗਰੁੱਪ ਦਾ ਵਿਸਤਾਰ ਕਰੋ।"</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"ਐਪਲੀਕੇਸ਼ਨ ਖੋਲ੍ਹੋ।"</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ।"</string> <string name="data_connection_roaming" msgid="375650836665414797">"ਰੋਮਿੰਗ"</string> <string name="cell_data_off" msgid="4886198950247099526">"ਬੰਦ"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"ਹੱਬ ਮੋਡ ਦੀ ਪੜਚੋਲ ਕਰੋ"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"ਚਾਰਜ ਕਰਨ ਵੇਲੇ ਆਪਣੇ ਮਨਪਸੰਦ ਵਿਜੇਟਾਂ ਅਤੇ ਸਕ੍ਰੀਨ ਸੇਵਰਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰੋ।"</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"ਚਲੋ ਸ਼ੁਰੂ ਕਰੀਏ"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"ਚਾਰਜ ਕਰਦੇ ਸਮੇਂ ਆਪਣੇ ਮਨਪਸੰਦ ਸਕ੍ਰੀਨ-ਸੇਵਰ ਦਿਖਾਓ"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"ਗੱਲਬਾਤ ਸੂਚਨਾਵਾਂ ਦੇ ਸਿਖਰ \'ਤੇ ਅਤੇ ਲਾਕ ਸਕ੍ਰੀਨ \'ਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਵਜੋਂ ਦਿਖਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਜੋ ਕਿ ਬਬਲ ਵਜੋਂ ਦਿਸਦੀਆਂ ਹਨ ਅਤੇ \'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਸੁਵਿਧਾ ਵਿੱਚ ਵਿਘਨ ਵੀ ਪਾ ਸਕਦੀਆਂ ਹਨ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ਤਰਜੀਹ"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਐਪ ਗੱਲਬਾਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"ਖਾਰਜ ਕਰੋ"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ਦੁਬਾਰਾ ਨਾ ਦਿਖਾਓ"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਸੋਧਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ।"</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ਖੋਲ੍ਹਣ ਲਈ ਫਿੰਗਰਪ੍ਰਿੰਟ ਵਰਤੋ"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ਪ੍ਰਮਾਣੀਕਰਨ ਲੋੜੀਂਦਾ ਹੈ। ਪ੍ਰਮਾਣਿਤ ਕਰਨ ਲਈ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪਰਸ਼ ਕਰੋ।"</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"ਜਾਰੀ ਕਾਲ"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"ਜਾਰੀ"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"ਮੋਬਾਈਲ ਡਾਟਾ"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"ਕਨੈਕਟ ਹੈ"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"ਕੁਝ ਸਮੇਂ ਲਈ ਕਨੈਕਟ ਹੈ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 2d3d39655cba..2e2a3b4623c0 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Wyświetla się u góry powiadomień w rozmowach oraz jako zdjęcie profilowe na ekranie blokady, jako dymek, przerywa działanie trybu Nie przeszkadzać"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorytetowe"</string> <string name="no_shortcut" msgid="8257177117568230126">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> nie obsługuje funkcji rozmów"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Zamknij"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Nie pokazuj ponownie"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tych powiadomień nie można zmodyfikować."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Przełącz ustawienie klawiszy trwałych"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Przełącz ustawienie klawiszy powolnych"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Przełącz ustawienie aplikacji Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Przełącz TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Przełącz powiększenie"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Włącz funkcję Przeczytaj na głos"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Nie przeszkadzać"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Wł./wył. przyciskami głośności"</string> <string name="battery" msgid="769686279459897127">"Bateria"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 39c4dfeaadb7..abba6885838b 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Porcentagem da bateria desconhecida."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Conectado a <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Expandir grupo."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Abrir aplicativo."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Sem conexão."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Desativados"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Conheça o modo Hub"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Acesse seus widgets e protetores de tela favoritos durante o carregamento."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Vamos lá"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Mostre seus protetores de tela favoritos durante o carregamento"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Aparecem na parte superior das notificações de conversa, como uma foto do perfil na tela de bloqueio e como um balão. Interrompem o Não perturbe."</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritárias"</string> <string name="no_shortcut" msgid="8257177117568230126">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com recursos de conversa"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Dispensar"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Não mostrar novamente"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Alternar teclas de aderência"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Alternar teclas lentas"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Alternar Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Alternar TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Alternar ampliação"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Ativar Selecionar para ouvir"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Não perturbe"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Atalho de botões de volume"</string> <string name="battery" msgid="769686279459897127">"Bateria"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Use a impressão digital para abrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autenticação obrigatória. Toque no sensor de impressão digital para autenticar."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Chamada em andamento"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Em andamento"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Dados móveis"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Conectado"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Temporariamente conectado"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index cb9730a3b5d6..833714c95e41 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Percentagem da bateria desconhecida."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ligado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Ligado a <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Expanda o grupo."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Abra a aplicação."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Sem ligação."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Desativado"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Explore o modo Hub"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Aceda aos seus widgets e proteções de ecrã favoritos durante o carregamento."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Começar"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Mostre as suas proteções de ecrã favoritas durante o carregamento"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Aparece na parte superior das notificações de conversas e como uma imagem do perfil no ecrã de bloqueio, surge como um balão, interrompe o modo Não incomodar"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> <string name="no_shortcut" msgid="8257177117568230126">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> não suporta funcionalidades de conversa."</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Ignorar"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Não mostrar novamente"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar estas notificações."</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Utilize a impressão digital para abrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autenticação necessária. Toque no sensor de impressões digitais para autenticar."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Chamada em curso"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Em curso"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Dados móveis"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Ligado"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Ligado temporariamente"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 39c4dfeaadb7..abba6885838b 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Porcentagem da bateria desconhecida."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Conectado a <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Conectado a <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Expandir grupo."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Abrir aplicativo."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Sem conexão."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Desativados"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Conheça o modo Hub"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Acesse seus widgets e protetores de tela favoritos durante o carregamento."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Vamos lá"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Mostre seus protetores de tela favoritos durante o carregamento"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Aparecem na parte superior das notificações de conversa, como uma foto do perfil na tela de bloqueio e como um balão. Interrompem o Não perturbe."</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritárias"</string> <string name="no_shortcut" msgid="8257177117568230126">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com recursos de conversa"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Dispensar"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Não mostrar novamente"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Não é possível modificar essas notificações."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Alternar teclas de aderência"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Alternar teclas lentas"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Alternar Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Alternar TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Alternar ampliação"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Ativar Selecionar para ouvir"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Não perturbe"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Atalho de botões de volume"</string> <string name="battery" msgid="769686279459897127">"Bateria"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Use a impressão digital para abrir"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Autenticação obrigatória. Toque no sensor de impressão digital para autenticar."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Chamada em andamento"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Em andamento"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Dados móveis"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Conectado"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Temporariamente conectado"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index a6d11f49b141..3cfe7b83fff9 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Se afișează în partea de sus a notificărilor pentru conversații și ca fotografie de profil pe ecranul de blocare, apare ca un balon, întrerupe funcția Nu deranja"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritate"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nu acceptă funcții pentru conversații"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Închide"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Nu mai afișa"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Aceste notificări nu pot fi modificate."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Comută tastele adezive"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Comută tastele lente"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Comută Accesul vocal"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Activează sau dezactivează TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Activează sau dezactivează Mărirea"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Activează Selectează și ascultă"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Nu deranja"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Comandă rapidă din butoanele de volum"</string> <string name="battery" msgid="769686279459897127">"Baterie"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 46007fef1c2e..7ec0513df942 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Уровень заряда батареи в процентах неизвестен."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>: подключено."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Подключено к: <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Развернуть группу."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Открыть приложение."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Не подключено"</string> <string name="data_connection_roaming" msgid="375650836665414797">"Роуминг"</string> <string name="cell_data_off" msgid="4886198950247099526">"Отключен"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Попробуйте режим домашнего центра"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Пока устройство заряжается, будут показываться любимые заставки и вы сможете пользоваться привычными виджетами."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Попробовать"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Показывать заставки во время зарядки"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Появляется в верхней части уведомлений о сообщениях, в виде всплывающего чата, а также в качестве фото профиля на заблокированном экране, прерывает режим \"Не беспокоить\"."</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> <string name="no_shortcut" msgid="8257177117568230126">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" не поддерживает функции разговоров."</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Закрыть"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Больше не показывать"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Эти уведомления нельзя изменить."</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Используйте отпечаток пальца для входа."</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Требуется аутентификация. Приложите палец к сканеру отпечатков."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Текущий вызов"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Сейчас"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобильный интернет"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Подключено"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Временное подключение"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 7c1c4404aa43..0a173cf0068f 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"බැටරි ප්රතිශතය නොදනී."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g> වෙත සම්බන්ධ කරන ලදි."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g> වෙත සම්බන්ධ විය."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"සමූහය දිගහැරීම"</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"යෙදුම විවෘත කරන්න."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"සම්බන්ධ වී නැත."</string> <string name="data_connection_roaming" msgid="375650836665414797">"රෝමිං"</string> <string name="cell_data_off" msgid="4886198950247099526">"ක්රියාවිරහිතයි"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"හබ් ප්රකාරය ගවේෂණය කරන්න"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"ආරෝපණය කරන අතරේ ඔබේ ප්රියතම විජට් සහ තිර සුරැකුම් වෙත ප්රවේශ වන්න."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"යමු"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"ආරෝපණය කරන අතරතුර ඔබේ ප්රියතම තිර සුරැකුම් පෙන්වන්න"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"සංවාද දැනුම්දීම්වල ඉහළින්ම සහ අගුලු තිරයේ ඇති පැතිකඩ පින්තූරයක් ලෙස පෙන්වයි, බුබුළක් ලෙස දිස් වේ, බාධා නොකරන්න සඳහා බාධා කරයි"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ප්රමුඛතාව"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> සංවාද විශේෂාංගවලට සහාය නොදක්වයි"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"අස් කරන්න"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"නැවත නොපෙන්වන්න"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"මෙම දැනුම්දීම් වෙනස් කළ නොහැක."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"ඇලෙන සුළු යතුරු ටොගල් කරන්න"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"මන්දගාමී යතුරු ටොගල් කරන්න"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"හඬ ප්රවේශය ටොගල් කරන්න"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Talkback ටොගල කරන්න"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"විශාලනය කිරීම ටොගල කරන්න"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"කථා කිරීමට තේරීම සක්රිය කරන්න"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"බාධා නොකරන්න"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"හඩ පරිමා බොත්තම් කෙටිමග"</string> <string name="battery" msgid="769686279459897127">"බැටරිය"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"විවෘත කිරීමට ඇඟිලි සලකුණ භාවිත කරන්න"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"සත්යාපනය අවශ්යයි. සත්යාපනය කිරීමට ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරන්න."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"කර ගෙන යන ඇමතුම"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"දැනට පවතින"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"ජංගම දත්ත"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"සම්බන්ධයි"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"තාවකාලිකව සම්බන්ධ කළා"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 3851173f6cc3..fbbc48c877f8 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Percento batérie nie je známe."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Pripojené k zariadeniu <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Pripojené k zariadeniu <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Rozbaliť skupinu"</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Otvoriť aplikáciu"</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Nepripojené."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Vypnuté"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Preskúmajte režim centra"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Počas nabíjania máte prístup k svojim obľúbeným miniaplikáciám a šetričom obrazovky."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Poďme na to"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Zobrazovať počas nabíjania obľúbené šetriče obrazovky"</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> @@ -576,7 +573,7 @@ <string name="media_projection_entry_app_permission_dialog_warning_single_app" msgid="7094417930857938876">"Pri zdieľaní aplikácie vidí aplikácia <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> všetko, čo sa v zdieľanej aplikácii zobrazuje alebo prehráva. Preto zvýšte pozornosť v prípade položiek, ako sú heslá, platobné údaje, správy, fotky a zvuk či video."</string> <string name="media_projection_entry_app_permission_dialog_continue_entire_screen" msgid="1850848182344377579">"Zdieľať obrazovku"</string> <string name="media_projection_entry_app_permission_dialog_single_app_disabled" msgid="8999903044874669995">"Aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g> túto možnosť zakázala"</string> - <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"Výber aplikácie na zdieľanie"</string> + <string name="media_projection_entry_share_app_selector_title" msgid="1419515119767501822">"Vyberte aplikáciu, do ktorej chcete zdieľať"</string> <string name="media_projection_entry_cast_permission_dialog_title" msgid="752756942658159416">"Chcete prenášať obrazovku?"</string> <string name="media_projection_entry_cast_permission_dialog_option_text_single_app" msgid="6073353940838561981">"Prenášať jednu aplikáciu"</string> <string name="media_projection_entry_cast_permission_dialog_option_text_entire_screen" msgid="8389508187954155307">"Prenášať celú obrazovku"</string> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Zobrazuje sa ako bublina v hornej časti upozornení konverzácie a profilová fotka na uzamknutej obrazovke, preruší režim bez vyrušení"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritné"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nepodporuje funkcie konverzácie"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Zavrieť"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Nabudúce nezobrazovať"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Tieto upozornenia sa nedajú upraviť."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Prepnúť na režim uzamknutia klávesa"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Prepnúť na pomalé klávesy"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Prepnúť na Voice Access"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Prepnúť TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Prepnúť zväčšenie"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktivovať počúvanie vybraného textu"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Režim bez vyrušení"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Skratka tlačidiel hlasitosti"</string> <string name="battery" msgid="769686279459897127">"Batéria"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Otvorte odtlačkom prsta"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Vyžaduje sa overenie. Dotknite sa senzora odtlačkov prstov."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Prebiehajúci hovor"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Prebieha"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobilné dáta"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Pripojené"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Dočasne pripojené"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index be51fbb67289..4174934bfedd 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -59,7 +59,7 @@ <string name="hdmi_cec_set_menu_language_description" msgid="8176716678074126619">"Spremembo jezika sistema je zahtevala druga naprava."</string> <string name="hdmi_cec_set_menu_language_accept" msgid="2513689457281009578">"Spremeni jezik"</string> <string name="hdmi_cec_set_menu_language_decline" msgid="7650721096558646011">"Obdrži trenutni jezik"</string> - <string name="share_wifi_button_text" msgid="1285273973812029240">"Delite omrežje Wi‑Fi"</string> + <string name="share_wifi_button_text" msgid="1285273973812029240">"Deli Wi‑Fi"</string> <string name="wifi_debugging_title" msgid="7300007687492186076">"Ali dovolite brezžično odpravljanje napak v tem omrežju?"</string> <string name="wifi_debugging_message" msgid="5461204211731802995">"Ime omrežja (SSID)\n<xliff:g id="SSID_0">%1$s</xliff:g>\n\nNaslov omrežja Wi‑Fi (BSSID)\n<xliff:g id="BSSID_1">%2$s</xliff:g>"</string> <string name="wifi_debugging_always" msgid="2968383799517975155">"Vedno dovoli v tem omrežju"</string> @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Neznan odstotek napolnjenosti baterije."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Povezava vzpostavljena z: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Vzpostavljena povezava: <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Razširitev skupine."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Odpiranje aplikacije."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Ni povezan."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Gostovanje"</string> <string name="cell_data_off" msgid="4886198950247099526">"Izklopljeno"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Raziščite način središča"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Med polnjenjem dostopajte do priljubljenih pripomočkov in ohranjevalnikov zaslona."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Pa začnimo"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Prikaz priljubljenih ohranjevalnikov zaslona med polnjenjem"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Prikaz v obliki oblačka na vrhu razdelka z obvestili za pogovor in kot profilna slika na zaklenjenem zaslonu, preglasitev načina Ne moti."</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prednostno"</string> <string name="no_shortcut" msgid="8257177117568230126">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> ne podpira pogovornih funkcij."</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Opusti"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Tega ne prikaži več"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Za ta obvestila ni mogoče spremeniti nastavitev."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Preklopi zaklepanje tipk"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Preklopi daljši pritisk tipk"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Preklopi Glasovni dostop"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Preklop funkcije TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Preklop povečave"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktiviranje storitve Izberite in poslušajte"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ne moti"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Bližnjica z gumboma za glasnost"</string> <string name="battery" msgid="769686279459897127">"Baterija"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Odprite s prstnim odtisom"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Zahtevano je preverjanje pristnosti. Za preverjanje pristnosti se dotaknite tipala prstnih odtisov."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Aktivni klic"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"V teku"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Prenos podatkov v mobilnem omrežju"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Povezano"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Začasno vzpostavljena povezava"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index e40ef60906b2..f2c6301e1a0c 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Shfaqet në krye të njoftimeve të bisedës dhe si fotografia e profilit në ekranin e kyçjes, shfaqet si flluskë dhe ndërpret modalitetin \"Mos shqetëso\""</string> <string name="notification_priority_title" msgid="2079708866333537093">"Me përparësi"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> nuk mbështet veçoritë e bisedës"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Hiq"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Mos e shfaq më"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Këto njoftime nuk mund të modifikohen."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Aktivizo/çaktivizo tastet e përhershme"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Aktivizo/çaktivizo tastet e ngadalta"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Aktivizo/çaktivizo \"Qasjen me zë\""</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Aktivizo/çaktivizo Talkback"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Aktivizo/çaktivizo \"Zmadhimin\""</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktivizo \"Zgjidh që të thuhet\""</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Mos shqetëso"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Shkurtorja e butonave të volumit"</string> <string name="battery" msgid="769686279459897127">"Bateria"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index ad837b4e8708..223242eb3cf9 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Проценат напуњености батерије није познат."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Повезани сте са <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Повезани смо са уређајем <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Проширите групу."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Отворите апликацију."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Није повезано."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Роминг"</string> <string name="cell_data_off" msgid="4886198950247099526">"Искључено"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Истражите режим центра"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Приступајте омиљеним виџетима и чуварима екрана током пуњења."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Идемо"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Приказујте омиљене чуваре екрана током пуњења"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Приказује се у врху обавештења о конверзацијама и као слика профила на закључаном екрану, појављује се као облачић, прекида режим Не узнемиравај"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритетно"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не подржава функције конверзације"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Одбаци"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Не приказуј поново"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ова обавештења не могу да се мењају."</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Отворите помоћу отиска прста"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Потребна је потврда идентитета. Додирните сензор за отисак прста да бисте потврдили идентитет."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Позив је у току"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Активно"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Мобилни подаци"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Повезано"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Привремено повезано"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index c0b846002140..b61353517e5c 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Visas högst upp i konversationsaviseringarna och som profilbild på låsskärmen, visas som bubbla, åsidosätter Stör ej"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> har inte stöd för konversationsfunktioner"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Stäng"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Visa inte igen"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Det går inte att ändra de här aviseringarna."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Aktivera/inaktivera låstangentsläget"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Aktivera/inaktivera långsamma tangenter"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Aktivera/inaktivera röststyrning"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Aktivera/inaktivera TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Aktivera/inaktivera förstoring"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Aktivera Textuppläsning"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Stör ej"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Genväg till volymknappar"</string> <string name="battery" msgid="769686279459897127">"Batteri"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index bcad102cab63..cae856503bed 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Huonyeshwa kwenye sehemu ya juu ya arifa za mazungumzo na kama picha ya wasifu kwenye skrini iliyofungwa. Huonekana kama kiputo na hukatiza kipengele cha Usinisumbue"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Kipaumbele"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> haitumii vipengele vya mazungumzo"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Ondoa"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Usionyeshe tena"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Arifa hizi haziwezi kubadilishwa."</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index f5f110af6701..d9781b6accc9 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"உரையாடல் அறிவிப்புகளின் மேற்பகுதியில் காட்டப்படும், திரை பூட்டப்பட்டிருக்கும்போது சுயவிவரப் படமாகக் காட்டப்படும், குமிழாகத் தோன்றும், தொந்தரவு செய்ய வேண்டாம் அம்சம் இயக்கப்பட்டிருக்கும்போதும் காட்டப்படும்"</string> <string name="notification_priority_title" msgid="2079708866333537093">"முன்னுரிமை"</string> <string name="no_shortcut" msgid="8257177117568230126">"உரையாடல் அம்சங்களை <xliff:g id="APP_NAME">%1$s</xliff:g> ஆதரிக்காது"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"மூடுக"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"மீண்டும் காட்டாதே"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"இந்த அறிவிப்புகளை மாற்ற இயலாது."</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 0f365c920bbf..e31f8662b38e 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"బ్యాటరీ శాతం తెలియదు."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"<xliff:g id="BLUETOOTH">%s</xliff:g>కి కనెక్ట్ చేయబడింది."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"<xliff:g id="CAST">%s</xliff:g>కి కనెక్ట్ చేయబడింది."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"గ్రూప్ను విస్తరించండి."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"యాప్ను తెరవండి."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"కనెక్ట్ చేయబడలేదు."</string> <string name="data_connection_roaming" msgid="375650836665414797">"రోమింగ్"</string> <string name="cell_data_off" msgid="4886198950247099526">"ఆఫ్ చేయండి"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"హబ్ మోడ్ను అన్వేషించండి"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"ఛార్జింగ్ అయ్యే సమయంలో మీకు ఇష్టమైన విడ్జెట్లను, స్క్రీన్ సేవర్లను యాక్సెస్ చేయండి."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"ప్రారంభించండి"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"ఛార్జింగ్ చేసేటప్పుడు మీకు ఇష్టమైన స్క్రీన్ సేవర్లను చూపండి"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"సంభాషణ నోటిఫికేషన్ల ఎగువున, లాక్ స్క్రీన్లో ప్రొఫైల్ ఫోటోగా చూపిస్తుంది, బబుల్గా కనిపిస్తుంది, \'అంతరాయం కలిగించవద్దు\'ను అంతరాయం కలిగిస్తుంది"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ప్రాధాన్యత"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> సంభాషణ ఫీచర్లను సపోర్ట్ చేయదు"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"విస్మరించండి"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"మళ్లీ చూపవద్దు"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ఈ నోటిఫికేషన్లను ఎడిట్ చేయడం వీలుపడదు."</string> @@ -924,12 +923,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"స్టిక్కీ కీలను టోగుల్ చేయండి"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"నిదానంగా పనిచేసే కీలను టోగుల్ చేయండి"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Voice Accessను టోగుల్ చేయండి"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"TalkBackను టోగుల్ చేయండి"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"మ్యాగ్నిఫికేషన్ను టోగుల్ చేయండి"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"\'వినడానికి ఎంచుకోండి\'ని యాక్టివేట్ చేయండి"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"అంతరాయం కలిగించవద్దు"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"వాల్యూమ్ బటన్ల షార్ట్కట్"</string> <string name="battery" msgid="769686279459897127">"బ్యాటరీ"</string> @@ -1309,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"తెరవడానికి వేలిముద్రను ఉపయోగించండి"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ప్రామాణీకరణ అవసరం. ప్రామాణీకరించడానికి వేలిముద్ర సెన్సార్ను తాకండి."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"కాల్ కొనసాగుతోంది"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"కొనసాగుతోంది"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"మొబైల్ డేటా"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"కనెక్ట్ చేయబడింది"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"తాత్కాలికంగా కనెక్ట్ చేయబడింది"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 81b7e1922367..8f34f8a2122e 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"ไม่ทราบเปอร์เซ็นต์แบตเตอรี่"</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"เชื่อมต่อกับ <xliff:g id="BLUETOOTH">%s</xliff:g> แล้ว"</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"เชื่อมต่อกับ <xliff:g id="CAST">%s</xliff:g>"</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"ขยายกลุ่ม"</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"เปิดแอปพลิเคชัน"</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"ไม่ได้เชื่อมต่อ"</string> <string name="data_connection_roaming" msgid="375650836665414797">"โรมมิ่ง"</string> <string name="cell_data_off" msgid="4886198950247099526">"ปิด"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"สำรวจโหมดฮับ"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"เข้าถึงวิดเจ็ตและภาพพักหน้าจอโปรดขณะชาร์จ"</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"มาเริ่มกันเลย"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"แสดงภาพพักหน้าจอโปรดขณะชาร์จ"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"แสดงที่ด้านบนของการแจ้งเตือนการสนทนาและเป็นรูปโปรไฟล์บนหน้าจอล็อก ปรากฏเป็นบับเบิล แสดงในโหมดห้ามรบกวน"</string> <string name="notification_priority_title" msgid="2079708866333537093">"สำคัญ"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ไม่รองรับฟีเจอร์การสนทนา"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"ปิด"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"ไม่ต้องแสดงอีก"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"แก้ไขการแจ้งเตือนเหล่านี้ไม่ได้"</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"ใช้ลายนิ้วมือเพื่อเปิด"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"ต้องมีการตรวจสอบสิทธิ์ แตะเซ็นเซอร์ลายนิ้วมือเพื่อตรวจสอบสิทธิ์"</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"สายที่สนทนาอยู่"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"ดำเนินอยู่"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"อินเทอร์เน็ตมือถือ"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"เชื่อมต่อแล้ว"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"เชื่อมต่อแล้วชั่วคราว"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 4b744f518021..2c72bd80c031 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Hindi alam ang porsyento ng baterya."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Nakakonekta sa <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Nakakonekta sa <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"I-expand ang grupo."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Buksan ang application."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Hindi nakakonekta."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roaming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Naka-off"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"I-explore ang hub mode"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"I-access ang mga paborito mong widget at screen saver habang nagcha-charge."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Tara na"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Ipakita ang mga paborito mong screensaver habang nagcha-charge"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Makikita sa itaas ng mga notification ng pag-uusap at bilang larawan sa profile sa lock screen, lumalabas bilang bubble, naaabala ang Huwag Istorbohin"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priyoridad"</string> <string name="no_shortcut" msgid="8257177117568230126">"Hindi sinusuportahan ng <xliff:g id="APP_NAME">%1$s</xliff:g> ang mga feature ng pag-uusap"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"I-dismiss"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Huwag nang ipakita ulit"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Hindi puwedeng baguhin ang mga notification na ito."</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Gamitin ang fingerprint para buksan"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Kailangan ng pag-authenticate. Pindutin ang sensor para sa fingerprint para mag-authenticate."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Kasalukuyang tawag"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Kasalukuyan"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobile data"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Nakakonekta"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Pansamantalang nakakonekta"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index fbdc7b670273..4ca73158c240 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Görüşme bildirimlerinin üstünde ve kilit ekranında profil resmi olarak gösterilir, baloncuk olarak görünür, Rahatsız Etmeyin\'i kesintiye uğratır"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Öncelikli"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>, sohbet özelliklerini desteklemiyor"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Kapat"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Tekrar gösterme"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirimler değiştirilemez."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Yapışkan tuşları aç/kapat"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Yavaş tuşları aç/kapat"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Sesli Erişim\'i aç/kapat"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"TalkBack\'i aç/kapat"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Büyüteci aç/kapat"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Seç ve Dinle\'yi etkinleştir"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Rahatsız Etmeyin"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Ses düğmeleri kısayolu"</string> <string name="battery" msgid="769686279459897127">"Pil"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 4a89f20092ee..bf4444ee8898 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"З’являється вгорі сповіщень про розмови і як зображення профілю на заблокованому екрані, відображається як спливаючий чат, перериває режим \"Не турбувати\""</string> <string name="notification_priority_title" msgid="2079708866333537093">"Пріоритет"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не підтримує функції розмов"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Закрити"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Більше не показувати"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ці сповіщення не можна змінити."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Увімкнути або вимкнути залипання клавіш"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Увімкнути або вимкнути повільні клавіші"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Увімкнути або вимкнути Голосовий доступ"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Увімкнути або вимкнути TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Увімкнути або вимкнути збільшення"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Активувати функцію \"Читання з екрана\""</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Не турбувати"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Кнопки гучності на корпусі"</string> <string name="battery" msgid="769686279459897127">"Акумулятор"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 5c97d27d2b5f..584375f8ac5f 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"یہ گفتگو کی اطلاعات کے اوپری حصّے پر اور مقفل اسکرین پر پروفائل کی تصویر کے بطور دکھائی دیتا ہے، بلبلے کے بطور ظاہر ہوتا ہے، \'ڈسٹرب نہ کریں\' میں مداخلت کرتا ہے"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ترجیح"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ایپ گفتگو کی خصوصیات کو سپورٹ نہیں کرتی ہے"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"برخاست کریں"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"دوبارہ نہ دکھائیں"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"ان اطلاعات کی ترمیم نہیں کی جا سکتی۔"</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"دبی رہنے والی کلیدیں ٹوگل کریں"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"سست کلیدیں ٹوگل کریں"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"صوتی رسائی کو ٹوگل کریں"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"TalkBack کو ٹوگل کریں"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"میگنیفکیشن کو ٹوگل کریں"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"سننے کیلئے منتخب کریں کو فعال کریں"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"ڈسٹرب نہ کریں"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"والیوم بٹنز کے شارٹ کٹ"</string> <string name="battery" msgid="769686279459897127">"بیٹری"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 9a759430cfdc..c69346f95c5c 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -250,10 +250,8 @@ <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batareya quvvati foizi nomaʼlum."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Ulangan: <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> <string name="accessibility_cast_name" msgid="7344437925388773685">"Bunga ulangan: <xliff:g id="CAST">%s</xliff:g>."</string> - <!-- no translation found for accessibility_expand_group (521237935987978624) --> - <skip /> - <!-- no translation found for accessibility_open_application (1749126077501259712) --> - <skip /> + <string name="accessibility_expand_group" msgid="521237935987978624">"Guruhni yoying."</string> + <string name="accessibility_open_application" msgid="1749126077501259712">"Ilovani oching."</string> <string name="accessibility_not_connected" msgid="4061305616351042142">"Ulanmagan."</string> <string name="data_connection_roaming" msgid="375650836665414797">"Rouming"</string> <string name="cell_data_off" msgid="4886198950247099526">"Oʻchiq"</string> @@ -543,8 +541,7 @@ <string name="hub_onboarding_bottom_sheet_title" msgid="162092881395529947">"Hub rejimi bilan tanishing"</string> <string name="hub_onboarding_bottom_sheet_text" msgid="8589816797970240544">"Quvvatlash paytida sevimli vidjetlar va ekran lavhalaridan foydalaning."</string> <string name="hub_onboarding_bottom_sheet_action_button" msgid="6161983690157872829">"Boshlash"</string> - <!-- no translation found for glanceable_hub_to_dream_button_tooltip (9018287673822335829) --> - <skip /> + <string name="glanceable_hub_to_dream_button_tooltip" msgid="9018287673822335829">"Quvvatlash paytida sevimli ekran lavhalari koʻrsatilsin"</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> @@ -807,6 +804,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Suhbat bildirishnomalari tepasida va ekran qulfida profil rasmi sifatida chiqariladi, bulutcha sifatida chiqadi, Bezovta qilinmasin rejimini bekor qiladi"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Muhim"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ilovasida suhbat funksiyalari ishlamaydi"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Yopish"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Boshqa chiqmasin"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Bu bildirishnomalarni tahrirlash imkonsiz."</string> @@ -1306,8 +1305,7 @@ <string name="keyguard_try_fingerprint" msgid="2825130772993061165">"Ochish uchun barmoq izidan foydalaning"</string> <string name="accessibility_fingerprint_bouncer" msgid="7189102492498735519">"Haqiqiylikni tekshirish talab etiladi. Autentifikatsiya uchun barmoq izi skaneriga tegining."</string> <string name="ongoing_call_content_description" msgid="6394763878322348560">"Joriy chaqiruv"</string> - <!-- no translation found for ongoing_notification_extra_content_description (2098752668861351265) --> - <skip /> + <string name="ongoing_notification_extra_content_description" msgid="2098752668861351265">"Hali bajarilmagan"</string> <string name="mobile_data_settings_title" msgid="3955246641380064901">"Mobil internet"</string> <string name="mobile_data_connection_active" msgid="944490013299018227">"Ulangan"</string> <string name="mobile_data_temp_connection_active" msgid="4590222725908806824">"Vaqtincha ulangan"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index d023242d73cd..eee95832f1ab 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Hiện ở đầu phần thông báo cuộc trò chuyện và ở dạng ảnh hồ sơ trên màn hình khóa, xuất hiện ở dạng bong bóng, làm gián đoạn chế độ Không làm phiền"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Mức độ ưu tiên"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> không hỗ trợ các tính năng trò chuyện"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Đóng"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Không hiện lại"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Không thể sửa đổi các thông báo này."</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Bật/tắt phím cố định"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Bật/tắt phím chậm"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Bật/tắt tính năng Điều khiển bằng giọng nói"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Bật/tắt TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Bật/tắt tính năng thu phóng"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Kích hoạt tính năng Chọn để nói"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Không làm phiền"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Phím tắt các nút âm lượng"</string> <string name="battery" msgid="769686279459897127">"Pin"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 23178d8d04fb..81f1bffdf4ab 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"以气泡形式显示在对话通知顶部(屏幕锁定时显示为个人资料照片),并且会中断勿扰模式"</string> <string name="notification_priority_title" msgid="2079708866333537093">"优先"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>不支持对话功能"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"关闭"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"不再显示"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"无法修改这些通知。"</string> @@ -924,12 +926,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"开启/关闭粘滞键"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"开启/关闭慢速键"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"开启/关闭语音操控"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"开启/关闭 TalkBack"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"开启/关闭放大功能"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"启用“随选朗读”"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"勿扰"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"音量按钮快捷键"</string> <string name="battery" msgid="769686279459897127">"电池"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 794a7ba1ac67..b21f13f8102c 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"以對話氣泡形式顯示在對話通知頂部 (在上鎖畫面會顯示為個人檔案相片),並會中斷「請勿打擾」模式"</string> <string name="notification_priority_title" msgid="2079708866333537093">"優先"</string> <string name="no_shortcut" msgid="8257177117568230126">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」不支援對話功能"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"關閉"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"不要再顯示"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 689475c89f8c..f2b0b86411e7 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -807,6 +807,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"以對話框的形式顯示在對話通知頂端 (螢幕鎖定時會顯示為個人資料相片),並會中斷「零打擾」模式"</string> <string name="notification_priority_title" msgid="2079708866333537093">"優先"</string> <string name="no_shortcut" msgid="8257177117568230126">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」不支援對話功能"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"關閉"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"不要再顯示"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"無法修改這些通知。"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index d07a44dba272..445bdc013dfb 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -809,6 +809,8 @@ <string name="notification_channel_summary_priority_all" msgid="7151752959650048285">"Ivela phezu kwezaziso zengxoxo futhi njengesithombe sephrofayela esikrinini sokukhiya, ivela njengebhamuza, ukuphazamisa okuthi Ungaphazamisi"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Okubalulekile"</string> <string name="no_shortcut" msgid="8257177117568230126">"I-<xliff:g id="APP_NAME">%1$s</xliff:g> ayisekeli izici zengxoxo"</string> + <!-- no translation found for notification_guts_bundle_feedback (7581587973879656500) --> + <skip /> <string name="notification_inline_dismiss" msgid="88423586921134258">"Chitha"</string> <string name="notification_inline_disable_promotion" msgid="6880961831026048166">"Ungabonisi futhi"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Lezi zaziso azikwazi ukushintshwa."</string> @@ -926,12 +928,9 @@ <string name="group_accessibility_toggle_sticky_keys" msgid="7722214637652104184">"Guqula okhiye abanamathelayo"</string> <string name="group_accessibility_toggle_slow_keys" msgid="8569881436531795062">"Guqula okhiye abanensayo"</string> <string name="group_accessibility_toggle_voice_access" msgid="5436708239015479017">"Guqula Ukufinyelela Kwezwi"</string> - <!-- no translation found for group_accessibility_toggle_talkback (5017967056006325713) --> - <skip /> - <!-- no translation found for group_accessibility_toggle_magnification (3892267763383743128) --> - <skip /> - <!-- no translation found for group_accessibility_activate_select_to_speak (9157775915495428592) --> - <skip /> + <string name="group_accessibility_toggle_talkback" msgid="5017967056006325713">"Guqula ITalkback"</string> + <string name="group_accessibility_toggle_magnification" msgid="3892267763383743128">"Guqula Ukukhuliswa"</string> + <string name="group_accessibility_activate_select_to_speak" msgid="9157775915495428592">"Sebenzisa okuthi Khetha ukuze Ukhulume"</string> <string name="volume_and_do_not_disturb" msgid="502044092739382832">"Ungaphazamisi"</string> <string name="volume_dnd_silent" msgid="4154597281458298093">"Izinqamuleli zezinkinobho zevolomu"</string> <string name="battery" msgid="769686279459897127">"Ibhethri"</string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index fcd3a51d5bb3..220d8a99d130 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1993,10 +1993,14 @@ </item> <!-- The padding applied to the dream overlay container --> - <dimen name="dream_overlay_container_padding_start">0dp</dimen> - <dimen name="dream_overlay_container_padding_end">0dp</dimen> + <dimen name="dream_overlay_container_padding_start">40dp</dimen> + <dimen name="dream_overlay_container_padding_end">40dp</dimen> <dimen name="dream_overlay_container_padding_top">0dp</dimen> - <dimen name="dream_overlay_container_padding_bottom">0dp</dimen> + <dimen name="dream_overlay_container_padding_bottom">40dp</dimen> + <dimen name="dream_overlay_container_small_padding_start">32dp</dimen> + <dimen name="dream_overlay_container_small_padding_end">32dp</dimen> + <dimen name="dream_overlay_container_small_padding_top">0dp</dimen> + <dimen name="dream_overlay_container_small_padding_bottom">32dp</dimen> <!-- The margin applied between complications --> <dimen name="dream_overlay_complication_margin">0dp</dimen> diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index dc089e707ca3..47a9bd638088 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -234,6 +234,7 @@ <item type="id" name="nssl_placeholder" /> <item type="id" name="nssl_placeholder_barrier_bottom" /> <item type="id" name="small_clock_guideline_top" /> + <item type="id" name="smart_space_barrier_top" /> <item type="id" name="smart_space_barrier_bottom" /> <item type="id" name="split_shade_guideline" /> <item type="id" name="start_button" /> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 3d675fa01b15..f6d0f4e26d26 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -146,6 +146,9 @@ import com.android.systemui.deviceentry.shared.model.HelpFaceAuthenticationStatu import com.android.systemui.deviceentry.shared.model.SuccessFaceAuthenticationStatus; import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpsysTableLogger; +import com.android.systemui.keyguard.KeyguardWmStateRefactor; +import com.android.systemui.keyguard.domain.interactor.KeyguardServiceShowLockscreenInteractor; +import com.android.systemui.keyguard.domain.interactor.ShowWhileAwakeReason; import com.android.systemui.keyguard.shared.constants.TrustAgentUiEvent; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.clocks.WeatherData; @@ -298,6 +301,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private final Provider<SceneInteractor> mSceneInteractor; private final Provider<AlternateBouncerInteractor> mAlternateBouncerInteractor; private final Provider<CommunalSceneInteractor> mCommunalSceneInteractor; + private final KeyguardServiceShowLockscreenInteractor mKeyguardServiceShowLockscreenInteractor; private final AuthController mAuthController; private final UiEventLogger mUiEventLogger; private final Set<String> mAllowFingerprintOnOccludingActivitiesFromPackage; @@ -2214,7 +2218,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab Provider<AlternateBouncerInteractor> alternateBouncerInteractor, Provider<JavaAdapter> javaAdapter, Provider<SceneInteractor> sceneInteractor, - Provider<CommunalSceneInteractor> communalSceneInteractor) { + Provider<CommunalSceneInteractor> communalSceneInteractor, + KeyguardServiceShowLockscreenInteractor keyguardServiceShowLockscreenInteractor) { mContext = context; mSubscriptionManager = subscriptionManager; mUserTracker = userTracker; @@ -2264,6 +2269,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab mJavaAdapter = javaAdapter; mSceneInteractor = sceneInteractor; mCommunalSceneInteractor = communalSceneInteractor; + mKeyguardServiceShowLockscreenInteractor = keyguardServiceShowLockscreenInteractor; mHandler = new Handler(mainLooper) { @Override @@ -2545,6 +2551,13 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab ); } + if (KeyguardWmStateRefactor.isEnabled()) { + mJavaAdapter.get().alwaysCollectFlow( + mKeyguardServiceShowLockscreenInteractor.getShowNowEvents(), + this::onKeyguardServiceShowLockscreenNowEvents + ); + } + if (glanceableHubV2()) { mJavaAdapter.get().alwaysCollectFlow( mCommunalSceneInteractor.get().isCommunalVisible(), @@ -2578,6 +2591,12 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab handlePrimaryBouncerChanged(primaryBouncerIsOrWillBeShowing, primaryBouncerFullyShown); } + void onKeyguardServiceShowLockscreenNowEvents(ShowWhileAwakeReason reason) { + if (reason == ShowWhileAwakeReason.FOLDED_WITH_SWIPE_UP_TO_CONTINUE) { + mMainExecutor.execute(this::tryForceIsDismissibleKeyguard); + } + } + private void initializeSimState() { // Set initial sim states values. for (int slot = 0; slot < mTelephonyManager.getActiveModemCount(); slot++) { diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContent.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContent.kt index 8bc929985052..710fde5c2130 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContent.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContent.kt @@ -24,13 +24,17 @@ import androidx.compose.ui.viewinterop.AndroidView import com.android.systemui.res.R @Composable -fun BluetoothDetailsContent() { +fun BluetoothDetailsContent(detailsContentViewModel: BluetoothTileDialogViewModel) { AndroidView( modifier = Modifier.fillMaxSize(), factory = { context -> // Inflate with the existing dialog xml layout - LayoutInflater.from(context).inflate(R.layout.bluetooth_tile_dialog, null) - // TODO: b/378513956 - Implement the bluetooth details view + val view = + LayoutInflater.from(context) + .inflate(R.layout.bluetooth_tile_dialog, /* root= */ null) + detailsContentViewModel.showDetailsContent(/* expandable= */ null, view) + view }, + onRelease = { detailsContentViewModel.contentManager.releaseView() }, ) } diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentManager.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentManager.kt index 0be28f3c5a97..d873f41309cc 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentManager.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsContentManager.kt @@ -61,7 +61,7 @@ data class DeviceItemClick(val deviceItem: DeviceItem, val clickedView: View, va /** View content manager for showing active, connected and saved bluetooth devices. */ class BluetoothDetailsContentManager @AssistedInject -internal constructor( +constructor( @Assisted private val initialUiProperties: BluetoothTileDialogViewModel.UiProperties, @Assisted private val cachedContentHeight: Int, @Assisted private val bluetoothTileDialogCallback: BluetoothTileDialogCallback, @@ -112,7 +112,7 @@ internal constructor( private lateinit var scrollViewContent: View @AssistedFactory - internal interface Factory { + interface Factory { fun create( initialUiProperties: BluetoothTileDialogViewModel.UiProperties, cachedContentHeight: Int, diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsViewModel.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsViewModel.kt index ac4d82a95834..44475318a61e 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothDetailsViewModel.kt @@ -18,11 +18,12 @@ package com.android.systemui.bluetooth.qsdialog import com.android.systemui.plugins.qs.TileDetailsViewModel -class BluetoothDetailsViewModel(onLongClick: () -> Unit) : TileDetailsViewModel() { - private val _onLongClick = onLongClick - +class BluetoothDetailsViewModel( + private val onSettingsClick: () -> Unit, + val detailsContentViewModel: BluetoothTileDialogViewModel, +) : TileDetailsViewModel() { override fun clickOnSettingsButton() { - _onLongClick() + onSettingsClick() } override fun getTitle(): String { diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt index 3e61c45c7f25..01be820a2fde 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegate.kt @@ -22,6 +22,7 @@ import com.android.internal.logging.UiEventLogger import com.android.systemui.qs.flags.QsDetailedView import com.android.systemui.res.R import com.android.systemui.shade.domain.interactor.ShadeDialogContextInteractor +import com.android.systemui.shade.domain.interactor.ShadeModeInteractor import com.android.systemui.statusbar.phone.SystemUIDialog import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -30,7 +31,7 @@ import dagger.assisted.AssistedInject /** Dialog for showing active, connected and saved bluetooth devices. */ class BluetoothTileDialogDelegate @AssistedInject -internal constructor( +constructor( @Assisted private val initialUiProperties: BluetoothTileDialogViewModel.UiProperties, @Assisted private val cachedContentHeight: Int, @Assisted private val bluetoothTileDialogCallback: BluetoothTileDialogCallback, @@ -39,12 +40,13 @@ internal constructor( private val systemuiDialogFactory: SystemUIDialog.Factory, private val shadeDialogContextInteractor: ShadeDialogContextInteractor, private val bluetoothDetailsContentManagerFactory: BluetoothDetailsContentManager.Factory, + private val shadeModeInteractor: ShadeModeInteractor, ) : SystemUIDialog.Delegate { lateinit var contentManager: BluetoothDetailsContentManager @AssistedFactory - internal interface Factory { + interface Factory { fun create( initialUiProperties: BluetoothTileDialogViewModel.UiProperties, cachedContentHeight: Int, @@ -54,8 +56,11 @@ internal constructor( } override fun createDialog(): SystemUIDialog { - // If `QsDetailedView` is enabled, it should show the details view. - QsDetailedView.assertInLegacyMode() + // TODO (b/393628355): remove this after the details view is supported for single shade. + if (shadeModeInteractor.isDualShade) { + // If `QsDetailedView` is enabled, it should show the details view. + QsDetailedView.assertInLegacyMode() + } return systemuiDialogFactory.create(this, shadeDialogContextInteractor.context) } diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt index 9492abbeb087..308c9d10db93 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt @@ -66,7 +66,7 @@ import kotlinx.coroutines.withContext * by the dialog view. */ @SysUISingleton -internal class BluetoothTileDialogViewModel +class BluetoothTileDialogViewModel @Inject constructor( private val deviceItemInteractor: DeviceItemInteractor, @@ -396,7 +396,7 @@ constructor( else R.string.bt_is_off } - internal data class UiProperties( + data class UiProperties( @StringRes val subTitleResId: Int, val autoOnToggleVisibility: Int, @DimenRes val scrollViewMinHeightResId: Int, diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/view/LongPressHandlingView.kt b/packages/SystemUI/src/com/android/systemui/common/ui/view/LongPressHandlingView.kt index 9c4736a13b46..dbe3dd09cb13 100644 --- a/packages/SystemUI/src/com/android/systemui/common/ui/view/LongPressHandlingView.kt +++ b/packages/SystemUI/src/com/android/systemui/common/ui/view/LongPressHandlingView.kt @@ -45,11 +45,7 @@ class LongPressHandlingView( longPressDuration: () -> Long, allowedTouchSlop: Int = ViewConfiguration.getTouchSlop(), logger: LongPressHandlingViewLogger? = null, -) : - View( - context, - attrs, - ) { +) : View(context, attrs) { init { setupAccessibilityDelegate() @@ -62,15 +58,10 @@ class LongPressHandlingView( interface Listener { /** Notifies that a long-press has been detected by the given view. */ - fun onLongPressDetected( - view: View, - x: Int, - y: Int, - isA11yAction: Boolean = false, - ) + fun onLongPressDetected(view: View, x: Int, y: Int, isA11yAction: Boolean = false) /** Notifies that the gesture was too short for a long press, it is actually a click. */ - fun onSingleTapDetected(view: View) = Unit + fun onSingleTapDetected(view: View, x: Int, y: Int) = Unit } var listener: Listener? = null @@ -82,23 +73,17 @@ class LongPressHandlingView( postDelayed = { block, timeoutMs -> val dispatchToken = Any() - handler.postDelayed( - block, - dispatchToken, - timeoutMs, - ) + handler.postDelayed(block, dispatchToken, timeoutMs) DisposableHandle { handler.removeCallbacksAndMessages(dispatchToken) } }, isAttachedToWindow = ::isAttachedToWindow, onLongPressDetected = { x, y -> - listener?.onLongPressDetected( - view = this, - x = x, - y = y, - ) + listener?.onLongPressDetected(view = this, x = x, y = y) + }, + onSingleTapDetected = { x, y -> + listener?.onSingleTapDetected(this@LongPressHandlingView, x = x, y = y) }, - onSingleTapDetected = { listener?.onSingleTapDetected(this@LongPressHandlingView) }, longPressDuration = longPressDuration, allowedTouchSlop = allowedTouchSlop, logger = logger, @@ -129,7 +114,7 @@ class LongPressHandlingView( object : AccessibilityDelegate() { override fun onInitializeAccessibilityNodeInfo( v: View, - info: AccessibilityNodeInfo + info: AccessibilityNodeInfo, ) { super.onInitializeAccessibilityNodeInfo(v, info) if ( @@ -143,7 +128,7 @@ class LongPressHandlingView( override fun performAccessibilityAction( host: View, action: Int, - args: Bundle? + args: Bundle?, ): Boolean { return if ( interactionHandler.isLongPressHandlingEnabled && @@ -179,7 +164,7 @@ private fun MotionEvent.toModel(): LongPressHandlingViewInteractionHandler.Motio ) MotionEvent.ACTION_MOVE -> LongPressHandlingViewInteractionHandler.MotionEventModel.Move( - distanceMoved = distanceMoved(), + distanceMoved = distanceMoved() ) MotionEvent.ACTION_UP -> LongPressHandlingViewInteractionHandler.MotionEventModel.Up( diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/view/LongPressHandlingViewInteractionHandler.kt b/packages/SystemUI/src/com/android/systemui/common/ui/view/LongPressHandlingViewInteractionHandler.kt index 4e38a4913fe6..a5d45aff4dc7 100644 --- a/packages/SystemUI/src/com/android/systemui/common/ui/view/LongPressHandlingViewInteractionHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/common/ui/view/LongPressHandlingViewInteractionHandler.kt @@ -17,6 +17,7 @@ package com.android.systemui.common.ui.view +import android.graphics.Point import com.android.systemui.log.LongPressHandlingViewLogger import kotlinx.coroutines.DisposableHandle @@ -32,7 +33,7 @@ class LongPressHandlingViewInteractionHandler( /** Callback reporting the a long-press gesture was detected at the given coordinates. */ private val onLongPressDetected: (x: Int, y: Int) -> Unit, /** Callback reporting the a single tap gesture was detected at the given coordinates. */ - private val onSingleTapDetected: () -> Unit, + private val onSingleTapDetected: (x: Int, y: Int) -> Unit, /** Time for the touch to be considered a long-press in ms */ var longPressDuration: () -> Long, /** @@ -47,19 +48,11 @@ class LongPressHandlingViewInteractionHandler( sealed class MotionEventModel { object Other : MotionEventModel() - data class Down( - val x: Int, - val y: Int, - ) : MotionEventModel() + data class Down(val x: Int, val y: Int) : MotionEventModel() - data class Move( - val distanceMoved: Float, - ) : MotionEventModel() + data class Move(val distanceMoved: Float) : MotionEventModel() - data class Up( - val distanceMoved: Float, - val gestureDuration: Long, - ) : MotionEventModel() + data class Up(val distanceMoved: Float, val gestureDuration: Long) : MotionEventModel() object Cancel : MotionEventModel() } @@ -67,14 +60,18 @@ class LongPressHandlingViewInteractionHandler( var isLongPressHandlingEnabled: Boolean = false var scheduledLongPressHandle: DisposableHandle? = null + /** Record coordinate for last DOWN event for single tap */ + val lastEventDownCoordinate = Point(-1, -1) + fun onTouchEvent(event: MotionEventModel?): Boolean { if (!isLongPressHandlingEnabled) { return false } - return when (event) { is MotionEventModel.Down -> { scheduleLongPress(event.x, event.y) + lastEventDownCoordinate.x = event.x + lastEventDownCoordinate.y = event.y true } is MotionEventModel.Move -> { @@ -92,7 +89,7 @@ class LongPressHandlingViewInteractionHandler( event.gestureDuration < longPressDuration() ) { logger?.dispatchingSingleTap() - dispatchSingleTap() + dispatchSingleTap(lastEventDownCoordinate.x, lastEventDownCoordinate.y) } false } @@ -105,29 +102,20 @@ class LongPressHandlingViewInteractionHandler( } } - private fun scheduleLongPress( - x: Int, - y: Int, - ) { + private fun scheduleLongPress(x: Int, y: Int) { val duration = longPressDuration() logger?.schedulingLongPress(duration) scheduledLongPressHandle = postDelayed( { logger?.longPressTriggered() - dispatchLongPress( - x = x, - y = y, - ) + dispatchLongPress(x = x, y = y) }, duration, ) } - private fun dispatchLongPress( - x: Int, - y: Int, - ) { + private fun dispatchLongPress(x: Int, y: Int) { if (!isAttachedToWindow()) { return } @@ -139,11 +127,11 @@ class LongPressHandlingViewInteractionHandler( scheduledLongPressHandle?.dispose() } - private fun dispatchSingleTap() { + private fun dispatchSingleTap(x: Int, y: Int) { if (!isAttachedToWindow()) { return } - onSingleTapDetected() + onSingleTapDetected(x, y) } } diff --git a/packages/SystemUI/src/com/android/systemui/communal/util/WindowSizeUtils.kt b/packages/SystemUI/src/com/android/systemui/communal/util/WindowSizeUtils.kt new file mode 100644 index 000000000000..7e62f0fdc821 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/communal/util/WindowSizeUtils.kt @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.communal.util + +import android.content.Context +import androidx.compose.ui.unit.dp +import androidx.window.layout.WindowMetricsCalculator + +/** + * [WindowSizeUtils] defines viewport breakpoints that helps create responsive mobile layout. + * + * @see https://developer.android.com/develop/ui/views/layout/use-window-size-classes + */ +object WindowSizeUtils { + /** Compact screen width breakpoint. */ + val COMPACT_WIDTH = 600.dp + /** Medium screen width breakpoint. */ + val MEDIUM_WIDTH = 840.dp + /** Compact screen height breakpoint. */ + val COMPACT_HEIGHT = 480.dp + /** Expanded screen height breakpoint. */ + val EXPANDED_HEIGHT = 900.dp + + /** Whether the window size is compact, which reflects most mobile sizes in portrait. */ + @JvmStatic + fun isCompactWindowSize(context: Context): Boolean { + val metrics = WindowMetricsCalculator.getOrCreate().computeCurrentWindowMetrics(context) + val width = metrics.bounds.width() + return width / metrics.density < COMPACT_WIDTH.value + } +} diff --git a/packages/SystemUI/src/com/android/systemui/complication/ComplicationHostViewController.java b/packages/SystemUI/src/com/android/systemui/complication/ComplicationHostViewController.java index 35592a5d87d9..ee98a06371e9 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/ComplicationHostViewController.java +++ b/packages/SystemUI/src/com/android/systemui/complication/ComplicationHostViewController.java @@ -18,6 +18,7 @@ package com.android.systemui.complication; import static com.android.systemui.complication.dagger.ComplicationHostViewModule.SCOPED_COMPLICATIONS_LAYOUT; import static com.android.systemui.complication.dagger.ComplicationModule.SCOPED_COMPLICATIONS_MODEL; +import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow; import android.graphics.Rect; import android.graphics.Region; @@ -32,10 +33,14 @@ import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.Observer; import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.util.ViewController; import com.android.systemui.util.settings.SecureSettings; +import kotlinx.coroutines.CoroutineDispatcher; + import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -77,7 +82,9 @@ public class ComplicationHostViewController extends ViewController<ConstraintLay DreamOverlayStateController dreamOverlayStateController, LifecycleOwner lifecycleOwner, @Named(SCOPED_COMPLICATIONS_MODEL) ComplicationCollectionViewModel viewModel, - SecureSettings secureSettings) { + SecureSettings secureSettings, + ConfigurationInteractor configurationInteractor, + @Main CoroutineDispatcher mainDispatcher) { super(view); mLayoutEngine = layoutEngine; mLifecycleOwner = lifecycleOwner; @@ -87,6 +94,13 @@ public class ComplicationHostViewController extends ViewController<ConstraintLay // Whether animations are enabled. mIsAnimationEnabled = secureSettings.getFloatForUser( Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f, UserHandle.USER_CURRENT) != 0.0f; + // Update layout on configuration change like rotation, fold etc. + collectFlow( + view, + configurationInteractor.getMaxBounds(), + mLayoutEngine::updateLayoutEngine, + mainDispatcher + ); } /** diff --git a/packages/SystemUI/src/com/android/systemui/complication/ComplicationLayoutEngine.java b/packages/SystemUI/src/com/android/systemui/complication/ComplicationLayoutEngine.java index 15ec4d463163..d91fbab04f64 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/ComplicationLayoutEngine.java +++ b/packages/SystemUI/src/com/android/systemui/complication/ComplicationLayoutEngine.java @@ -27,16 +27,15 @@ import static com.android.systemui.complication.ComplicationLayoutParams.POSITIO import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATIONS_FADE_IN_DURATION; import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATIONS_FADE_OUT_DURATION; import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATION_DIRECTIONAL_SPACING_DEFAULT; -import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATION_MARGIN_POSITION_BOTTOM; -import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATION_MARGIN_POSITION_END; -import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATION_MARGIN_POSITION_START; -import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATION_MARGIN_POSITION_TOP; +import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATION_MARGINS; import static com.android.systemui.complication.dagger.ComplicationHostViewModule.SCOPED_COMPLICATIONS_LAYOUT; +import android.graphics.Rect; import android.util.Log; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.Constraints; @@ -52,11 +51,13 @@ import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.function.Consumer; import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Named; +import javax.inject.Provider; /** * {@link ComplicationLayoutEngine} arranges a collection of {@link ComplicationViewModel} based on @@ -401,6 +402,16 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll return mDirectionGroups.get(direction).add(entryBuilder); } + public void updateDirectionalMargins(Map<Integer, Margins> directionalMargins) { + // the new map should have the same set of directional keys as the old map + if (!(directionalMargins.keySet()) + .containsAll(mDirectionalMargins.keySet())) { + Log.e(TAG, "Directional margins map does not have the same keys"); + return; + } + mDirectionalMargins.replaceAll((direction, v) -> directionalMargins.get(direction)); + } + @Override public void onEntriesChanged() { // Whenever an entry is added/removed from a child {@link DirectionGroup}, it is vital @@ -584,42 +595,36 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll private final TouchInsetManager.TouchInsetSession mSession; private final int mFadeInDuration; private final int mFadeOutDuration; - private final HashMap<Integer, HashMap<Integer, Margins>> mPositionDirectionMarginMapping; - + private final HashMap<Integer, HashMap<Integer, Margins>> mPositionDirectionMarginMapping = + new HashMap<>(); + private final Provider<Margins> mComplicationMarginsProvider; + private Rect mScreenBounds = new Rect(); /** */ @Inject public ComplicationLayoutEngine(@Named(SCOPED_COMPLICATIONS_LAYOUT) ConstraintLayout layout, @Named(COMPLICATION_DIRECTIONAL_SPACING_DEFAULT) int defaultDirectionalSpacing, - @Named(COMPLICATION_MARGIN_POSITION_START) int complicationMarginPositionStart, - @Named(COMPLICATION_MARGIN_POSITION_TOP) int complicationMarginPositionTop, - @Named(COMPLICATION_MARGIN_POSITION_END) int complicationMarginPositionEnd, - @Named(COMPLICATION_MARGIN_POSITION_BOTTOM) int complicationMarginPositionBottom, + @Named(COMPLICATION_MARGINS) Provider<Margins> complicationMarginsProvider, TouchInsetManager.TouchInsetSession session, @Named(COMPLICATIONS_FADE_IN_DURATION) int fadeInDuration, - @Named(COMPLICATIONS_FADE_OUT_DURATION) int fadeOutDuration) { + @Named(COMPLICATIONS_FADE_OUT_DURATION) int fadeOutDuration + ) { mLayout = layout; mDefaultDirectionalSpacing = defaultDirectionalSpacing; mSession = session; mFadeInDuration = fadeInDuration; mFadeOutDuration = fadeOutDuration; - mPositionDirectionMarginMapping = generatePositionDirectionalMarginsMapping( - complicationMarginPositionStart, - complicationMarginPositionTop, - complicationMarginPositionEnd, - complicationMarginPositionBottom); + mComplicationMarginsProvider = complicationMarginsProvider; + updatePositionDirectionalMarginsMapping(mPositionDirectionMarginMapping, + mComplicationMarginsProvider.get()); } - private static HashMap<Integer, HashMap<Integer, Margins>> - generatePositionDirectionalMarginsMapping(int complicationMarginPositionStart, - int complicationMarginPositionTop, - int complicationMarginPositionEnd, - int complicationMarginPositionBottom) { - HashMap<Integer, HashMap<Integer, Margins>> mapping = new HashMap<>(); - - final Margins startMargins = new Margins(complicationMarginPositionStart, 0, 0, 0); - final Margins topMargins = new Margins(0, complicationMarginPositionTop, 0, 0); - final Margins endMargins = new Margins(0, 0, complicationMarginPositionEnd, 0); - final Margins bottomMargins = new Margins(0, 0, 0, complicationMarginPositionBottom); + private static void updatePositionDirectionalMarginsMapping( + Map<Integer, HashMap<Integer, Margins>> mapping, + Margins complicationMargins) { + final Margins startMargins = new Margins(complicationMargins.start, 0, 0, 0); + final Margins topMargins = new Margins(0, complicationMargins.top, 0, 0); + final Margins endMargins = new Margins(0, 0, complicationMargins.end, 0); + final Margins bottomMargins = new Margins(0, 0, 0, complicationMargins.bottom); addToMapping(mapping, POSITION_START | POSITION_TOP, DIRECTION_END, topMargins); addToMapping(mapping, POSITION_START | POSITION_TOP, DIRECTION_DOWN, startMargins); @@ -632,11 +637,9 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll addToMapping(mapping, POSITION_END | POSITION_BOTTOM, DIRECTION_START, bottomMargins); addToMapping(mapping, POSITION_END | POSITION_BOTTOM, DIRECTION_UP, endMargins); - - return mapping; } - private static void addToMapping(HashMap<Integer, HashMap<Integer, Margins>> mapping, + private static void addToMapping(Map<Integer, HashMap<Integer, Margins>> mapping, @Position int position, @Direction int direction, Margins margins) { if (!mapping.containsKey(position)) { mapping.put(position, new HashMap<>()); @@ -644,6 +647,28 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll mapping.get(position).put(direction, margins); } + /** + * Update margins on screen dimension change. + */ + public void updateLayoutEngine(@NonNull Rect bounds) { + if (bounds.width() == mScreenBounds.width() && bounds.height() == mScreenBounds.height()) { + return; + } + mScreenBounds = bounds; + updatePositionDirectionalMarginsMapping(mPositionDirectionMarginMapping, + mComplicationMarginsProvider.get()); + + // update each position group and layout of entries + for (Integer position : mPositions.keySet()) { + PositionGroup positionGroup = mPositions.get(position); + positionGroup.updateDirectionalMargins(mPositionDirectionMarginMapping + .get(position)); + positionGroup.onEntriesChanged(); + } + Log.d(TAG, "Updated margins for complications as screen size changed to width = " + + bounds.width() + "px, height = " + bounds.height() + "px."); + } + @Override public void setVisibility(int visibility) { if (visibility == View.VISIBLE) { diff --git a/packages/SystemUI/src/com/android/systemui/complication/dagger/ComplicationHostViewModule.java b/packages/SystemUI/src/com/android/systemui/complication/dagger/ComplicationHostViewModule.java index 9dd48eaa7551..e446fbf35543 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/dagger/ComplicationHostViewModule.java +++ b/packages/SystemUI/src/com/android/systemui/complication/dagger/ComplicationHostViewModule.java @@ -16,12 +16,15 @@ package com.android.systemui.complication.dagger; +import android.content.Context; import android.content.res.Resources; import android.view.LayoutInflater; import androidx.constraintlayout.widget.ConstraintLayout; import com.android.internal.util.Preconditions; +import com.android.systemui.communal.util.WindowSizeUtils; +import com.android.systemui.complication.ComplicationLayoutEngine; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.res.R; @@ -42,14 +45,7 @@ public abstract class ComplicationHostViewModule { public static final String COMPLICATIONS_FADE_IN_DURATION = "complications_fade_in_duration"; public static final String COMPLICATIONS_RESTORE_TIMEOUT = "complication_restore_timeout"; public static final String COMPLICATIONS_FADE_OUT_DELAY = "complication_fade_out_delay"; - public static final String COMPLICATION_MARGIN_POSITION_START = - "complication_margin_position_start"; - public static final String COMPLICATION_MARGIN_POSITION_TOP = - "complication_margin_position_top"; - public static final String COMPLICATION_MARGIN_POSITION_END = - "complication_margin_position_end"; - public static final String COMPLICATION_MARGIN_POSITION_BOTTOM = - "complication_margin_position_bottom"; + public static final String COMPLICATION_MARGINS = "complication_margins"; /** * Generates a {@link ConstraintLayout}, which can host @@ -72,28 +68,32 @@ public abstract class ComplicationHostViewModule { return resources.getDimensionPixelSize(R.dimen.dream_overlay_complication_margin); } + /** + * Use small margins for compact window width (mobile portrait), and regular margins for + * medium and expanded width (mobile landscape, tablet and large unfolded). + */ @Provides - @Named(COMPLICATION_MARGIN_POSITION_START) - static int providesComplicationMarginPositionStart(@Main Resources resources) { - return resources.getDimensionPixelSize(R.dimen.dream_overlay_container_padding_start); - } - - @Provides - @Named(COMPLICATION_MARGIN_POSITION_TOP) - static int providesComplicationMarginPositionTop(@Main Resources resources) { - return resources.getDimensionPixelSize(R.dimen.dream_overlay_container_padding_top); - } - - @Provides - @Named(COMPLICATION_MARGIN_POSITION_END) - static int providesComplicationMarginPositionEnd(@Main Resources resources) { - return resources.getDimensionPixelSize(R.dimen.dream_overlay_container_padding_end); - } - - @Provides - @Named(COMPLICATION_MARGIN_POSITION_BOTTOM) - static int providesComplicationMarginPositionBottom(@Main Resources resources) { - return resources.getDimensionPixelSize(R.dimen.dream_overlay_container_padding_bottom); + @Named(COMPLICATION_MARGINS) + static ComplicationLayoutEngine.Margins providesComplicationMargins(@Main Resources resources, + Context context) { + return WindowSizeUtils.isCompactWindowSize(context) + ? new ComplicationLayoutEngine.Margins(resources.getDimensionPixelSize( + R.dimen.dream_overlay_container_small_padding_start), + resources.getDimensionPixelSize( + R.dimen.dream_overlay_container_small_padding_top), + resources.getDimensionPixelSize( + R.dimen.dream_overlay_container_small_padding_end), + resources.getDimensionPixelSize( + R.dimen.dream_overlay_container_small_padding_bottom)) : + new ComplicationLayoutEngine.Margins(resources.getDimensionPixelSize( + R.dimen.dream_overlay_container_padding_start), + resources.getDimensionPixelSize( + R.dimen.dream_overlay_container_padding_top), + resources.getDimensionPixelSize( + R.dimen.dream_overlay_container_padding_end), + resources.getDimensionPixelSize( + R.dimen.dream_overlay_container_padding_bottom) + ); } /** diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackConfig.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackConfig.kt index da124de358a8..7b97bbc0fd28 100644 --- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackConfig.kt @@ -49,4 +49,6 @@ data class SliderHapticFeedbackConfig( @FloatRange(from = 0.0, fromInclusive = false) val exponent: Float = 1f / 0.89f, /** The step-size that defines the slider quantization. Zero represents a continuous slider */ @FloatRange(from = 0.0) val sliderStepSize: Float = 0f, + /** A filter that determines values for which haptics are triggered */ + val filter: SliderHapticFeedbackFilter = SliderHapticFeedbackFilter(), ) diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackFilter.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackFilter.kt new file mode 100644 index 000000000000..237775f8b097 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackFilter.kt @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.haptics.slider + +/** + * This filter is used by the [SliderHapticFeedbackProvider] to filter-out haptics if the slider + * state logic needs to avoid certain vibrations. + * + * @param[vibrateOnUpperBookend] Tell the provider if we should vibrate on the upper bookend. + * @param[vibrateOnLowerBookend] Tell the provider if we should vibrate on the lower bookend. + */ +data class SliderHapticFeedbackFilter( + var vibrateOnUpperBookend: Boolean = true, + var vibrateOnLowerBookend: Boolean = true, +) diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProvider.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProvider.kt index de6697bd8fea..82c284a57954 100644 --- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProvider.kt @@ -218,14 +218,14 @@ class SliderHapticFeedbackProvider( } override fun onLowerBookend() { - if (!hasVibratedAtLowerBookend) { + if (!hasVibratedAtLowerBookend && config.filter.vibrateOnLowerBookend) { vibrateOnEdgeCollision(abs(velocityProvider.getTrackedVelocity())) hasVibratedAtLowerBookend = true } } override fun onUpperBookend() { - if (!hasVibratedAtUpperBookend) { + if (!hasVibratedAtUpperBookend && config.filter.vibrateOnUpperBookend) { vibrateOnEdgeCollision(abs(velocityProvider.getTrackedVelocity())) hasVibratedAtUpperBookend = true } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index c1a59f180225..757464976261 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -82,7 +82,7 @@ import com.android.systemui.flags.FeatureFlags; import com.android.systemui.keyguard.domain.interactor.KeyguardDismissInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardEnabledInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; -import com.android.systemui.keyguard.domain.interactor.KeyguardServiceLockNowInteractor; +import com.android.systemui.keyguard.domain.interactor.KeyguardServiceShowLockscreenInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardStateCallbackInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardWakeDirectlyToGoneInteractor; import com.android.systemui.keyguard.ui.binder.KeyguardSurfaceBehindParamsApplier; @@ -331,7 +331,7 @@ public class KeyguardService extends Service { return new FoldGracePeriodProvider(); } }; - private final KeyguardServiceLockNowInteractor mKeyguardServiceLockNowInteractor; + private final KeyguardServiceShowLockscreenInteractor mKeyguardServiceShowLockscreenInteractor; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; @Inject @@ -358,7 +358,7 @@ public class KeyguardService extends Service { KeyguardDismissInteractor keyguardDismissInteractor, Lazy<DeviceEntryInteractor> deviceEntryInteractorLazy, KeyguardStateCallbackInteractor keyguardStateCallbackInteractor, - KeyguardServiceLockNowInteractor keyguardServiceLockNowInteractor, + KeyguardServiceShowLockscreenInteractor keyguardServiceShowLockscreenInteractor, KeyguardUpdateMonitor keyguardUpdateMonitor) { super(); mKeyguardViewMediator = keyguardViewMediator; @@ -391,7 +391,7 @@ public class KeyguardService extends Service { mKeyguardEnabledInteractor = keyguardEnabledInteractor; mKeyguardWakeDirectlyToGoneInteractor = keyguardWakeDirectlyToGoneInteractor; mKeyguardDismissInteractor = keyguardDismissInteractor; - mKeyguardServiceLockNowInteractor = keyguardServiceLockNowInteractor; + mKeyguardServiceShowLockscreenInteractor = keyguardServiceShowLockscreenInteractor; mKeyguardUpdateMonitor = keyguardUpdateMonitor; } @@ -673,7 +673,7 @@ public class KeyguardService extends Service { if (SceneContainerFlag.isEnabled()) { mDeviceEntryInteractorLazy.get().lockNow("doKeyguardTimeout"); } else if (KeyguardWmStateRefactor.isEnabled()) { - mKeyguardServiceLockNowInteractor.onKeyguardServiceDoKeyguardTimeout(options); + mKeyguardServiceShowLockscreenInteractor.onKeyguardServiceDoKeyguardTimeout(); } mKeyguardViewMediator.doKeyguardTimeout(options); @@ -686,7 +686,12 @@ public class KeyguardService extends Service { if (mFoldGracePeriodProvider.get().isEnabled()) { mKeyguardInteractor.showDismissibleKeyguard(); } - mKeyguardViewMediator.showDismissibleKeyguard(); + + if (KeyguardWmStateRefactor.isEnabled()) { + mKeyguardServiceShowLockscreenInteractor.onKeyguardServiceShowDismissibleKeyguard(); + } else { + mKeyguardViewMediator.showDismissibleKeyguard(); + } if (SceneContainerFlag.isEnabled() && mFoldGracePeriodProvider.get().isEnabled()) { mMainExecutor.execute(() -> mSceneInteractorLazy.get().changeScene( diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt index 869edfa2b886..23be5c52ab5c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewConfigurator.kt @@ -27,7 +27,6 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.deviceentry.domain.interactor.DeviceEntryHapticsInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor -import com.android.systemui.keyguard.domain.interactor.WallpaperFocalAreaInteractor import com.android.systemui.keyguard.ui.binder.KeyguardBlueprintViewBinder import com.android.systemui.keyguard.ui.binder.KeyguardJankBinder import com.android.systemui.keyguard.ui.binder.KeyguardRootViewBinder @@ -53,6 +52,8 @@ import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.statusbar.phone.ScreenOffAnimationController import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator +import com.android.systemui.wallpapers.domain.interactor.WallpaperFocalAreaInteractor +import com.android.systemui.wallpapers.ui.viewmodel.WallpaperFocalAreaViewModel import com.android.systemui.wallpapers.ui.viewmodel.WallpaperViewModel import com.google.android.msdl.domain.MSDLPlayer import java.util.Optional @@ -93,6 +94,7 @@ constructor( @Main private val mainDispatcher: CoroutineDispatcher, private val msdlPlayer: MSDLPlayer, @KeyguardBlueprintLog private val blueprintLog: LogBuffer, + private val wallpaperFocalAreaViewModel: WallpaperFocalAreaViewModel, ) : CoreStartable { private var rootViewHandle: DisposableHandle? = null @@ -148,7 +150,6 @@ constructor( screenOffAnimationController, shadeInteractor, clockInteractor, - wallpaperFocalAreaInteractor, keyguardClockViewModel, deviceEntryHapticsInteractor, vibratorHelper, @@ -157,6 +158,7 @@ constructor( mainDispatcher, msdlPlayer, blueprintLog, + wallpaperFocalAreaViewModel, ) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt index 9718e7508df2..a4b9135d708f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardClockRepository.kt @@ -69,16 +69,11 @@ interface KeyguardClockRepository { val previewClock: Flow<ClockController> - /** top of notifications without bcsmartspace in small clock settings */ - val notificationDefaultTop: StateFlow<Float> - val clockEventController: ClockEventController val shouldForceSmallClock: Boolean fun setClockSize(size: ClockSize) - - fun setNotificationDefaultTop(top: Float) } @SysUISingleton @@ -155,14 +150,6 @@ constructor( clockRegistry.createCurrentClock() } - private val _notificationDefaultTop: MutableStateFlow<Float> = MutableStateFlow(0F) - - override val notificationDefaultTop: StateFlow<Float> = _notificationDefaultTop.asStateFlow() - - override fun setNotificationDefaultTop(top: Float) { - _notificationDefaultTop.value = top - } - override val shouldForceSmallClock: Boolean get() = featureFlags.isEnabled(Flags.LOCKSCREEN_ENABLE_LANDSCAPE) && diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt index 4b36e7a43dcb..acb98ede3e80 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt @@ -17,7 +17,6 @@ package com.android.systemui.keyguard.data.repository import android.graphics.Point -import android.graphics.RectF import com.android.app.tracing.coroutines.launchTraced as launch import com.android.internal.widget.LockPatternUtils import com.android.keyguard.KeyguardUpdateMonitor @@ -255,13 +254,6 @@ interface KeyguardRepository { */ val isEncryptedOrLockdown: Flow<Boolean> - /** The top of shortcut in screen, used by wallpaper to find remaining space in lockscreen */ - val shortcutAbsoluteTop: StateFlow<Float> - - val notificationStackAbsoluteBottom: StateFlow<Float> - - val wallpaperFocalAreaBounds: StateFlow<RectF> - /** * Returns `true` if the keyguard is showing; `false` otherwise. * @@ -328,13 +320,6 @@ interface KeyguardRepository { * otherwise. */ fun isShowKeyguardWhenReenabled(): Boolean - - fun setShortcutAbsoluteTop(top: Float) - - /** Set bottom of notifications from notification stack */ - fun setNotificationStackAbsoluteBottom(bottom: Float) - - fun setWallpaperFocalAreaBounds(bounds: RectF) } /** Encapsulates application state for the keyguard. */ @@ -621,16 +606,6 @@ constructor( private val _isQuickSettingsVisible = MutableStateFlow(false) override val isQuickSettingsVisible: Flow<Boolean> = _isQuickSettingsVisible.asStateFlow() - private val _shortcutAbsoluteTop = MutableStateFlow(0F) - override val shortcutAbsoluteTop = _shortcutAbsoluteTop.asStateFlow() - - private val _notificationStackAbsoluteBottom = MutableStateFlow(0F) - override val notificationStackAbsoluteBottom = _notificationStackAbsoluteBottom.asStateFlow() - - private val _wallpaperFocalAreaBounds = MutableStateFlow(RectF(0F, 0F, 0F, 0F)) - override val wallpaperFocalAreaBounds: StateFlow<RectF> = - _wallpaperFocalAreaBounds.asStateFlow() - init { val callback = object : KeyguardStateController.Callback { @@ -705,18 +680,6 @@ constructor( } } - override fun setShortcutAbsoluteTop(top: Float) { - _shortcutAbsoluteTop.value = top - } - - override fun setNotificationStackAbsoluteBottom(bottom: Float) { - _notificationStackAbsoluteBottom.value = bottom - } - - override fun setWallpaperFocalAreaBounds(bounds: RectF) { - _wallpaperFocalAreaBounds.value = bounds - } - private fun dozeMachineStateToModel(state: DozeMachine.State): DozeStateModel { return when (state) { DozeMachine.State.UNINITIALIZED -> DozeStateModel.UNINITIALIZED diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt index 126b375efb7d..4411437188f2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt @@ -22,6 +22,8 @@ import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepositoryImpl import com.android.systemui.keyguard.shared.transition.KeyguardTransitionAnimationCallback import com.android.systemui.keyguard.shared.transition.KeyguardTransitionAnimationCallbackDelegator +import com.android.systemui.wallpapers.data.repository.WallpaperFocalAreaRepository +import com.android.systemui.wallpapers.data.repository.WallpaperFocalAreaRepositoryImpl import dagger.Binds import dagger.Module @@ -73,4 +75,9 @@ interface KeyguardRepositoryModule { fun keyguardSmartspaceRepository( impl: KeyguardSmartspaceRepositoryImpl ): KeyguardSmartspaceRepository + + @Binds + fun bindWallpaperFocalAreaRepository( + impl: WallpaperFocalAreaRepositoryImpl + ): WallpaperFocalAreaRepository } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt index 090cdcc23936..eb96c921c181 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt @@ -77,6 +77,7 @@ constructor( override fun start() { listenForDozingToAny() + listenForDozingToDreaming() listenForDozingToGoneViaBiometrics() listenForWakeFromDozing() listenForTransitionToCamera(scope, keyguardInteractor) @@ -130,6 +131,18 @@ constructor( @OptIn(FlowPreview::class) @SuppressLint("MissingPermission") + private fun listenForDozingToDreaming() { + scope.launch { + keyguardInteractor.isAbleToDream + .filterRelevantKeyguardStateAnd { isAbleToDream -> isAbleToDream } + .collect { + startTransitionTo(KeyguardState.DREAMING, ownerReason = "isAbleToDream") + } + } + } + + @OptIn(FlowPreview::class) + @SuppressLint("MissingPermission") private fun listenForDozingToAny() { if (KeyguardWmStateRefactor.isEnabled) { return @@ -284,6 +297,7 @@ constructor( interpolator = Interpolators.LINEAR duration = when (toState) { + KeyguardState.DREAMING -> TO_DREAMING_DURATION KeyguardState.GONE -> TO_GONE_DURATION KeyguardState.GLANCEABLE_HUB -> TO_GLANCEABLE_HUB_DURATION KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION @@ -297,6 +311,7 @@ constructor( companion object { const val TAG = "FromDozingTransitionInteractor" private val DEFAULT_DURATION = 500.milliseconds + val TO_DREAMING_DURATION = 300.milliseconds val TO_GLANCEABLE_HUB_DURATION = DEFAULT_DURATION val TO_GONE_DURATION = DEFAULT_DURATION val TO_LOCKSCREEN_DURATION = DEFAULT_DURATION diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt index bd9836f3489d..ca6a7907a8eb 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt @@ -34,9 +34,6 @@ import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.filter -import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class FromGoneTransitionInteractor @@ -52,7 +49,7 @@ constructor( powerInteractor: PowerInteractor, private val communalSceneInteractor: CommunalSceneInteractor, keyguardOcclusionInteractor: KeyguardOcclusionInteractor, - private val keyguardLockWhileAwakeInteractor: KeyguardLockWhileAwakeInteractor, + private val keyguardShowWhileAwakeInteractor: KeyguardShowWhileAwakeInteractor, ) : TransitionInteractor( fromState = KeyguardState.GONE, @@ -101,7 +98,7 @@ constructor( private fun listenForGoneToLockscreenOrHubOrOccluded() { if (KeyguardWmStateRefactor.isEnabled) { scope.launch { - keyguardLockWhileAwakeInteractor.lockWhileAwakeEvents + keyguardShowWhileAwakeInteractor.showWhileAwakeEvents .filterRelevantKeyguardState() .sample(communalSceneInteractor.isIdleOnCommunalNotEditMode, ::Pair) .collect { (lockReason, idleOnCommunal) -> diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt index ab5fdd608d03..dab4b5f4183c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt @@ -37,6 +37,7 @@ import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor import com.android.systemui.statusbar.notification.domain.interactor.HeadsUpNotificationInteractor import com.android.systemui.util.kotlin.combine +import com.android.systemui.wallpapers.domain.interactor.WallpaperFocalAreaInteractor import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -62,6 +63,7 @@ constructor( headsUpNotificationInteractor: HeadsUpNotificationInteractor, @Application private val applicationScope: CoroutineScope, val keyguardClockRepository: KeyguardClockRepository, + private val wallpaperFocalAreaInteractor: WallpaperFocalAreaInteractor, ) { private val isOnAod: Flow<Boolean> = keyguardTransitionInteractor.currentKeyguardState.map { it == KeyguardState.AOD } @@ -183,6 +185,6 @@ constructor( } fun setNotificationStackDefaultTop(top: Float) { - keyguardClockRepository.setNotificationDefaultTop(top) + wallpaperFocalAreaInteractor.setNotificationDefaultTop(top) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt index 3652c17309f4..f84d29f57cc7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt @@ -52,6 +52,7 @@ import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shade.data.repository.ShadeRepository import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine import com.android.systemui.util.kotlin.sample +import com.android.systemui.wallpapers.data.repository.WallpaperFocalAreaRepository import javax.inject.Inject import javax.inject.Provider import kotlinx.coroutines.CoroutineScope @@ -85,6 +86,7 @@ class KeyguardInteractor constructor( private val repository: KeyguardRepository, bouncerRepository: KeyguardBouncerRepository, + private val wallpaperFocalAreaRepository: WallpaperFocalAreaRepository, @ShadeDisplayAware configurationInteractor: ConfigurationInteractor, shadeRepository: ShadeRepository, private val keyguardTransitionInteractor: KeyguardTransitionInteractor, @@ -532,7 +534,7 @@ constructor( } fun setShortcutAbsoluteTop(top: Float) { - repository.setShortcutAbsoluteTop(top) + wallpaperFocalAreaRepository.setShortcutAbsoluteTop(top) } fun setIsKeyguardGoingAway(isGoingAway: Boolean) { @@ -540,7 +542,7 @@ constructor( } fun setNotificationStackAbsoluteBottom(bottom: Float) { - repository.setNotificationStackAbsoluteBottom(bottom) + wallpaperFocalAreaRepository.setNotificationStackAbsoluteBottom(bottom) } suspend fun hydrateTableLogBuffer(tableLogBuffer: TableLogBuffer) { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardServiceLockNowInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardServiceShowLockscreenInteractor.kt index 9ed53ea74316..b55bb383c308 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardServiceLockNowInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardServiceShowLockscreenInteractor.kt @@ -17,7 +17,6 @@ package com.android.systemui.keyguard.domain.interactor import android.annotation.SuppressLint -import android.os.Bundle import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import javax.inject.Inject @@ -26,48 +25,53 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch /** - * Emitted when we receive a [KeyguardServiceLockNowInteractor.onKeyguardServiceDoKeyguardTimeout] - * call. - */ -data class KeyguardLockNowEvent(val options: Bundle?) - -/** - * Logic around requests by [KeyguardService] to lock the device right now, even though the device - * is awake and not going to sleep. + * Logic around requests by [KeyguardService] to show keyguard right now, even though the device is + * awake and not going to sleep. * - * This can happen if WM#lockNow() is called, or if the screen is forced to stay awake but the lock - * timeout elapses. + * This can happen if WM#lockNow() is called, if KeyguardService#showDismissibleKeyguard is called + * because we're folding with "continue using apps on fold" set to "swipe up to continue", or if the + * screen is forced to stay awake but the lock timeout elapses. * * This is not the only way for the device to lock while the screen is on. The other cases, which do - * not directly involve [KeyguardService], are handled in [KeyguardLockWhileAwakeInteractor]. + * not directly involve [KeyguardService], are handled in [KeyguardShowWhileAwakeInteractor]. */ @SysUISingleton -class KeyguardServiceLockNowInteractor +class KeyguardServiceShowLockscreenInteractor @Inject constructor(@Background val backgroundScope: CoroutineScope) { /** - * Emits whenever [KeyguardService] receives a call that indicates we should lock the device + * Emits whenever [KeyguardService] receives a call that indicates we should show the lockscreen * right now, even though the device is awake and not going to sleep. * - * WARNING: This is only one of multiple reasons the device might need to lock while not going + * WARNING: This is only one of multiple reasons the keyguard might need to show while not going * to sleep. Unless you're dealing with keyguard internals that specifically need to know that - * we're locking due to a call to doKeyguardTimeout, use - * [KeyguardLockWhileAwakeInteractor.lockWhileAwakeEvents]. + * we're locking due to a call to doKeyguardTimeout or showDismissibleKeyguard, use + * [KeyguardShowWhileAwakeInteractor.showWhileAwakeEvents]. * * This is fundamentally an event flow, hence the SharedFlow. */ @SuppressLint("SharedFlowCreation") - val lockNowEvents: MutableSharedFlow<KeyguardLockNowEvent> = MutableSharedFlow() + val showNowEvents: MutableSharedFlow<ShowWhileAwakeReason> = MutableSharedFlow() /** * Called by [KeyguardService] when it receives a doKeyguardTimeout() call. This indicates that * the device locked while the screen was on. - * - * [options] appears to be no longer used, but we'll keep it in this interactor in case that - * turns out not to be true. */ - fun onKeyguardServiceDoKeyguardTimeout(options: Bundle?) { - backgroundScope.launch { lockNowEvents.emit(KeyguardLockNowEvent(options = options)) } + fun onKeyguardServiceDoKeyguardTimeout() { + backgroundScope.launch { + showNowEvents.emit(ShowWhileAwakeReason.KEYGUARD_TIMEOUT_WHILE_SCREEN_ON) + } + } + + /** + * Called by [KeyguardService] when it receives a showDismissibleKeyguard() call. This indicates + * that the device was folded with settings configured to show a dismissible keyguard on the + * outer display. + */ + fun onKeyguardServiceShowDismissibleKeyguard() { + backgroundScope.launch { + showNowEvents.emit(ShowWhileAwakeReason.FOLDED_WITH_SWIPE_UP_TO_CONTINUE) + } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardLockWhileAwakeInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardShowWhileAwakeInteractor.kt index ce84e71a3562..a8000a568a6a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardLockWhileAwakeInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardShowWhileAwakeInteractor.kt @@ -26,8 +26,11 @@ import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge -/** The reason we're locking while awake, used for logging. */ -enum class LockWhileAwakeReason(private val logReason: String) { +/** The reason we're showing lockscreen while awake, used for logging. */ +enum class ShowWhileAwakeReason(private val logReason: String) { + FOLDED_WITH_SWIPE_UP_TO_CONTINUE( + "Folded with continue using apps on fold set to 'swipe up to continue'." + ), LOCKDOWN("Lockdown initiated."), KEYGUARD_REENABLED( "Keyguard was re-enabled. We weren't unlocked when it was disabled, " + @@ -43,60 +46,67 @@ enum class LockWhileAwakeReason(private val logReason: String) { } /** - * Logic around cases where the device locks while still awake (transitioning from GONE -> + * Logic around cases where the we show the lockscreen while still awake (transition from GONE -> * LOCKSCREEN), vs. the more common cases of a power button press or screen timeout, which result in * the device going to sleep. * + * This does not necessarily mean we lock the device (which does not happen if showing the + * lockscreen is triggered by [KeyguardService.showDismissibleKeyguard]). We'll show keyguard here + * and authentication logic will decide if that keyguard is dismissible or not. + * * This is possible in the following situations: * - The user initiates lockdown from the power menu. * - Theft detection, etc. has requested lockdown. * - The keyguard was disabled while visible, and has now been re-enabled, so it's re-showing. * - Someone called WM#lockNow(). * - The screen timed out, but an activity with FLAG_ALLOW_LOCK_WHILE_SCREEN_ON is on top. + * - A foldable is folded with "Continue using apps on fold" set to "Swipe up to continue" (if set + * to "never", then lockscreen will be shown when the device goes to sleep, which is not tnohe + * concern of this interactor). */ @SysUISingleton -class KeyguardLockWhileAwakeInteractor +class KeyguardShowWhileAwakeInteractor @Inject constructor( biometricSettingsRepository: BiometricSettingsRepository, keyguardEnabledInteractor: KeyguardEnabledInteractor, - keyguardServiceLockNowInteractor: KeyguardServiceLockNowInteractor, + keyguardServiceShowLockscreenInteractor: KeyguardServiceShowLockscreenInteractor, ) { /** Emits whenever the current user is in lockdown mode. */ - private val inLockdown: Flow<LockWhileAwakeReason> = + private val inLockdown: Flow<ShowWhileAwakeReason> = biometricSettingsRepository.isCurrentUserInLockdown .distinctUntilChanged() .filter { inLockdown -> inLockdown } - .map { LockWhileAwakeReason.LOCKDOWN } + .map { ShowWhileAwakeReason.LOCKDOWN } /** * Emits whenever the keyguard is re-enabled, and we need to return to lockscreen due to the * device being locked when the keyguard was originally disabled. */ - private val keyguardReenabled: Flow<LockWhileAwakeReason> = + private val keyguardReenabled: Flow<ShowWhileAwakeReason> = keyguardEnabledInteractor.isKeyguardEnabled .filter { enabled -> enabled } .sample(keyguardEnabledInteractor.showKeyguardWhenReenabled) .filter { reshow -> reshow } - .map { LockWhileAwakeReason.KEYGUARD_REENABLED } + .map { ShowWhileAwakeReason.KEYGUARD_REENABLED } - /** Emits whenever we should lock while the screen is on, for any reason. */ - val lockWhileAwakeEvents: Flow<LockWhileAwakeReason> = + /** Emits whenever we should show lockscreen while the screen is on, for any reason. */ + val showWhileAwakeEvents: Flow<ShowWhileAwakeReason> = merge( // We're in lockdown, and the keyguard is enabled. If the keyguard is disabled, the // lockdown button is hidden in the UI, but it's still possible to trigger lockdown in // tests. inLockdown .filter { keyguardEnabledInteractor.isKeyguardEnabledAndNotSuppressed() } - .map { LockWhileAwakeReason.LOCKDOWN }, + .map { ShowWhileAwakeReason.LOCKDOWN }, // The keyguard was re-enabled, and it was showing when it was originally disabled. // Tests currently expect that if the keyguard is re-enabled, it will show even if it's // suppressed, so we don't check for isKeyguardEnabledAndNotSuppressed() on this flow. - keyguardReenabled.map { LockWhileAwakeReason.KEYGUARD_REENABLED }, - // KeyguardService says we need to lock now, and the lockscreen is enabled. - keyguardServiceLockNowInteractor.lockNowEvents - .filter { keyguardEnabledInteractor.isKeyguardEnabledAndNotSuppressed() } - .map { LockWhileAwakeReason.KEYGUARD_TIMEOUT_WHILE_SCREEN_ON }, + keyguardReenabled.map { ShowWhileAwakeReason.KEYGUARD_REENABLED }, + // KeyguardService says we need to show now, and the lockscreen is enabled. + keyguardServiceShowLockscreenInteractor.showNowEvents.filter { + keyguardEnabledInteractor.isKeyguardEnabledAndNotSuppressed() + }, ) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractor.kt index 3bdc32dce6f5..ef1fe49372b2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractor.kt @@ -52,6 +52,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChangedBy +import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onStart @@ -89,7 +90,7 @@ constructor( private val systemSettings: SystemSettings, private val selectedUserInteractor: SelectedUserInteractor, keyguardEnabledInteractor: KeyguardEnabledInteractor, - keyguardServiceLockNowInteractor: KeyguardServiceLockNowInteractor, + keyguardServiceShowLockscreenInteractor: KeyguardServiceShowLockscreenInteractor, keyguardInteractor: KeyguardInteractor, ) { @@ -100,7 +101,15 @@ constructor( * depend on that behavior, so for now, we'll replicate it here. */ private val shouldSuppressKeyguard = - merge(powerInteractor.isAwake, keyguardServiceLockNowInteractor.lockNowEvents) + merge( + powerInteractor.isAwake, + // Update only when doKeyguardTimeout is called, not on fold or other events, to + // match + // pre-existing logic. + keyguardServiceShowLockscreenInteractor.showNowEvents.filter { + it == ShowWhileAwakeReason.KEYGUARD_TIMEOUT_WHILE_SCREEN_ON + }, + ) .map { keyguardEnabledInteractor.isKeyguardSuppressed() } // Default to false, so that flows that combine this one emit prior to the first // wakefulness emission. diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/StatusBarDisableFlagsInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/StatusBarDisableFlagsInteractor.kt index cb602f1287f7..c1e1259bf145 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/StatusBarDisableFlagsInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/StatusBarDisableFlagsInteractor.kt @@ -121,7 +121,15 @@ constructor( var flags = StatusBarManager.DISABLE_NONE if (hideHomeAndRecentsForBouncer || (isKeyguardShowing && !isOccluded)) { - if (!isShowHomeOverLockscreen || !isGesturalMode) { + // Hide the home button/nav handle if we're on keyguard and either: + // - Going to AOD, in which case the handle should animate away. + // - Nav handle is configured not to show on lockscreen. + // - There is no nav handle. + if ( + startedState == KeyguardState.AOD || + !isShowHomeOverLockscreen || + !isGesturalMode + ) { flags = flags or StatusBarManager.DISABLE_HOME } flags = flags or StatusBarManager.DISABLE_RECENT diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt index 2fd9818a38f0..f0e5e16b092b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardLongPressViewBinder.kt @@ -43,13 +43,13 @@ object KeyguardLongPressViewBinder { fun bind( view: LongPressHandlingView, viewModel: KeyguardTouchHandlingViewModel, - onSingleTap: () -> Unit, + onSingleTap: (x: Int, y: Int) -> Unit, falsingManager: FalsingManager, ) { view.accessibilityHintLongPressAction = AccessibilityNodeInfo.AccessibilityAction( AccessibilityNodeInfoCompat.ACTION_LONG_CLICK, - view.resources.getString(R.string.lock_screen_settings) + view.resources.getString(R.string.lock_screen_settings), ) view.listener = object : LongPressHandlingView.Listener { @@ -57,7 +57,7 @@ object KeyguardLongPressViewBinder { view: View, x: Int, y: Int, - isA11yAction: Boolean + isA11yAction: Boolean, ) { if ( !isA11yAction && falsingManager.isFalseLongTap(FalsingManager.LOW_PENALTY) @@ -68,12 +68,12 @@ object KeyguardLongPressViewBinder { viewModel.onLongPress(isA11yAction) } - override fun onSingleTapDetected(view: View) { + override fun onSingleTapDetected(view: View, x: Int, y: Int) { if (falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { return } - onSingleTap() + onSingleTap(x, y) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt index b8020b19ce86..00710c97d00a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardRootViewBinder.kt @@ -50,7 +50,6 @@ import com.android.systemui.common.ui.view.onTouchListener import com.android.systemui.customization.R as customR import com.android.systemui.deviceentry.domain.interactor.DeviceEntryHapticsInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor -import com.android.systemui.keyguard.domain.interactor.WallpaperFocalAreaInteractor import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.ui.view.layout.sections.AodPromotedNotificationSection import com.android.systemui.keyguard.ui.viewmodel.BurnInParameters @@ -80,6 +79,7 @@ import com.android.systemui.util.ui.AnimatedValue import com.android.systemui.util.ui.isAnimating import com.android.systemui.util.ui.stopAnimating import com.android.systemui.util.ui.value +import com.android.systemui.wallpapers.ui.viewmodel.WallpaperFocalAreaViewModel import com.google.android.msdl.data.model.MSDLToken import com.google.android.msdl.domain.MSDLPlayer import kotlin.math.min @@ -104,7 +104,6 @@ object KeyguardRootViewBinder { screenOffAnimationController: ScreenOffAnimationController, shadeInteractor: ShadeInteractor, clockInteractor: KeyguardClockInteractor, - wallpaperFocalAreaInteractor: WallpaperFocalAreaInteractor, clockViewModel: KeyguardClockViewModel, deviceEntryHapticsInteractor: DeviceEntryHapticsInteractor?, vibratorHelper: VibratorHelper?, @@ -113,6 +112,7 @@ object KeyguardRootViewBinder { mainImmediateDispatcher: CoroutineDispatcher, msdlPlayer: MSDLPlayer?, @KeyguardBlueprintLog blueprintLog: LogBuffer, + wallpaperFocalAreaViewModel: WallpaperFocalAreaViewModel, ): DisposableHandle { val disposables = DisposableHandles() val childViews = mutableMapOf<Int, View>() @@ -368,13 +368,11 @@ object KeyguardRootViewBinder { disposables += view.repeatWhenAttached { repeatOnLifecycle(Lifecycle.State.STARTED) { - if (viewModel.shouldSendFocalArea.value) { + if (wallpaperFocalAreaViewModel.hasFocalArea.value) { launch { - wallpaperFocalAreaInteractor.wallpaperFocalAreaBounds + wallpaperFocalAreaViewModel.wallpaperFocalAreaBounds .filterNotNull() - .collect { - wallpaperFocalAreaInteractor.setWallpaperFocalAreaBounds(it) - } + .collect { wallpaperFocalAreaViewModel.setFocalAreaBounds(it) } } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt index cff5cebf2011..85eae6ed98b3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt @@ -55,7 +55,6 @@ import com.android.systemui.customization.R as customR import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main -import com.android.systemui.keyguard.domain.interactor.WallpaperFocalAreaInteractor import com.android.systemui.keyguard.shared.model.ClockSizeSetting import com.android.systemui.keyguard.ui.binder.KeyguardPreviewClockViewBinder import com.android.systemui.keyguard.ui.binder.KeyguardPreviewSmartspaceViewBinder @@ -82,6 +81,7 @@ import com.android.systemui.statusbar.KeyguardIndicationController import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController import com.android.systemui.util.kotlin.DisposableHandles import com.android.systemui.util.settings.SecureSettings +import com.android.systemui.wallpapers.domain.interactor.WallpaperFocalAreaInteractor import dagger.assisted.Assisted import dagger.assisted.AssistedInject import kotlinx.coroutines.CoroutineDispatcher diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt index 4f4442350873..e268050234ab 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt @@ -34,6 +34,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardSection import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel import com.android.systemui.res.R import com.android.systemui.shade.ShadeDisplayAware +import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.icon.ui.viewbinder.AlwaysOnDisplayNotificationIconViewStore import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder import com.android.systemui.statusbar.notification.icon.ui.viewbinder.StatusBarIconViewBindingFailureTracker @@ -55,6 +56,7 @@ constructor( private val nicAodIconViewStore: AlwaysOnDisplayNotificationIconViewStore, private val systemBarUtilsState: SystemBarUtilsState, private val rootViewModel: KeyguardRootViewModel, + private val shadeInteractor: ShadeInteractor, ) : KeyguardSection() { private var nicBindingDisposable: DisposableHandle? = null @@ -93,34 +95,30 @@ constructor( override fun applyConstraints(constraintSet: ConstraintSet) { val bottomMargin = context.resources.getDimensionPixelSize(R.dimen.keyguard_status_view_bottom_margin) + val horizontalMargin = + context.resources.getDimensionPixelSize(customR.dimen.status_view_margin_horizontal) + val height = context.resources.getDimensionPixelSize(R.dimen.notification_shelf_height) val isVisible = rootViewModel.isNotifIconContainerVisible.value + val isShadeLayoutWide = shadeInteractor.isShadeLayoutWide.value + constraintSet.apply { if (PromotedNotificationUiAod.isEnabled) { connect(nicId, TOP, AodPromotedNotificationSection.viewId, BOTTOM, bottomMargin) } else { connect(nicId, TOP, R.id.smart_space_barrier_bottom, BOTTOM, bottomMargin) } + setGoneMargin(nicId, BOTTOM, bottomMargin) setVisibility(nicId, if (isVisible.value) VISIBLE else GONE) - connect( - nicId, - START, - PARENT_ID, - START, - context.resources.getDimensionPixelSize(customR.dimen.status_view_margin_horizontal), - ) - connect( - nicId, - END, - PARENT_ID, - END, - context.resources.getDimensionPixelSize(customR.dimen.status_view_margin_horizontal), - ) - constrainHeight( - nicId, - context.resources.getDimensionPixelSize(R.dimen.notification_shelf_height), - ) + if (PromotedNotificationUiAod.isEnabled && isShadeLayoutWide) { + // Don't create a start constraint, so the icons can hopefully right-align. + } else { + connect(nicId, START, PARENT_ID, START, horizontalMargin) + } + connect(nicId, END, PARENT_ID, END, horizontalMargin) + + constrainHeight(nicId, height) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodPromotedNotificationSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodPromotedNotificationSection.kt index 6c9a755148e9..2110c4027667 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodPromotedNotificationSection.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodPromotedNotificationSection.kt @@ -16,6 +16,7 @@ package com.android.systemui.keyguard.ui.view.layout.sections +import android.content.Context import androidx.compose.ui.platform.ComposeView import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet @@ -26,6 +27,7 @@ import androidx.constraintlayout.widget.ConstraintSet.START import androidx.constraintlayout.widget.ConstraintSet.TOP import com.android.systemui.keyguard.shared.model.KeyguardSection import com.android.systemui.res.R +import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.notification.promoted.AODPromotedNotification import com.android.systemui.statusbar.notification.promoted.PromotedNotificationLogger @@ -36,6 +38,7 @@ import javax.inject.Inject class AodPromotedNotificationSection @Inject constructor( + @ShadeDisplayAware private val context: Context, private val viewModelFactory: AODPromotedNotificationViewModel.Factory, private val shadeInteractor: ShadeInteractor, private val logger: PromotedNotificationLogger, @@ -83,13 +86,30 @@ constructor( // view may have been created by a different instance of the section (!), and we don't // actually *need* it to set constraints, so don't check for it here. + val topPadding = + context.resources.getDimensionPixelSize(R.dimen.below_clock_padding_start_icons) + constraintSet.apply { val isShadeLayoutWide = shadeInteractor.isShadeLayoutWide.value - val endGuidelineId = if (isShadeLayoutWide) R.id.split_shade_guideline else PARENT_ID - connect(viewId, TOP, R.id.smart_space_barrier_bottom, BOTTOM, 0) - connect(viewId, START, PARENT_ID, START, 0) - connect(viewId, END, endGuidelineId, END, 0) + if (isShadeLayoutWide) { + // When in split shade, align with top of smart space: + connect(viewId, TOP, R.id.smart_space_barrier_top, TOP, 0) + + // and occupy the right half of the screen: + connect(viewId, START, R.id.split_shade_guideline, START, 0) + connect(viewId, END, PARENT_ID, END, 0) + + // TODO(b/369151941): Calculate proper right padding here (when in split shade, it's + // bigger than what the Composable applies!) + } else { + // When not in split shade, place below smart space: + connect(viewId, TOP, R.id.smart_space_barrier_bottom, BOTTOM, topPadding) + + // and occupy the full width of the screen: + connect(viewId, START, PARENT_ID, START, 0) + connect(viewId, END, PARENT_ID, END, 0) + } constrainWidth(viewId, ConstraintSet.MATCH_CONSTRAINT) constrainHeight(viewId, ConstraintSet.WRAP_CONTENT) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt index 9319bc890c6c..d6d03c7e02d1 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/SmartspaceSection.kt @@ -168,6 +168,13 @@ constructor( } createBarrier( + R.id.smart_space_barrier_top, + Barrier.TOP, + 0, + *intArrayOf(sharedR.id.bc_smartspace_view, sharedR.id.date_smartspace_view), + ) + + createBarrier( R.id.smart_space_barrier_bottom, Barrier.BOTTOM, 0, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModel.kt new file mode 100644 index 000000000000..e6a85c6860c5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModel.kt @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.viewmodel + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.keyguard.domain.interactor.FromDozingTransitionInteractor +import com.android.systemui.keyguard.shared.model.Edge +import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING +import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING +import com.android.systemui.keyguard.ui.KeyguardTransitionAnimationFlow +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow + +/** + * Breaks down DOZING->DREAMING transition into discrete steps for corresponding views to consume. + */ +@SysUISingleton +class DozingToDreamingTransitionViewModel +@Inject +constructor(animationFlow: KeyguardTransitionAnimationFlow) { + private val transitionAnimation = + animationFlow.setup( + duration = FromDozingTransitionInteractor.TO_DREAMING_DURATION, + edge = Edge.create(from = DOZING, to = DREAMING), + ) + + val lockscreenAlpha: Flow<Float> = transitionAnimation.immediatelyTransitionTo(0f) +} 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 47a76a00fd4a..62a5ebab29e0 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 @@ -28,7 +28,6 @@ import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.PulseExpansionInteractor -import com.android.systemui.keyguard.domain.interactor.WallpaperFocalAreaInteractor import com.android.systemui.keyguard.shared.model.Edge import com.android.systemui.keyguard.shared.model.KeyguardState.AOD import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING @@ -54,6 +53,7 @@ import com.android.systemui.util.ui.AnimatableEvent import com.android.systemui.util.ui.AnimatedValue import com.android.systemui.util.ui.toAnimatedValueFlow import com.android.systemui.util.ui.zip +import com.android.systemui.wallpapers.domain.interactor.WallpaperFocalAreaInteractor import javax.inject.Inject import kotlin.math.max import kotlinx.coroutines.CoroutineScope @@ -96,6 +96,7 @@ constructor( private val aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel, private val aodToOccludedTransitionViewModel: AodToOccludedTransitionViewModel, private val aodToPrimaryBouncerTransitionViewModel: AodToPrimaryBouncerTransitionViewModel, + private val dozingToDreamingTransitionViewModel: DozingToDreamingTransitionViewModel, private val dozingToGoneTransitionViewModel: DozingToGoneTransitionViewModel, private val dozingToLockscreenTransitionViewModel: DozingToLockscreenTransitionViewModel, private val dozingToOccludedTransitionViewModel: DozingToOccludedTransitionViewModel, @@ -247,6 +248,7 @@ constructor( aodToLockscreenTransitionViewModel.lockscreenAlpha(viewState), aodToOccludedTransitionViewModel.lockscreenAlpha(viewState), aodToPrimaryBouncerTransitionViewModel.lockscreenAlpha, + dozingToDreamingTransitionViewModel.lockscreenAlpha, dozingToGoneTransitionViewModel.lockscreenAlpha(viewState), dozingToLockscreenTransitionViewModel.lockscreenAlpha, dozingToOccludedTransitionViewModel.lockscreenAlpha(viewState), @@ -375,8 +377,6 @@ constructor( initialValue = AnimatedValue.NotAnimating(false), ) - val shouldSendFocalArea = wallpaperFocalAreaInteractor.shouldSendFocalArea - fun onNotificationContainerBoundsChanged(top: Float, bottom: Float, animate: Boolean = false) { keyguardInteractor.setNotificationContainerBounds( NotificationContainerBounds(top = top, bottom = bottom, isAnimated = animate) diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/animation/ColorSchemeTransition.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/animation/ColorSchemeTransition.kt index 02b403786768..21407f3bd6d4 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/animation/ColorSchemeTransition.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/animation/ColorSchemeTransition.kt @@ -27,7 +27,6 @@ import android.graphics.drawable.RippleDrawable import com.android.internal.R import com.android.internal.annotations.VisibleForTesting import com.android.settingslib.Utils -import com.android.systemui.Flags import com.android.systemui.media.controls.ui.view.MediaViewHolder import com.android.systemui.monet.ColorScheme import com.android.systemui.surfaceeffects.loadingeffect.LoadingEffect @@ -52,7 +51,7 @@ interface ColorTransition { open class AnimatingColorTransition( private val defaultColor: Int, private val extractColor: (ColorScheme) -> Int, - private val applyColor: (Int) -> Unit, + private val applyColor: (Int) -> Unit ) : AnimatorUpdateListener, ColorTransition { private val argbEvaluator = ArgbEvaluator() @@ -106,52 +105,35 @@ internal constructor( private val mediaViewHolder: MediaViewHolder, private val multiRippleController: MultiRippleController, private val turbulenceNoiseController: TurbulenceNoiseController, - animatingColorTransitionFactory: AnimatingColorTransitionFactory, + animatingColorTransitionFactory: AnimatingColorTransitionFactory ) { constructor( context: Context, mediaViewHolder: MediaViewHolder, multiRippleController: MultiRippleController, - turbulenceNoiseController: TurbulenceNoiseController, + turbulenceNoiseController: TurbulenceNoiseController ) : this( context, mediaViewHolder, multiRippleController, turbulenceNoiseController, - ::AnimatingColorTransition, + ::AnimatingColorTransition ) - var loadingEffect: LoadingEffect? = null - val bgColor = - if (Flags.mediaControlsUiUpdate()) { - context.getColor(R.color.materialColorOnSurface) - } else { - context.getColor(com.google.android.material.R.color.material_dynamic_neutral20) - } - - val textColor = context.getColor(R.color.materialColorInverseOnSurface) - val buttonBgColor = context.getColor(R.color.materialColorPrimary) - val insideButtonColor = context.getColor(R.color.materialColorOnPrimary) - + val bgColor = context.getColor(com.google.android.material.R.color.material_dynamic_neutral20) val surfaceColor = animatingColorTransitionFactory(bgColor, ::surfaceFromScheme) { surfaceColor -> val colorList = ColorStateList.valueOf(surfaceColor) - mediaViewHolder.albumView.backgroundTintList = colorList - mediaViewHolder.gutsViewHolder.setSurfaceColor(surfaceColor) - - if (Flags.mediaControlsUiUpdate()) return@animatingColorTransitionFactory mediaViewHolder.seamlessIcon.imageTintList = colorList mediaViewHolder.seamlessText.setTextColor(surfaceColor) + mediaViewHolder.albumView.backgroundTintList = colorList + mediaViewHolder.gutsViewHolder.setSurfaceColor(surfaceColor) } val accentPrimary = animatingColorTransitionFactory( - if (Flags.mediaControlsUiUpdate()) { - buttonBgColor - } else { - loadDefaultColor(R.attr.textColorPrimary) - }, - ::accentPrimaryFromScheme, + loadDefaultColor(R.attr.textColorPrimary), + ::accentPrimaryFromScheme ) { accentPrimary -> val accentColorList = ColorStateList.valueOf(accentPrimary) mediaViewHolder.actionPlayPause.backgroundTintList = accentColorList @@ -163,12 +145,8 @@ internal constructor( val accentSecondary = animatingColorTransitionFactory( - if (Flags.mediaControlsUiUpdate()) { - buttonBgColor - } else { - loadDefaultColor(R.attr.textColorPrimary) - }, - ::accentSecondaryFromScheme, + loadDefaultColor(R.attr.textColorPrimary), + ::accentSecondaryFromScheme ) { accentSecondary -> val colorList = ColorStateList.valueOf(accentSecondary) (mediaViewHolder.seamlessButton.background as? RippleDrawable)?.let { @@ -179,11 +157,7 @@ internal constructor( val colorSeamless = animatingColorTransitionFactory( - if (Flags.mediaControlsUiUpdate()) { - buttonBgColor - } else { - loadDefaultColor(R.attr.textColorPrimary) - }, + loadDefaultColor(R.attr.textColorPrimary), { colorScheme: ColorScheme -> // A1-100 dark in dark theme, A1-200 in light theme if ( @@ -196,17 +170,13 @@ internal constructor( { seamlessColor: Int -> val accentColorList = ColorStateList.valueOf(seamlessColor) mediaViewHolder.seamlessButton.backgroundTintList = accentColorList - }, + } ) val textPrimary = animatingColorTransitionFactory( - if (Flags.mediaControlsUiUpdate()) { - textColor - } else { - loadDefaultColor(R.attr.textColorPrimary) - }, - ::textPrimaryFromScheme, + loadDefaultColor(R.attr.textColorPrimary), + ::textPrimaryFromScheme ) { textPrimary -> mediaViewHolder.titleText.setTextColor(textPrimary) val textColorList = ColorStateList.valueOf(textPrimary) @@ -222,41 +192,25 @@ internal constructor( val textPrimaryInverse = animatingColorTransitionFactory( - if (Flags.mediaControlsUiUpdate()) { - insideButtonColor - } else { - loadDefaultColor(R.attr.textColorPrimaryInverse) - }, - ::textPrimaryInverseFromScheme, + loadDefaultColor(R.attr.textColorPrimaryInverse), + ::textPrimaryInverseFromScheme ) { textPrimaryInverse -> - val colorList = ColorStateList.valueOf(textPrimaryInverse) - mediaViewHolder.actionPlayPause.imageTintList = colorList - - if (!Flags.mediaControlsUiUpdate()) return@animatingColorTransitionFactory - mediaViewHolder.seamlessIcon.imageTintList = colorList - mediaViewHolder.seamlessText.setTextColor(textPrimaryInverse) + mediaViewHolder.actionPlayPause.imageTintList = + ColorStateList.valueOf(textPrimaryInverse) } val textSecondary = animatingColorTransitionFactory( - if (Flags.mediaControlsUiUpdate()) { - textColor - } else { - loadDefaultColor(R.attr.textColorSecondary) - }, - ::textSecondaryFromScheme, + loadDefaultColor(R.attr.textColorSecondary), + ::textSecondaryFromScheme ) { textSecondary -> mediaViewHolder.artistText.setTextColor(textSecondary) } val textTertiary = animatingColorTransitionFactory( - if (Flags.mediaControlsUiUpdate()) { - textColor - } else { - loadDefaultColor(R.attr.textColorTertiary) - }, - ::textTertiaryFromScheme, + loadDefaultColor(R.attr.textColorTertiary), + ::textTertiaryFromScheme ) { textTertiary -> mediaViewHolder.seekBar.progressBackgroundTintList = ColorStateList.valueOf(textTertiary) diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt index c604bfb2d5c1..173b600de06b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt @@ -1472,6 +1472,7 @@ constructor( } // This is a hosting view, let's remeasure our players + val prevLocation = this.desiredLocation this.desiredLocation = desiredLocation this.desiredHostState = it currentlyExpanded = it.expansion > 0 @@ -1504,7 +1505,11 @@ constructor( mediaPlayer.closeGuts(!animate) } - mediaPlayer.mediaViewController.onLocationPreChange(desiredLocation) + mediaPlayer.mediaViewController.onLocationPreChange( + mediaPlayer.mediaViewHolder, + desiredLocation, + prevLocation, + ) } } else { controllerById.values.forEach { controller -> @@ -1515,7 +1520,11 @@ constructor( controller.closeGuts(!animate) } - controller.onLocationPreChange(desiredLocation) + controller.onLocationPreChange( + controller.mediaViewHolder, + desiredLocation, + prevLocation, + ) } } mediaCarouselScrollHandler.showsSettingsButton = !it.showsOnlyActiveMedia diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt index 6501c437caf9..c1778119a3fd 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaViewController.kt @@ -23,6 +23,7 @@ import android.content.Context import android.content.res.Configuration import android.graphics.Color import android.graphics.Paint +import android.graphics.Typeface import android.graphics.drawable.Drawable import android.provider.Settings import android.view.View @@ -43,6 +44,10 @@ import com.android.systemui.media.controls.ui.controller.MediaCarouselController import com.android.systemui.media.controls.ui.view.GutsViewHolder import com.android.systemui.media.controls.ui.view.MediaHostState import com.android.systemui.media.controls.ui.view.MediaViewHolder +import com.android.systemui.media.controls.ui.view.MediaViewHolder.Companion.headlineSmallTF +import com.android.systemui.media.controls.ui.view.MediaViewHolder.Companion.labelLargeTF +import com.android.systemui.media.controls.ui.view.MediaViewHolder.Companion.labelMediumTF +import com.android.systemui.media.controls.ui.view.MediaViewHolder.Companion.titleMediumTF import com.android.systemui.media.controls.ui.view.RecommendationViewHolder import com.android.systemui.media.controls.ui.viewmodel.MediaControlViewModel import com.android.systemui.media.controls.ui.viewmodel.SeekBarViewModel @@ -186,6 +191,9 @@ constructor( var isSeekBarEnabled: Boolean = false + /** Whether font family should be updated. */ + private var isFontUpdateAllowed: Boolean = true + /** Not visible value for previous button when scrubbing */ private var prevNotVisibleValue = ConstraintSet.GONE private var isPrevButtonAvailable = false @@ -1108,11 +1116,43 @@ constructor( return viewState } + private fun updateFontPerLocation(viewHolder: MediaViewHolder?, location: Int) { + when (location) { + MediaHierarchyManager.LOCATION_COMMUNAL_HUB -> + viewHolder?.updateFontFamily(headlineSmallTF, titleMediumTF, labelMediumTF) + else -> viewHolder?.updateFontFamily(titleMediumTF, labelLargeTF, labelMediumTF) + } + } + + private fun MediaViewHolder.updateFontFamily( + titleTF: Typeface, + artistTF: Typeface, + menuTF: Typeface, + ) { + gutsViewHolder.gutsText.setTypeface(menuTF) + gutsViewHolder.dismissText.setTypeface(menuTF) + titleText.setTypeface(titleTF) + artistText.setTypeface(artistTF) + seamlessText.setTypeface(menuTF) + } + /** * Notify that the location is changing right now and a [setCurrentState] change is imminent. * This updates the width the view will me measured with. */ - fun onLocationPreChange(@MediaLocation newLocation: Int) { + fun onLocationPreChange( + viewHolder: MediaViewHolder?, + @MediaLocation newLocation: Int, + @MediaLocation prevLocation: Int, + ) { + isFontUpdateAllowed = + isFontUpdateAllowed || + MediaHierarchyManager.LOCATION_COMMUNAL_HUB == newLocation || + MediaHierarchyManager.LOCATION_COMMUNAL_HUB == prevLocation + if (Flags.mediaControlsUiUpdate() && isFontUpdateAllowed) { + updateFontPerLocation(viewHolder, newLocation) + isFontUpdateAllowed = false + } obtainViewStateForLocation(newLocation)?.let { layoutController.setMeasureState(it) } } diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaViewHolder.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaViewHolder.kt index 35309ea65a4c..0e8e595f5b06 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaViewHolder.kt @@ -16,6 +16,7 @@ package com.android.systemui.media.controls.ui.view +import android.graphics.Typeface import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -139,7 +140,7 @@ class MediaViewHolder constructor(itemView: View) { R.id.action4, R.id.icon, R.id.media_scrubbing_elapsed_time, - R.id.media_scrubbing_total_time + R.id.media_scrubbing_total_time, ) // Buttons used for notification-based actions @@ -175,5 +176,10 @@ class MediaViewHolder constructor(itemView: View) { R.id.loading_effect_view, R.id.touch_ripple_view, ) + + val headlineSmallTF: Typeface = Typeface.create("gsf-headline-small", Typeface.NORMAL) + val titleMediumTF: Typeface = Typeface.create("gsf-title-medium", Typeface.NORMAL) + val labelMediumTF: Typeface = Typeface.create("gsf-label-medium", Typeface.NORMAL) + val labelLargeTF: Typeface = Typeface.create("gsf-label-large", Typeface.NORMAL) } } diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java index bc6b2beb2ddb..22d7eb4e2752 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java @@ -34,6 +34,7 @@ import android.widget.TextView; import androidx.annotation.DoNotInline; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.core.widget.CompoundButtonCompat; import androidx.recyclerview.widget.RecyclerView; @@ -54,8 +55,8 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { private static final String TAG = "MediaOutputAdapter"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - private static final float DEVICE_DISCONNECTED_ALPHA = 0.5f; - private static final float DEVICE_CONNECTED_ALPHA = 1f; + private static final float DEVICE_DISABLED_ALPHA = 0.5f; + private static final float DEVICE_ACTIVE_ALPHA = 1f; protected List<MediaItem> mMediaItemList = new CopyOnWriteArrayList<>(); private boolean mShouldGroupSelectedMediaItems = Flags.enableOutputSwitcherSessionGrouping(); @@ -155,7 +156,6 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { super.onBind(device, position); boolean isMutingExpectedDeviceExist = mController.hasMutingExpectedDevice(); final boolean currentlyConnected = isCurrentlyConnected(device); - boolean isCurrentSeekbarInvisible = mSeekBar.getVisibility() == View.GONE; boolean isSelected = isDeviceIncluded(mController.getSelectedMediaDevice(), device); boolean isDeselectable = isDeviceIncluded(mController.getDeselectableMediaDevice(), device); @@ -184,82 +184,56 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { + "]"); } + boolean isDeviceGroup = false; + GroupStatus groupStatus = null; + OngoingSessionStatus ongoingSessionStatus = null; + ConnectionState connectionState = ConnectionState.DISCONNECTED; + boolean restrictVolumeAdjustment = false; + boolean deviceDisabled = false; + View.OnClickListener clickListener = null; + if (mCurrentActivePosition == position) { mCurrentActivePosition = -1; } mItemLayout.setVisibility(View.VISIBLE); mStatusIcon.setVisibility(View.GONE); - enableFocusPropertyForView(mContainerLayout); if (mController.isAnyDeviceTransferring()) { if (device.getState() == MediaDeviceState.STATE_CONNECTING && !mController.hasAdjustVolumeUserRestriction()) { - setUpDeviceIcon(device); - updateProgressBarColor(); - setSingleLineLayout(device.getName(), false /* showSeekBar*/, - true /* showProgressBar */, false /* showCheckBox */, - false /* showEndTouchArea */); - } else { - setUpDeviceIcon(device); - setSingleLineLayout(device.getName()); + connectionState = ConnectionState.CONNECTING; } } else { // Set different layout for each device if (device.isMutingExpectedDevice() && !mController.isCurrentConnectedDeviceRemote()) { - updateUnmutedVolumeIcon(device); + connectionState = ConnectionState.CONNECTED; + restrictVolumeAdjustment = true; mCurrentActivePosition = position; - updateFullItemClickListener(v -> onItemClick(v, device)); - setSingleLineLayout(device.getName()); - initFakeActiveDevice(device); + clickListener = v -> onItemClick(v, device); } else if (mShouldGroupSelectedMediaItems && mController.getSelectedMediaDevice().size() > 1 && isDeviceIncluded(mController.getSelectedMediaDevice(), device)) { if (!mediaItem.isFirstDeviceInGroup()) { mItemLayout.setVisibility(View.GONE); - mEndTouchArea.setVisibility(View.GONE); + return; } else { - String sessionName = mController.getSessionName().toString(); - updateUnmutedVolumeIcon(null); - updateEndClickAreaWithIcon( - v -> { - mShouldGroupSelectedMediaItems = false; - notifyDataSetChanged(); - }, - R.drawable.media_output_item_expand_group, - R.string.accessibility_expand_group); - disableFocusPropertyForView(mContainerLayout); - setUpContentDescriptionForView(mSeekBar, mContext.getString( - R.string.accessibility_cast_name, sessionName)); - setSingleLineLayout(sessionName, true /* showSeekBar */, - false /* showProgressBar */, false /* showCheckBox */, - true /* showEndTouchArea */); - initGroupSeekbar(isCurrentSeekbarInvisible); + isDeviceGroup = true; } } else if (device.hasSubtext()) { boolean isActiveWithOngoingSession = device.hasOngoingSession() && (currentlyConnected || isSelected); - boolean isHost = device.isHostForOngoingSession() - && isActiveWithOngoingSession; if (isActiveWithOngoingSession) { mCurrentActivePosition = position; - updateUnmutedVolumeIcon(device); mSubTitleText.setText(device.getSubtextString()); - updateContentAlpha(DEVICE_CONNECTED_ALPHA); - updateEndClickAreaAsSessionEditing(device, - isHost ? R.drawable.media_output_status_edit_session - : R.drawable.ic_sound_bars_anim); - setTwoLineLayout(device.getName() /* title */, - true /* showSeekBar */, false /* showProgressBar */, - true /* showSubtitle */, false /* showStatus */, - true /* showEndTouchArea */); - initSeekbar(device, isCurrentSeekbarInvisible); + ongoingSessionStatus = new OngoingSessionStatus( + device.isHostForOngoingSession()); + setSubtextAndStatus(true /* showSubtitle */, false /* showStatus */); + connectionState = ConnectionState.CONNECTED; } else { if (currentlyConnected) { mCurrentActivePosition = position; - updateUnmutedVolumeIcon(device); - } else { - setUpDeviceIcon(device); + connectionState = ConnectionState.CONNECTED; } mSubTitleText.setText(device.getSubtextString()); Drawable deviceStatusIcon = @@ -271,99 +245,58 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { if (deviceStatusIcon != null) { updateDeviceStatusIcon(deviceStatusIcon); } - updateContentAlpha( - updateClickActionBasedOnSelectionBehavior(device) - ? DEVICE_CONNECTED_ALPHA : DEVICE_DISCONNECTED_ALPHA); - setTwoLineLayout(device.getName(), - currentlyConnected /* showSeekBar */, - false /* showProgressBar */, true /* showSubtitle */, + clickListener = getClickListenerBasedOnSelectionBehavior(device); + deviceDisabled = clickListener == null; + setSubtextAndStatus(true /* showSubtitle */, deviceStatusIcon != null /* showStatus */); } } else if (device.getState() == MediaDeviceState.STATE_CONNECTING_FAILED) { - setUpDeviceIcon(device); updateConnectionFailedStatusIcon(); mSubTitleText.setText(R.string.media_output_dialog_connect_failed); - updateFullItemClickListener(v -> onItemClick(v, device)); - setTwoLineLayout(device.getName(), false /* showSeekBar */, - false /* showProgressBar */, true /* showSubtitle */, - true /* showStatus */); + clickListener = v -> onItemClick(v, device); + setSubtextAndStatus(true /* showSubtitle */, true /* showStatus */); } else if (device.getState() == MediaDeviceState.STATE_GROUPING) { - setUpDeviceIcon(device); - updateProgressBarColor(); - setSingleLineLayout(device.getName(), false /* showSeekBar*/, - true /* showProgressBar */, false /* showCheckBox */, - false /* showEndTouchArea */); + connectionState = ConnectionState.CONNECTING; } else if (mController.getSelectedMediaDevice().size() > 1 && isSelected) { // selected device in group - boolean showEndArea = - !Flags.enableOutputSwitcherSessionGrouping() || isDeselectable; - updateUnmutedVolumeIcon(device); - updateEndAreaForGroupCheckbox(device, true /* isSelected */, isDeselectable); - disableFocusPropertyForView(mContainerLayout); - setUpContentDescriptionForView(mSeekBar, device); - setSingleLineLayout(device.getName(), true /* showSeekBar */, - false /* showProgressBar */, true /* showCheckBox */, - showEndArea /* showEndTouchArea */); - initSeekbar(device, isCurrentSeekbarInvisible); + groupStatus = new GroupStatus( + true /* selected */, + isDeselectable /* deselectable */); + connectionState = ConnectionState.CONNECTED; } else if (!mController.hasAdjustVolumeUserRestriction() && currentlyConnected) { // single selected device if (isMutingExpectedDeviceExist && !mController.isCurrentConnectedDeviceRemote()) { // mark as disconnected and set special click listener - setUpDeviceIcon(device); - updateFullItemClickListener(v -> cancelMuteAwaitConnection()); - setSingleLineLayout(device.getName()); + clickListener = v -> cancelMuteAwaitConnection(); } else if (device.hasOngoingSession()) { mCurrentActivePosition = position; - updateUnmutedVolumeIcon(device); - updateEndClickAreaAsSessionEditing(device, device.isHostForOngoingSession() - ? R.drawable.media_output_status_edit_session - : R.drawable.ic_sound_bars_anim); - mEndClickIcon.setVisibility(View.VISIBLE); - setSingleLineLayout(device.getName(), true /* showSeekBar */, - false /* showProgressBar */, false /* showCheckBox */, - true /* showEndTouchArea */); - initSeekbar(device, isCurrentSeekbarInvisible); + ongoingSessionStatus = new OngoingSessionStatus( + device.isHostForOngoingSession()); + connectionState = ConnectionState.CONNECTED; } else if (mController.isCurrentConnectedDeviceRemote() && !mController.getSelectableMediaDevice().isEmpty()) { //If device is connected and there's other selectable devices, layout as // one of selected devices. - updateUnmutedVolumeIcon(device); - updateEndAreaForGroupCheckbox(device, true /* isSelected */, - isDeselectable); - disableFocusPropertyForView(mContainerLayout); - setUpContentDescriptionForView(mSeekBar, device); - setSingleLineLayout(device.getName(), true /* showSeekBar */, - false /* showProgressBar */, true /* showCheckBox */, - true /* showEndTouchArea */); - initSeekbar(device, isCurrentSeekbarInvisible); + groupStatus = new GroupStatus( + true /* selected */, + isDeselectable /* isDeselectable */); + connectionState = ConnectionState.CONNECTED; } else { - updateUnmutedVolumeIcon(device); - disableFocusPropertyForView(mContainerLayout); - setUpContentDescriptionForView(mSeekBar, device); mCurrentActivePosition = position; - setSingleLineLayout(device.getName(), true /* showSeekBar */, - false /* showProgressBar */, false /* showCheckBox */, - false /* showEndTouchArea */); - initSeekbar(device, isCurrentSeekbarInvisible); + connectionState = ConnectionState.CONNECTED; } } else if (isSelectable) { //groupable device - setUpDeviceIcon(device); - updateEndAreaForGroupCheckbox(device, false /* isSelected */, - true /* isDeselectable */); + groupStatus = new GroupStatus(false /* selected */, true /* deselectable */); if (!Flags.disableTransferWhenAppsDoNotSupport() || isTransferable || hasRouteListingPreferenceItem) { - updateFullItemClickListener(v -> onItemClick(v, device)); + clickListener = v -> onItemClick(v, device); } - setSingleLineLayout(device.getName(), false /* showSeekBar */, - false /* showProgressBar */, true /* showCheckBox */, - true /* showEndTouchArea */); + deviceDisabled = clickListener == null; } else { - setUpDeviceIcon(device); - setSingleLineLayout(device.getName()); Drawable deviceStatusIcon = device.hasOngoingSession() ? mContext.getDrawable( R.drawable.ic_sound_bars_anim) @@ -374,11 +307,61 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { updateDeviceStatusIcon(deviceStatusIcon); mStatusIcon.setVisibility(View.VISIBLE); } - updateContentAlpha( - updateClickActionBasedOnSelectionBehavior(device) - ? DEVICE_CONNECTED_ALPHA : DEVICE_DISCONNECTED_ALPHA); + clickListener = getClickListenerBasedOnSelectionBehavior(device); + deviceDisabled = clickListener == null; } } + + if (isDeviceGroup) { + String sessionName = mController.getSessionName().toString(); + updateTitle(sessionName); + updateUnmutedVolumeIcon(null /* device */); + updateGroupSeekBar(getGroupItemContentDescription(sessionName)); + updateEndAreaForDeviceGroup(); + updateItemBackground(ConnectionState.CONNECTED); + } else { + updateTitle(device.getName()); + updateTitleIcon(device, connectionState, restrictVolumeAdjustment); + updateSeekBar(device, connectionState, restrictVolumeAdjustment, + getDeviceItemContentDescription(device)); + updateEndArea(device, connectionState, groupStatus, ongoingSessionStatus); + updateLoadingIndicator(connectionState); + updateFullItemClickListener(clickListener); + updateContentAlpha(deviceDisabled); + updateItemBackground(connectionState); + } + } + + /** Renders the right side round pill button / checkbox. */ + private void updateEndArea(@NonNull MediaDevice device, ConnectionState connectionState, + @Nullable GroupStatus groupStatus, + @Nullable OngoingSessionStatus ongoingSessionStatus) { + boolean showEndArea = false; + boolean isCheckbox = false; + // If both group status and the ongoing session status are present, only the ongoing + // session controls are displayed. The current layout design doesn't allow both group + // and ongoing session controls to be rendered simultaneously. + if (ongoingSessionStatus != null && connectionState == ConnectionState.CONNECTED) { + showEndArea = true; + updateEndAreaForOngoingSession(device, ongoingSessionStatus.host()); + } else if (groupStatus != null && shouldShowGroupCheckbox(groupStatus)) { + showEndArea = true; + isCheckbox = true; + updateEndAreaForGroupCheckBox(device, groupStatus); + } + updateEndAreaVisibility(showEndArea, isCheckbox); + } + + private boolean shouldShowGroupCheckbox(@NonNull GroupStatus groupStatus) { + if (Flags.enableOutputSwitcherSessionGrouping()) { + return isGroupCheckboxEnabled(groupStatus); + } + return true; + } + + private boolean isGroupCheckboxEnabled(@NonNull GroupStatus groupStatus) { + boolean disabled = groupStatus.selected() && !groupStatus.deselectable(); + return !disabled; } public void setCheckBoxColor(CheckBox checkBox, int color) { @@ -388,21 +371,34 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { ColorStateList(states, colors)); } - private void updateContentAlpha(float alphaValue) { + private void updateContentAlpha(boolean deviceDisabled) { + float alphaValue = deviceDisabled ? DEVICE_DISABLED_ALPHA : DEVICE_ACTIVE_ALPHA; mTitleIcon.setAlpha(alphaValue); mTitleText.setAlpha(alphaValue); mSubTitleText.setAlpha(alphaValue); mStatusIcon.setAlpha(alphaValue); } - private void updateEndClickAreaAsSessionEditing(MediaDevice device, @DrawableRes int id) { - updateEndClickAreaWithIcon( + private void updateEndAreaForDeviceGroup() { + updateEndAreaWithIcon( + v -> { + mShouldGroupSelectedMediaItems = false; + notifyDataSetChanged(); + }, + R.drawable.media_output_item_expand_group, + R.string.accessibility_expand_group); + updateEndAreaVisibility(true /* showEndArea */, false /* isCheckbox */); + } + + private void updateEndAreaForOngoingSession(@NonNull MediaDevice device, boolean isHost) { + updateEndAreaWithIcon( v -> mController.tryToLaunchInAppRoutingIntent(device.getId(), v), - id, + isHost ? R.drawable.media_output_status_edit_session + : R.drawable.ic_sound_bars_anim, R.string.accessibility_open_application); } - private void updateEndClickAreaWithIcon(View.OnClickListener clickListener, + private void updateEndAreaWithIcon(View.OnClickListener clickListener, @DrawableRes int iconDrawableId, @StringRes int accessibilityStringId) { updateEndAreaColor(mController.getColorSeekbarProgress()); @@ -416,8 +412,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { ((AnimatedVectorDrawable) drawable).start(); } if (Flags.enableOutputSwitcherSessionGrouping()) { - setUpContentDescriptionForView( - mEndClickIcon, mContext.getString(accessibilityStringId)); + mEndClickIcon.setContentDescription(mContext.getString(accessibilityStringId)); } } @@ -426,11 +421,11 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { ColorStateList.valueOf(color)); } - private boolean updateClickActionBasedOnSelectionBehavior(MediaDevice device) { - View.OnClickListener clickListener = Api34Impl.getClickListenerBasedOnSelectionBehavior( + @Nullable + private View.OnClickListener getClickListenerBasedOnSelectionBehavior( + @NonNull MediaDevice device) { + return Api34Impl.getClickListenerBasedOnSelectionBehavior( device, mController, v -> onItemClick(v, device)); - updateFullItemClickListener(clickListener); - return clickListener != null; } private void updateConnectionFailedStatusIcon() { @@ -449,31 +444,24 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { } } - private void updateProgressBarColor() { - mProgressBar.getIndeterminateDrawable().setTintList( - ColorStateList.valueOf(mController.getColorItemContent())); - } - - public void updateEndAreaForGroupCheckbox(MediaDevice device, boolean isSelected, - boolean isDeselectable) { - mEndTouchArea.setOnClickListener(null); + public void updateEndAreaForGroupCheckBox(@NonNull MediaDevice device, + @NonNull GroupStatus groupStatus) { + boolean isEnabled = isGroupCheckboxEnabled(groupStatus); mEndTouchArea.setOnClickListener( - isDeselectable ? (v) -> mCheckBox.performClick() : null); - mEndTouchArea.setImportantForAccessibility( - View.IMPORTANT_FOR_ACCESSIBILITY_YES); - updateEndAreaColor(isSelected ? mController.getColorSeekbarProgress() + isEnabled ? (v) -> mCheckBox.performClick() : null); + mEndTouchArea.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); + updateEndAreaColor(groupStatus.selected() ? mController.getColorSeekbarProgress() : mController.getColorItemBackground()); - setUpContentDescriptionForView(mEndTouchArea, device); - mCheckBox.setOnCheckedChangeListener(null); - mCheckBox.setChecked(isSelected); + mEndTouchArea.setContentDescription(getDeviceItemContentDescription(device)); + mCheckBox.setChecked(groupStatus.selected()); mCheckBox.setOnCheckedChangeListener( - isDeselectable ? (buttonView, isChecked) -> onGroupActionTriggered(!isSelected, - device) : null); - mCheckBox.setEnabled(isDeselectable); + isEnabled ? (buttonView, isChecked) -> onGroupActionTriggered( + !groupStatus.selected(), device) : null); + mCheckBox.setEnabled(isEnabled); setCheckBoxColor(mCheckBox, mController.getColorItemContent()); } - private void updateFullItemClickListener(View.OnClickListener listener) { + private void updateFullItemClickListener(@Nullable View.OnClickListener listener) { mContainerLayout.setOnClickListener(listener); updateIconAreaClickListener(listener); } @@ -482,7 +470,8 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { void onBindPairNewDevice() { mTitleText.setTextColor(mController.getColorItemContent()); mCheckBox.setVisibility(View.GONE); - setSingleLineLayout(mContext.getText(R.string.media_output_dialog_pairing_new)); + updateTitle(mContext.getText(R.string.media_output_dialog_pairing_new)); + updateItemBackground(ConnectionState.DISCONNECTED); final Drawable addDrawable = mContext.getDrawable(R.drawable.ic_add); mTitleIcon.setImageDrawable(addDrawable); mTitleIcon.setImageTintList( @@ -536,27 +525,15 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { notifyDataSetChanged(); } - private void disableFocusPropertyForView(View view) { - view.setFocusable(false); - view.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); - } - - private void enableFocusPropertyForView(View view) { - view.setFocusable(true); - view.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO); - } - - private void setUpContentDescriptionForView(View view, MediaDevice device) { - setUpContentDescriptionForView( - view, - mContext.getString(device.getDeviceType() - == MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE + private String getDeviceItemContentDescription(@NonNull MediaDevice device) { + return mContext.getString( + device.getDeviceType() == MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE ? R.string.accessibility_bluetooth_name - : R.string.accessibility_cast_name, device.getName())); + : R.string.accessibility_cast_name, device.getName()); } - protected void setUpContentDescriptionForView(View view, String description) { - view.setContentDescription(description); + private String getGroupItemContentDescription(String sessionName) { + return mContext.getString(R.string.accessibility_cast_name, sessionName); } } diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java index a7786c8f0b57..3f635fa281d6 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java @@ -22,7 +22,6 @@ import android.app.WallpaperColors; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.drawable.ClipDrawable; -import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.Icon; import android.graphics.drawable.LayerDrawable; @@ -39,6 +38,7 @@ import android.widget.SeekBar; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.recyclerview.widget.RecyclerView; @@ -56,6 +56,16 @@ import java.util.List; public abstract class MediaOutputBaseAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { + record OngoingSessionStatus(boolean host) {} + + record GroupStatus(Boolean selected, Boolean deselectable) {} + + enum ConnectionState { + CONNECTED, + CONNECTING, + DISCONNECTED, + } + protected final MediaSwitchingController mController; private static final int UNMUTE_DEFAULT_VOLUME = 2; @@ -175,6 +185,7 @@ public abstract class MediaOutputBaseAdapter extends mCheckBox.setVisibility(View.GONE); mStatusIcon.setVisibility(View.GONE); mEndTouchArea.setVisibility(View.GONE); + mEndClickIcon.setVisibility(View.GONE); mEndTouchArea.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); mContainerLayout.setOnClickListener(null); mContainerLayout.setContentDescription(null); @@ -184,75 +195,92 @@ public abstract class MediaOutputBaseAdapter extends mIconAreaLayout.setBackground(null); mSeekBar.setProgressTintList( ColorStateList.valueOf(mController.getColorSeekbarProgress())); + enableFocusPropertyForView(mContainerLayout); } - void setSingleLineLayout(CharSequence title) { - setSingleLineLayout(title, false, false, false, false); + void updateTitle(CharSequence title) { + mTitleText.setText(title); } - void setSingleLineLayout(CharSequence title, boolean showSeekBar, - boolean showProgressBar, boolean showCheckBox, boolean showEndTouchArea) { - boolean isActive = showSeekBar || showProgressBar; + void updateSeekBar(@NonNull MediaDevice device, ConnectionState connectionState, + boolean restrictVolumeAdjustment, String contentDescription) { + boolean showSeekBar = + connectionState == ConnectionState.CONNECTED && !restrictVolumeAdjustment; if (!mCornerAnimator.isRunning()) { - final Drawable backgroundDrawable = - showSeekBar - ? mContext.getDrawable( - R.drawable.media_output_item_background_active) - .mutate() : mContext.getDrawable( - R.drawable.media_output_item_background) - .mutate(); - mItemLayout.setBackground(backgroundDrawable); if (showSeekBar) { updateSeekbarProgressBackground(); } } - mItemLayout.setBackgroundTintList( - ColorStateList.valueOf(isActive ? mController.getColorConnectedItemBackground() - : mController.getColorItemBackground())); - mProgressBar.setVisibility(showProgressBar ? View.VISIBLE : View.GONE); - mSeekBar.setAlpha(1); + boolean isCurrentSeekbarInvisible = mSeekBar.getVisibility() == View.GONE; mSeekBar.setVisibility(showSeekBar ? View.VISIBLE : View.GONE); - if (!showSeekBar) { - mSeekBar.resetVolume(); - } - mTitleText.setText(title); - mCheckBox.setVisibility(showCheckBox ? View.VISIBLE : View.GONE); - mEndTouchArea.setVisibility(showEndTouchArea ? View.VISIBLE : View.GONE); - if (Flags.enableOutputSwitcherSessionGrouping()) { - mEndClickIcon.setVisibility( - !showCheckBox && showEndTouchArea ? View.VISIBLE : View.GONE); + if (showSeekBar) { + initSeekbar(device, isCurrentSeekbarInvisible); + disableFocusPropertyForView(mContainerLayout); + mSeekBar.setContentDescription(contentDescription); + } else { + enableFocusPropertyForView(mContainerLayout); } } - void setTwoLineLayout(CharSequence title, boolean showSeekBar, - boolean showProgressBar, boolean showSubtitle, boolean showStatus) { - setTwoLineLayout(title, showSeekBar, showProgressBar, showSubtitle, showStatus, false); + void updateGroupSeekBar(String contentDescription) { + updateSeekbarProgressBackground(); + boolean isCurrentSeekbarInvisible = mSeekBar.getVisibility() == View.GONE; + mSeekBar.setVisibility(View.VISIBLE); + initGroupSeekbar(isCurrentSeekbarInvisible); + disableFocusPropertyForView(mContainerLayout); + mSeekBar.setContentDescription(contentDescription); } - void setTwoLineLayout(CharSequence title, - boolean showSeekBar, boolean showProgressBar, boolean showSubtitle, - boolean showStatus , boolean showEndTouchArea) { + private void disableFocusPropertyForView(View view) { + view.setFocusable(false); + view.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); + } + + private void enableFocusPropertyForView(View view) { + view.setFocusable(true); + view.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_AUTO); + } + + void setSubtextAndStatus(boolean showSubtitle, boolean showStatus) { mStatusIcon.setVisibility(showStatus ? View.VISIBLE : View.GONE); - mSeekBar.setAlpha(1); - mSeekBar.setVisibility(showSeekBar ? View.VISIBLE : View.GONE); - final Drawable backgroundDrawable; - backgroundDrawable = mContext.getDrawable( - showSeekBar ? R.drawable.media_output_item_background_active - : R.drawable.media_output_item_background).mutate(); - mItemLayout.setBackgroundTintList(ColorStateList.valueOf( - showSeekBar ? mController.getColorConnectedItemBackground() - : mController.getColorItemBackground() - )); - if (showSeekBar) { - updateSeekbarProgressBackground(); + mSubTitleText.setVisibility(showSubtitle ? View.VISIBLE : View.GONE); + } + + protected void updateLoadingIndicator(ConnectionState connectionState) { + if (connectionState == ConnectionState.CONNECTING) { + mProgressBar.setVisibility(View.VISIBLE); + mProgressBar.getIndeterminateDrawable().setTintList( + ColorStateList.valueOf(mController.getColorItemContent())); + } else { + mProgressBar.setVisibility(View.GONE); } - //update end click area by isActive + } + + protected void updateItemBackground(ConnectionState connectionState) { + boolean isConnected = connectionState == ConnectionState.CONNECTED; + boolean isConnecting = connectionState == ConnectionState.CONNECTING; + + // Increase corner radius for a connected state. + if (!mCornerAnimator.isRunning()) { // FIXME(b/387576145): This is always True. + int backgroundDrawableId = + isConnected ? R.drawable.media_output_item_background_active + : R.drawable.media_output_item_background; + mItemLayout.setBackground(mContext.getDrawable(backgroundDrawableId).mutate()); + } + + // Connected or connecting state has a darker background. + int backgroundColor = isConnected || isConnecting + ? mController.getColorConnectedItemBackground() + : mController.getColorItemBackground(); + mItemLayout.setBackgroundTintList(ColorStateList.valueOf(backgroundColor)); + } + + protected void updateEndAreaVisibility(boolean showEndTouchArea, boolean isCheckbox) { mEndTouchArea.setVisibility(showEndTouchArea ? View.VISIBLE : View.GONE); - mEndClickIcon.setVisibility(showEndTouchArea ? View.VISIBLE : View.GONE); - mItemLayout.setBackground(backgroundDrawable); - mProgressBar.setVisibility(showProgressBar ? View.VISIBLE : View.GONE); - mSubTitleText.setVisibility(showSubtitle ? View.VISIBLE : View.GONE); - mTitleText.setText(title); + if (showEndTouchArea) { + mCheckBox.setVisibility(isCheckbox ? View.VISIBLE : View.GONE); + mEndClickIcon.setVisibility(!isCheckbox ? View.VISIBLE : View.GONE); + } } void updateSeekbarProgressBackground() { @@ -269,7 +297,8 @@ public abstract class MediaOutputBaseAdapter extends } private void initializeSeekbarVolume( - MediaDevice device, int currentVolume, boolean isCurrentSeekbarInvisible) { + @Nullable MediaDevice device, int currentVolume, + boolean isCurrentSeekbarInvisible) { if (!mIsDragging) { if (mSeekBar.getVolume() != currentVolume && (mLatestUpdateVolume == -1 || currentVolume == mLatestUpdateVolume)) { @@ -306,7 +335,7 @@ public abstract class MediaOutputBaseAdapter extends } } - void initSeekbar(MediaDevice device, boolean isCurrentSeekbarInvisible) { + void initSeekbar(@NonNull MediaDevice device, boolean isCurrentSeekbarInvisible) { SeekBarVolumeControl volumeControl = new SeekBarVolumeControl() { @Override public int getVolume() { @@ -377,20 +406,34 @@ public abstract class MediaOutputBaseAdapter extends }); } - void updateMutedVolumeIcon(MediaDevice device) { + protected void updateTitleIcon(@NonNull MediaDevice device, + ConnectionState connectionState, boolean restrictVolumeAdjustment) { + if (connectionState == ConnectionState.CONNECTED) { + if (restrictVolumeAdjustment) { + // Volume icon without a background that makes it looks like part of a seekbar. + updateVolumeIcon(device, false /* isMutedIcon */); + } else { + updateUnmutedVolumeIcon(device); + } + } else { + setUpDeviceIcon(device); + } + } + + void updateMutedVolumeIcon(@Nullable MediaDevice device) { mIconAreaLayout.setBackground( mContext.getDrawable(R.drawable.media_output_item_background_active)); - updateTitleIcon(device, true /* isMutedVolumeIcon */); + updateVolumeIcon(device, true /* isMutedVolumeIcon */); } - void updateUnmutedVolumeIcon(MediaDevice device) { + void updateUnmutedVolumeIcon(@Nullable MediaDevice device) { mIconAreaLayout.setBackground( mContext.getDrawable(R.drawable.media_output_title_icon_area) ); - updateTitleIcon(device, false /* isMutedVolumeIcon */); + updateVolumeIcon(device, false /* isMutedVolumeIcon */); } - void updateTitleIcon(MediaDevice device, boolean isMutedVolumeIcon) { + void updateVolumeIcon(@Nullable MediaDevice device, boolean isMutedVolumeIcon) { boolean isInputMediaDevice = device instanceof InputMediaDevice; int id = getDrawableId(isInputMediaDevice, isMutedVolumeIcon); mTitleIcon.setImageDrawable(mContext.getDrawable(id)); @@ -412,22 +455,10 @@ public abstract class MediaOutputBaseAdapter extends : R.drawable.media_output_icon_volume; } - void updateIconAreaClickListener(View.OnClickListener listener) { + void updateIconAreaClickListener(@Nullable View.OnClickListener listener) { mIconAreaLayout.setOnClickListener(listener); } - void initFakeActiveDevice(MediaDevice device) { - disableSeekBar(); - updateTitleIcon(device, false /* isMutedIcon */); - final Drawable backgroundDrawable = mContext.getDrawable( - R.drawable.media_output_item_background_active) - .mutate(); - mItemLayout.setBackground(backgroundDrawable); - mItemLayout.setBackgroundTintList( - ColorStateList.valueOf(mController.getColorConnectedItemBackground())); - mIconAreaLayout.setBackground(null); - } - private void initAnimator() { mCornerAnimator = ValueAnimator.ofFloat(mInactiveRadius, mActiveRadius); mCornerAnimator.setDuration(ANIM_DURATION); @@ -493,7 +524,7 @@ public abstract class MediaOutputBaseAdapter extends } - protected void setUpDeviceIcon(MediaDevice device) { + protected void setUpDeviceIcon(@NonNull MediaDevice device) { ThreadUtils.postOnBackgroundThread(() -> { Icon icon = mController.getDeviceIconCompat(device).toIcon(mContext); ThreadUtils.postOnMainThread(() -> { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index d5cd8dc55045..b8971d1fa797 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -43,7 +43,9 @@ import com.android.systemui.settings.brightness.BrightnessController; import com.android.systemui.settings.brightness.BrightnessMirrorHandler; import com.android.systemui.settings.brightness.BrightnessSliderController; import com.android.systemui.settings.brightness.MirrorController; +import com.android.systemui.shade.ShadeDisplayAware; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; +import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.SplitShadeStateController; import com.android.systemui.tuner.TunerService; @@ -101,10 +103,11 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { StatusBarKeyguardViewManager statusBarKeyguardViewManager, SplitShadeStateController splitShadeStateController, Provider<QSLongPressEffect> longPRessEffectProvider, - MediaCarouselInteractor mediaCarouselInteractor) { + MediaCarouselInteractor mediaCarouselInteractor, + @ShadeDisplayAware ConfigurationController configurationController) { super(view, qsHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, uiEventLogger, qsLogger, dumpManager, splitShadeStateController, - longPRessEffectProvider); + longPRessEffectProvider, configurationController); mTunerService = tunerService; mQsCustomizerController = qsCustomizerController; mQsTileRevealControllerFactory = qsTileRevealControllerFactory; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java index c8f7be6d80b2..b0b02fa28390 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -41,6 +41,10 @@ import com.android.systemui.qs.external.CustomTile; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileViewImpl; import com.android.systemui.scene.shared.flag.SceneContainerFlag; +import com.android.systemui.shade.ShadeDisplayAware; +import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround; +import com.android.systemui.statusbar.policy.ConfigurationController; +import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.statusbar.policy.SplitShadeStateController; import com.android.systemui.util.ViewController; import com.android.systemui.util.animation.DisappearParameters; @@ -95,6 +99,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr private final QSHost.Callback mQSHostCallback = this::setTiles; private SplitShadeStateController mSplitShadeStateController; + private final ConfigurationController mConfigurationController; private final Provider<QSLongPressEffect> mLongPressEffectProvider; @@ -111,39 +116,42 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr private boolean mLastListening; + private final ConfigurationListener mConfigurationListener = new ConfigurationListener() { + @Override + public void onConfigChanged(Configuration newConfig) { + final boolean previousSplitShadeState = mShouldUseSplitNotificationShade; + final int previousOrientation = mLastOrientation; + final int previousScreenLayout = mLastScreenLayout; + mShouldUseSplitNotificationShade = mSplitShadeStateController + .shouldUseSplitNotificationShade(getResources()); + mLastOrientation = newConfig.orientation; + mLastScreenLayout = newConfig.screenLayout; + + mQSLogger.logOnConfigurationChanged( + /* oldOrientation= */ previousOrientation, + /* newOrientation= */ mLastOrientation, + /* oldShouldUseSplitShade= */ previousSplitShadeState, + /* newShouldUseSplitShade= */ mShouldUseSplitNotificationShade, + /* oldScreenLayout= */ previousScreenLayout, + /* newScreenLayout= */ mLastScreenLayout, + /* containerName= */ mView.getDumpableTag()); + + if (SceneContainerFlag.isEnabled()) { + setLayoutForMediaInScene(); + } else { + switchTileLayoutIfNeeded(); + } + onConfigurationChanged(); + if (previousSplitShadeState != mShouldUseSplitNotificationShade) { + onSplitShadeChanged(mShouldUseSplitNotificationShade); + } + } + }; + /** When {@link ShadeWindowGoesAround} is enabled, this listener is not used anymore.*/ @VisibleForTesting + @Deprecated protected final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener = - new QSPanel.OnConfigurationChangedListener() { - @Override - public void onConfigurationChange(Configuration newConfig) { - final boolean previousSplitShadeState = mShouldUseSplitNotificationShade; - final int previousOrientation = mLastOrientation; - final int previousScreenLayout = mLastScreenLayout; - mShouldUseSplitNotificationShade = mSplitShadeStateController - .shouldUseSplitNotificationShade(getResources()); - mLastOrientation = newConfig.orientation; - mLastScreenLayout = newConfig.screenLayout; - - mQSLogger.logOnConfigurationChanged( - /* oldOrientation= */ previousOrientation, - /* newOrientation= */ mLastOrientation, - /* oldShouldUseSplitShade= */ previousSplitShadeState, - /* newShouldUseSplitShade= */ mShouldUseSplitNotificationShade, - /* oldScreenLayout= */ previousScreenLayout, - /* newScreenLayout= */ mLastScreenLayout, - /* containerName= */ mView.getDumpableTag()); - - if (SceneContainerFlag.isEnabled()) { - setLayoutForMediaInScene(); - } else { - switchTileLayoutIfNeeded(); - } - onConfigurationChanged(); - if (previousSplitShadeState != mShouldUseSplitNotificationShade) { - onSplitShadeChanged(mShouldUseSplitNotificationShade); - } - } - }; + newConfig -> mConfigurationListener.onConfigChanged(newConfig); protected void onConfigurationChanged() { } @@ -173,7 +181,8 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr QSLogger qsLogger, DumpManager dumpManager, SplitShadeStateController splitShadeStateController, - Provider<QSLongPressEffect> longPressEffectProvider + Provider<QSLongPressEffect> longPressEffectProvider, + @ShadeDisplayAware ConfigurationController configurationController ) { super(view); mHost = host; @@ -185,6 +194,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr mQSLogger = qsLogger; mDumpManager = dumpManager; mSplitShadeStateController = splitShadeStateController; + mConfigurationController = configurationController; mShouldUseSplitNotificationShade = mSplitShadeStateController.shouldUseSplitNotificationShade(getResources()); mLongPressEffectProvider = longPressEffectProvider; @@ -238,7 +248,11 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr if (!SceneContainerFlag.isEnabled()) { mMediaHost.addVisibilityChangeListener(mMediaHostVisibilityListener); } - mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener); + if (ShadeWindowGoesAround.isEnabled()) { + mConfigurationController.addCallback(mConfigurationListener); + } else { + mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener); + } // We were not attached and the configuration may have changed, trigger the listener. if (mView.hadConfigurationChangeWhileDetached()) { mOnConfigurationChangedListener.onConfigurationChange( @@ -272,8 +286,11 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr @Override protected void onViewDetached() { mQSLogger.logOnViewDetached(mLastOrientation, mView.getDumpableTag()); - mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener); - + if (ShadeWindowGoesAround.isEnabled()) { + mConfigurationController.removeCallback(mConfigurationListener); + } else { + mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener); + } // Call directly so mLastListening is not modified. We want that to have the last actual // value. mView.getTileLayout().setListening(false, mUiEventLogger); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java index bc695bdd4e05..75628a0e487c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java @@ -35,6 +35,8 @@ import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.res.R; import com.android.systemui.scene.shared.flag.SceneContainerFlag; +import com.android.systemui.shade.ShadeDisplayAware; +import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.SplitShadeStateController; import com.android.systemui.util.leak.RotationUtils; @@ -66,11 +68,12 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, DumpManager dumpManager, SplitShadeStateController splitShadeStateController, Provider<QSLongPressEffect> longPressEffectProvider, - MediaCarouselInteractor mediaCarouselInteractor + MediaCarouselInteractor mediaCarouselInteractor, + @ShadeDisplayAware ConfigurationController configurationController ) { super(view, qsHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, uiEventLogger, qsLogger, dumpManager, splitShadeStateController, - longPressEffectProvider); + longPressEffectProvider, configurationController); mUsingCollapsedLandscapeMediaProvider = usingCollapsedLandscapeMediaProvider; mMediaCarouselInteractor = mediaCarouselInteractor; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/TileDetails.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/TileDetails.kt index 1233a2f285d5..701f44e9981c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/TileDetails.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/TileDetails.kt @@ -125,7 +125,8 @@ private fun MapTileDetailsContent(tileDetailsViewModel: TileDetailsViewModel) { when (tileDetailsViewModel) { is InternetDetailsViewModel -> InternetDetailsContent(tileDetailsViewModel) is ScreenRecordDetailsViewModel -> ScreenRecordDetailsContent(tileDetailsViewModel) - is BluetoothDetailsViewModel -> BluetoothDetailsContent() + is BluetoothDetailsViewModel -> + BluetoothDetailsContent(tileDetailsViewModel.detailsContentViewModel) is ModesDetailsViewModel -> ModesDetailsContent(tileDetailsViewModel) } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java index 1cfa6632a8b0..973265c6c9b1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java @@ -133,7 +133,7 @@ public class BluetoothTile extends QSTileImpl<BooleanState> { callback.accept(new BluetoothDetailsViewModel(() -> { longClick(null); return null; - })) + }, mDialogViewModel)) ); return true; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java index e37ed16133e5..a2cae6ad07e8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java @@ -67,8 +67,10 @@ public class DreamTile extends QSTileImpl<QSTile.BooleanState> { private static final String LOG_TAG = "QSDream"; private final IDreamManager mDreamManager; private final BroadcastDispatcher mBroadcastDispatcher; - private final UserSettingObserver mEnabledSettingObserver; - private final UserSettingObserver mDreamSettingObserver; + @VisibleForTesting + final UserSettingObserver mEnabledSettingObserver; + @VisibleForTesting + final UserSettingObserver mDreamSettingObserver; private final UserTracker mUserTracker; private final boolean mDreamSupported; private final boolean mDreamOnlyEnabledForDockUser; @@ -180,6 +182,13 @@ public class DreamTile extends QSTileImpl<QSTile.BooleanState> { state.expandedAccessibilityClassName = Switch.class.getName(); } + @Override + protected void handleUserSwitch(int newUserId) { + super.handleUserSwitch(newUserId); + mDreamSettingObserver.setUserId(newUserId); + mEnabledSettingObserver.setUserId(newUserId); + } + @Nullable @Override public Intent getLongClickIntent() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTileNewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTileNewImpl.kt index b1f99cccff70..4d0e80854853 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTileNewImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTileNewImpl.kt @@ -32,7 +32,6 @@ import com.android.systemui.plugins.qs.TileDetailsViewModel import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.qs.QSHost import com.android.systemui.qs.QsEventLogger -import com.android.systemui.qs.flags.QsDetailedView import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.qs.tiles.dialog.InternetDetailsViewModel @@ -94,9 +93,6 @@ constructor( } override fun handleClick(expandable: Expandable?) { - if (QsDetailedView.isEnabled) { - return - } mainHandler.post { internetDialogManager.create( aboveStatusBar = true, diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacy.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacy.java index a418b2a71f50..c6bcab48fa68 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacy.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacy.java @@ -74,6 +74,7 @@ import com.android.systemui.qs.flags.QsDetailedView; import com.android.systemui.res.R; import com.android.systemui.shade.ShadeDisplayAware; import com.android.systemui.shade.domain.interactor.ShadeDialogContextInteractor; +import com.android.systemui.shade.domain.interactor.ShadeModeInteractor; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.wifitrackerlib.WifiEntry; @@ -207,9 +208,13 @@ public class InternetDialogDelegateLegacy implements @Background Executor executor, KeyguardStateController keyguardStateController, SystemUIDialog.Factory systemUIDialogFactory, - ShadeDialogContextInteractor shadeDialogContextInteractor) { - // If `QsDetailedView` is enabled, it should show the details view. - QsDetailedView.assertInLegacyMode(); + ShadeDialogContextInteractor shadeDialogContextInteractor, + ShadeModeInteractor shadeModeInteractor) { + // TODO (b/393628355): remove this after the details view is supported for single shade. + if (shadeModeInteractor.isDualShade()){ + // If `QsDetailedView` is enabled, it should show the details view. + QsDetailedView.assertInLegacyMode(); + } mAboveStatusBar = aboveStatusBar; mSystemUIDialogFactory = systemUIDialogFactory; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt index 5f82e60b63ec..27342f37f9fc 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt @@ -24,6 +24,7 @@ import com.android.systemui.coroutines.newTracingContext import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.qs.flags.QsDetailedView +import com.android.systemui.shade.domain.interactor.ShadeModeInteractor import com.android.systemui.statusbar.phone.SystemUIDialog import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher @@ -41,6 +42,7 @@ constructor( private val dialogTransitionAnimator: DialogTransitionAnimator, private val dialogFactory: InternetDialogDelegateLegacy.Factory, @Background private val bgDispatcher: CoroutineDispatcher, + private val shadeModeInteractor: ShadeModeInteractor, ) { private lateinit var coroutineScope: CoroutineScope @@ -59,8 +61,10 @@ constructor( canConfigWifi: Boolean, expandable: Expandable?, ) { - // If `QsDetailedView` is enabled, it should show the details view. - QsDetailedView.assertInLegacyMode() + if (shadeModeInteractor.isDualShade) { + // If `QsDetailedView` is enabled, it should show the details view. + QsDetailedView.assertInLegacyMode() + } if (dialog != null) { if (DEBUG) { Log.d(TAG, "InternetDialog is showing, do not create it twice.") diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index e535019cd3d7..d0632d1fd2fb 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -49,6 +49,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; import android.graphics.Insets; @@ -187,6 +188,7 @@ import com.android.systemui.unfold.SysUIUnfoldComponent; import com.android.systemui.util.Compile; import com.android.systemui.util.Utils; import com.android.systemui.util.time.SystemClock; +import com.android.systemui.wallpapers.ui.viewmodel.WallpaperFocalAreaViewModel; import com.android.wm.shell.animation.FlingAnimationUtils; import dalvik.annotation.optimization.NeverCompile; @@ -261,7 +263,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private final ShadeLogger mShadeLog; private final DozeParameters mDozeParameters; private final NotificationStackScrollLayout.OnEmptySpaceClickListener - mOnEmptySpaceClickListener = (x, y) -> onEmptySpaceClick(); + mOnEmptySpaceClickListener = this::onEmptySpaceClick; private final ShadeHeadsUpChangedListener mOnHeadsUpChangedListener = new ShadeHeadsUpChangedListener(); private final ConfigurationListener mConfigurationListener = new ConfigurationListener(); @@ -459,6 +461,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private final NotificationListContainer mNotificationListContainer; private final NPVCDownEventState.Buffer mLastDownEvents; private final KeyguardClockInteractor mKeyguardClockInteractor; + private final WallpaperFocalAreaViewModel mWallpaperFocalAreaViewModel; private float mMinExpandHeight; private boolean mPanelUpdateWhenAnimatorEnds; private boolean mHasVibratedOnOpen = false; @@ -592,6 +595,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump KeyguardTransitionInteractor keyguardTransitionInteractor, DumpManager dumpManager, KeyguardTouchHandlingViewModel keyguardTouchHandlingViewModel, + WallpaperFocalAreaViewModel wallpaperFocalAreaViewModel, KeyguardInteractor keyguardInteractor, ActivityStarter activityStarter, SharedNotificationContainerInteractor sharedNotificationContainerInteractor, @@ -747,11 +751,13 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump SysUIUnfoldComponent::getKeyguardUnfoldTransition); mKeyguardClockInteractor = keyguardClockInteractor; + mWallpaperFocalAreaViewModel = wallpaperFocalAreaViewModel; + KeyguardLongPressViewBinder.bind( mView.requireViewById(R.id.keyguard_long_press), keyguardTouchHandlingViewModel, - () -> { - onEmptySpaceClick(); + (x, y) -> { + onEmptySpaceClick(x, y); return Unit.INSTANCE; }, mFalsingManager); @@ -2071,7 +2077,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } } - private void onMiddleClicked() { + private void onMiddleClicked(float x, float y) { switch (mBarState) { case KEYGUARD: if (!mDozingOnDown) { @@ -2090,6 +2096,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mLockscreenGestureLogger .log(LockscreenUiEvent.LOCKSCREEN_LOCK_SHOW_HINT); mKeyguardIndicationController.showActionToUnlock(); + mWallpaperFocalAreaViewModel.setTapPosition(x, y); } } break; @@ -2834,7 +2841,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } else if (!mCentralSurfaces.isBouncerShowing() && !mAlternateBouncerInteractor.isVisibleState() && !mKeyguardStateController.isKeyguardGoingAway()) { - onEmptySpaceClick(); + onEmptySpaceClick(x, y); onTrackingStopped(true); } mVelocityTracker.clear(); @@ -3142,8 +3149,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } /** Called when the user performs a click anywhere in the empty area of the panel. */ - private void onEmptySpaceClick() { - onMiddleClicked(); + private void onEmptySpaceClick(float x, float y) { + onMiddleClicked(x, y); } @VisibleForTesting @@ -3371,6 +3378,13 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private final class ConfigurationListener implements ConfigurationController.ConfigurationListener { @Override + public void onConfigChanged(Configuration newConfig) { + if (ShadeWindowGoesAround.isEnabled()) { + updateResources(); + } + } + + @Override public void onThemeChanged() { debugLog("onThemeChanged"); reInflateViews(); diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java index 48e374746bf5..1721700d2aaf 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java @@ -187,10 +187,6 @@ public class NotificationShadeWindowView extends WindowRootView { protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); ShadeTraceLogger.logOnConfigChanged(newConfig); - if (mConfigurationForwarder != null) { - ShadeWindowGoesAround.isUnexpectedlyInLegacyMode(); - mConfigurationForwarder.onConfigurationChanged(newConfig); - } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeStateTraceLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeStateTraceLogger.kt index 6b183acbf9c2..bd7796118038 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeStateTraceLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeStateTraceLogger.kt @@ -21,6 +21,7 @@ import com.android.app.tracing.TrackGroupUtils.trackGroup import com.android.app.tracing.coroutines.TrackTracer.Companion.instantForGroup import com.android.app.tracing.coroutines.launchTraced import com.android.systemui.CoreStartable +import com.android.systemui.common.ui.data.repository.ConfigurationRepository import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.shade.data.repository.ShadeDisplaysRepository @@ -39,6 +40,7 @@ constructor( private val shadeInteractor: ShadeInteractor, private val shadeModeInteractor: ShadeModeInteractor, private val shadeDisplaysRepository: Lazy<ShadeDisplaysRepository>, + @ShadeDisplayAware private val configurationRepository: ConfigurationRepository, @Application private val scope: CoroutineScope, ) : CoreStartable { override fun start() { @@ -63,6 +65,15 @@ constructor( } } } + launch { + configurationRepository.configurationValues.collect { + instantForGroup( + TRACK_GROUP_NAME, + "configurationChange#smallestScreenWidthDp", + it.smallestScreenWidthDp, + ) + } + } } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeTraceLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeTraceLogger.kt index 9a9fc467c53f..ed36204977f8 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeTraceLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeTraceLogger.kt @@ -36,7 +36,10 @@ object ShadeTraceLogger { @JvmStatic fun logOnConfigChanged(config: Configuration) { - t.instant { "onConfigurationChanged(dpi=${config.densityDpi})" } + t.instant { + "NotificationShadeWindowView#onConfigurationChanged(dpi=${config.densityDpi}, " + + "smallestWidthDp=${config.smallestScreenWidthDp})" + } } @JvmStatic diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt index b045db464674..e746274a39c1 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractor.kt @@ -16,6 +16,8 @@ package com.android.systemui.shade.domain.interactor +import android.content.ComponentCallbacks +import android.content.res.Configuration import android.util.Log import android.window.WindowContext import androidx.annotation.UiThread @@ -36,6 +38,7 @@ import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor import com.android.systemui.statusbar.notification.row.NotificationRebindingTracker import com.android.systemui.statusbar.notification.stack.NotificationStackRebindingHider +import com.android.systemui.statusbar.phone.ConfigurationForwarder import com.android.systemui.util.kotlin.getOrNull import com.android.window.flags.Flags import java.util.Optional @@ -65,6 +68,7 @@ constructor( private val activeNotificationsInteractor: ActiveNotificationsInteractor, private val notificationRebindingTracker: NotificationRebindingTracker, notificationStackRebindingHider: Optional<NotificationStackRebindingHider>, + @ShadeDisplayAware private val configForwarder: ConfigurationForwarder, ) : CoreStartable { private val shadeExpandedInteractor = requireOptional(shadeExpandedInteractor) @@ -75,6 +79,7 @@ constructor( override fun start() { ShadeWindowGoesAround.isUnexpectedlyInLegacyMode() + listenForWindowContextConfigChanges() bgScope.launchTraced(TAG) { shadePositionRepository.displayId.collectLatest { displayId -> moveShadeWindowTo(displayId) @@ -82,6 +87,18 @@ constructor( } } + private fun listenForWindowContextConfigChanges() { + shadeContext.registerComponentCallbacks( + object : ComponentCallbacks { + override fun onConfigurationChanged(newConfig: Configuration) { + configForwarder.onConfigurationChanged(newConfig) + } + + override fun onLowMemory() {} + } + ) + } + /** Tries to move the shade. If anything wrong happens, fails gracefully without crashing. */ private suspend fun moveShadeWindowTo(destinationId: Int) { Log.d(TAG, "Trying to move shade window to display with id $destinationId") diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeExpandedStateInteractor.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeExpandedStateInteractor.kt index 8b110e3ef792..c60a67f8c8d0 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeExpandedStateInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeExpandedStateInteractor.kt @@ -110,13 +110,17 @@ constructor( @Background private val bgContext: CoroutineContext, ) : ShadeElement() { override suspend fun expand(reason: String) { - shadeInteractor.expandNotificationsShade(reason) - shadeInteractor.shadeExpansion.waitUntil(1f, bgContext) + if (SceneContainerFlag.isEnabled) { + shadeInteractor.expandNotificationsShade(reason) + shadeInteractor.shadeExpansion.waitUntil(1f, bgContext) + } } override suspend fun collapse(reason: String) { - shadeInteractor.collapseNotificationsShade(reason) - shadeInteractor.shadeExpansion.waitUntil(0f, bgContext) + if (SceneContainerFlag.isEnabled) { + shadeInteractor.collapseNotificationsShade(reason) + shadeInteractor.shadeExpansion.waitUntil(0f, bgContext) + } } } @@ -128,12 +132,16 @@ constructor( @Background private val bgContext: CoroutineContext, ) : ShadeElement() { override suspend fun expand(reason: String) { - shadeInteractor.expandQuickSettingsShade(reason) - shadeInteractor.qsExpansion.waitUntil(1f, bgContext) + if (SceneContainerFlag.isEnabled) { + shadeInteractor.expandQuickSettingsShade(reason) + shadeInteractor.qsExpansion.waitUntil(1f, bgContext) + } } override suspend fun collapse(reason: String) { - shadeInteractor.collapseQuickSettingsShade(reason) - shadeInteractor.qsExpansion.waitUntil(0f, bgContext) + if (SceneContainerFlag.isEnabled) { + shadeInteractor.collapseQuickSettingsShade(reason) + shadeInteractor.qsExpansion.waitUntil(0f, bgContext) + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 4269f60e1c2a..657c86b10f16 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -211,6 +211,7 @@ public class KeyguardIndicationController { protected boolean mPowerPluggedInDock; protected int mChargingSpeed; protected boolean mPowerCharged; + protected int mChargingStatus; /** Whether the battery defender is triggered. */ private boolean mBatteryDefender; @@ -1260,6 +1261,7 @@ public class KeyguardIndicationController { pw.println(" mPowerCharged: " + mPowerCharged); pw.println(" mChargingSpeed: " + mChargingSpeed); pw.println(" mChargingWattage: " + mChargingWattage); + pw.println(" mChargingStatus: " + mChargingStatus); pw.println(" mMessageToShowOnScreenOn: " + mBiometricErrorMessageToShowOnScreenOn); pw.println(" mDozing: " + mDozing); pw.println(" mTransientIndication: " + mTransientIndication); @@ -1317,6 +1319,7 @@ public class KeyguardIndicationController { mPowerCharged = status.isCharged(); mChargingWattage = status.maxChargingWattage; mChargingSpeed = status.getChargingSpeed(mContext); + mChargingStatus = status.chargingStatus; mBatteryLevel = status.level; mBatteryPresent = status.present; mBatteryDefender = isBatteryDefender(status); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt index b6ef95893036..89cb42056e87 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ConversationNotifications.kt @@ -20,10 +20,17 @@ import android.app.Notification import android.app.Notification.EXTRA_SUMMARIZED_CONTENT import android.content.Context import android.content.pm.LauncherApps +import android.graphics.Typeface import android.graphics.drawable.AnimatedImageDrawable import android.os.Handler import android.service.notification.NotificationListenerService.Ranking import android.service.notification.NotificationListenerService.RankingMap +import android.text.SpannableString +import android.text.Spanned +import android.text.TextUtils +import android.text.style.ImageSpan +import android.text.style.StyleSpan +import com.android.internal.R import com.android.internal.widget.ConversationLayout import com.android.internal.widget.MessagingImageMessage import com.android.internal.widget.MessagingLayout @@ -49,6 +56,7 @@ import javax.inject.Inject class ConversationNotificationProcessor @Inject constructor( + @ShadeDisplayAware private val context: Context, private val launcherApps: LauncherApps, private val conversationNotificationManager: ConversationNotificationManager, ) { @@ -67,9 +75,38 @@ constructor( messagingStyle.shortcutIcon = launcherApps.getShortcutIcon(shortcutInfo) shortcutInfo.label?.let { label -> messagingStyle.conversationTitle = label } } - if (NmSummarizationUiFlag.isEnabled) { + if (NmSummarizationUiFlag.isEnabled && !TextUtils.isEmpty(entry.ranking.summarization)) { + val icon = context.getDrawable(R.drawable.ic_notification_summarization)?.mutate() + val imageSpan = + icon?.let { + it.setBounds( + /* left= */ 0, + /* top= */ 0, + icon.getIntrinsicWidth(), + icon.getIntrinsicHeight(), + ) + ImageSpan(it, ImageSpan.ALIGN_CENTER) + } + val decoratedSummary = + SpannableString("x" + entry.ranking.summarization).apply { + setSpan( + /* what = */ imageSpan, + /* start = */ 0, + /* end = */ 1, + /* flags = */ Spanned.SPAN_INCLUSIVE_EXCLUSIVE, + ) + entry.ranking.summarization?.let { + setSpan( + /* what = */ StyleSpan(Typeface.BOLD), + /* start = */ 1, + /* end = */ it.length, + /* flags = */ Spanned.SPAN_EXCLUSIVE_INCLUSIVE, + ) + } + } entry.sbn.notification.extras.putCharSequence( - EXTRA_SUMMARIZED_CONTENT, entry.ranking.summarization + EXTRA_SUMMARIZED_CONTENT, + decoratedSummary, ) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/AvalancheProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/AvalancheProvider.kt index a8fd082dd1e1..4953e648be4f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/AvalancheProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/AvalancheProvider.kt @@ -33,7 +33,6 @@ class AvalancheProvider @Inject constructor( private val broadcastDispatcher: BroadcastDispatcher, - private val logger: VisualInterruptionDecisionLogger, private val uiEventLogger: UiEventLogger, ) { val TAG = "AvalancheProvider" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt index caa6ccf9a5fa..d237bbf3552d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/CommonVisualInterruptionSuppressors.kt @@ -280,7 +280,6 @@ class AvalancheSuppressor( private val uiEventLogger: UiEventLogger, private val context: Context, private val notificationManager: NotificationManager, - private val logger: VisualInterruptionDecisionLogger, private val systemSettings: SystemSettings, ) : VisualInterruptionFilter(types = setOf(PEEK, PULSE), reason = "avalanche") { val TAG = "AvalancheSuppressor" @@ -358,18 +357,15 @@ class AvalancheSuppressor( override fun shouldSuppress(entry: NotificationEntry): Boolean { if (!isCooldownEnabled()) { - logger.logAvalancheAllow("cooldown OFF") return false } val timeSinceAvalancheMs = systemClock.currentTimeMillis() - avalancheProvider.startTime val timedOut = timeSinceAvalancheMs >= avalancheProvider.timeoutMs if (timedOut) { - logger.logAvalancheAllow("timedOut! timeSinceAvalancheMs=$timeSinceAvalancheMs") return false } val state = calculateState(entry) if (state != State.SUPPRESS) { - logger.logAvalancheAllow("state=$state") return false } if (shouldShowEdu()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionLogger.kt index 38cab820c133..1f76d5db6e15 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionLogger.kt @@ -94,15 +94,6 @@ constructor(@NotificationInterruptLog val buffer: LogBuffer) { ) } - fun logAvalancheAllow(info: String) { - buffer.log( - TAG, - INFO, - { str1 = info }, - { "AvalancheSuppressor: $str1" } - ) - } - fun logCooldownSetting(isEnabled: Boolean) { buffer.log( TAG, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt index b831b9457acd..8240a0abaa9d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImpl.kt @@ -196,7 +196,6 @@ constructor( uiEventLogger, context, notificationManager, - logger, systemSettings, ) ) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt index 5ddb4ea4b94a..7c75983885ea 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/promoted/AODPromotedNotification.kt @@ -66,7 +66,10 @@ import com.android.systemui.statusbar.notification.row.shared.ImageModel import com.android.systemui.statusbar.notification.row.shared.isNullOrEmpty @Composable -fun AODPromotedNotification(viewModelFactory: AODPromotedNotificationViewModel.Factory) { +fun AODPromotedNotification( + viewModelFactory: AODPromotedNotificationViewModel.Factory, + modifier: Modifier = Modifier, +) { if (!PromotedNotificationUiAod.isEnabled) { return } @@ -79,17 +82,15 @@ fun AODPromotedNotification(viewModelFactory: AODPromotedNotificationViewModel.F key(content.identity) { val layoutResource = content.layoutResource ?: return - val topPadding = dimensionResource(systemuiR.dimen.below_clock_padding_start_icons) val sidePaddings = dimensionResource(systemuiR.dimen.notification_side_paddings) - val paddingValues = - PaddingValues(top = topPadding, start = sidePaddings, end = sidePaddings, bottom = 0.dp) + val sidePaddingValues = PaddingValues(horizontal = sidePaddings, vertical = 0.dp) val borderStroke = BorderStroke(1.dp, SecondaryText.brush) val borderRadius = dimensionResource(systemuiR.dimen.notification_corner_radius) val borderShape = RoundedCornerShape(borderRadius) - Box(modifier = Modifier.padding(paddingValues)) { + Box(modifier = modifier.padding(sidePaddingValues)) { AODPromotedNotificationView( layoutResource = layoutResource, content = content, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridConversationNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridConversationNotificationView.java index 92c10abff735..344d0f6d3741 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridConversationNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridConversationNotificationView.java @@ -289,7 +289,7 @@ public class HybridConversationNotificationView extends HybridNotificationView { CharSequence titleText, CharSequence contentText, CharSequence conversationSenderName, - @Nullable String summarization + @Nullable CharSequence summarization ) { if (AsyncHybridViewInflation.isUnexpectedlyInLegacyMode()) return; if (summarization != null) { @@ -304,9 +304,8 @@ public class HybridConversationNotificationView extends HybridNotificationView { mConversationSenderName.setText(conversationSenderName); } } - // TODO (b/217799515): super.bind() doesn't use contentView, remove the contentView - // argument when the flag is removed - super.bind(/* title = */ titleText, /* text = */ contentText, /* contentView = */ null); + super.bind(/* title = */ titleText, /* text = */ contentText, + /* stripSpans = */ TextUtils.isEmpty(summarization)); } private static void setSize(View view, int size) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java index 5c4c253d1f98..02dc805dcab4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/HybridNotificationView.java @@ -121,6 +121,11 @@ public class HybridNotificationView extends AlphaOptimizedLinearLayout public void bind(@Nullable CharSequence title, @Nullable CharSequence text, @Nullable View contentView) { + bind(/* title = */ title, /* text = */ text, /* stripSpans */ true); + } + + public void bind(@Nullable CharSequence title, @Nullable CharSequence text, + boolean stripSpans) { mTitleView.setText(title != null ? title.toString() : title); mTitleView.setVisibility(TextUtils.isEmpty(title) ? GONE : VISIBLE); if (TextUtils.isEmpty(text)) { @@ -128,7 +133,11 @@ public class HybridNotificationView extends AlphaOptimizedLinearLayout mTextView.setText(null); } else { mTextView.setVisibility(VISIBLE); - mTextView.setText(text.toString()); + if (stripSpans) { + mTextView.setText(text.toString()); + } else { + mTextView.setText(text); + } } requestLayout(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt index bc3653a34fca..20c3464536e9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationRowContentBinderImpl.kt @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.notification.row import android.annotation.SuppressLint import android.app.Notification +import android.app.Notification.EXTRA_SUMMARIZED_CONTENT import android.app.Notification.MessagingStyle import android.content.Context import android.content.ContextWrapper @@ -729,7 +730,9 @@ constructor( builder = builder, systemUiContext = systemUiContext, redactText = false, - summarization = entry.ranking.summarization, + summarization = entry.sbn.notification.extras.getCharSequence( + EXTRA_SUMMARIZED_CONTENT, + ) ) } else null diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/SingleLineViewInflater.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/SingleLineViewInflater.kt index c051513ef3b4..b3c8f2219f4d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/SingleLineViewInflater.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/SingleLineViewInflater.kt @@ -61,7 +61,7 @@ internal object SingleLineViewInflater { builder: Notification.Builder, systemUiContext: Context, redactText: Boolean, - summarization: String? + summarization: CharSequence? ): SingleLineViewModel { if (AsyncHybridViewInflation.isUnexpectedlyInLegacyMode()) { return SingleLineViewModel(null, null, null) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/SingleLineViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/SingleLineViewModel.kt index 32ded25f18a1..bb5cff98c470 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/SingleLineViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewmodel/SingleLineViewModel.kt @@ -46,7 +46,7 @@ data class SingleLineViewModel( data class ConversationData( val conversationSenderName: CharSequence?, val avatar: ConversationAvatar, - val summarization: String? + val summarization: CharSequence? ) /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index b146b92ed110..a9b3753b42cb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -21,15 +21,14 @@ import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; import static android.app.StatusBarManager.WindowVisibleState; import static android.app.StatusBarManager.windowStateToString; +import static android.service.quickaccesswallet.Flags.launchWalletOptionOnPowerDoubleTap; +import static android.service.quickaccesswallet.Flags.launchWalletViaSysuiCallbacks; import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO; import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO; import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS; import static androidx.lifecycle.Lifecycle.State.RESUMED; -import static android.service.quickaccesswallet.Flags.launchWalletOptionOnPowerDoubleTap; -import static android.service.quickaccesswallet.Flags.launchWalletViaSysuiCallbacks; - import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME; import static com.android.systemui.Flags.keyboardShortcutHelperRewrite; import static com.android.systemui.Flags.lightRevealMigration; @@ -38,6 +37,7 @@ import static com.android.systemui.Flags.statusBarSignalPolicyRefactor; import static com.android.systemui.charging.WirelessChargingAnimation.UNKNOWN_BATTERY_LEVEL; import static com.android.systemui.flags.Flags.SHORTCUT_LIST_SEARCH_LAYOUT; import static com.android.systemui.statusbar.StatusBarState.SHADE; + import android.annotation.Nullable; import android.app.ActivityOptions; import android.app.IWallpaperManager; @@ -176,6 +176,7 @@ import com.android.systemui.shade.ShadeExpansionStateManager; import com.android.systemui.shade.ShadeLogger; import com.android.systemui.shade.ShadeSurface; import com.android.systemui.shade.ShadeViewController; +import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround; import com.android.systemui.shared.recents.utilities.Utilities; import com.android.systemui.shared.statusbar.phone.BarTransitions; import com.android.systemui.statusbar.AutoHideUiElement; @@ -1974,17 +1975,15 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { * meantime, just update the things that we know change. */ void updateResources() { - // TODO: b/374267505 - we shouldn't propagate this from here. Each class should be - // listening at the correct configuration change. For example, shade window classes should - // be listening at @ShadeDisplayAware configurations (as it can be on a different display. - - // Update the quick setting tiles - if (mQSPanelController != null) { - mQSPanelController.updateResources(); - } + if (!ShadeWindowGoesAround.isEnabled()) { + // Each class now subscribes to configuration changes by themselves. + if (mQSPanelController != null) { + mQSPanelController.updateResources(); + } - if (mShadeSurface != null) { - mShadeSurface.updateResources(); + if (mShadeSurface != null) { + mShadeSurface.updateResources(); + } } if (mBrightnessMirrorController != null) { mBrightnessMirrorController.updateResources(); diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index ae063b416dca..ae3756d390af 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -125,6 +125,7 @@ import com.android.systemui.haptics.slider.HapticSliderPlugin; import com.android.systemui.haptics.slider.HapticSliderViewBinder; import com.android.systemui.haptics.slider.SeekableSliderTrackerConfig; import com.android.systemui.haptics.slider.SliderHapticFeedbackConfig; +import com.android.systemui.haptics.slider.SliderHapticFeedbackFilter; import com.android.systemui.media.dialog.MediaOutputDialogManager; import com.android.systemui.plugins.VolumeDialog; import com.android.systemui.plugins.VolumeDialogController; @@ -2698,7 +2699,8 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, /* upperBookendScale= */ 1f, /* lowerBookendScale= */ 0.05f, /* exponent= */ 1f / 0.89f, - /* sliderStepSize = */ 0f); + /* sliderStepSize = */ 0f, + /* filter =*/new SliderHapticFeedbackFilter()); private static final SeekableSliderTrackerConfig sSliderTrackerConfig = new SeekableSliderTrackerConfig( /* waitTimeMillis= */100, diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt index ffafa065a7c8..a51e33ad05cc 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt @@ -19,6 +19,7 @@ package com.android.systemui.volume.dialog.sliders.ui import android.graphics.drawable.Drawable import android.view.View import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -39,8 +40,8 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue -import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.pointer.pointerInput @@ -60,12 +61,11 @@ import com.android.systemui.volume.haptics.ui.VolumeHapticsConfigsProvider import javax.inject.Inject import kotlin.math.round import kotlin.math.roundToInt +import kotlinx.coroutines.Job import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.currentCoroutineContext -import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.flow.map import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch @VolumeDialogSliderScope class VolumeDialogSliderViewBinder @@ -102,6 +102,7 @@ private fun VolumeDialogSlider( hapticsViewModelFactory: SliderHapticsViewModel.Factory?, modifier: Modifier = Modifier, ) { + val coroutineScope = rememberCoroutineScope() val colors = SliderDefaults.colors( thumbColor = MaterialTheme.colorScheme.primary, @@ -110,8 +111,14 @@ private fun VolumeDialogSlider( activeTrackColor = MaterialTheme.colorScheme.primary, inactiveTrackColor = MaterialTheme.colorScheme.surfaceContainerHighest, ) - val collectedSliderState by viewModel.state.collectAsStateWithLifecycle(null) - val sliderState = collectedSliderState ?: return + val collectedSliderStateModel by viewModel.state.collectAsStateWithLifecycle(null) + val sliderStateModel = collectedSliderStateModel ?: return + + val steps = with(sliderStateModel.valueRange) { endInclusive - start - 1 }.toInt() + + var animateJob: Job? = null + val animatedSliderValue = + remember(sliderStateModel.value) { Animatable(sliderStateModel.value) } val interactionSource = remember { MutableInteractionSource() } val hapticsViewModel: SliderHapticsViewModel? = @@ -119,56 +126,63 @@ private fun VolumeDialogSlider( rememberViewModel(traceName = "SliderHapticsViewModel") { it.create( interactionSource, - sliderState.valueRange, + sliderStateModel.valueRange, Orientation.Vertical, - VolumeHapticsConfigsProvider.sliderHapticFeedbackConfig(sliderState.valueRange), + VolumeHapticsConfigsProvider.sliderHapticFeedbackConfig( + sliderStateModel.valueRange + ), VolumeHapticsConfigsProvider.seekableSliderTrackerConfig, ) } } - val state = - remember(sliderState.valueRange) { + val sliderState = + remember(steps, sliderStateModel.valueRange) { SliderState( - value = sliderState.value, - valueRange = sliderState.valueRange, - steps = - (sliderState.valueRange.endInclusive - sliderState.valueRange.start - 1) - .toInt(), + value = sliderStateModel.value, + valueRange = sliderStateModel.valueRange, + steps = steps, ) - .apply { - onValueChangeFinished = { - viewModel.onStreamChangeFinished(value.roundToInt()) + .also { sliderState -> + sliderState.onValueChangeFinished = { + viewModel.onStreamChangeFinished(sliderState.value.roundToInt()) hapticsViewModel?.onValueChangeEnded() } - setOnValueChangeListener { - value = it - hapticsViewModel?.addVelocityDataPoint(it) + sliderState.onValueChange = { newValue -> + if (newValue != animatedSliderValue.targetValue) { + animateJob?.cancel() + animateJob = + coroutineScope.launch { + animatedSliderValue.animateTo(newValue) { + sliderState.value = value + } + } + } + + hapticsViewModel?.addVelocityDataPoint(newValue) overscrollViewModel.setSlider( - value = value, - min = valueRange.start, - max = valueRange.endInclusive, + value = sliderState.value, + min = sliderState.valueRange.start, + max = sliderState.valueRange.endInclusive, ) - viewModel.setStreamVolume(it, true) + viewModel.setStreamVolume(newValue, true) } } } - var lastDiscreteStep by remember { mutableFloatStateOf(round(sliderState.value)) } - LaunchedEffect(sliderState.value) { - state.value = sliderState.value - snapshotFlow { sliderState.value } - .map { round(it) } - .filter { it != lastDiscreteStep } - .distinctUntilChanged() - .collect { discreteStep -> - lastDiscreteStep = discreteStep - hapticsViewModel?.onValueChange(discreteStep) - } + + var lastDiscreteStep by remember { mutableFloatStateOf(round(sliderStateModel.value)) } + LaunchedEffect(sliderStateModel.value) { + val value = sliderStateModel.value + launch { animatedSliderValue.animateTo(value) } + if (value != lastDiscreteStep) { + lastDiscreteStep = value + hapticsViewModel?.onValueChange(value) + } } VerticalSlider( - state = state, - enabled = !sliderState.isDisabled, + state = sliderState, + enabled = !sliderStateModel.isDisabled, reverseDirection = true, colors = colors, interactionSource = interactionSource, @@ -185,14 +199,14 @@ private fun VolumeDialogSlider( }, track = { VolumeDialogSliderTrack( - state, + sliderState, colors = colors, - isEnabled = !sliderState.isDisabled, + isEnabled = !sliderStateModel.isDisabled, activeTrackEndIcon = { iconsState -> - VolumeIcon(sliderState.icon, iconsState.isActiveTrackEndIconVisible) + VolumeIcon(sliderStateModel.icon, iconsState.isActiveTrackEndIconVisible) }, inactiveTrackEndIcon = { iconsState -> - VolumeIcon(sliderState.icon, !iconsState.isActiveTrackEndIconVisible) + VolumeIcon(sliderStateModel.icon, !iconsState.isActiveTrackEndIconVisible) }, ) }, @@ -214,15 +228,3 @@ private fun BoxScope.VolumeIcon( Icon(painter = DrawablePainter(drawable), contentDescription = null) } } - -@OptIn(ExperimentalMaterial3Api::class) -fun SliderState.setOnValueChangeListener(onValueChange: ((Float) -> Unit)?) { - with(javaClass.getDeclaredField("onValueChange")) { - val oldIsAccessible = isAccessible - AutoCloseable { isAccessible = oldIsAccessible } - .use { - isAccessible = true - set(this@setOnValueChangeListener, onValueChange) - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/volume/haptics/ui/VolumeHapticsConfigsProvider.kt b/packages/SystemUI/src/com/android/systemui/volume/haptics/ui/VolumeHapticsConfigsProvider.kt index 92e9bf2d1ffc..863ae6262f72 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/haptics/ui/VolumeHapticsConfigsProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/haptics/ui/VolumeHapticsConfigsProvider.kt @@ -18,11 +18,13 @@ package com.android.systemui.volume.haptics.ui import com.android.systemui.haptics.slider.SeekableSliderTrackerConfig import com.android.systemui.haptics.slider.SliderHapticFeedbackConfig +import com.android.systemui.haptics.slider.SliderHapticFeedbackFilter object VolumeHapticsConfigsProvider { fun sliderHapticFeedbackConfig( - valueRange: ClosedFloatingPointRange<Float> + valueRange: ClosedFloatingPointRange<Float>, + filter: SliderHapticFeedbackFilter = SliderHapticFeedbackFilter(), ): SliderHapticFeedbackConfig { val sliderStepSize = 1f / (valueRange.endInclusive - valueRange.start) return SliderHapticFeedbackConfig( @@ -33,6 +35,7 @@ object VolumeHapticsConfigsProvider { additionalVelocityMaxBump = 0.2f, maxVelocityToScale = 0.1f, /* slider progress(from 0 to 1) per sec */ sliderStepSize = sliderStepSize, + filter = filter, ) } diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModel.kt index 5f20b4e27a80..e2d2f3f68c6b 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioSharingStreamSliderViewModel.kt @@ -20,6 +20,7 @@ import android.content.Context import com.android.internal.logging.UiEventLogger import com.android.systemui.Flags import com.android.systemui.common.shared.model.Icon +import com.android.systemui.haptics.slider.SliderHapticFeedbackFilter import com.android.systemui.haptics.slider.compose.ui.SliderHapticsViewModel import com.android.systemui.res.R import com.android.systemui.volume.domain.interactor.AudioSharingInteractor @@ -102,6 +103,9 @@ constructor( override val icon: Icon, override val label: String, ) : SliderState { + override val hapticFilter: SliderHapticFeedbackFilter + get() = SliderHapticFeedbackFilter() + override val isEnabled: Boolean get() = true diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt index 4410cb156723..f9d776bc3aaf 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt @@ -28,6 +28,7 @@ import com.android.settingslib.volume.shared.model.AudioStreamModel import com.android.settingslib.volume.shared.model.RingerMode import com.android.systemui.Flags import com.android.systemui.common.shared.model.Icon +import com.android.systemui.haptics.slider.SliderHapticFeedbackFilter import com.android.systemui.haptics.slider.compose.ui.SliderHapticsViewModel import com.android.systemui.modes.shared.ModesUiIcons import com.android.systemui.res.R @@ -159,6 +160,7 @@ constructor( return State( value = volume.toFloat(), valueRange = volumeRange.first.toFloat()..volumeRange.last.toFloat(), + hapticFilter = createHapticFilter(ringerMode), icon = icon, label = label, disabledMessage = disabledMessage, @@ -198,6 +200,18 @@ constructor( ) } + private fun AudioStreamModel.createHapticFilter( + ringerMode: RingerMode + ): SliderHapticFeedbackFilter = + when (audioStream.value) { + AudioManager.STREAM_RING -> SliderHapticFeedbackFilter(vibrateOnLowerBookend = false) + AudioManager.STREAM_NOTIFICATION -> + SliderHapticFeedbackFilter( + vibrateOnLowerBookend = ringerMode.value != AudioManager.RINGER_MODE_VIBRATE + ) + else -> SliderHapticFeedbackFilter() + } + // TODO: b/372213356 - Figure out the correct messages for VOICE_CALL and RING. // In fact, VOICE_CALL should not be affected by interruption filtering at all. private fun streamDisabledMessage(): Flow<String> { @@ -288,6 +302,7 @@ constructor( private data class State( override val value: Float, override val valueRange: ClosedFloatingPointRange<Float>, + override val hapticFilter: SliderHapticFeedbackFilter, override val icon: Icon, override val label: String, override val disabledMessage: String?, diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModel.kt index 0d804525a68c..533276413ade 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModel.kt @@ -21,6 +21,7 @@ import android.media.session.MediaController.PlaybackInfo import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.Flags import com.android.systemui.common.shared.model.Icon +import com.android.systemui.haptics.slider.SliderHapticFeedbackFilter import com.android.systemui.haptics.slider.compose.ui.SliderHapticsViewModel import com.android.systemui.res.R import com.android.systemui.volume.panel.component.mediaoutput.domain.interactor.MediaDeviceSessionInteractor @@ -90,6 +91,9 @@ constructor( override val isEnabled: Boolean, override val a11yStep: Int, ) : SliderState { + override val hapticFilter: SliderHapticFeedbackFilter + get() = SliderHapticFeedbackFilter() + override val disabledMessage: String? get() = null diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/SliderState.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/SliderState.kt index c951928bb977..f1353713799d 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/SliderState.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/SliderState.kt @@ -17,6 +17,7 @@ package com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel import com.android.systemui.common.shared.model.Icon +import com.android.systemui.haptics.slider.SliderHapticFeedbackFilter /** * Models a state of a volume slider. @@ -26,6 +27,8 @@ import com.android.systemui.common.shared.model.Icon sealed interface SliderState { val value: Float val valueRange: ClosedFloatingPointRange<Float> + val hapticFilter: SliderHapticFeedbackFilter + val icon: Icon? val isEnabled: Boolean val label: String @@ -42,6 +45,7 @@ sealed interface SliderState { data object Empty : SliderState { override val value: Float = 0f override val valueRange: ClosedFloatingPointRange<Float> = 0f..1f + override val hapticFilter = SliderHapticFeedbackFilter() override val icon: Icon? = null override val label: String = "" override val disabledMessage: String? = null diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperFocalAreaRepository.kt b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperFocalAreaRepository.kt new file mode 100644 index 000000000000..2c3491b06a90 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperFocalAreaRepository.kt @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallpapers.data.repository + +import android.graphics.PointF +import android.graphics.RectF +import com.android.systemui.dagger.SysUISingleton +import javax.inject.Inject +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +interface WallpaperFocalAreaRepository { + + /** The top of shortcut in screen, used by wallpaper to find remaining space in lockscreen */ + val shortcutAbsoluteTop: StateFlow<Float> + + val notificationStackAbsoluteBottom: StateFlow<Float> + + val wallpaperFocalAreaBounds: StateFlow<RectF> + + val wallpaperFocalAreaTapPosition: StateFlow<PointF> + + /** top of notifications without bcsmartspace in small clock settings */ + val notificationDefaultTop: StateFlow<Float> + + fun setShortcutAbsoluteTop(top: Float) + + /** Set bottom of notifications from notification stack, used as top for focal area bounds */ + fun setNotificationStackAbsoluteBottom(bottom: Float) + + fun setWallpaperFocalAreaBounds(bounds: RectF) + + fun setNotificationDefaultTop(top: Float) + + fun setTapPosition(tapPosition: PointF) +} + +@SysUISingleton +class WallpaperFocalAreaRepositoryImpl @Inject constructor() : WallpaperFocalAreaRepository { + + private val _shortcutAbsoluteTop = MutableStateFlow(0F) + override val shortcutAbsoluteTop = _shortcutAbsoluteTop.asStateFlow() + + private val _notificationStackAbsoluteBottom = MutableStateFlow(0F) + override val notificationStackAbsoluteBottom = _notificationStackAbsoluteBottom.asStateFlow() + + private val _wallpaperFocalAreaBounds = MutableStateFlow(RectF(0F, 0F, 0F, 0F)) + override val wallpaperFocalAreaBounds: StateFlow<RectF> = + _wallpaperFocalAreaBounds.asStateFlow() + + private val _wallpaperFocalAreaTapPosition = MutableStateFlow(PointF(0F, 0F)) + override val wallpaperFocalAreaTapPosition: StateFlow<PointF> = + _wallpaperFocalAreaTapPosition.asStateFlow() + + private val _notificationDefaultTop = MutableStateFlow(0F) + override val notificationDefaultTop: StateFlow<Float> = _notificationDefaultTop.asStateFlow() + + override fun setShortcutAbsoluteTop(top: Float) { + _shortcutAbsoluteTop.value = top + } + + override fun setNotificationStackAbsoluteBottom(bottom: Float) { + _notificationStackAbsoluteBottom.value = bottom + } + + override fun setNotificationDefaultTop(top: Float) { + _notificationDefaultTop.value = top + } + + override fun setWallpaperFocalAreaBounds(bounds: RectF) { + _wallpaperFocalAreaBounds.value = bounds + } + + override fun setTapPosition(point: PointF) { + _wallpaperFocalAreaTapPosition.value = point + } +} diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt index 79a9630e6887..990c76f60ded 100644 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt @@ -30,7 +30,6 @@ import com.android.internal.R import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background -import com.android.systemui.keyguard.data.repository.KeyguardRepository import com.android.systemui.res.R as SysUIR import com.android.systemui.shared.Flags.ambientAod import com.android.systemui.shared.Flags.extendedWallpaperEffects @@ -79,7 +78,7 @@ constructor( @Background private val bgDispatcher: CoroutineDispatcher, broadcastDispatcher: BroadcastDispatcher, userRepository: UserRepository, - keyguardRepository: KeyguardRepository, + wallpaperFocalAreaRepository: WallpaperFocalAreaRepository, private val wallpaperManager: WallpaperManager, private val context: Context, ) : WallpaperRepository { @@ -101,6 +100,7 @@ constructor( .filter { it.selectionStatus == SelectionStatus.SELECTION_COMPLETE } @VisibleForTesting var sendLockscreenLayoutJob: Job? = null + @VisibleForTesting var sendTapInShapeEffectsJob: Job? = null override val wallpaperInfo: StateFlow<WallpaperInfo?> = if (!wallpaperManager.isWallpaperSupported) { @@ -131,7 +131,7 @@ constructor( if (shouldSendNotificationLayout) { sendLockscreenLayoutJob = scope.launch { - keyguardRepository.wallpaperFocalAreaBounds.collect { + wallpaperFocalAreaRepository.wallpaperFocalAreaBounds.collect { wallpaperFocalAreaBounds -> wallpaperManager.sendWallpaperCommand( /* windowToken = */ rootView?.windowToken, @@ -161,8 +161,24 @@ constructor( ) } } + + sendTapInShapeEffectsJob = + scope.launch { + wallpaperFocalAreaRepository.wallpaperFocalAreaTapPosition.collect { + wallpaperFocalAreaTapPosition -> + wallpaperManager.sendWallpaperCommand( + /* windowToken = */ rootView?.windowToken, + /* action = */ WallpaperManager.COMMAND_LOCKSCREEN_TAP, + /* x = */ wallpaperFocalAreaTapPosition.x.toInt(), + /* y = */ wallpaperFocalAreaTapPosition.y.toInt(), + /* z = */ 0, + /* extras = */ null, + ) + } + } } else { sendLockscreenLayoutJob?.cancel() + sendTapInShapeEffectsJob?.cancel() } shouldSendNotificationLayout } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WallpaperFocalAreaInteractor.kt b/packages/SystemUI/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractor.kt index 9c744d63a093..187d6c7801c0 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WallpaperFocalAreaInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractor.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,44 +14,43 @@ * limitations under the License. */ -package com.android.systemui.keyguard.domain.interactor +package com.android.systemui.wallpapers.domain.interactor import android.content.Context import android.content.res.Resources +import android.graphics.PointF import android.graphics.RectF import android.util.TypedValue -import com.android.app.animation.MathUtils.max +import androidx.annotation.VisibleForTesting +import com.android.app.animation.MathUtils import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application -import com.android.systemui.keyguard.data.repository.KeyguardClockRepository -import com.android.systemui.keyguard.data.repository.KeyguardRepository import com.android.systemui.res.R import com.android.systemui.shade.data.repository.ShadeRepository import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor +import com.android.systemui.wallpapers.data.repository.WallpaperFocalAreaRepository import com.android.systemui.wallpapers.data.repository.WallpaperRepository import javax.inject.Inject import kotlin.math.min import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.flow.distinctUntilChanged @SysUISingleton class WallpaperFocalAreaInteractor @Inject constructor( @Application private val applicationScope: CoroutineScope, - context: Context, - private val keyguardRepository: KeyguardRepository, + private val context: Context, + private val wallpaperFocalAreaRepository: WallpaperFocalAreaRepository, shadeRepository: ShadeRepository, activeNotificationsInteractor: ActiveNotificationsInteractor, - keyguardClockRepository: KeyguardClockRepository, - wallpaperRepository: WallpaperRepository, + val wallpaperRepository: WallpaperRepository, ) { - // When there's notifications in splitshade, the focal area shape effect should be left aligned - private val notificationInShadeWideLayout: Flow<Boolean> = + // When there's notifications in splitshade, the focal area should be left aligned + @VisibleForTesting + val notificationInShadeWideLayout: Flow<Boolean> = combine( shadeRepository.isShadeLayoutWide, activeNotificationsInteractor.areAnyNotificationsPresent, @@ -63,14 +62,15 @@ constructor( } } - val shouldSendFocalArea = wallpaperRepository.shouldSendFocalArea - val wallpaperFocalAreaBounds: StateFlow<RectF?> = + val hasFocalArea = wallpaperRepository.shouldSendFocalArea + + val wallpaperFocalAreaBounds: Flow<RectF> = combine( shadeRepository.isShadeLayoutWide, notificationInShadeWideLayout, - keyguardRepository.notificationStackAbsoluteBottom, - keyguardRepository.shortcutAbsoluteTop, - keyguardClockRepository.notificationDefaultTop, + wallpaperFocalAreaRepository.notificationStackAbsoluteBottom, + wallpaperFocalAreaRepository.shortcutAbsoluteTop, + wallpaperFocalAreaRepository.notificationDefaultTop, ) { isShadeLayoutWide, notificationInShadeWideLayout, @@ -80,6 +80,7 @@ constructor( // Wallpaper will be zoomed in with config_wallpaperMaxScale in lockscreen // so we need to give a bounds taking this scale in consideration val wallpaperZoomedInScale = getSystemWallpaperMaximumScale(context) + val screenBounds = RectF( 0F, @@ -95,12 +96,14 @@ constructor( screenBounds.centerX() + screenBounds.width() / 2F / wallpaperZoomedInScale, screenBounds.centerY() + screenBounds.height() / 2F / wallpaperZoomedInScale, ) + val maxFocalAreaWidth = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, FOCAL_AREA_MAX_WIDTH_DP.toFloat(), context.resources.displayMetrics, ) + val (left, right) = // tablet landscape if (context.resources.getBoolean(R.bool.center_align_focal_area_shape)) { @@ -140,32 +143,48 @@ constructor( // handheld / portrait } else { scaledBounds.top + - max(notificationDefaultTop, notificationStackAbsoluteBottom) / + MathUtils.max(notificationDefaultTop, notificationStackAbsoluteBottom) / wallpaperZoomedInScale } val bottom = scaledBounds.bottom - scaledBottomMargin RectF(left, top, right, bottom) } - .stateIn( - applicationScope, - started = SharingStarted.WhileSubscribed(), - initialValue = null, - ) + .distinctUntilChanged() + + fun setFocalAreaBounds(bounds: RectF) { + wallpaperFocalAreaRepository.setWallpaperFocalAreaBounds(bounds) + } - fun setWallpaperFocalAreaBounds(bounds: RectF) { - keyguardRepository.setWallpaperFocalAreaBounds(bounds) + fun setNotificationDefaultTop(top: Float) { + wallpaperFocalAreaRepository.setNotificationDefaultTop(top) + } + + fun setTapPosition(x: Float, y: Float) { + // Focal area should only react to touch event within its bounds + val wallpaperZoomedInScale = getSystemWallpaperMaximumScale(context) + // Because there's a scale applied on wallpaper in lockscreen + // we should map it to the unscaled position on wallpaper + val screenCenterX = context.resources.displayMetrics.widthPixels / 2F + val newX = (x - screenCenterX) / wallpaperZoomedInScale + screenCenterX + val screenCenterY = context.resources.displayMetrics.heightPixels / 2F + val newY = (y - screenCenterY) / wallpaperZoomedInScale + screenCenterY + if (wallpaperFocalAreaRepository.wallpaperFocalAreaBounds.value.contains(newX, newY)) { + wallpaperFocalAreaRepository.setTapPosition(PointF(newX, newY)) + } } companion object { fun getSystemWallpaperMaximumScale(context: Context): Float { - return context.resources.getFloat( - Resources.getSystem() - .getIdentifier( - /* name= */ "config_wallpaperMaxScale", - /* defType= */ "dimen", - /* defPackage= */ "android", - ) - ) + val scale = + context.resources.getFloat( + Resources.getSystem() + .getIdentifier( + /* name= */ "config_wallpaperMaxScale", + /* defType= */ "dimen", + /* defPackage= */ "android", + ) + ) + return if (scale == 0f) 1f else scale } // A max width for focal area shape effects bounds, to avoid diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/ui/viewmodel/WallpaperFocalAreaViewModel.kt b/packages/SystemUI/src/com/android/systemui/wallpapers/ui/viewmodel/WallpaperFocalAreaViewModel.kt new file mode 100644 index 000000000000..70a97d473c49 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/ui/viewmodel/WallpaperFocalAreaViewModel.kt @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallpapers.ui.viewmodel + +import android.graphics.RectF +import com.android.systemui.wallpapers.domain.interactor.WallpaperFocalAreaInteractor +import javax.inject.Inject + +class WallpaperFocalAreaViewModel +@Inject +constructor(private val wallpaperFocalAreaInteractor: WallpaperFocalAreaInteractor) { + val hasFocalArea = wallpaperFocalAreaInteractor.hasFocalArea + + val wallpaperFocalAreaBounds = wallpaperFocalAreaInteractor.wallpaperFocalAreaBounds + + fun setFocalAreaBounds(bounds: RectF) { + wallpaperFocalAreaInteractor.setFocalAreaBounds(bounds) + } + + fun setTapPosition(x: Float, y: Float) { + wallpaperFocalAreaInteractor.setTapPosition(x, y) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt b/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt index bfa349876c42..e21e0a1cadc7 100644 --- a/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/window/domain/interactor/WindowRootViewBlurInteractor.kt @@ -32,7 +32,9 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn @@ -72,39 +74,29 @@ constructor( /** Radius of blur to be applied on the window root view. */ val blurRadius: StateFlow<Int> = repository.blurRadius.asStateFlow() - /** Whether the blur applied is opaque or transparent. */ - val isBlurOpaque: StateFlow<Boolean> = repository.isBlurOpaque.asStateFlow() - /** * Emits the applied blur radius whenever blur is successfully applied to the window root view. */ val onBlurAppliedEvent: Flow<Int> = repository.onBlurApplied - /** - * Request to apply blur while on bouncer, this takes precedence over other blurs (from shade). - */ - fun requestBlurForBouncer(blurRadius: Int) { - repository.isBlurOpaque.value = false - repository.blurRadius.value = blurRadius - } - - /** - * Request to apply blur while on glanceable hub, this takes precedence over other blurs (from - * shade) except for bouncer. - */ - fun requestBlurForGlanceableHub(blurRadius: Int): Boolean { - if (keyguardInteractor.primaryBouncerShowing.value) { - return false + /** Whether the blur applied is opaque or transparent. */ + val isBlurOpaque: Flow<Boolean> = + combine( + if (Flags.bouncerUiRevamp()) { + keyguardInteractor.primaryBouncerShowing.or(isBouncerTransitionInProgress) + } else { + flowOf(false) + }, + if (Flags.glanceableHubBlurredBackground()) { + communalInteractor.isCommunalBlurring + } else { + flowOf(false) + }, + repository.isBlurOpaque, + ) { bouncerActive, ghActive, shadeBlurOpaque -> + if (bouncerActive || ghActive) false else shadeBlurOpaque } - Log.d(TAG, "requestBlurForGlanceableHub for $blurRadius") - - repository.isBlurOpaque.value = false - repository.blurRadius.value = blurRadius - - return true - } - /** * Method that requests blur to be applied on window root view. It is applied only when other * blurs are not applied. @@ -119,10 +111,10 @@ constructor( // We need to check either of these because they are two different sources of truth, // primaryBouncerShowing changes early to true/false, but blur is // coordinated by transition value. - if (keyguardInteractor.primaryBouncerShowing.value || isBouncerTransitionInProgress.value) { + if (isBouncerTransitionInProgress()) { return false } - if (communalInteractor.isCommunalBlurring.value) { + if (isGlanceableHubActive()) { return false } Log.d(TAG, "requestingBlurForShade for $blurRadius $opaque") @@ -131,6 +123,14 @@ constructor( return true } + private fun isGlanceableHubActive() = communalInteractor.isCommunalBlurring.value + + private fun isBouncerTransitionInProgress() = + keyguardInteractor.primaryBouncerShowing.value || isBouncerTransitionInProgress.value + + private fun Flow<Boolean>.or(anotherFlow: Flow<Boolean>): Flow<Boolean> = + this.combine(anotherFlow) { a, b -> a || b } + companion object { const val TAG = "WindowRootViewBlurInteractor" } diff --git a/packages/SystemUI/src/com/android/systemui/window/ui/WindowRootViewBinder.kt b/packages/SystemUI/src/com/android/systemui/window/ui/WindowRootViewBinder.kt index e09a74cd0ad3..153df7f29737 100644 --- a/packages/SystemUI/src/com/android/systemui/window/ui/WindowRootViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/window/ui/WindowRootViewBinder.kt @@ -19,6 +19,8 @@ package com.android.systemui.window.ui import android.util.Log import android.view.Choreographer import android.view.Choreographer.FrameCallback +import com.android.app.tracing.coroutines.TrackTracer +import com.android.app.tracing.coroutines.launchTraced import com.android.systemui.Flags import com.android.systemui.lifecycle.WindowLifecycleState import com.android.systemui.lifecycle.repeatWhenAttached @@ -28,8 +30,8 @@ import com.android.systemui.statusbar.BlurUtils import com.android.systemui.window.ui.viewmodel.WindowRootViewModel import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.awaitCancellation +import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.launch /** * View binder that wires up window level UI transformations like blur to the [WindowRootView] @@ -50,7 +52,6 @@ object WindowRootViewBinder { view.repeatWhenAttached(mainDispatcher) { Log.d(TAG, "Binding root view") - var frameCallbackPendingExecution: FrameCallback? = null view.viewModel( minWindowLifecycleState = WindowLifecycleState.ATTACHED, factory = { viewModelFactory.create() }, @@ -58,24 +59,48 @@ object WindowRootViewBinder { ) { viewModel -> try { Log.d(TAG, "Launching coroutines that update window root view state") - launch { - viewModel.blurState - .filter { it.radius >= 0 } - .collect { blurState -> - val newFrameCallback = FrameCallback { - frameCallbackPendingExecution = null - blurUtils.applyBlur( - view.rootView?.viewRootImpl, - blurState.radius, - blurState.isOpaque, - ) - viewModel.onBlurApplied(blurState.radius) - } - blurUtils.prepareBlur(view.rootView?.viewRootImpl, blurState.radius) - if (frameCallbackPendingExecution != null) { - choreographer.removeFrameCallback(frameCallbackPendingExecution) + launchTraced("WindowBlur") { + var wasUpdateScheduledForThisFrame = false + var lastScheduledBlurRadius = 0 + var lastScheduleBlurOpaqueness = false + + // Creating the callback once and not for every coroutine invocation + val newFrameCallback = FrameCallback { + wasUpdateScheduledForThisFrame = false + val blurRadiusToApply = lastScheduledBlurRadius + blurUtils.applyBlur( + view.rootView?.viewRootImpl, + blurRadiusToApply, + lastScheduleBlurOpaqueness, + ) + TrackTracer.instantForGroup( + "windowBlur", + "appliedBlurRadius", + blurRadiusToApply, + ) + viewModel.onBlurApplied(blurRadiusToApply) + } + + combine(viewModel.blurRadius, viewModel.isBlurOpaque, ::Pair) + .filter { it.first >= 0 } + .collect { (blurRadius, isOpaque) -> + // Expectation is that we schedule only one blur radius value + // per frame + if (wasUpdateScheduledForThisFrame) { + return@collect } - frameCallbackPendingExecution = newFrameCallback + TrackTracer.instantForGroup( + "windowBlur", + "preparedBlurRadius", + blurRadius, + ) + lastScheduledBlurRadius = blurRadius.toInt() + lastScheduleBlurOpaqueness = isOpaque + wasUpdateScheduledForThisFrame = true + blurUtils.prepareBlur( + view.rootView?.viewRootImpl, + lastScheduledBlurRadius, + ) choreographer.postFrameCallback(newFrameCallback) } } diff --git a/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt b/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt index 72cca75df92c..b18c39dcf5e0 100644 --- a/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt @@ -19,7 +19,7 @@ package com.android.systemui.window.ui.viewmodel import android.os.Build import android.util.Log import com.android.app.tracing.coroutines.launchTraced -import com.android.systemui.Flags.glanceableHubBlurredBackground +import com.android.systemui.Flags import com.android.systemui.keyguard.ui.transitions.GlanceableHubTransition import com.android.systemui.keyguard.ui.transitions.PrimaryBouncerTransition import com.android.systemui.lifecycle.ExclusiveActivatable @@ -29,9 +29,9 @@ import dagger.assisted.AssistedInject import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach @@ -41,14 +41,33 @@ typealias BlurAppliedUiEvent = Int class WindowRootViewModel @AssistedInject constructor( - private val primaryBouncerTransitions: Set<@JvmSuppressWildcards PrimaryBouncerTransition>, - private val glanceableHubTransitions: Set<@JvmSuppressWildcards GlanceableHubTransition>, + primaryBouncerTransitions: Set<@JvmSuppressWildcards PrimaryBouncerTransition>, + glanceableHubTransitions: Set<@JvmSuppressWildcards GlanceableHubTransition>, private val blurInteractor: WindowRootViewBlurInteractor, ) : ExclusiveActivatable() { private val blurEvents = Channel<BlurAppliedUiEvent>(Channel.BUFFERED) - private val _blurState = MutableStateFlow(BlurState(0, false)) - val blurState = _blurState.asStateFlow() + + private val bouncerBlurRadiusFlows = + if (Flags.bouncerUiRevamp()) + primaryBouncerTransitions.map { it.windowBlurRadius.logIfPossible(it.javaClass.name) } + else emptyList() + + private val glanceableHubBlurRadiusFlows = + if (Flags.glanceableHubBlurredBackground()) + glanceableHubTransitions.map { it.windowBlurRadius.logIfPossible(it.javaClass.name) } + else emptyList() + + val blurRadius: Flow<Float> = + listOf( + *bouncerBlurRadiusFlows.toTypedArray(), + *glanceableHubBlurRadiusFlows.toTypedArray(), + blurInteractor.blurRadius.map { it.toFloat() }.logIfPossible("ShadeBlur"), + ) + .merge() + + val isBlurOpaque = + blurInteractor.isBlurOpaque.distinctUntilChanged().logIfPossible("isBlurOpaque") override suspend fun onActivated(): Nothing { coroutineScope { @@ -60,49 +79,6 @@ constructor( blurInteractor.onBlurApplied(event) } } - - launchTraced("WindowRootViewModel#blurState") { - combine(blurInteractor.blurRadius, blurInteractor.isBlurOpaque, ::BlurState) - .collect { _blurState.value = it } - } - - launchTraced("WindowRootViewModel#bouncerTransitions") { - primaryBouncerTransitions - .map { transition -> - transition.windowBlurRadius.onEach { blurRadius -> - if (isLoggable) { - Log.d( - TAG, - "${transition.javaClass.simpleName} windowBlurRadius $blurRadius", - ) - } - } - } - .merge() - .collect { blurRadius -> - blurInteractor.requestBlurForBouncer(blurRadius.toInt()) - } - } - - if (glanceableHubBlurredBackground()) { - launchTraced("WindowRootViewModel#glanceableHubTransitions") { - glanceableHubTransitions - .map { transition -> - transition.windowBlurRadius.onEach { blurRadius -> - if (isLoggable) { - Log.d( - TAG, - "${transition.javaClass.simpleName} windowBlurRadius $blurRadius", - ) - } - } - } - .merge() - .collect { blurRadius -> - blurInteractor.requestBlurForGlanceableHub(blurRadius.toInt()) - } - } - } } awaitCancellation() } @@ -118,7 +94,11 @@ constructor( private companion object { const val TAG = "WindowRootViewModel" - val isLoggable = Log.isLoggable(TAG, Log.DEBUG) || Build.isDebuggable() + val isLoggable = Log.isLoggable(TAG, Log.VERBOSE) || Build.isDebuggable() + + fun <T> Flow<T>.logIfPossible(loggingInfo: String): Flow<T> { + return onEach { if (isLoggable) Log.v(TAG, "$loggingInfo $it") } + } } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 60a9fcea854f..e2cfbc6f764c 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -149,6 +149,7 @@ import com.android.systemui.deviceentry.shared.model.FaceDetectionStatus; import com.android.systemui.deviceentry.shared.model.FailedFaceAuthenticationStatus; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.SceneContainerFlagParameterizationKt; +import com.android.systemui.keyguard.domain.interactor.KeyguardServiceShowLockscreenInteractor; import com.android.systemui.kosmos.KosmosJavaAdapter; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -310,6 +311,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { private SceneInteractor mSceneInteractor; @Mock private CommunalSceneInteractor mCommunalSceneInteractor; + @Mock + private KeyguardServiceShowLockscreenInteractor mKeyguardServiceShowLockscreenInteractor; @Captor private ArgumentCaptor<FaceAuthenticationListener> mFaceAuthenticationListener; @@ -2739,7 +2742,8 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { () -> mAlternateBouncerInteractor, () -> mJavaAdapter, () -> mSceneInteractor, - () -> mCommunalSceneInteractor); + () -> mCommunalSceneInteractor, + mKeyguardServiceShowLockscreenInteractor); setAlternateBouncerVisibility(false); setPrimaryBouncerVisibility(false); setStrongAuthTracker(KeyguardUpdateMonitorTest.this.mStrongAuthTracker); diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt index 97abba7a4bcb..2e634390679a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt @@ -58,9 +58,12 @@ class FontInterpolatorTest : SysuiTestCase() { Font.Builder(sFont).setFontVariationSettings("'wght' 900, 'ital' 1, 'GRAD' 700").build() val interp = FontInterpolator() - assertSameAxes(startFont, interp.lerp(startFont, endFont, 0f)) - assertSameAxes(endFont, interp.lerp(startFont, endFont, 1f)) - assertSameAxes("'wght' 500, 'ital' 0.5, 'GRAD' 450", interp.lerp(startFont, endFont, 0.5f)) + assertSameAxes(startFont, interp.lerp(startFont, endFont, 0f, 0f)) + assertSameAxes(endFont, interp.lerp(startFont, endFont, 1f, 1f)) + assertSameAxes( + "'wght' 500, 'ital' 0.5, 'GRAD' 450", + interp.lerp(startFont, endFont, 0.5f, 0.5f), + ) } @Test @@ -69,7 +72,7 @@ class FontInterpolatorTest : SysuiTestCase() { val endFont = Font.Builder(sFont).setFontVariationSettings("'ital' 1").build() val interp = FontInterpolator() - assertSameAxes("'wght' 250, 'ital' 0.5", interp.lerp(startFont, endFont, 0.5f)) + assertSameAxes("'wght' 250, 'ital' 0.5", interp.lerp(startFont, endFont, 0.5f, 0.5f)) } @Test @@ -78,8 +81,8 @@ class FontInterpolatorTest : SysuiTestCase() { val endFont = Font.Builder(sFont).setFontVariationSettings("'ital' 1").build() val interp = FontInterpolator() - val resultFont = interp.lerp(startFont, endFont, 0.5f) - val cachedFont = interp.lerp(startFont, endFont, 0.5f) + val resultFont = interp.lerp(startFont, endFont, 0.5f, 0.5f) + val cachedFont = interp.lerp(startFont, endFont, 0.5f, 0.5f) assertThat(resultFont).isSameInstanceAs(cachedFont) } @@ -89,8 +92,8 @@ class FontInterpolatorTest : SysuiTestCase() { val endFont = Font.Builder(sFont).setFontVariationSettings("'ital' 1").build() val interp = FontInterpolator() - val resultFont = interp.lerp(startFont, endFont, 0.5f) - val reversedFont = interp.lerp(endFont, startFont, 0.5f) + val resultFont = interp.lerp(startFont, endFont, 0.5f, 0.5f) + val reversedFont = interp.lerp(endFont, startFont, 0.5f, 0.5f) assertThat(resultFont).isSameInstanceAs(reversedFont) } @@ -100,14 +103,14 @@ class FontInterpolatorTest : SysuiTestCase() { val startFont = Font.Builder(sFont).setFontVariationSettings("'wght' 100").build() val endFont = Font.Builder(sFont).setFontVariationSettings("'wght' 1").build() - val resultFont = interp.lerp(startFont, endFont, 0.5f) + val resultFont = interp.lerp(startFont, endFont, 0.5f, 0.5f) for (i in 0..(interp.fontCache as FontCacheImpl).cacheMaxEntries + 1) { val f1 = Font.Builder(sFont).setFontVariationSettings("'wght' ${i * 100}").build() val f2 = Font.Builder(sFont).setFontVariationSettings("'wght' $i").build() - interp.lerp(f1, f2, 0.5f) + interp.lerp(f1, f2, 0.5f, 0.5f) } - val cachedFont = interp.lerp(startFont, endFont, 0.5f) + val cachedFont = interp.lerp(startFont, endFont, 0.5f, 0.5f) assertThat(resultFont).isNotSameInstanceAs(cachedFont) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegateTest.kt index ffc75188ffa1..2788f1d95382 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegateTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegateTest.kt @@ -16,17 +16,20 @@ package com.android.systemui.bluetooth.qsdialog +import android.platform.test.annotations.DisableFlags import android.testing.TestableLooper import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.internal.logging.UiEventLogger +import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.kosmos.testDispatcher import com.android.systemui.kosmos.testScope import com.android.systemui.model.SysUiState import com.android.systemui.shade.data.repository.shadeDialogContextInteractor +import com.android.systemui.shade.domain.interactor.shadeModeInteractor import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.statusbar.phone.SystemUIDialogManager import com.android.systemui.testKosmos @@ -50,6 +53,7 @@ import org.mockito.junit.MockitoRule @SmallTest @RunWith(AndroidJUnit4::class) @TestableLooper.RunWithLooper(setAsMainLooper = true) +@DisableFlags(Flags.FLAG_QS_TILE_DETAILED_VIEW) class BluetoothTileDialogDelegateTest : SysuiTestCase() { companion object { const val DEVICE_NAME = "device" @@ -105,6 +109,7 @@ class BluetoothTileDialogDelegateTest : SysuiTestCase() { sysuiDialogFactory, kosmos.shadeDialogContextInteractor, bluetoothDetailsContentManagerFactory, + kosmos.shadeModeInteractor, ) whenever(sysuiDialogFactory.create(any(SystemUIDialog.Delegate::class.java), any())) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java index 5f63b15916a3..3f607ffaea6d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DreamTileTest.java @@ -20,6 +20,8 @@ import static android.platform.test.flag.junit.FlagsParameterization.allCombinat import static com.android.systemui.Flags.FLAG_QS_CUSTOM_TILE_CLICK_GUARANTEED_BUG_FIX; +import static com.google.common.truth.Truth.assertThat; + import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertTrue; @@ -59,7 +61,6 @@ import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.res.R; import com.android.systemui.settings.UserTracker; import com.android.systemui.util.settings.FakeSettings; -import com.android.systemui.util.settings.SecureSettings; import org.junit.After; import org.junit.Before; @@ -69,11 +70,11 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.util.List; - import platform.test.runner.parameterized.ParameterizedAndroidJunit4; import platform.test.runner.parameterized.Parameters; +import java.util.List; + @RunWith(ParameterizedAndroidJunit4.class) @TestableLooper.RunWithLooper(setAsMainLooper = true) @SmallTest @@ -107,7 +108,7 @@ public class DreamTileTest extends SysuiTestCase { private DreamTile mTile; - private SecureSettings mSecureSettings; + private FakeSettings mSecureSettings; private static final ComponentName COLORS_DREAM_COMPONENT_NAME = new ComponentName( "com.android.dreams", ".Colors"); @@ -279,6 +280,23 @@ public class DreamTileTest extends SysuiTestCase { destroyTile(dockedTile); } + @Test + public void testHandleUserSwitch() { + final DreamTile dockedTile = constructTileForTest(true, false); + dockedTile.handleSetListening(true); + + final int oldUserId = mUserTracker.getUserId(); + assertThat(dockedTile.mDreamSettingObserver.getCurrentUser()).isEqualTo(oldUserId); + assertThat(dockedTile.mEnabledSettingObserver.getCurrentUser()).isEqualTo(oldUserId); + + final int newUserId = 1337; + dockedTile.handleUserSwitch(newUserId); + assertThat(dockedTile.mDreamSettingObserver.getCurrentUser()).isEqualTo(newUserId); + assertThat(dockedTile.mEnabledSettingObserver.getCurrentUser()).isEqualTo(newUserId); + + destroyTile(dockedTile); + } + private void setScreensaverEnabled(boolean enabled) { mSecureSettings.putIntForUser(Settings.Secure.SCREENSAVER_ENABLED, enabled ? 1 : 0, DEFAULT_USER); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacyTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacyTest.java index 8c2bdabb2417..3d0a8f6cd236 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacyTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogDelegateLegacyTest.java @@ -15,6 +15,7 @@ import static org.mockito.Mockito.when; import android.content.Intent; import android.os.Handler; +import android.platform.test.annotations.DisableFlags; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.testing.TestableLooper; @@ -32,8 +33,10 @@ import androidx.test.filters.SmallTest; import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.internal.logging.UiEventLogger; import com.android.settingslib.wifi.WifiEnterpriseRestrictionUtils; +import com.android.systemui.Flags; import com.android.systemui.SysuiTestCase; import com.android.systemui.animation.DialogTransitionAnimator; +import com.android.systemui.kosmos.KosmosJavaAdapter; import com.android.systemui.res.R; import com.android.systemui.shade.domain.interactor.FakeShadeDialogContextInteractor; import com.android.systemui.statusbar.phone.SystemUIDialog; @@ -57,6 +60,7 @@ import kotlinx.coroutines.CoroutineScope; @SmallTest @RunWith(AndroidJUnit4.class) @TestableLooper.RunWithLooper(setAsMainLooper = true) +@DisableFlags(Flags.FLAG_QS_TILE_DETAILED_VIEW) @UiThreadTest public class InternetDialogDelegateLegacyTest extends SysuiTestCase { @@ -107,6 +111,7 @@ public class InternetDialogDelegateLegacyTest extends SysuiTestCase { private TextView mAirplaneModeSummaryText; private MockitoSession mMockitoSession; + private final KosmosJavaAdapter mKosmos = new KosmosJavaAdapter(this); @Before public void setUp() { @@ -151,7 +156,8 @@ public class InternetDialogDelegateLegacyTest extends SysuiTestCase { mBgExecutor, mKeyguard, mSystemUIDialogFactory, - new FakeShadeDialogContextInteractor(mContext)); + new FakeShadeDialogContextInteractor(mContext), + mKosmos.getShadeModeInteractor()); mInternetDialogDelegateLegacy.createDialog(); mInternetDialogDelegateLegacy.onCreate(mSystemUIDialog, null); mInternetDialogDelegateLegacy.mAdapter = mInternetAdapter; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImplTest.kt index b177e4a3e22e..950af455ccda 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/VisualInterruptionDecisionProviderImplTest.kt @@ -101,7 +101,7 @@ class VisualInterruptionDecisionProviderImplTest : VisualInterruptionDecisionPro private fun getAvalancheSuppressor() : AvalancheSuppressor { return AvalancheSuppressor( avalancheProvider, systemClock, settingsInteractor, packageManager, - uiEventLogger, context, notificationManager, logger, systemSettings + uiEventLogger, context, notificationManager, systemSettings ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index bf10dc6c4aef..a38d71b178e9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -1923,13 +1923,13 @@ public class BubblesTest extends SysuiTestCase { public void testShowStackEdu_isNotConversationBubble() { // Setup setPrefBoolean(StackEducationView.PREF_STACK_EDUCATION, false); - BubbleEntry bubbleEntry = createBubbleEntry(false /* isConversation */); - mBubbleController.updateBubble(bubbleEntry); + mBubbleController.showOrHideNotesBubble(mNotesBubbleIntent, mUser0, mNotesBubbleIcon); assertTrue(mBubbleController.hasBubbles()); - + String noteBubbleKey = Bubble.getNoteBubbleKeyForApp(mNotesBubbleIntent.getPackage(), + mUser0); // Click on bubble - Bubble bubble = mBubbleData.getBubbleInStackWithKey(bubbleEntry.getKey()); - assertFalse(bubble.isConversation()); + Bubble bubble = mBubbleData.getBubbleInStackWithKey(noteBubbleKey); + assertFalse(bubble.isChat()); bubble.getIconView().callOnClick(); // Check education is not shown @@ -1941,13 +1941,13 @@ public class BubblesTest extends SysuiTestCase { public void testShowStackEdu_isConversationBubble() { // Setup setPrefBoolean(StackEducationView.PREF_STACK_EDUCATION, false); - BubbleEntry bubbleEntry = createBubbleEntry(true /* isConversation */); + BubbleEntry bubbleEntry = createBubbleEntry(); mBubbleController.updateBubble(bubbleEntry); assertTrue(mBubbleController.hasBubbles()); // Click on bubble Bubble bubble = mBubbleData.getBubbleInStackWithKey(bubbleEntry.getKey()); - assertTrue(bubble.isConversation()); + assertTrue(bubble.isChat()); bubble.getIconView().callOnClick(); // Check education is shown @@ -1959,13 +1959,13 @@ public class BubblesTest extends SysuiTestCase { public void testShowStackEdu_isSeenConversationBubble() { // Setup setPrefBoolean(StackEducationView.PREF_STACK_EDUCATION, true); - BubbleEntry bubbleEntry = createBubbleEntry(true /* isConversation */); + BubbleEntry bubbleEntry = createBubbleEntry(); mBubbleController.updateBubble(bubbleEntry); assertTrue(mBubbleController.hasBubbles()); // Click on bubble Bubble bubble = mBubbleData.getBubbleInStackWithKey(bubbleEntry.getKey()); - assertTrue(bubble.isConversation()); + assertTrue(bubble.isChat()); bubble.getIconView().callOnClick(); // Check education is not shown @@ -2690,17 +2690,19 @@ public class BubblesTest extends SysuiTestCase { mock(Bubbles.PendingIntentCanceledListener.class), executor, executor); } - private BubbleEntry createBubbleEntry(boolean isConversation) { + /** + * Creates a BubbleEntry, which will represent a chat bubble. + * All bubble entries are notification based & therefore are chat bubbles. + */ + private BubbleEntry createBubbleEntry() { NotificationEntry notificationEntry = mNotificationTestHelper.createBubble(mDeleteIntent); - if (isConversation) { - ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mContext) - .setId("shortcutId") - .build(); - NotificationEntryHelper.modifyRanking(notificationEntry) - .setIsConversation(true) - .setShortcutInfo(shortcutInfo) - .build(); - } + ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mContext) + .setId("shortcutId") + .build(); + NotificationEntryHelper.modifyRanking(notificationEntry) + .setIsConversation(true) + .setShortcutInfo(shortcutInfo) + .build(); return mBubblesManager.notifToBubbleEntry(notificationEntry); } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt index 159dd34efbbc..25a9120651a6 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardClockRepository.kt @@ -47,10 +47,6 @@ class FakeKeyguardClockRepository() : KeyguardClockRepository { override val previewClock: Flow<ClockController> get() = _previewClock - private val _notificationDefaultTop = MutableStateFlow(0F) - override val notificationDefaultTop: StateFlow<Float> - get() = _notificationDefaultTop - override val clockEventController: ClockEventController get() = mock() @@ -63,10 +59,6 @@ class FakeKeyguardClockRepository() : KeyguardClockRepository { _clockSize.value = size } - override fun setNotificationDefaultTop(top: Float) { - _notificationDefaultTop.value = top - } - fun setSelectedClockSize(size: ClockSizeSetting) { _selectedClockSize.value = size } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt index 1952f26b4e6a..591f493cc129 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt @@ -18,7 +18,6 @@ package com.android.systemui.keyguard.data.repository import android.graphics.Point -import android.graphics.RectF import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.shared.model.BiometricUnlockMode import com.android.systemui.keyguard.shared.model.BiometricUnlockModel @@ -123,18 +122,6 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { private val _isEncryptedOrLockdown = MutableStateFlow(true) override val isEncryptedOrLockdown: Flow<Boolean> = _isEncryptedOrLockdown - private val _shortcutAbsoluteTop = MutableStateFlow(0F) - override val shortcutAbsoluteTop: StateFlow<Float> - get() = _shortcutAbsoluteTop.asStateFlow() - - private val _notificationStackAbsoluteBottom = MutableStateFlow(0F) - override val notificationStackAbsoluteBottom: StateFlow<Float> - get() = _notificationStackAbsoluteBottom.asStateFlow() - - private val _wallpaperFocalAreaBounds = MutableStateFlow(RectF(0f, 0f, 0f, 0f)) - override val wallpaperFocalAreaBounds: StateFlow<RectF> - get() = _wallpaperFocalAreaBounds.asStateFlow() - private val _isKeyguardEnabled = MutableStateFlow(true) override val isKeyguardEnabled: StateFlow<Boolean> = _isKeyguardEnabled.asStateFlow() @@ -289,18 +276,6 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { return isShowKeyguardWhenReenabled } - override fun setShortcutAbsoluteTop(top: Float) { - _shortcutAbsoluteTop.value = top - } - - override fun setNotificationStackAbsoluteBottom(bottom: Float) { - _notificationStackAbsoluteBottom.value = bottom - } - - override fun setWallpaperFocalAreaBounds(bounds: RectF) { - _wallpaperFocalAreaBounds.value = bounds - } - override fun setCanIgnoreAuthAndReturnToGone(canWake: Boolean) { _canIgnoreAuthAndReturnToGone.value = canWake } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorKosmos.kt index ff0f13e7111f..1698a5078038 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractorKosmos.kt @@ -37,6 +37,6 @@ val Kosmos.fromGoneTransitionInteractor by powerInteractor = powerInteractor, communalSceneInteractor = communalSceneInteractor, keyguardOcclusionInteractor = keyguardOcclusionInteractor, - keyguardLockWhileAwakeInteractor = keyguardLockWhileAwakeInteractor, + keyguardShowWhileAwakeInteractor = keyguardShowWhileAwakeInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt index bdb9abb03c5f..8844eb040f02 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorKosmos.kt @@ -23,6 +23,7 @@ import com.android.systemui.media.controls.domain.pipeline.interactor.mediaCarou import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor +import com.android.systemui.wallpapers.domain.interactor.wallpaperFocalAreaInteractor val Kosmos.keyguardClockInteractor by Kosmos.Fixture { @@ -35,5 +36,6 @@ val Kosmos.keyguardClockInteractor by headsUpNotificationInteractor = headsUpNotificationInteractor, applicationScope = applicationCoroutineScope, keyguardClockRepository = keyguardClockRepository, + wallpaperFocalAreaInteractor = wallpaperFocalAreaInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt index ee21bdc0b4c2..4e5abb883afd 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt @@ -28,6 +28,8 @@ import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.shade.data.repository.FakeShadeRepository import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever +import com.android.systemui.wallpapers.data.repository.FakeWallpaperFocalAreaRepository +import com.android.systemui.wallpapers.data.repository.WallpaperFocalAreaRepository import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -48,6 +50,8 @@ object KeyguardInteractorFactory { bouncerRepository: FakeKeyguardBouncerRepository = FakeKeyguardBouncerRepository(), configurationRepository: FakeConfigurationRepository = FakeConfigurationRepository(), shadeRepository: FakeShadeRepository = FakeShadeRepository(), + wallpaperFocalAreaRepository: WallpaperFocalAreaRepository = + FakeWallpaperFocalAreaRepository(), sceneInteractor: SceneInteractor = mock(), fromGoneTransitionInteractor: FromGoneTransitionInteractor = mock(), fromLockscreenTransitionInteractor: FromLockscreenTransitionInteractor = mock(), @@ -84,6 +88,7 @@ object KeyguardInteractorFactory { fromAlternateBouncerTransitionInteractor }, applicationScope = testScope, + wallpaperFocalAreaRepository = wallpaperFocalAreaRepository, ), ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt index 869bae236d5c..f9b0290fe339 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt @@ -23,6 +23,7 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.shade.data.repository.shadeRepository +import com.android.systemui.wallpapers.data.repository.wallpaperFocalAreaRepository val Kosmos.keyguardInteractor: KeyguardInteractor by Kosmos.Fixture { @@ -38,5 +39,6 @@ val Kosmos.keyguardInteractor: KeyguardInteractor by fromOccludedTransitionInteractor = { fromOccludedTransitionInteractor }, fromAlternateBouncerTransitionInteractor = { fromAlternateBouncerTransitionInteractor }, applicationScope = testScope.backgroundScope, + wallpaperFocalAreaRepository = wallpaperFocalAreaRepository, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardServiceLockNowInteractor.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardServiceShowLockscreenInteractor.kt index 29335c590a75..3cec5a9cd822 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardServiceLockNowInteractor.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardServiceShowLockscreenInteractor.kt @@ -19,5 +19,5 @@ package com.android.systemui.keyguard.domain.interactor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope -val Kosmos.keyguardServiceLockNowInteractor by - Kosmos.Fixture { KeyguardServiceLockNowInteractor(backgroundScope = testScope) } +val Kosmos.keyguardServiceShowLockscreenInteractor by + Kosmos.Fixture { KeyguardServiceShowLockscreenInteractor(backgroundScope = testScope) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardLockWhileAwakeInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardShowWhileAwakeInteractorKosmos.kt index 2423949cdacc..f7caeb69f17e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardLockWhileAwakeInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardShowWhileAwakeInteractorKosmos.kt @@ -19,11 +19,11 @@ package com.android.systemui.keyguard.domain.interactor import com.android.systemui.keyguard.data.repository.biometricSettingsRepository import com.android.systemui.kosmos.Kosmos -val Kosmos.keyguardLockWhileAwakeInteractor by +val Kosmos.keyguardShowWhileAwakeInteractor by Kosmos.Fixture { - KeyguardLockWhileAwakeInteractor( + KeyguardShowWhileAwakeInteractor( biometricSettingsRepository = biometricSettingsRepository, keyguardEnabledInteractor = keyguardEnabledInteractor, - keyguardServiceLockNowInteractor = keyguardServiceLockNowInteractor, + keyguardServiceShowLockscreenInteractor = keyguardServiceShowLockscreenInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractorKosmos.kt index 8c9163dd3b21..43fa718cff9a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractorKosmos.kt @@ -42,7 +42,7 @@ val Kosmos.keyguardWakeDirectlyToGoneInteractor by fakeSettings, selectedUserInteractor, keyguardEnabledInteractor, - keyguardServiceLockNowInteractor, + keyguardServiceShowLockscreenInteractor, keyguardInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModelKosmos.kt new file mode 100644 index 000000000000..8609626f9002 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/DozingToDreamingTransitionViewModelKosmos.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.keyguard.ui.viewmodel + +import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.Kosmos.Fixture + +val Kosmos.dozingToDreamingTransitionViewModel by Fixture { + DozingToDreamingTransitionViewModel(animationFlow = keyguardTransitionAnimationFlow) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt index 37df05b68f9e..ea3feeaf0854 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardRootViewModelKosmos.kt @@ -20,7 +20,6 @@ import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.pulseExpansionInteractor -import com.android.systemui.keyguard.domain.interactor.wallpaperFocalAreaInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.kosmos.applicationCoroutineScope @@ -30,6 +29,7 @@ import com.android.systemui.statusbar.notification.icon.ui.viewmodel.notificatio import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationsKeyguardInteractor import com.android.systemui.statusbar.phone.dozeParameters import com.android.systemui.statusbar.phone.screenOffAnimationController +import com.android.systemui.wallpapers.domain.interactor.wallpaperFocalAreaInteractor val Kosmos.keyguardRootViewModel by Fixture { KeyguardRootViewModel( @@ -55,6 +55,7 @@ val Kosmos.keyguardRootViewModel by Fixture { aodToLockscreenTransitionViewModel = aodToLockscreenTransitionViewModel, aodToOccludedTransitionViewModel = aodToOccludedTransitionViewModel, aodToPrimaryBouncerTransitionViewModel = aodToPrimaryBouncerTransitionViewModel, + dozingToDreamingTransitionViewModel = dozingToDreamingTransitionViewModel, dozingToGoneTransitionViewModel = dozingToGoneTransitionViewModel, dozingToLockscreenTransitionViewModel = dozingToLockscreenTransitionViewModel, dozingToOccludedTransitionViewModel = dozingToOccludedTransitionViewModel, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt index 170d067b5c0c..46314135c574 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeDisplaysInteractorKosmos.kt @@ -28,6 +28,7 @@ import com.android.systemui.shade.data.repository.shadeExpansionIntent import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor import com.android.systemui.statusbar.notification.row.notificationRebindingTracker import com.android.systemui.statusbar.notification.stack.notificationStackRebindingHider +import com.android.systemui.statusbar.policy.configurationController import java.util.Optional import org.mockito.kotlin.any import org.mockito.kotlin.mock @@ -59,5 +60,6 @@ val Kosmos.shadeDisplaysInteractor by activeNotificationsInteractor, notificationRebindingTracker, Optional.of(notificationStackRebindingHider), + configurationController, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt index e9c6c18550fb..e445a73b06d0 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt @@ -219,6 +219,7 @@ class ExpandableNotificationRowBuilder( } val conversationProcessor = ConversationNotificationProcessor( + context, Mockito.mock(LauncherApps::class.java, STUB_ONLY), Mockito.mock(ConversationNotificationManager::class.java, STUB_ONLY), ) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/FakeWallpaperFocalAreaRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/FakeWallpaperFocalAreaRepository.kt new file mode 100644 index 000000000000..aeff86ed89bb --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/FakeWallpaperFocalAreaRepository.kt @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallpapers.data.repository + +import android.graphics.PointF +import android.graphics.RectF +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +class FakeWallpaperFocalAreaRepository : WallpaperFocalAreaRepository { + private val _shortcutAbsoluteTop = MutableStateFlow(0F) + override val shortcutAbsoluteTop = _shortcutAbsoluteTop.asStateFlow() + + private val _notificationStackAbsoluteBottom = MutableStateFlow(0F) + override val notificationStackAbsoluteBottom = _notificationStackAbsoluteBottom.asStateFlow() + + private val _wallpaperFocalAreaBounds = MutableStateFlow(RectF(0F, 0F, 0F, 0F)) + override val wallpaperFocalAreaBounds: StateFlow<RectF> = + _wallpaperFocalAreaBounds.asStateFlow() + + private val _wallpaperFocalAreaTapPosition = MutableStateFlow(PointF(0F, 0F)) + override val wallpaperFocalAreaTapPosition: StateFlow<PointF> = + _wallpaperFocalAreaTapPosition.asStateFlow() + + private val _notificationDefaultTop = MutableStateFlow(0F) + override val notificationDefaultTop: StateFlow<Float> = _notificationDefaultTop.asStateFlow() + + override fun setShortcutAbsoluteTop(top: Float) { + _shortcutAbsoluteTop.value = top + } + + override fun setNotificationStackAbsoluteBottom(bottom: Float) { + _notificationStackAbsoluteBottom.value = bottom + } + + override fun setNotificationDefaultTop(top: Float) { + _notificationDefaultTop.value = top + } + + override fun setWallpaperFocalAreaBounds(bounds: RectF) { + _wallpaperFocalAreaBounds.value = bounds + } + + override fun setTapPosition(point: PointF) { + _wallpaperFocalAreaTapPosition.value = point + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/FakeWallpaperRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/FakeWallpaperRepository.kt new file mode 100644 index 000000000000..8689e04e62dd --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/FakeWallpaperRepository.kt @@ -0,0 +1,44 @@ +/* + * 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.wallpapers.data.repository + +import android.app.WallpaperInfo +import android.view.View +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +/** Fake implementation of the wallpaper repository. */ +class FakeWallpaperRepository : WallpaperRepository { + private val _wallpaperInfo: MutableStateFlow<WallpaperInfo?> = MutableStateFlow(null) + override val wallpaperInfo: StateFlow<WallpaperInfo?> = _wallpaperInfo.asStateFlow() + private val _wallpaperSupportsAmbientMode = MutableStateFlow(false) + override val wallpaperSupportsAmbientMode: Flow<Boolean> = + _wallpaperSupportsAmbientMode.asStateFlow() + override var rootView: View? = null + private val _shouldSendFocalArea = MutableStateFlow(false) + override val shouldSendFocalArea: StateFlow<Boolean> = _shouldSendFocalArea.asStateFlow() + + fun setShouldSendFocalArea(shouldSendFocalArea: Boolean) { + _shouldSendFocalArea.value = shouldSendFocalArea + } + + fun setWallpaperInfo(wallpaperInfo: WallpaperInfo?) { + _wallpaperInfo.value = wallpaperInfo + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/FakeWallpaperRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperFocalAreaRepositoryKosmos.kt index d6343c840d9b..c1032b14d478 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/FakeWallpaperRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperFocalAreaRepositoryKosmos.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 The Android Open Source Project + * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +16,8 @@ package com.android.systemui.wallpapers.data.repository -import android.app.WallpaperInfo -import android.view.View -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.flowOf +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.Kosmos.Fixture -/** Fake implementation of the wallpaper repository. */ -class FakeWallpaperRepository : WallpaperRepository { - override val wallpaperInfo = MutableStateFlow<WallpaperInfo?>(null) - override val wallpaperSupportsAmbientMode = flowOf(false) - override var rootView: View? = null - override val shouldSendFocalArea = MutableStateFlow(false) -} +val Kosmos.wallpaperFocalAreaRepository by Fixture { fakeWallpaperFocalAreaRepository } +val Kosmos.fakeWallpaperFocalAreaRepository by Fixture { FakeWallpaperFocalAreaRepository() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt index f0c0d30e6db4..6b955ffb0b68 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/data/repository/WallpaperRepositoryKosmos.kt @@ -16,24 +16,9 @@ package com.android.systemui.wallpapers.data.repository -import android.content.applicationContext -import com.android.app.wallpaperManager -import com.android.systemui.broadcast.broadcastDispatcher -import com.android.systemui.keyguard.data.repository.keyguardRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture -import com.android.systemui.kosmos.testDispatcher -import com.android.systemui.kosmos.testScope -import com.android.systemui.user.data.repository.userRepository -val Kosmos.wallpaperRepository by Fixture { - WallpaperRepositoryImpl( - context = applicationContext, - scope = testScope.backgroundScope, - bgDispatcher = testDispatcher, - broadcastDispatcher = broadcastDispatcher, - userRepository = userRepository, - keyguardRepository = keyguardRepository, - wallpaperManager = wallpaperManager, - ) -} +var Kosmos.fakeWallpaperRepository by Kosmos.Fixture { FakeWallpaperRepository() } + +var Kosmos.wallpaperRepository: WallpaperRepository by Kosmos.Fixture { fakeWallpaperRepository } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/WallpaperFocalAreaInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractor.kt index 8fd6f62b315f..88eb5511160b 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/WallpaperFocalAreaInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/domain/interactor/WallpaperFocalAreaInteractor.kt @@ -14,15 +14,14 @@ * limitations under the License. */ -package com.android.systemui.keyguard.domain.interactor +package com.android.systemui.wallpapers.domain.interactor import android.content.applicationContext -import com.android.systemui.keyguard.data.repository.keyguardClockRepository -import com.android.systemui.keyguard.data.repository.keyguardRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.shade.data.repository.shadeRepository import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor +import com.android.systemui.wallpapers.data.repository.wallpaperFocalAreaRepository import com.android.systemui.wallpapers.data.repository.wallpaperRepository val Kosmos.wallpaperFocalAreaInteractor by @@ -30,10 +29,9 @@ val Kosmos.wallpaperFocalAreaInteractor by WallpaperFocalAreaInteractor( applicationScope = applicationCoroutineScope, context = applicationContext, - keyguardRepository = keyguardRepository, + wallpaperFocalAreaRepository = wallpaperFocalAreaRepository, shadeRepository = shadeRepository, activeNotificationsInteractor = activeNotificationsInteractor, - keyguardClockRepository = keyguardClockRepository, wallpaperRepository = wallpaperRepository, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/ui/viewmodel/WallpaperFocalAreaViewModel.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/ui/viewmodel/WallpaperFocalAreaViewModel.kt new file mode 100644 index 000000000000..7e232c526732 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/wallpapers/ui/viewmodel/WallpaperFocalAreaViewModel.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wallpapers.ui.viewmodel + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.wallpapers.domain.interactor.wallpaperFocalAreaInteractor + +var Kosmos.wallpaperFocalAreaViewModel by + Kosmos.Fixture { + WallpaperFocalAreaViewModel(wallpaperFocalAreaInteractor = wallpaperFocalAreaInteractor) + } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 6ece2654f3bf..7db63a5c4a11 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -15113,10 +15113,24 @@ public class ActivityManagerService extends IActivityManager.Stub } } - void noteUidProcessState(final int uid, final int state, - final @ProcessCapability int capability) { - mBatteryStatsService.noteUidProcessState(uid, state); + /** + * Called by {@link OomAdjuster} whenever either the ProcessState or Capability of a uid has + * changed. + * NOTE: Use {@link #noteUidProcessState(int, int)} instead of this method for listeners + * interested in only ProcessState changes. + */ + void noteUidProcessStateAndCapability(final int uid, final int state, + final @ProcessCapability int capability) { mAppOpsService.updateUidProcState(uid, state, capability); + } + + /** + * Called by {@link OomAdjuster} whenever either the ProcessState of a uid has changed. + * NOTE: Use {@link #noteUidProcessStateAndCapability(int, int, int)} instead of this method + * for listeners interested in both ProcessState and Capability changes. + */ + void noteUidProcessState(final int uid, final int state) { + mBatteryStatsService.noteUidProcessState(uid, state); if (StatsPullAtomService.ENABLE_MOBILE_DATA_STATS_AGGREGATED_PULLER) { try { if (mStatsPullAtomServiceInternal == null) { diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 87f843b53a1d..804de920a3d9 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -1681,8 +1681,11 @@ public class OomAdjuster { } if ((uidChange & UidRecord.CHANGE_PROCSTATE) != 0 || (uidChange & UidRecord.CHANGE_CAPABILITY) != 0) { - mService.noteUidProcessState(uidRec.getUid(), uidRec.getCurProcState(), - uidRec.getCurCapability()); + mService.noteUidProcessStateAndCapability(uidRec.getUid(), + uidRec.getCurProcState(), uidRec.getCurCapability()); + } + if ((uidChange & UidRecord.CHANGE_PROCSTATE) != 0) { + mService.noteUidProcessState(uidRec.getUid(), uidRec.getCurProcState()); } if (uidRec.hasForegroundServices()) { mService.mServices.foregroundServiceProcStateChangedLocked(uidRec); diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index f7eaa159be30..b8babe69d5a7 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -3286,8 +3286,9 @@ public final class ProcessList { uidRec.updateHasInternetPermission(); mActiveUids.put(proc.uid, uidRec); EventLogTags.writeAmUidRunning(uidRec.getUid()); - mService.noteUidProcessState(uidRec.getUid(), uidRec.getCurProcState(), + mService.noteUidProcessStateAndCapability(uidRec.getUid(), uidRec.getCurProcState(), uidRec.getCurCapability()); + mService.noteUidProcessState(uidRec.getUid(), uidRec.getCurProcState()); } proc.setUidRecord(uidRec); uidRec.addProcess(proc); @@ -3489,8 +3490,11 @@ public final class ProcessList { EventLogTags.writeAmUidStopped(uid); mActiveUids.remove(uid); mService.mFgsStartTempAllowList.removeUid(record.info.uid); - mService.noteUidProcessState(uid, ActivityManager.PROCESS_STATE_NONEXISTENT, + mService.noteUidProcessStateAndCapability(uid, + ActivityManager.PROCESS_STATE_NONEXISTENT, ActivityManager.PROCESS_CAPABILITY_NONE); + mService.noteUidProcessState(uid, ActivityManager.PROCESS_STATE_NONEXISTENT + ); } record.setUidRecord(null); } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 99ecd8e58e53..2bc6166af40b 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -64,7 +64,6 @@ import static android.provider.Settings.Secure.VOLUME_HUSH_OFF; import static android.provider.Settings.Secure.VOLUME_HUSH_VIBRATE; import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE; -import static com.android.media.audio.Flags.absVolumeIndexFix; import static com.android.media.audio.Flags.alarmMinVolumeZero; import static com.android.media.audio.Flags.asDeviceConnectionFailure; import static com.android.media.audio.Flags.audioserverPermissions; @@ -74,7 +73,6 @@ import static com.android.media.audio.Flags.equalScoLeaVcIndexRange; import static com.android.media.audio.Flags.replaceStreamBtSco; import static com.android.media.audio.Flags.ringMyCar; import static com.android.media.audio.Flags.ringerModeAffectsAlarm; -import static com.android.media.audio.Flags.setStreamVolumeOrder; import static com.android.media.audio.Flags.vgsVssSyncMuteOrder; import static com.android.media.flags.Flags.enableAudioInputDeviceRoutingAndVolumeControl; import static com.android.server.audio.SoundDoseHelper.ACTION_CHECK_MUSIC_ACTIVE; @@ -4126,10 +4124,8 @@ public class AudioService extends IAudioService.Stub int newIndex = getVssForStreamOrDefault(streamType).getIndex(device); - int streamToDriveAbsVol = absVolumeIndexFix() ? getBluetoothContextualVolumeStream() : - AudioSystem.STREAM_MUSIC; // Check if volume update should be send to AVRCP - if (streamTypeAlias == streamToDriveAbsVol + if (streamTypeAlias == getBluetoothContextualVolumeStream() && AudioSystem.DEVICE_OUT_ALL_A2DP_SET.contains(device) && (flags & AudioManager.FLAG_BLUETOOTH_ABS_VOLUME) == 0) { if (DEBUG_VOL) { @@ -4984,16 +4980,14 @@ public class AudioService extends IAudioService.Stub + audioserverPermissions()); pw.println("\tcom.android.media.audio.disablePrescaleAbsoluteVolume:" + disablePrescaleAbsoluteVolume()); - pw.println("\tcom.android.media.audio.setStreamVolumeOrder:" - + setStreamVolumeOrder()); + pw.println("\tcom.android.media.audio.setStreamVolumeOrder - EOL"); pw.println("\tandroid.media.audio.roForegroundAudioControl:" + roForegroundAudioControl()); pw.println("\tandroid.media.audio.scoManagedByAudio:" + scoManagedByAudio()); pw.println("\tcom.android.media.audio.vgsVssSyncMuteOrder:" + vgsVssSyncMuteOrder()); - pw.println("\tcom.android.media.audio.absVolumeIndexFix:" - + absVolumeIndexFix()); + pw.println("\tcom.android.media.audio.absVolumeIndexFix - EOL"); pw.println("\tcom.android.media.audio.replaceStreamBtSco:" + replaceStreamBtSco()); pw.println("\tcom.android.media.audio.equalScoLeaVcIndexRange:" @@ -5178,33 +5172,29 @@ public class AudioService extends IAudioService.Stub index = rescaleIndex(index * 10, streamType, streamTypeAlias); - if (setStreamVolumeOrder()) { - flags &= ~AudioManager.FLAG_FIXED_VOLUME; - if (streamTypeAlias == AudioSystem.STREAM_MUSIC && isFixedVolumeDevice(device)) { - flags |= AudioManager.FLAG_FIXED_VOLUME; + flags &= ~AudioManager.FLAG_FIXED_VOLUME; + if (streamTypeAlias == AudioSystem.STREAM_MUSIC && isFixedVolumeDevice(device)) { + flags |= AudioManager.FLAG_FIXED_VOLUME; - // volume is either 0 or max allowed for fixed volume devices - if (index != 0) { - index = mSoundDoseHelper.getSafeMediaVolumeIndex(device); - if (index < 0) { - index = streamState.getMaxIndex(); - } + // volume is either 0 or max allowed for fixed volume devices + if (index != 0) { + index = mSoundDoseHelper.getSafeMediaVolumeIndex(device); + if (index < 0) { + index = streamState.getMaxIndex(); } } + } - if (!mSoundDoseHelper.willDisplayWarningAfterCheckVolume(streamType, index, device, - flags)) { - onSetStreamVolume(streamType, index, flags, device, caller, hasModifyAudioSettings, - // ada is non-null when called from setDeviceVolume, - // which shouldn't update the mute state - canChangeMuteAndUpdateController /*canChangeMute*/); - index = getVssForStreamOrDefault(streamType).getIndex(device); - } + if (!mSoundDoseHelper.willDisplayWarningAfterCheckVolume(streamType, index, device, + flags)) { + onSetStreamVolume(streamType, index, flags, device, caller, hasModifyAudioSettings, + // ada is non-null when called from setDeviceVolume, + // which shouldn't update the mute state + canChangeMuteAndUpdateController /*canChangeMute*/); + index = getVssForStreamOrDefault(streamType).getIndex(device); } - int streamToDriveAbsVol = absVolumeIndexFix() ? getBluetoothContextualVolumeStream() : - AudioSystem.STREAM_MUSIC; - if (streamTypeAlias == streamToDriveAbsVol + if (streamTypeAlias == getBluetoothContextualVolumeStream() && AudioSystem.DEVICE_OUT_ALL_A2DP_SET.contains(device) && (flags & AudioManager.FLAG_BLUETOOTH_ABS_VOLUME) == 0) { if (DEBUG_VOL) { @@ -5237,30 +5227,6 @@ public class AudioService extends IAudioService.Stub mDeviceBroker.postSetHearingAidVolumeIndex(index, streamType); } - if (!setStreamVolumeOrder()) { - flags &= ~AudioManager.FLAG_FIXED_VOLUME; - if (streamTypeAlias == AudioSystem.STREAM_MUSIC && isFixedVolumeDevice(device)) { - flags |= AudioManager.FLAG_FIXED_VOLUME; - - // volume is either 0 or max allowed for fixed volume devices - if (index != 0) { - index = mSoundDoseHelper.getSafeMediaVolumeIndex(device); - if (index < 0) { - index = streamState.getMaxIndex(); - } - } - } - - if (!mSoundDoseHelper.willDisplayWarningAfterCheckVolume(streamType, index, device, - flags)) { - onSetStreamVolume(streamType, index, flags, device, caller, hasModifyAudioSettings, - // ada is non-null when called from setDeviceVolume, - // which shouldn't update the mute state - canChangeMuteAndUpdateController /*canChangeMute*/); - index = getVssForStreamOrDefault(streamType).getIndex(device); - } - } - synchronized (mHdmiClientLock) { if (streamTypeAlias == AudioSystem.STREAM_MUSIC && (oldIndex != index)) { @@ -9594,33 +9560,6 @@ public class AudioService extends IAudioService.Stub } } - private int getAbsoluteVolumeIndex(int index) { - if (absVolumeIndexFix()) { - // The attenuation is applied in the APM. No need to manipulate the index here - return index; - } else { - /* Special handling for Bluetooth Absolute Volume scenario - * If we send full audio gain, some accessories are too loud even at its lowest - * volume. We are not able to enumerate all such accessories, so here is the - * workaround from phone side. - * Pre-scale volume at lowest volume steps 1 2 and 3. - * For volume step 0, set audio gain to 0 as some accessories won't mute on their - * end. - */ - if (index == 0) { - // 0% for volume 0 - index = 0; - } else if (!disablePrescaleAbsoluteVolume() && index > 0 && index <= 3) { - // Pre-scale for volume steps 1 2 and 3 - index = (int) (mIndexMax * mPrescaleAbsoluteVolume[index - 1]) / 10; - } else { - // otherwise, full gain - index = (mIndexMax + 5) / 10; - } - return index; - } - } - /** * Sends the new volume index on the given device to native. * @@ -9660,19 +9599,15 @@ public class AudioService extends IAudioService.Stub || isA2dpAbsoluteVolumeDevice(device) || AudioSystem.isLeAudioDeviceType(device)) { // do not change the volume logic for dynamic abs behavior devices like HDMI - if (absVolumeIndexFix() && isAbsoluteVolumeDevice(device)) { - index = getAbsoluteVolumeIndex((mIndexMax + 5) / 10); + if (isAbsoluteVolumeDevice(device)) { + index = (mIndexMax + 5) / 10; } else { - index = getAbsoluteVolumeIndex((getIndex(device) + 5) / 10); + index = (getIndex(device) + 5) / 10; } } else if (isFullVolumeDevice(device)) { index = (mIndexMax + 5)/10; } else if (device == AudioSystem.DEVICE_OUT_HEARING_AID) { - if (absVolumeIndexFix()) { - index = getAbsoluteVolumeIndex((getIndex(device) + 5) / 10); - } else { - index = (mIndexMax + 5) / 10; - } + index = (getIndex(device) + 5) / 10; } else { index = (getIndex(device) + 5)/10; } @@ -9696,20 +9631,16 @@ public class AudioService extends IAudioService.Stub isAbsoluteVolume = true; // do not change the volume logic for dynamic abs behavior devices // like HDMI - if (absVolumeIndexFix() && isAbsoluteVolumeDevice(device)) { - index = getAbsoluteVolumeIndex((mIndexMax + 5) / 10); + if (isAbsoluteVolumeDevice(device)) { + index = (mIndexMax + 5) / 10; } else { - index = getAbsoluteVolumeIndex((getIndex(device) + 5) / 10); + index = (getIndex(device) + 5) / 10; } } else if (isFullVolumeDevice(device)) { index = (mIndexMax + 5)/10; } else if (device == AudioSystem.DEVICE_OUT_HEARING_AID) { - if (absVolumeIndexFix()) { - isAbsoluteVolume = true; - index = getAbsoluteVolumeIndex((getIndex(device) + 5) / 10); - } else { - index = (mIndexMax + 5) / 10; - } + isAbsoluteVolume = true; + index = (getIndex(device) + 5) / 10; } else { index = (mIndexMap.valueAt(i) + 5)/10; } @@ -10779,39 +10710,37 @@ public class AudioService extends IAudioService.Stub Log.i(TAG, "setAvrcpAbsoluteVolumeSupported support " + support); synchronized (mCachedAbsVolDrivingStreamsLock) { mAvrcpAbsVolSupported = support; - if (absVolumeIndexFix()) { - int a2dpDev = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP; - mCachedAbsVolDrivingStreams.compute(a2dpDev, (dev, stream) -> { - if (!mAvrcpAbsVolSupported) { - final int result = mAudioSystem.setDeviceAbsoluteVolumeEnabled( - a2dpDev, /*address=*/"", /*enabled*/false, - AudioSystem.STREAM_DEFAULT); - if (result != AudioSystem.AUDIO_STATUS_OK) { - sVolumeLogger.enqueueAndSlog( - new VolumeEvent(VolumeEvent.VOL_ABS_DEVICE_ENABLED_ERROR, - result, a2dpDev, /*enabled=*/false, - AudioSystem.STREAM_DEFAULT).eventToString(), ALOGE, - TAG); - } - return null; + int a2dpDev = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP; + mCachedAbsVolDrivingStreams.compute(a2dpDev, (dev, stream) -> { + if (!mAvrcpAbsVolSupported) { + final int result = mAudioSystem.setDeviceAbsoluteVolumeEnabled( + a2dpDev, /*address=*/"", /*enabled*/false, + AudioSystem.STREAM_DEFAULT); + if (result != AudioSystem.AUDIO_STATUS_OK) { + sVolumeLogger.enqueueAndSlog( + new VolumeEvent(VolumeEvent.VOL_ABS_DEVICE_ENABLED_ERROR, + result, a2dpDev, /*enabled=*/false, + AudioSystem.STREAM_DEFAULT).eventToString(), ALOGE, + TAG); } - // For A2DP and AVRCP we need to set the driving stream based on the - // BT contextual stream. Hence, we need to make sure in adjustStreamVolume - // and setStreamVolume that the driving abs volume stream is consistent. - int streamToDriveAbs = getBluetoothContextualVolumeStream(); - if (stream == null || stream != streamToDriveAbs) { - final int result = mAudioSystem.setDeviceAbsoluteVolumeEnabled(a2dpDev, - /*address=*/"", /*enabled*/true, streamToDriveAbs); - if (result != AudioSystem.AUDIO_STATUS_OK) { - sVolumeLogger.enqueueAndSlog( - new VolumeEvent(VolumeEvent.VOL_ABS_DEVICE_ENABLED_ERROR, - result, a2dpDev, /*enabled=*/true, - streamToDriveAbs).eventToString(), ALOGE, TAG); - } + return null; + } + // For A2DP and AVRCP we need to set the driving stream based on the + // BT contextual stream. Hence, we need to make sure in adjustStreamVolume + // and setStreamVolume that the driving abs volume stream is consistent. + int streamToDriveAbs = getBluetoothContextualVolumeStream(); + if (stream == null || stream != streamToDriveAbs) { + final int result = mAudioSystem.setDeviceAbsoluteVolumeEnabled(a2dpDev, + /*address=*/"", /*enabled*/true, streamToDriveAbs); + if (result != AudioSystem.AUDIO_STATUS_OK) { + sVolumeLogger.enqueueAndSlog( + new VolumeEvent(VolumeEvent.VOL_ABS_DEVICE_ENABLED_ERROR, + result, a2dpDev, /*enabled=*/true, + streamToDriveAbs).eventToString(), ALOGE, TAG); } - return streamToDriveAbs; - }); - } + } + return streamToDriveAbs; + }); } sendMsg(mAudioHandler, MSG_SET_DEVICE_VOLUME, SENDMSG_QUEUE, AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, 0, diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java index 57b5febf4df0..64b933a89b71 100644 --- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java +++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java @@ -16,7 +16,6 @@ package com.android.server.audio; -import static android.media.AudioPlaybackConfiguration.EXTRA_PLAYER_EVENT_MUTE; import static android.media.AudioPlaybackConfiguration.MUTED_BY_OP_PLAY_AUDIO; import static android.media.AudioPlaybackConfiguration.MUTED_BY_CLIENT_VOLUME; import static android.media.AudioPlaybackConfiguration.MUTED_BY_MASTER; @@ -28,8 +27,6 @@ import static android.media.AudioPlaybackConfiguration.MUTED_BY_OP_CONTROL_AUDIO import static android.media.AudioPlaybackConfiguration.PLAYER_PIID_INVALID; import static android.media.AudioPlaybackConfiguration.PLAYER_UPDATE_MUTED; -import static com.android.media.audio.Flags.portToPiidSimplification; - import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; @@ -158,8 +155,6 @@ public final class PlaybackActivityMonitor @GuardedBy("mPlayerLock") private final SparseIntArray mPiidToPortId = new SparseIntArray(); - @GuardedBy("mPlayerLock") - private final SparseIntArray mPortIdToPiid = new SparseIntArray(); private final Context mContext; private int mSavedAlarmVolume = -1; @@ -387,11 +382,7 @@ public final class PlaybackActivityMonitor sEventLogger.enqueue(new PlayerEvent(piid, event, eventValues)); if (event == AudioPlaybackConfiguration.PLAYER_UPDATE_PORT_ID) { - if (portToPiidSimplification()) { - mPiidToPortId.put(piid, eventValues[0]); - } else { - mPortIdToPiid.put(eventValues[0], piid); - } + mPiidToPortId.put(piid, eventValues[0]); return; } else if (event == AudioPlaybackConfiguration.PLAYER_STATE_STARTED) { for (Integer uidInteger: mBannedUids) { @@ -446,20 +437,12 @@ public final class PlaybackActivityMonitor synchronized (mPlayerLock) { int piid; - if (portToPiidSimplification()) { - int idxOfPiid = mPiidToPortId.indexOfValue(portId); - if (idxOfPiid < 0) { - Log.w(TAG, "No piid assigned for invalid/internal port id " + portId); - return; - } - piid = mPiidToPortId.keyAt(idxOfPiid); - } else { - piid = mPortIdToPiid.get(portId, PLAYER_PIID_INVALID); - if (piid == PLAYER_PIID_INVALID) { - Log.w(TAG, "No piid assigned for invalid/internal port id " + portId); - return; - } + int idxOfPiid = mPiidToPortId.indexOfValue(portId); + if (idxOfPiid < 0) { + Log.w(TAG, "No piid assigned for invalid/internal port id " + portId); + return; } + piid = mPiidToPortId.keyAt(idxOfPiid); final AudioPlaybackConfiguration apc = mPlayers.get(piid); if (apc == null) { Log.w(TAG, "No AudioPlaybackConfiguration assigned for piid " + piid); @@ -496,20 +479,13 @@ public final class PlaybackActivityMonitor synchronized (mPlayerLock) { int piid; - if (portToPiidSimplification()) { - int idxOfPiid = mPiidToPortId.indexOfValue(portId); - if (idxOfPiid < 0) { - Log.w(TAG, "No piid assigned for invalid/internal port id " + portId); - return; - } - piid = mPiidToPortId.keyAt(idxOfPiid); - } else { - piid = mPortIdToPiid.get(portId, PLAYER_PIID_INVALID); - if (piid == PLAYER_PIID_INVALID) { - Log.w(TAG, "No piid assigned for invalid/internal port id " + portId); - return; - } + int idxOfPiid = mPiidToPortId.indexOfValue(portId); + if (idxOfPiid < 0) { + Log.w(TAG, "No piid assigned for invalid/internal port id " + portId); + return; } + piid = mPiidToPortId.keyAt(idxOfPiid); + final AudioPlaybackConfiguration apc = mPlayers.get(piid); if (apc == null) { Log.w(TAG, "No AudioPlaybackConfiguration assigned for piid " + piid); @@ -559,15 +535,7 @@ public final class PlaybackActivityMonitor change = apc.handleStateEvent(AudioPlaybackConfiguration.PLAYER_STATE_RELEASED, AudioPlaybackConfiguration.PLAYER_DEVICEIDS_INVALID); - if (portToPiidSimplification()) { - mPiidToPortId.delete(piid); - } else { - // remove all port ids mapped to the released player - int portIdx; - while ((portIdx = mPortIdToPiid.indexOfValue(piid)) >= 0) { - mPortIdToPiid.removeAt(portIdx); - } - } + mPiidToPortId.delete(piid); if (change && mDoNotLogPiidList.contains(piid)) { // do not dispatch a change for a "do not log" player @@ -585,17 +553,10 @@ public final class PlaybackActivityMonitor new EventLogger.StringEvent( "clear port id to piid map")); synchronized (mPlayerLock) { - if (portToPiidSimplification()) { - if (DEBUG) { - Log.v(TAG, "clear piid to portId map:\n" + mPiidToPortId); - } - mPiidToPortId.clear(); - } else { - if (DEBUG) { - Log.v(TAG, "clear port id to piid map:\n" + mPortIdToPiid); - } - mPortIdToPiid.clear(); + if (DEBUG) { + Log.v(TAG, "clear piid to portId map:\n" + mPiidToPortId); } + mPiidToPortId.clear(); } } @@ -754,21 +715,12 @@ public final class PlaybackActivityMonitor pw.print(" " + piid); } pw.println("\n"); - if (portToPiidSimplification()) { - // portId to piid mappings: - pw.println("\n current piid to portId map:"); - for (int i = 0; i < mPiidToPortId.size(); ++i) { - pw.println( - " piid: " + mPiidToPortId.keyAt(i) + " portId: " - + mPiidToPortId.valueAt(i)); - } - } else { - // portId to piid mappings: - pw.println("\n current portId to piid map:"); - for (int i = 0; i < mPortIdToPiid.size(); ++i) { - pw.println(" portId: " + mPortIdToPiid.keyAt(i) + " piid: " - + mPortIdToPiid.valueAt(i)); - } + // portId to piid mappings: + pw.println("\n current piid to portId map:"); + for (int i = 0; i < mPiidToPortId.size(); ++i) { + pw.println( + " piid: " + mPiidToPortId.keyAt(i) + " portId: " + + mPiidToPortId.valueAt(i)); } pw.println("\n"); // log diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java index 4389dd09ba73..ed98bf98f7b7 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubEndpointManager.java @@ -19,12 +19,14 @@ package com.android.server.location.contexthub; import android.content.Context; import android.hardware.contexthub.ContextHubInfo; import android.hardware.contexthub.EndpointInfo; +import android.hardware.contexthub.ErrorCode; import android.hardware.contexthub.HubEndpointInfo; import android.hardware.contexthub.HubInfo; import android.hardware.contexthub.HubMessage; import android.hardware.contexthub.IContextHubEndpoint; import android.hardware.contexthub.IContextHubEndpointCallback; import android.hardware.contexthub.IEndpointCommunication; +import android.hardware.contexthub.MessageDeliveryStatus; import android.os.RemoteException; import android.os.ServiceSpecificException; import android.util.Log; @@ -339,6 +341,12 @@ import java.util.function.Consumer; sessionId, (broker) -> broker.onMessageReceived(sessionId, message)); if (!callbackInvoked) { Log.w(TAG, "onMessageReceived: unknown session ID " + sessionId); + if (message.isResponseRequired()) { + sendMessageDeliveryStatus( + sessionId, + message.getMessageSequenceNumber(), + ErrorCode.DESTINATION_NOT_FOUND); + } } } @@ -402,6 +410,21 @@ import java.util.function.Consumer; return (minId <= maxId) && (minId >= 0) && (maxId >= 0); } + private void sendMessageDeliveryStatus( + int sessionId, int messageSequenceNumber, byte errorCode) { + MessageDeliveryStatus status = new MessageDeliveryStatus(); + status.messageSequenceNumber = messageSequenceNumber; + status.errorCode = errorCode; + try { + mHubInterface.sendMessageDeliveryStatusToEndpoint(sessionId, status); + } catch (RemoteException e) { + Log.w( + TAG, + "Exception while sending message delivery status on session " + sessionId, + e); + } + } + @VisibleForTesting /* package */ int getNumAvailableSessions() { synchronized (mSessionIdLock) { diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index e091fc62451b..58cf29b59961 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -196,16 +196,6 @@ public class MediaSessionService extends SystemService implements Monitor { @GuardedBy("mLock") private final Map<Integer, Set<StatusBarNotification>> mMediaNotifications = new HashMap<>(); - /** - * Holds all {@link MediaSessionRecordImpl} which we've reported as being {@link - * ActivityManagerInternal#startForegroundServiceDelegate user engaged}. - * - * <p>This map simply prevents invoking {@link - * ActivityManagerInternal#startForegroundServiceDelegate} more than once per session. - */ - @GuardedBy("mLock") - private final Set<MediaSessionRecordImpl> mFgsAllowedMediaSessionRecords = new HashSet<>(); - // The FullUserRecord of the current users. (i.e. The foreground user that isn't a profile) // It's always not null after the MediaSessionService is started. private FullUserRecord mCurrentFullUserRecord; @@ -759,9 +749,6 @@ public class MediaSessionService extends SystemService implements Monitor { @GuardedBy("mLock") private void setFgsActiveLocked(MediaSessionRecordImpl mediaSessionRecord, StatusBarNotification sbn) { - if (!mFgsAllowedMediaSessionRecords.add(mediaSessionRecord)) { - return; // This record already is FGS-activated. - } final long token = Binder.clearCallingIdentity(); try { final String packageName = sbn.getPackageName(); @@ -826,10 +813,6 @@ public class MediaSessionService extends SystemService implements Monitor { @GuardedBy("mLock") private void setFgsInactiveLocked(MediaSessionRecordImpl mediaSessionRecord, StatusBarNotification sbn) { - if (!mFgsAllowedMediaSessionRecords.remove(mediaSessionRecord)) { - return; // This record is not FGS-active. No need to set inactive. - } - final long token = Binder.clearCallingIdentity(); try { final String packageName = sbn.getPackageName(); @@ -3273,6 +3256,7 @@ public class MediaSessionService extends SystemService implements Monitor { public void onNotificationPosted(StatusBarNotification sbn) { super.onNotificationPosted(sbn); int uid = sbn.getUid(); + int userId = sbn.getUser().getIdentifier(); final Notification postedNotification = sbn.getNotification(); if (!postedNotification.isMediaNotification()) { return; @@ -3280,12 +3264,16 @@ public class MediaSessionService extends SystemService implements Monitor { synchronized (mLock) { mMediaNotifications.putIfAbsent(uid, new HashSet<>()); mMediaNotifications.get(uid).add(sbn); - for (MediaSessionRecordImpl mediaSessionRecord : - mUserEngagedSessionsForFgs.getOrDefault(uid, Set.of())) { - if (mediaSessionRecord.isLinkedToNotification(postedNotification)) { - setFgsActiveLocked(mediaSessionRecord, sbn); - return; - } + MediaSessionRecordImpl userEngagedRecord = + getUserEngagedMediaSessionRecordForNotification(uid, postedNotification); + if (userEngagedRecord != null) { + setFgsActiveLocked(userEngagedRecord, sbn); + return; + } + MediaSessionRecordImpl notificationRecord = + getAnyMediaSessionRecordForNotification(uid, userId, postedNotification); + if (notificationRecord != null) { + setFgsInactiveIfNoSessionIsLinkedToNotification(notificationRecord); } } } @@ -3308,7 +3296,7 @@ public class MediaSessionService extends SystemService implements Monitor { } MediaSessionRecordImpl notificationRecord = - getLinkedMediaSessionRecord(uid, removedNotification); + getUserEngagedMediaSessionRecordForNotification(uid, removedNotification); if (notificationRecord == null) { return; @@ -3317,7 +3305,7 @@ public class MediaSessionService extends SystemService implements Monitor { } } - private MediaSessionRecordImpl getLinkedMediaSessionRecord( + private MediaSessionRecordImpl getUserEngagedMediaSessionRecordForNotification( int uid, Notification notification) { synchronized (mLock) { for (MediaSessionRecordImpl mediaSessionRecord : @@ -3329,5 +3317,24 @@ public class MediaSessionService extends SystemService implements Monitor { } return null; } + + private MediaSessionRecordImpl getAnyMediaSessionRecordForNotification( + int uid, int userId, Notification notification) { + synchronized (mLock) { + FullUserRecord userRecord = getFullUserRecordLocked(userId); + if (userRecord == null) { + return null; + } + List<MediaSessionRecord> allUserSessions = + userRecord.mPriorityStack.getPriorityList(/* activeOnly= */ false, userId); + for (MediaSessionRecordImpl mediaSessionRecord : allUserSessions) { + if (mediaSessionRecord.getUid() == uid + && mediaSessionRecord.isLinkedToNotification(notification)) { + return mediaSessionRecord; + } + } + } + return null; + } } } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index b16b766b6ef6..3a3deb00562e 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -4994,6 +4994,16 @@ public class NotificationManagerService extends SystemService { } @Override + public ParceledListSlice<NotificationChannelGroup> + getNotificationChannelGroupsWithoutChannels(String pkg) { + checkCallerIsSystemOrSameApp(pkg); + List<NotificationChannelGroup> groups = new ArrayList<>(); + groups.addAll(mPreferencesHelper.getNotificationChannelGroupsWithoutChannels(pkg, + Binder.getCallingUid())); + return new ParceledListSlice<>(groups); + } + + @Override public void deleteNotificationChannelGroup(String pkg, String groupId) { checkCallerIsSystemOrSameApp(pkg); @@ -7136,7 +7146,7 @@ public class NotificationManagerService extends SystemService { verifyPrivilegedListener(token, user, true); List<NotificationChannelGroup> groups = new ArrayList<>(); - groups.addAll(mPreferencesHelper.getNotificationChannelGroups( + groups.addAll(mPreferencesHelper.getNotificationChannelGroupsWithoutChannels( pkg, getUidForPackageAndUser(pkg, user))); return new ParceledListSlice<>(groups); } diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index 46c99cd83150..a171ffc2ed98 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -276,6 +276,7 @@ public class PreferencesHelper implements RankingConfig { // notification channels. if (android.app.Flags.nmBinderPerfCacheChannels()) { invalidateNotificationChannelCache(); + invalidateNotificationChannelGroupCache(); } } @@ -1022,6 +1023,7 @@ public class PreferencesHelper implements RankingConfig { throw new IllegalArgumentException("group.getName() can't be empty"); } boolean needsDndChange = false; + boolean changed = false; synchronized (mLock) { PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid); if (r == null) { @@ -1052,6 +1054,7 @@ public class PreferencesHelper implements RankingConfig { } if (!group.equals(oldGroup)) { // will log for new entries as well as name/description changes + changed = true; MetricsLogger.action(getChannelGroupLog(group.getId(), pkg)); mNotificationChannelLogger.logNotificationChannelGroup(group, uid, pkg, oldGroup == null, @@ -1062,6 +1065,9 @@ public class PreferencesHelper implements RankingConfig { if (needsDndChange) { updateCurrentUserHasChannelsBypassingDnd(callingUid, fromSystemOrSystemUi); } + if (android.app.Flags.nmBinderPerfCacheChannels() && changed) { + invalidateNotificationChannelGroupCache(); + } } @Override @@ -1714,6 +1720,7 @@ public class PreferencesHelper implements RankingConfig { String groupId, int callingUid, boolean fromSystemOrSystemUi) { List<NotificationChannel> deletedChannels = new ArrayList<>(); boolean groupBypassedDnd = false; + boolean deleted = false; synchronized (mLock) { PackagePreferences r = getPackagePreferencesLocked(pkg, uid); if (r == null || TextUtils.isEmpty(groupId)) { @@ -1722,6 +1729,7 @@ public class PreferencesHelper implements RankingConfig { NotificationChannelGroup channelGroup = r.groups.remove(groupId); if (channelGroup != null) { + deleted = true; mNotificationChannelLogger.logNotificationChannelGroupDeleted(channelGroup, uid, pkg); } @@ -1739,15 +1747,25 @@ public class PreferencesHelper implements RankingConfig { if (groupBypassedDnd) { updateCurrentUserHasChannelsBypassingDnd(callingUid, fromSystemOrSystemUi); } - if (android.app.Flags.nmBinderPerfCacheChannels() && deletedChannels.size() > 0) { - invalidateNotificationChannelCache(); + if (android.app.Flags.nmBinderPerfCacheChannels()) { + if (deletedChannels.size() > 0) { + invalidateNotificationChannelCache(); + } + if (deleted) { + invalidateNotificationChannelGroupCache(); + } } return deletedChannels; } + /** + * Returns all notification channel groups for the provided package and uid, without channel + * information included. Note that this method returns the object instances from the internal + * structure; do not modify the returned groups before copying or parceling. + */ @Override - public Collection<NotificationChannelGroup> getNotificationChannelGroups(String pkg, - int uid) { + public Collection<NotificationChannelGroup> getNotificationChannelGroupsWithoutChannels( + String pkg, int uid) { List<NotificationChannelGroup> groups = new ArrayList<>(); synchronized (mLock) { PackagePreferences r = getPackagePreferencesLocked(pkg, uid); @@ -2896,6 +2914,7 @@ public class PreferencesHelper implements RankingConfig { } if (android.app.Flags.nmBinderPerfCacheChannels() && removed) { invalidateNotificationChannelCache(); + invalidateNotificationChannelGroupCache(); } } } @@ -3008,6 +3027,7 @@ public class PreferencesHelper implements RankingConfig { updateConfig(); if (android.app.Flags.nmBinderPerfCacheChannels()) { invalidateNotificationChannelCache(); + invalidateNotificationChannelGroupCache(); } } return updated; @@ -3028,6 +3048,7 @@ public class PreferencesHelper implements RankingConfig { p.showBadge = DEFAULT_SHOW_BADGE; if (android.app.Flags.nmBinderPerfCacheChannels()) { invalidateNotificationChannelCache(); + invalidateNotificationChannelGroupCache(); } } } @@ -3253,6 +3274,11 @@ public class PreferencesHelper implements RankingConfig { NotificationManager.invalidateNotificationChannelCache(); } + @VisibleForTesting + protected void invalidateNotificationChannelGroupCache() { + NotificationManager.invalidateNotificationChannelGroupCache(); + } + private static String packagePreferencesKey(String pkg, int uid) { return pkg + "|" + uid; } diff --git a/services/core/java/com/android/server/notification/RankingConfig.java b/services/core/java/com/android/server/notification/RankingConfig.java index 001e91cbea12..d5b8147a64ec 100644 --- a/services/core/java/com/android/server/notification/RankingConfig.java +++ b/services/core/java/com/android/server/notification/RankingConfig.java @@ -36,7 +36,7 @@ public interface RankingConfig { boolean canShowNotificationsOnLockscreen(int userId); boolean canShowPrivateNotificationsOnLockScreen(int userId); - Collection<NotificationChannelGroup> getNotificationChannelGroups(String pkg, + Collection<NotificationChannelGroup> getNotificationChannelGroupsWithoutChannels(String pkg, int uid); void createNotificationChannelGroup(String pkg, int uid, NotificationChannelGroup group, boolean fromTargetApp, int callingUid, boolean isSystemOrSystemUi); diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 476ba7bafdc4..55d2508d085e 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -3044,20 +3044,11 @@ final class InstallPackageHelper { // Set the OP_ACCESS_RESTRICTED_SETTINGS op, which is used by ECM (see {@link // EnhancedConfirmationManager}) as a persistent state denoting whether an app is - // currently guarded by ECM, not guarded by ECM, or (in Android V+) that this should - // be decided later. - if (android.permission.flags.Flags.enhancedConfirmationModeApisEnabled() - && android.security.Flags.extendEcmToAllSettings()) { - final int appId = request.getAppId(); - // TODO: b/388960315 - Implement a long-term solution to race condition - mPm.mHandler.postDelayed(() -> { - for (int userId : firstUserIds) { - // MODE_DEFAULT means that the app's guardedness will be decided lazily - setAccessRestrictedSettingsMode(packageName, appId, userId, - AppOpsManager.MODE_DEFAULT); - } - }, 1000L); - } else { + // currently guarded by ECM, not guarded by ECM or (in Android V+) that this should + // be decided later. In Android B, the op's default mode was updated to the + // "should be decided later" case, and so this step is now unnecessary. + if (!android.permission.flags.Flags.enhancedConfirmationModeApisEnabled() + || !android.security.Flags.extendEcmToAllSettings()) { // Apply restricted settings on potentially dangerous packages. Needs to happen // after appOpsManager is notified of the new package if (request.getPackageSource() == PackageInstaller.PACKAGE_SOURCE_LOCAL_FILE diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 1b41c3617a05..352985d5a023 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -189,6 +189,7 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; +import com.android.server.IoThread; import com.android.server.LocalServices; import com.android.server.art.ArtManagedInstallFileHelper; import com.android.server.pm.Installer.InstallerException; @@ -236,6 +237,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { private static final int MSG_SESSION_VALIDATION_FAILURE = 5; private static final int MSG_PRE_APPROVAL_REQUEST = 6; + private static final int MSG_ON_NATIVE_LIBS_EXTRACTED = 7; + /** XML constants used for persisting a session */ static final String TAG_SESSION = "session"; static final String TAG_CHILD_SESSION = "childSession"; @@ -943,6 +946,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { case MSG_PRE_APPROVAL_REQUEST: handlePreapprovalRequest(); break; + case MSG_ON_NATIVE_LIBS_EXTRACTED: + handleOnNativeLibsExtracted(); } return true; @@ -2908,15 +2913,13 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } private void verify() { + // Extract native libraries on the IO thread before proceeding to the verification + runExtractNativeLibraries(); + } + + @WorkerThread + private void handleOnNativeLibsExtracted() { try { - List<PackageInstallerSession> children = getChildSessions(); - if (isMultiPackage()) { - for (PackageInstallerSession child : children) { - child.extractNativeLibraries(); - } - } else { - extractNativeLibraries(); - } verifyNonStaged(); } catch (PackageManagerException e) { final String completeMsg = ExceptionUtils.getCompleteMessage(e); @@ -2926,6 +2929,27 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } + private void runExtractNativeLibraries() { + IoThread.getHandler().post(() -> { + try { + List<PackageInstallerSession> children = getChildSessions(); + if (isMultiPackage()) { + for (PackageInstallerSession child : children) { + child.extractNativeLibraries(); + } + } else { + extractNativeLibraries(); + } + mHandler.obtainMessage(MSG_ON_NATIVE_LIBS_EXTRACTED).sendToTarget(); + } catch (PackageManagerException e) { + final String completeMsg = ExceptionUtils.getCompleteMessage(e); + final String errorMsg = PackageManager.installStatusToString(e.error, completeMsg); + setSessionFailed(e.error, errorMsg); + onSessionVerificationFailure(e.error, errorMsg); + } + }); + } + private IntentSender getRemoteStatusReceiver() { synchronized (mLock) { return mRemoteStatusReceiver; @@ -3072,6 +3096,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } + @WorkerThread private void extractNativeLibraries() throws PackageManagerException { synchronized (mLock) { if (mPackageLite != null) { diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index f38394e2a259..b17eef85f93d 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -248,6 +248,7 @@ import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES; import static com.android.server.wm.WindowManagerService.sEnableShellTransitions; import static com.android.server.wm.WindowState.LEGACY_POLICY_VISIBILITY; +import static com.android.window.flags.Flags.enablePresentationForConnectedDisplays; import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.END_TAG; @@ -6223,6 +6224,16 @@ final class ActivityRecord extends WindowToken { return false; } + // Hide all activities on the presenting display so that malicious apps can't do tap + // jacking (b/391466268). + // For now, this should only be applied to external displays because presentations can only + // be shown on them. + // TODO(b/390481621): Disallow a presentation from covering its controlling activity so that + // the presentation won't stop its controlling activity. + if (enablePresentationForConnectedDisplays() && mDisplayContent.mIsPresenting) { + return false; + } + // Check if the activity is on a sleeping display and keyguard is not going away (to // align with TaskFragment#shouldSleepActivities), canTurnScreenOn will also check keyguard // visibility diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 785e198c42c8..5cb39d44586f 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -547,6 +547,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // TODO(multi-display): remove some of the usages. boolean isDefaultDisplay; + /** Indicates whether any presentation is shown on this display. */ + boolean mIsPresenting; + /** Save allocating when calculating rects */ private final Rect mTmpRect = new Rect(); private final Region mTmpRegion = new Region(); diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index ba48fdc963de..64105f634f84 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -1407,14 +1407,22 @@ class TaskFragment extends WindowContainer<WindowContainer> { final TaskFragment otherTaskFrag = other.asTaskFragment(); if (otherTaskFrag != null && otherTaskFrag.hasAdjacentTaskFragment()) { + // For adjacent TaskFragments, we have assumptions that: + // 1. A set of adjacent TaskFragments always cover the entire Task window, so that + // if this TaskFragment is behind a set of opaque TaskFragments, then this + // TaskFragment is invisible. + // 2. Adjacent TaskFragments do not overlap, so that if this TaskFragment is behind + // any translucent TaskFragment in the adjacent set, then this TaskFragment is + // visible behind translucent. if (Flags.allowMultipleAdjacentTaskFragments()) { final boolean hasTraversedAdj = otherTaskFrag.forOtherAdjacentTaskFragments( adjacentTaskFragments::contains); if (hasTraversedAdj) { - final boolean isTranslucent = otherTaskFrag.isTranslucent(starting) - || otherTaskFrag.forOtherAdjacentTaskFragments(adjacentTf -> { - return adjacentTf.isTranslucent(starting); - }); + final boolean isTranslucent = + isBehindTransparentTaskFragment(otherTaskFrag, starting) + || otherTaskFrag.forOtherAdjacentTaskFragments( + (Predicate<TaskFragment>) tf -> + isBehindTransparentTaskFragment(tf, starting)); if (isTranslucent) { // Can be visible behind a translucent adjacent TaskFragments. gotTranslucentFullscreen = true; @@ -1426,8 +1434,9 @@ class TaskFragment extends WindowContainer<WindowContainer> { } } else { if (adjacentTaskFragments.contains(otherTaskFrag.mAdjacentTaskFragment)) { - if (otherTaskFrag.isTranslucent(starting) - || otherTaskFrag.mAdjacentTaskFragment.isTranslucent(starting)) { + if (isBehindTransparentTaskFragment(otherTaskFrag, starting) + || isBehindTransparentTaskFragment( + otherTaskFrag.mAdjacentTaskFragment, starting)) { // Can be visible behind a translucent adjacent TaskFragments. gotTranslucentFullscreen = true; gotTranslucentAdjacent = true; @@ -1439,7 +1448,6 @@ class TaskFragment extends WindowContainer<WindowContainer> { } adjacentTaskFragments.add(otherTaskFrag); } - } if (!shouldBeVisible) { @@ -1452,6 +1460,11 @@ class TaskFragment extends WindowContainer<WindowContainer> { : TASK_FRAGMENT_VISIBILITY_VISIBLE; } + private boolean isBehindTransparentTaskFragment( + @NonNull TaskFragment otherTf, @Nullable ActivityRecord starting) { + return otherTf.isTranslucent(starting) && getBounds().intersect(otherTf.getBounds()); + } + private static boolean hasRunningActivity(WindowContainer wc) { if (wc.asTaskFragment() != null) { return wc.asTaskFragment().topRunningActivity() != null; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 5ead3554fda3..04ddb3cacf27 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -157,6 +157,7 @@ import static com.android.server.wm.WindowManagerServiceDumpProto.POLICY; import static com.android.server.wm.WindowManagerServiceDumpProto.ROOT_WINDOW_CONTAINER; import static com.android.server.wm.WindowManagerServiceDumpProto.WINDOW_FRAMES_VALID; import static com.android.window.flags.Flags.enableDisplayFocusInShellTransitions; +import static com.android.window.flags.Flags.enablePresentationForConnectedDisplays; import static com.android.window.flags.Flags.multiCrop; import static com.android.window.flags.Flags.setScPropertiesInClient; @@ -325,7 +326,6 @@ import android.window.WindowContainerToken; import android.window.WindowContextInfo; import com.android.internal.R; -import com.android.internal.util.ToBooleanFunction; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; @@ -342,6 +342,7 @@ import com.android.internal.util.DumpUtils; import com.android.internal.util.FastPrintWriter; import com.android.internal.util.FrameworkStatsLog; import com.android.internal.util.LatencyTracker; +import com.android.internal.util.ToBooleanFunction; import com.android.internal.view.WindowManagerPolicyThread; import com.android.server.AnimationThread; import com.android.server.DisplayThread; @@ -387,7 +388,6 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; -import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; @@ -672,6 +672,14 @@ public class WindowManagerService extends IWindowManager.Stub private ArrayList<WindowState> mHidingNonSystemOverlayWindows = new ArrayList<>(); /** + * A map that tracks uid/count of windows that cause non-system overlay windows to be hidden. + * The key is the window's uid and the value is the number of windows with that uid that are + * requesting hiding non-system overlay + */ + private final ArrayMap<Integer, Integer> mHidingNonSystemOverlayWindowsCountPerUid = + new ArrayMap<>(); + + /** * In some cases (e.g. when {@link R.bool.config_reverseDefaultRotation} has value * {@value true}) we need to map some orientation to others. This {@link SparseIntArray} * contains the relation between the source orientation and the one to use. @@ -1807,7 +1815,7 @@ public class WindowManagerService extends IWindowManager.Stub UserHandle.getUserId(win.getOwningUid())); win.setHiddenWhileSuspended(suspended); - final boolean hideSystemAlertWindows = !mHidingNonSystemOverlayWindows.isEmpty(); + final boolean hideSystemAlertWindows = shouldHideNonSystemOverlayWindow(win); win.setForceHideNonSystemOverlayWindowIfNeeded(hideSystemAlertWindows); boolean imMayMove = true; @@ -1925,6 +1933,12 @@ public class WindowManagerService extends IWindowManager.Stub if (res >= ADD_OKAY && (type == TYPE_PRESENTATION || type == TYPE_PRIVATE_PRESENTATION)) { + displayContent.mIsPresenting = true; + if (enablePresentationForConnectedDisplays()) { + // A presentation hides all activities behind on the same display. + displayContent.ensureActivitiesVisible(/*starting=*/ null, + /*notifyClients=*/ true); + } mDisplayManagerInternal.onPresentation(displayContent.getDisplay().getDisplayId(), /*isShown=*/ true); } @@ -2025,6 +2039,22 @@ public class WindowManagerService extends IWindowManager.Stub } } + private boolean shouldHideNonSystemOverlayWindow(WindowState win) { + if (!Flags.fixHideOverlayApi()) { + return !mHidingNonSystemOverlayWindows.isEmpty(); + } + + if (mHidingNonSystemOverlayWindows.isEmpty()) { + return false; + } + + if (mHidingNonSystemOverlayWindowsCountPerUid.size() == 1 + && mHidingNonSystemOverlayWindowsCountPerUid.containsKey(win.getOwningUid())) { + return false; + } + return true; + } + /** * Set whether screen capture is disabled for all windows of a specific user from * the device policy cache, or specific windows based on sensitive content protections. @@ -6941,12 +6971,12 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; PriorityDump.dump(mPriorityDumper, fd, pw, args); } @NeverCompile // Avoid size overhead of debugging code. private void doDump(FileDescriptor fd, PrintWriter pw, String[] args, boolean useProto) { - if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; boolean dumpAll = false; int opti = 0; @@ -8726,22 +8756,42 @@ public class WindowManagerService extends IWindowManager.Stub return; } final boolean systemAlertWindowsHidden = !mHidingNonSystemOverlayWindows.isEmpty(); + final int numUIDsRequestHidingPreUpdate = mHidingNonSystemOverlayWindowsCountPerUid.size(); if (surfaceShown && win.hideNonSystemOverlayWindowsWhenVisible()) { if (!mHidingNonSystemOverlayWindows.contains(win)) { mHidingNonSystemOverlayWindows.add(win); + int uid = win.getOwningUid(); + int count = mHidingNonSystemOverlayWindowsCountPerUid.getOrDefault(uid, 0); + mHidingNonSystemOverlayWindowsCountPerUid.put(uid, count + 1); } } else { mHidingNonSystemOverlayWindows.remove(win); + int uid = win.getOwningUid(); + int count = mHidingNonSystemOverlayWindowsCountPerUid.getOrDefault(uid, 0); + if (count <= 1) { + mHidingNonSystemOverlayWindowsCountPerUid.remove(win.getOwningUid()); + } else { + mHidingNonSystemOverlayWindowsCountPerUid.put(uid, count - 1); + } } - final boolean hideSystemAlertWindows = !mHidingNonSystemOverlayWindows.isEmpty(); - - if (systemAlertWindowsHidden == hideSystemAlertWindows) { - return; + final int numUIDSRequestHidingPostUpdate = mHidingNonSystemOverlayWindowsCountPerUid.size(); + if (Flags.fixHideOverlayApi()) { + if (numUIDSRequestHidingPostUpdate == numUIDsRequestHidingPreUpdate) { + return; + } + // The visibility of SAWs needs to be refreshed only when the number of uids that + // request hiding SAWs changes 0->1, 1->0, 1->2 or 2->1. + if (numUIDSRequestHidingPostUpdate != 1 && numUIDsRequestHidingPreUpdate != 1) { + return; + } + } else { + if (systemAlertWindowsHidden == hideSystemAlertWindows) { + return; + } } - mRoot.forAllWindows((w) -> { - w.setForceHideNonSystemOverlayWindowIfNeeded(hideSystemAlertWindows); + w.setForceHideNonSystemOverlayWindowIfNeeded(shouldHideNonSystemOverlayWindow(w)); }, false /* traverseTopToBottom */); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index a8f22eaeabb8..84d8f840d849 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -182,6 +182,7 @@ import static com.android.server.wm.WindowStateProto.UNRESTRICTED_KEEP_CLEAR_ARE import static com.android.server.wm.WindowStateProto.VIEW_VISIBILITY; import static com.android.server.wm.WindowStateProto.WINDOW_CONTAINER; import static com.android.server.wm.WindowStateProto.WINDOW_FRAMES; +import static com.android.window.flags.Flags.enablePresentationForConnectedDisplays; import static com.android.window.flags.Flags.surfaceTrustedOverlay; import android.annotation.CallSuper; @@ -2317,6 +2318,12 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final int type = mAttrs.type; if (type == TYPE_PRESENTATION || type == TYPE_PRIVATE_PRESENTATION) { + // TODO(b/393945496): Make sure that there's one presentation at most per display. + dc.mIsPresenting = false; + if (enablePresentationForConnectedDisplays()) { + // A presentation hides all activities behind on the same display. + dc.ensureActivitiesVisible(/*starting=*/ null, /*notifyClients=*/ true); + } mWmService.mDisplayManagerInternal.onPresentation(dc.getDisplay().getDisplayId(), /*isShown=*/ false); } diff --git a/services/core/jni/com_android_server_display_DisplayControl.cpp b/services/core/jni/com_android_server_display_DisplayControl.cpp index 6613a250bd71..aeae13d83809 100644 --- a/services/core/jni/com_android_server_display_DisplayControl.cpp +++ b/services/core/jni/com_android_server_display_DisplayControl.cpp @@ -172,9 +172,9 @@ static jlongArray nativeGetPhysicalDisplayIds(JNIEnv* env, jclass clazz) { } static jobject nativeGetPhysicalDisplayToken(JNIEnv* env, jclass clazz, jlong physicalDisplayId) { - const auto id = DisplayId::fromValue<PhysicalDisplayId>(physicalDisplayId); - if (!id) return nullptr; - sp<IBinder> token = SurfaceComposerClient::getPhysicalDisplayToken(*id); + const PhysicalDisplayId id = PhysicalDisplayId::fromValue(physicalDisplayId); + sp<IBinder> token = SurfaceComposerClient::getPhysicalDisplayToken(id); + if (!token) return nullptr; return javaObjectForIBinder(env, token); } diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index b37bcc73829c..883cab07914f 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -571,9 +571,6 @@ private: PointerIcon loadPointerIcon(JNIEnv* env, ui::LogicalDisplayId displayId, PointerIconStyle type); bool isDisplayInteractive(ui::LogicalDisplayId displayId); - // TODO(b/362719483) remove when the real topology is available - void populateFakeDisplayTopology(const std::vector<DisplayViewport>& viewports); - static inline JNIEnv* jniEnv() { return AndroidRuntime::getJNIEnv(); } }; @@ -663,54 +660,16 @@ void NativeInputManager::setDisplayViewports(JNIEnv* env, jobjectArray viewportO mInputManager->getChoreographer().setDisplayViewports(viewports); mInputManager->getReader().requestRefreshConfiguration( InputReaderConfiguration::Change::DISPLAY_INFO); - - // TODO(b/362719483) remove when the real topology is available - populateFakeDisplayTopology(viewports); } -void NativeInputManager::populateFakeDisplayTopology( - const std::vector<DisplayViewport>& viewports) { +void NativeInputManager::setDisplayTopology(JNIEnv* env, jobject topologyGraph) { if (!com::android::input::flags::connected_displays_cursor()) { return; } - // create a fake topology assuming following order - // default-display (top-edge) -> next-display (right-edge) -> next-display (right-edge) ... - // This also adds a 100px offset on corresponding edge for better manual testing - // ┌────────┐ - // │ next ├─────────┐ - // ┌─└───────┐┤ next 2 │ ... - // │ default │└─────────┘ - // └─────────┘ - DisplayTopologyGraph displaytopology; - displaytopology.primaryDisplayId = ui::LogicalDisplayId::DEFAULT; - - // treat default display as base, in real topology it should be the primary-display - ui::LogicalDisplayId previousDisplay = ui::LogicalDisplayId::DEFAULT; - for (const auto& viewport : viewports) { - if (viewport.displayId == ui::LogicalDisplayId::DEFAULT) { - continue; - } - if (previousDisplay == ui::LogicalDisplayId::DEFAULT) { - displaytopology.graph[previousDisplay].push_back( - {viewport.displayId, DisplayTopologyPosition::TOP, 100}); - displaytopology.graph[viewport.displayId].push_back( - {previousDisplay, DisplayTopologyPosition::BOTTOM, -100}); - } else { - displaytopology.graph[previousDisplay].push_back( - {viewport.displayId, DisplayTopologyPosition::RIGHT, 100}); - displaytopology.graph[viewport.displayId].push_back( - {previousDisplay, DisplayTopologyPosition::LEFT, -100}); - } - previousDisplay = viewport.displayId; - } - - mInputManager->getChoreographer().setDisplayTopology(displaytopology); -} - -void NativeInputManager::setDisplayTopology(JNIEnv* env, jobject topologyGraph) { - android_hardware_display_DisplayTopologyGraph_toNative(env, topologyGraph); - // TODO(b/367661489): Use the topology + // TODO(b/383092013): Add topology validation + mInputManager->getChoreographer().setDisplayTopology( + android_hardware_display_DisplayTopologyGraph_toNative(env, topologyGraph)); } base::Result<std::unique_ptr<InputChannel>> NativeInputManager::createInputChannel( 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 69a88e982f96..1bb395441587 100644 --- a/services/permission/java/com/android/server/permission/access/AccessPolicy.kt +++ b/services/permission/java/com/android/server/permission/access/AccessPolicy.kt @@ -431,7 +431,7 @@ private constructor( companion object { private val LOG_TAG = AccessPolicy::class.java.simpleName - internal const val VERSION_LATEST = 15 + internal const val VERSION_LATEST = 16 private const val TAG_ACCESS = "access" private const val TAG_DEFAULT_PERMISSION_GRANT = "default-permission-grant" diff --git a/services/permission/java/com/android/server/permission/access/appop/AppIdAppOpUpgrade.kt b/services/permission/java/com/android/server/permission/access/appop/AppIdAppOpUpgrade.kt index 10c77645bf15..0f7175c4dfd9 100644 --- a/services/permission/java/com/android/server/permission/access/appop/AppIdAppOpUpgrade.kt +++ b/services/permission/java/com/android/server/permission/access/appop/AppIdAppOpUpgrade.kt @@ -61,5 +61,21 @@ class AppIdAppOpUpgrade(private val policy: AppIdAppOpPolicy) { } } } + if (version <= 15) { + with(policy) { + val appOpModes = getAppOpModes(packageState.appId, userId) + if ( + appOpModes != null && + AppOpsManager.OPSTR_ACCESS_RESTRICTED_SETTINGS !in appOpModes + ) { + setAppOpMode( + packageState.appId, + userId, + AppOpsManager.OPSTR_ACCESS_RESTRICTED_SETTINGS, + AppOpsManager.MODE_ALLOWED, + ) + } + } + } } } diff --git a/services/tests/InputMethodSystemServerTests/Android.bp b/services/tests/InputMethodSystemServerTests/Android.bp index da58aa1f6c66..ae9a34efc222 100644 --- a/services/tests/InputMethodSystemServerTests/Android.bp +++ b/services/tests/InputMethodSystemServerTests/Android.bp @@ -34,24 +34,24 @@ android_test { static_libs: [ "androidx.test.core", - "androidx.test.runner", - "androidx.test.espresso.core", "androidx.test.espresso.contrib", + "androidx.test.espresso.core", "androidx.test.ext.truth", + "androidx.test.runner", "frameworks-base-testutils", "mockito-target-extended-minus-junit4", "platform-test-annotations", "ravenwood-junit", - "services.core", "service-permission.stubs.system_server", + "services.core", "servicestests-core-utils", "servicestests-utils-mockito-extended", "truth", ], libs: [ - "android.test.mock.stubs.system", "android.test.base.stubs.system", + "android.test.mock.stubs.system", "android.test.runner.stubs.system", ], @@ -103,27 +103,29 @@ android_test { test_config: "src/com/android/inputmethodservice/AndroidTest.xml", static_libs: [ + "SimpleImeImsLib", + "SimpleImeTestingLib", "androidx.test.core", - "androidx.test.runner", - "androidx.test.espresso.core", "androidx.test.espresso.contrib", + "androidx.test.espresso.core", "androidx.test.ext.truth", + "androidx.test.runner", + "cts-input-lib", + "cts-wm-util", "frameworks-base-testutils", "mockito-target-extended-minus-junit4", "platform-test-annotations", "ravenwood-junit", - "services.core", "service-permission.stubs.system_server", + "services.core", "servicestests-core-utils", "servicestests-utils-mockito-extended", "truth", - "SimpleImeTestingLib", - "SimpleImeImsLib", ], libs: [ - "android.test.mock.stubs.system", "android.test.base.stubs.system", + "android.test.mock.stubs.system", "android.test.runner.stubs.system", ], diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java index c954b185914c..a103b0583eac 100644 --- a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java +++ b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java @@ -19,11 +19,13 @@ package com.android.inputmethodservice; import static android.view.WindowInsets.Type.captionBar; import static com.android.compatibility.common.util.SystemUtil.eventually; +import static com.android.cts.input.injectinputinprocess.InjectInputInProcessKt.clickOnViewCenter; +import static com.android.internal.inputmethod.InputMethodNavButtonFlags.IME_DRAWS_IME_NAV_BAR; +import static com.android.internal.inputmethod.InputMethodNavButtonFlags.SHOW_IME_SWITCHER_WHEN_IME_IS_SHOWN; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeTrue; @@ -37,6 +39,7 @@ import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.provider.Settings; +import android.server.wm.WindowManagerStateHelper; import android.util.Log; import android.view.WindowManagerGlobal; import android.view.WindowManagerPolicyConstants; @@ -49,6 +52,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.MediumTest; import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.uiautomator.By; +import androidx.test.uiautomator.BySelector; import androidx.test.uiautomator.UiDevice; import androidx.test.uiautomator.UiObject2; import androidx.test.uiautomator.Until; @@ -56,15 +60,14 @@ import androidx.test.uiautomator.Until; import com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper; import com.android.apps.inputmethod.simpleime.testing.TestActivity; import com.android.compatibility.common.util.SystemUtil; -import com.android.internal.inputmethod.InputMethodNavButtonFlags; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestName; import org.junit.runner.RunWith; -import java.io.IOException; import java.util.Objects; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -72,9 +75,9 @@ import java.util.concurrent.TimeUnit; @RunWith(AndroidJUnit4.class) @MediumTest public class InputMethodServiceTest { + private static final String TAG = "SimpleIMSTest"; private static final String INPUT_METHOD_SERVICE_NAME = ".SimpleInputMethodService"; - private static final String EDIT_TEXT_DESC = "Input box"; private static final String INPUT_METHOD_NAV_BACK_ID = "android:id/input_method_nav_back"; private static final String INPUT_METHOD_NAV_IME_SWITCHER_ID = @@ -85,62 +88,71 @@ public class InputMethodServiceTest { private static final String DISABLE_SHOW_IME_WITH_HARD_KEYBOARD_CMD = "settings put secure " + Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD + " 0"; + private final WindowManagerStateHelper mWmState = new WindowManagerStateHelper(); + private final DeviceFlagsValueProvider mFlagsValueProvider = new DeviceFlagsValueProvider(); + @Rule + public final CheckFlagsRule mCheckFlagsRule = new CheckFlagsRule(mFlagsValueProvider); + + @Rule + public final TestName mName = new TestName(); + private Instrumentation mInstrumentation; private UiDevice mUiDevice; private Context mContext; + private InputMethodManager mImm; private String mTargetPackageName; + private String mInputMethodId; private TestActivity mActivity; private InputMethodServiceWrapper mInputMethodService; - private String mInputMethodId; private boolean mShowImeWithHardKeyboardEnabled; - @Rule - public final CheckFlagsRule mCheckFlagsRule = new CheckFlagsRule(mFlagsValueProvider); - @Before public void setUp() throws Exception { mInstrumentation = InstrumentationRegistry.getInstrumentation(); mUiDevice = UiDevice.getInstance(mInstrumentation); mContext = mInstrumentation.getContext(); + mImm = mContext.getSystemService(InputMethodManager.class); mTargetPackageName = mInstrumentation.getTargetContext().getPackageName(); mInputMethodId = getInputMethodId(); prepareIme(); - prepareEditor(); + prepareActivity(); mInstrumentation.waitForIdleSync(); mUiDevice.freezeRotation(); mUiDevice.setOrientationNatural(); // Waits for input binding ready. eventually(() -> { - mInputMethodService = - InputMethodServiceWrapper.getInputMethodServiceWrapperForTesting(); - assertThat(mInputMethodService).isNotNull(); + mInputMethodService = InputMethodServiceWrapper.getInstance(); + assertWithMessage("IME is not null").that(mInputMethodService).isNotNull(); // The activity gets focus. - assertThat(mActivity.hasWindowFocus()).isTrue(); - assertThat(mInputMethodService.getCurrentInputEditorInfo()).isNotNull(); - assertThat(mInputMethodService.getCurrentInputEditorInfo().packageName) - .isEqualTo(mTargetPackageName); - - // The editor won't bring up keyboard by default. - assertThat(mInputMethodService.getCurrentInputStarted()).isTrue(); - assertThat(mInputMethodService.getCurrentInputViewStarted()).isFalse(); + assertWithMessage("Activity window has input focus") + .that(mActivity.hasWindowFocus()).isTrue(); + final var editorInfo = mInputMethodService.getCurrentInputEditorInfo(); + assertWithMessage("EditorInfo is not null").that(editorInfo).isNotNull(); + assertWithMessage("EditorInfo package matches target package") + .that(editorInfo.packageName).isEqualTo(mTargetPackageName); + + assertWithMessage("Input connection is started") + .that(mInputMethodService.getCurrentInputStarted()).isTrue(); + // The editor won't bring up the IME by default. + assertWithMessage("IME is not shown during setup") + .that(mInputMethodService.getCurrentInputViewStarted()).isFalse(); }); // Save the original value of show_ime_with_hard_keyboard from Settings. - mShowImeWithHardKeyboardEnabled = Settings.Secure.getInt( - mInputMethodService.getContentResolver(), - Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD, 0) != 0; + mShowImeWithHardKeyboardEnabled = + mInputMethodService.getShouldShowImeWithHardKeyboardForTesting(); } @After public void tearDown() throws Exception { mUiDevice.unfreezeRotation(); - executeShellCommand("ime disable " + mInputMethodId); // Change back the original value of show_ime_with_hard_keyboard in Settings. executeShellCommand(mShowImeWithHardKeyboardEnabled ? ENABLE_SHOW_IME_WITH_HARD_KEYBOARD_CMD : DISABLE_SHOW_IME_WITH_HARD_KEYBOARD_CMD); + executeShellCommand("ime disable " + mInputMethodId); } /** @@ -148,30 +160,65 @@ public class InputMethodServiceTest { * (i.e. tapping on an EditText, tapping the Home button). */ @Test - public void testShowHideKeyboard_byUserAction() throws Exception { + public void testShowHideKeyboard_byUserAction() { + waitUntilActivityReadyForInputInjection(mActivity); + setShowImeWithHardKeyboard(true /* enabled */); - // Performs click on editor box to bring up the soft keyboard. - Log.i(TAG, "Click on EditText."); + // Performs click on EditText to bring up the IME. + Log.i(TAG, "Click on EditText"); verifyInputViewStatus( - () -> clickOnEditorText(), + () -> clickOnViewCenter(mActivity.getEditText()), true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); - // Press home key to hide soft keyboard. + // Press home key to hide IME. Log.i(TAG, "Press home"); if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) { - assertThat(mUiDevice.pressHome()).isTrue(); + assertWithMessage("Home key press was handled").that(mUiDevice.pressHome()).isTrue(); // The IME visibility is only sent at the end of the animation. Therefore, we have to // wait until the visibility was sent to the server and the IME window hidden. - eventually(() -> assertThat(mInputMethodService.isInputViewShown()).isFalse()); + eventually(() -> assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse()); } else { verifyInputViewStatus( - () -> assertThat(mUiDevice.pressHome()).isTrue(), + () -> assertWithMessage("Home key press was handled") + .that(mUiDevice.pressHome()).isTrue(), true /* expected */, false /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isFalse(); + assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse(); + } + } + + /** + * This checks that the IME can be shown and hidden using the InputMethodManager APIs. + */ + @Test + public void testShowHideKeyboard_byInputMethodManager() { + setShowImeWithHardKeyboard(true /* enabled */); + + // Triggers to show IME via public API. + verifyInputViewStatusOnMainSync( + () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); + + // Triggers to hide IME via public API. + verifyInputViewStatusOnMainSync( + () -> assertThat(mActivity.hideImeWithInputMethodManager(0 /* flags */)).isTrue(), + true /* expected */, + false /* inputViewStarted */); + if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) { + // The IME visibility is only sent at the end of the animation. Therefore, we have to + // wait until the visibility was sent to the server and the IME window hidden. + eventually(() -> assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse()); + } else { + assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse(); } } @@ -179,39 +226,41 @@ public class InputMethodServiceTest { * This checks that the IME can be shown and hidden using the WindowInsetsController APIs. */ @Test - public void testShowHideKeyboard_byApi() throws Exception { + public void testShowHideKeyboard_byInsetsController() { setShowImeWithHardKeyboard(true /* enabled */); // Triggers to show IME via public API. verifyInputViewStatusOnMainSync( - () -> assertThat(mActivity.showImeWithWindowInsetsController()).isTrue(), + () -> mActivity.showImeWithWindowInsetsController(), true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); // Triggers to hide IME via public API. verifyInputViewStatusOnMainSync( - () -> assertThat(mActivity.hideImeWithWindowInsetsController()).isTrue(), + () -> mActivity.hideImeWithWindowInsetsController(), true /* expected */, false /* inputViewStarted */); if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) { // The IME visibility is only sent at the end of the animation. Therefore, we have to // wait until the visibility was sent to the server and the IME window hidden. - eventually(() -> assertThat(mInputMethodService.isInputViewShown()).isFalse()); + eventually(() -> assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse()); } else { - assertThat(mInputMethodService.isInputViewShown()).isFalse(); + assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse(); } } /** * This checks the result of calling IMS#requestShowSelf and IMS#requestHideSelf. * - * With the refactor in b/298172246, all calls to IMMS#{show,hide}MySoftInputLocked + * <p>With the refactor in b/298172246, all calls to IMMS#{show,hide}MySoftInputLocked * will be just apply the requested visibility (by using the callback). Therefore, we will * lose flags like HIDE_IMPLICIT_ONLY. */ @Test - public void testShowHideSelf() throws Exception { + public void testShowHideSelf() { setShowImeWithHardKeyboard(true /* enabled */); // IME request to show itself without any flags, expect shown. @@ -220,7 +269,7 @@ public class InputMethodServiceTest { () -> mInputMethodService.requestShowSelf(0 /* flags */), true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); if (!mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) { // IME request to hide itself with flag HIDE_IMPLICIT_ONLY, expect not hide (shown). @@ -230,7 +279,8 @@ public class InputMethodServiceTest { InputMethodManager.HIDE_IMPLICIT_ONLY), false /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is still shown after HIDE_IMPLICIT_ONLY") + .that(mInputMethodService.isInputViewShown()).isTrue(); } // IME request to hide itself without any flags, expect hidden. @@ -242,9 +292,11 @@ public class InputMethodServiceTest { if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) { // The IME visibility is only sent at the end of the animation. Therefore, we have to // wait until the visibility was sent to the server and the IME window hidden. - eventually(() -> assertThat(mInputMethodService.isInputViewShown()).isFalse()); + eventually(() -> assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse()); } else { - assertThat(mInputMethodService.isInputViewShown()).isFalse(); + assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse(); } if (!mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) { @@ -254,7 +306,8 @@ public class InputMethodServiceTest { () -> mInputMethodService.requestShowSelf(InputMethodManager.SHOW_IMPLICIT), true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is shown with SHOW_IMPLICIT") + .that(mInputMethodService.isInputViewShown()).isTrue(); // IME request to hide itself with flag HIDE_IMPLICIT_ONLY, expect hidden. Log.i(TAG, "Call IMS#requestHideSelf(InputMethodManager.HIDE_IMPLICIT_ONLY)"); @@ -263,7 +316,8 @@ public class InputMethodServiceTest { InputMethodManager.HIDE_IMPLICIT_ONLY), true /* expected */, false /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isFalse(); + assertWithMessage("IME is not shown after HIDE_IMPLICIT_ONLY") + .that(mInputMethodService.isInputViewShown()).isFalse(); } } @@ -272,53 +326,67 @@ public class InputMethodServiceTest { * when show_ime_with_hard_keyboard is enabled. */ @Test - public void testOnEvaluateInputViewShown_showImeWithHardKeyboard() throws Exception { + public void testOnEvaluateInputViewShown_showImeWithHardKeyboard() { setShowImeWithHardKeyboard(true /* enabled */); - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_NO; - eventually(() -> assertThat(mInputMethodService.onEvaluateInputViewShown()).isTrue()); - - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_NOKEYS; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_NO; - eventually(() -> assertThat(mInputMethodService.onEvaluateInputViewShown()).isTrue()); - - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; - eventually(() -> assertThat(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; + eventually(() -> + assertWithMessage("InputView should show with visible hardware keyboard") + .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + + config.keyboard = Configuration.KEYBOARD_NOKEYS; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; + eventually(() -> + assertWithMessage("InputView should show without hardware keyboard") + .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; + eventually(() -> + assertWithMessage("InputView should show with hidden hardware keyboard") + .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** - * This checks the return value of IMSonEvaluateInputViewShown, + * This checks the return value of IMS#onEvaluateInputViewShown, * when show_ime_with_hard_keyboard is disabled. */ @Test - public void testOnEvaluateInputViewShown_disableShowImeWithHardKeyboard() throws Exception { + public void testOnEvaluateInputViewShown_disableShowImeWithHardKeyboard() { setShowImeWithHardKeyboard(false /* enabled */); - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_NO; - eventually(() -> assertThat(mInputMethodService.onEvaluateInputViewShown()).isFalse()); - - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_NOKEYS; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_NO; - eventually(() -> assertThat(mInputMethodService.onEvaluateInputViewShown()).isTrue()); - - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; - eventually(() -> assertThat(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; + eventually(() -> + assertWithMessage("InputView should not show with visible hardware keyboard") + .that(mInputMethodService.onEvaluateInputViewShown()).isFalse()); + + config.keyboard = Configuration.KEYBOARD_NOKEYS; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; + eventually(() -> + assertWithMessage("InputView should show without hardware keyboard") + .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; + eventually(() -> + assertWithMessage("InputView should show with hidden hardware keyboard") + .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** @@ -326,51 +394,60 @@ public class InputMethodServiceTest { * when IMS#onEvaluateInputViewShown returns false, results in the IME not being shown. */ @Test - public void testShowSoftInput_disableShowImeWithHardKeyboard() throws Exception { + public void testShowSoftInput_disableShowImeWithHardKeyboard() { setShowImeWithHardKeyboard(false /* enabled */); - // Simulate connecting a hard keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_NO; - - // When InputMethodService#onEvaluateInputViewShown() returns false, the Ime should not be - // shown no matter what the show flag is. - verifyInputViewStatusOnMainSync(() -> assertThat( - mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(), - false /* expected */, - false /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isFalse(); + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + // Simulate connecting a hardware keyboard. + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; + + // When InputMethodService#onEvaluateInputViewShown() returns false, the IME should + // not be shown no matter what the show flag is. + verifyInputViewStatusOnMainSync(() -> assertThat( + mActivity.showImeWithInputMethodManager( + InputMethodManager.SHOW_IMPLICIT)).isTrue(), + false /* expected */, + false /* inputViewStarted */); + assertWithMessage("IME is not shown after SHOW_IMPLICIT") + .that(mInputMethodService.isInputViewShown()).isFalse(); - verifyInputViewStatusOnMainSync( - () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), - false /* expected */, - false /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isFalse(); + verifyInputViewStatusOnMainSync( + () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)) + .isTrue(), + false /* expected */, + false /* inputViewStarted */); + assertWithMessage("IME is not shown after SHOW_EXPLICIT") + .that(mInputMethodService.isInputViewShown()).isFalse(); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** * This checks that an explicit show request results in the IME being shown. */ @Test - public void testShowSoftInputExplicitly() throws Exception { + public void testShowSoftInputExplicitly() { setShowImeWithHardKeyboard(true /* enabled */); // When InputMethodService#onEvaluateInputViewShown() returns true and flag is EXPLICIT, the - // Ime should be shown. + // IME should be shown. verifyInputViewStatusOnMainSync( () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); } /** * This checks that an implicit show request results in the IME being shown. */ @Test - public void testShowSoftInputImplicitly() throws Exception { + public void testShowSoftInputImplicitly() { setShowImeWithHardKeyboard(true /* enabled */); // When InputMethodService#onEvaluateInputViewShown() returns true and flag is IMPLICIT, @@ -379,7 +456,7 @@ public class InputMethodServiceTest { mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(), true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); } /** @@ -387,194 +464,216 @@ public class InputMethodServiceTest { * and it should be shown in fullscreen mode, results in the IME being shown. */ @Test - public void testShowSoftInputExplicitly_fullScreenMode() throws Exception { + public void testShowSoftInputExplicitly_fullScreenMode() { setShowImeWithHardKeyboard(true /* enabled */); // Set orientation landscape to enable fullscreen mode. setOrientation(2); - eventually(() -> assertThat(mUiDevice.isNaturalOrientation()).isFalse()); + eventually(() -> assertWithMessage("No longer in natural orientation") + .that(mUiDevice.isNaturalOrientation()).isFalse()); // Wait for the TestActivity to be recreated. - eventually(() -> - assertThat(TestActivity.getLastCreatedInstance()).isNotEqualTo(mActivity)); + eventually(() -> assertWithMessage("Activity was re-created after rotation") + .that(TestActivity.getLastCreatedInstance()).isNotEqualTo(mActivity)); // Get the new TestActivity. mActivity = TestActivity.getLastCreatedInstance(); - assertThat(mActivity).isNotNull(); - InputMethodManager imm = mContext.getSystemService(InputMethodManager.class); + assertWithMessage("Re-created activity is not null").that(mActivity).isNotNull(); // Wait for the new EditText to be served by InputMethodManager. - eventually(() -> assertThat( - imm.hasActiveInputConnection(mActivity.getEditText())).isTrue()); + eventually(() -> assertWithMessage("Has an input connection to the re-created Activity") + .that(mImm.hasActiveInputConnection(mActivity.getEditText())).isTrue()); verifyInputViewStatusOnMainSync(() -> assertThat( mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); } /** * This checks that an implicit show request when the IME is not previously shown, * and it should be shown in fullscreen mode, results in the IME not being shown. * - * With the refactor in b/298172246, all calls from InputMethodManager#{show,hide}SoftInput + * <p>With the refactor in b/298172246, all calls from InputMethodManager#{show,hide}SoftInput * will be redirected to InsetsController#{show,hide}. Therefore, we will lose flags like * SHOW_IMPLICIT. */ @Test @RequiresFlagsDisabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER) - public void testShowSoftInputImplicitly_fullScreenMode() throws Exception { + public void testShowSoftInputImplicitly_fullScreenMode() { setShowImeWithHardKeyboard(true /* enabled */); // Set orientation landscape to enable fullscreen mode. setOrientation(2); - eventually(() -> assertThat(mUiDevice.isNaturalOrientation()).isFalse()); + eventually(() -> assertWithMessage("No longer in natural orientation") + .that(mUiDevice.isNaturalOrientation()).isFalse()); // Wait for the TestActivity to be recreated. - eventually(() -> - assertThat(TestActivity.getLastCreatedInstance()).isNotEqualTo(mActivity)); + eventually(() -> assertWithMessage("Activity was re-created after rotation") + .that(TestActivity.getLastCreatedInstance()).isNotEqualTo(mActivity)); // Get the new TestActivity. mActivity = TestActivity.getLastCreatedInstance(); - assertThat(mActivity).isNotNull(); - InputMethodManager imm = mContext.getSystemService(InputMethodManager.class); + assertWithMessage("Re-created activity is not null").that(mActivity).isNotNull(); // Wait for the new EditText to be served by InputMethodManager. - eventually(() -> assertThat( - imm.hasActiveInputConnection(mActivity.getEditText())).isTrue()); + eventually(() -> assertWithMessage("Has an input connection to the re-created Activity") + .that(mImm.hasActiveInputConnection(mActivity.getEditText())).isTrue()); verifyInputViewStatusOnMainSync(() -> assertThat( mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(), false /* expected */, false /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isFalse(); + assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse(); } /** - * This checks that an explicit show request when a hard keyboard is connected, + * This checks that an explicit show request when a hardware keyboard is connected, * results in the IME being shown. */ @Test - public void testShowSoftInputExplicitly_withHardKeyboard() throws Exception { + public void testShowSoftInputExplicitly_withHardKeyboard() { setShowImeWithHardKeyboard(false /* enabled */); - // Simulate connecting a hard keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + // Simulate connecting a hardware keyboard. + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; - verifyInputViewStatusOnMainSync(() -> assertThat( - mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), - true /* expected */, - true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + verifyInputViewStatusOnMainSync(() -> assertThat( + mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** - * This checks that an implicit show request when a hard keyboard is connected, + * This checks that an implicit show request when a hardware keyboard is connected, * results in the IME not being shown. * - * With the refactor in b/298172246, all calls from InputMethodManager#{show,hide}SoftInput + * <p>With the refactor in b/298172246, all calls from InputMethodManager#{show,hide}SoftInput * will be redirected to InsetsController#{show,hide}. Therefore, we will lose flags like * SHOW_IMPLICIT. */ @Test @RequiresFlagsDisabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER) - public void testShowSoftInputImplicitly_withHardKeyboard() throws Exception { + public void testShowSoftInputImplicitly_withHardKeyboard() { setShowImeWithHardKeyboard(false /* enabled */); - // Simulate connecting a hard keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + // Simulate connecting a hardware keyboard. + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; - verifyInputViewStatusOnMainSync(() -> assertThat( - mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(), - false /* expected */, - false /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isFalse(); + verifyInputViewStatusOnMainSync(() ->assertThat( + mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)) + .isTrue(), + false /* expected */, + false /* inputViewStarted */); + assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse(); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** - * This checks that an explicit show request followed by connecting a hard keyboard + * This checks that an explicit show request followed by connecting a hardware keyboard * and a configuration change, still results in the IME being shown. */ @Test - public void testShowSoftInputExplicitly_thenConfigurationChanged() throws Exception { + public void testShowSoftInputExplicitly_thenConfigurationChanged() { setShowImeWithHardKeyboard(false /* enabled */); - // Start with no hard keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_NOKEYS; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + // Start with no hardware keyboard. + config.keyboard = Configuration.KEYBOARD_NOKEYS; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; - verifyInputViewStatusOnMainSync( - () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), - true /* expected */, - true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + verifyInputViewStatusOnMainSync( + () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)) + .isTrue(), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); - // Simulate connecting a hard keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; + // Simulate connecting a hardware keyboard. + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; - // Simulate a fake configuration change to avoid triggering the recreation of TestActivity. - mInputMethodService.getResources().getConfiguration().orientation = - Configuration.ORIENTATION_LANDSCAPE; + // Simulate a fake configuration change to avoid the recreation of TestActivity. + config.orientation = Configuration.ORIENTATION_LANDSCAPE; - verifyInputViewStatusOnMainSync(() -> mInputMethodService.onConfigurationChanged( - mInputMethodService.getResources().getConfiguration()), - true /* expected */, - true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + verifyInputViewStatusOnMainSync( + () -> mInputMethodService.onConfigurationChanged(config), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is still shown after a configuration change") + .that(mInputMethodService.isInputViewShown()).isTrue(); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** - * This checks that an implicit show request followed by connecting a hard keyboard + * This checks that an implicit show request followed by connecting a hardware keyboard * and a configuration change, does not trigger IMS#onFinishInputView, * but results in the IME being hidden. * - * With the refactor in b/298172246, all calls from InputMethodManager#{show,hide}SoftInput + * <p>With the refactor in b/298172246, all calls from InputMethodManager#{show,hide}SoftInput * will be redirected to InsetsController#{show,hide}. Therefore, we will lose flags like * SHOW_IMPLICIT. */ @Test @RequiresFlagsDisabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER) - public void testShowSoftInputImplicitly_thenConfigurationChanged() throws Exception { + public void testShowSoftInputImplicitly_thenConfigurationChanged() { setShowImeWithHardKeyboard(false /* enabled */); - // Start with no hard keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_NOKEYS; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + // Start with no hardware keyboard. + config.keyboard = Configuration.KEYBOARD_NOKEYS; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; - verifyInputViewStatusOnMainSync(() -> assertThat( - mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(), - true /* expected */, - true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); - - // Simulate connecting a hard keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.HARDKEYBOARDHIDDEN_YES; - - // Simulate a fake configuration change to avoid triggering the recreation of TestActivity. - mInputMethodService.getResources().getConfiguration().orientation = - Configuration.ORIENTATION_LANDSCAPE; - - // Normally, IMS#onFinishInputView will be called when finishing the input view by the user. - // But if IMS#hideWindow is called when receiving a new configuration change, we don't - // expect that it's user-driven to finish the lifecycle of input view with - // IMS#onFinishInputView, because the input view will be re-initialized according to the - // last #mShowInputRequested state. So in this case we treat the input view as still alive. - verifyInputViewStatusOnMainSync(() -> mInputMethodService.onConfigurationChanged( - mInputMethodService.getResources().getConfiguration()), - true /* expected */, - true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isFalse(); + verifyInputViewStatusOnMainSync(() -> assertThat( + mActivity.showImeWithInputMethodManager( + InputMethodManager.SHOW_IMPLICIT)).isTrue(), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); + + // Simulate connecting a hardware keyboard. + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; + + // Simulate a fake configuration change to avoid the recreation of TestActivity. + config.orientation = Configuration.ORIENTATION_LANDSCAPE; + + // Normally, IMS#onFinishInputView will be called when finishing the input view by + // the user. But if IMS#hideWindow is called when receiving a new configuration change, + // we don't expect that it's user-driven to finish the lifecycle of input view with + // IMS#onFinishInputView, because the input view will be re-initialized according + // to the last #mShowInputRequested state. So in this case we treat the input view as + // still alive. + verifyInputViewStatusOnMainSync( + () -> mInputMethodService.onConfigurationChanged(config), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is not shown after a configuration change") + .that(mInputMethodService.isInputViewShown()).isFalse(); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** @@ -583,38 +682,45 @@ public class InputMethodServiceTest { * (i.e. the implicit show request is treated as explicit). */ @Test - public void testShowSoftInputExplicitly_thenShowSoftInputImplicitly_withHardKeyboard() - throws Exception { + public void testShowSoftInputExplicitly_thenShowSoftInputImplicitly_withHardKeyboard() { setShowImeWithHardKeyboard(false /* enabled */); - // Simulate connecting a hard keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + // Simulate connecting a hardware keyboard. + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; - // Explicit show request. - verifyInputViewStatusOnMainSync(() -> assertThat( - mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), - true /* expected */, - true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + // Explicit show request. + verifyInputViewStatusOnMainSync(() -> assertThat( + mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); - // Implicit show request. - verifyInputViewStatusOnMainSync(() -> assertThat( - mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(), - false /* expected */, - true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + // Implicit show request. + verifyInputViewStatusOnMainSync(() -> assertThat( + mActivity.showImeWithInputMethodManager( + InputMethodManager.SHOW_IMPLICIT)).isTrue(), + false /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is still shown") + .that(mInputMethodService.isInputViewShown()).isTrue(); - // Simulate a fake configuration change to avoid triggering the recreation of TestActivity. - // This should now consider the implicit show request, but keep the state from the - // explicit show request, and thus not hide the keyboard. - verifyInputViewStatusOnMainSync(() -> mInputMethodService.onConfigurationChanged( - mInputMethodService.getResources().getConfiguration()), - true /* expected */, - true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + // Simulate a fake configuration change to avoid the recreation of TestActivity. + // This should now consider the implicit show request, but keep the state from the + // explicit show request, and thus not hide the IME. + verifyInputViewStatusOnMainSync( + () -> mInputMethodService.onConfigurationChanged(config), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is still shown after a configuration change") + .that(mInputMethodService.isInputViewShown()).isTrue(); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** @@ -622,40 +728,42 @@ public class InputMethodServiceTest { * and then a hide not always request, still results in the IME being shown * (i.e. the explicit show request retains the forced state). * - * With the refactor in b/298172246, all calls from InputMethodManager#{show,hide}SoftInput + * <p>With the refactor in b/298172246, all calls from InputMethodManager#{show,hide}SoftInput * will be redirected to InsetsController#{show,hide}. Therefore, we will lose flags like * HIDE_NOT_ALWAYS. */ @Test @RequiresFlagsDisabled(Flags.FLAG_REFACTOR_INSETS_CONTROLLER) - public void testShowSoftInputForced_testShowSoftInputExplicitly_thenHideSoftInputNotAlways() - throws Exception { + public void testShowSoftInputForced_testShowSoftInputExplicitly_thenHideSoftInputNotAlways() { setShowImeWithHardKeyboard(true /* enabled */); verifyInputViewStatusOnMainSync(() -> assertThat( mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_FORCED)).isTrue(), true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); verifyInputViewStatusOnMainSync(() -> assertThat( mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), false /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is still shown") + .that(mInputMethodService.isInputViewShown()).isTrue(); - verifyInputViewStatusOnMainSync(() -> - mActivity.hideImeWithInputMethodManager(InputMethodManager.HIDE_NOT_ALWAYS), + verifyInputViewStatusOnMainSync(() -> assertThat( + mActivity.hideImeWithInputMethodManager(InputMethodManager.HIDE_NOT_ALWAYS)) + .isTrue(), false /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is still shown after HIDE_NOT_ALWAYS") + .that(mInputMethodService.isInputViewShown()).isTrue(); } /** * This checks that the IME fullscreen mode state is updated after changing orientation. */ @Test - public void testFullScreenMode() throws Exception { + public void testFullScreenMode() { setShowImeWithHardKeyboard(true /* enabled */); Log.i(TAG, "Set orientation natural"); @@ -679,13 +787,13 @@ public class InputMethodServiceTest { * then the IME caption bar is also not created. */ @Test - public void testNoNavigationBar_thenImeNoCaptionBar() throws Exception { - boolean hasNavigationBar = WindowManagerGlobal.getWindowManagerService() - .hasNavigationBar(mInputMethodService.getDisplayId()); - assumeFalse("Must not have a navigation bar", hasNavigationBar); + public void testNoNavigationBar_thenImeNoCaptionBar() { + assumeFalse("Must not have a navigation bar", hasNavigationBar()); - assertEquals(Insets.NONE, mInputMethodService.getWindow().getWindow().getDecorView() - .getRootWindowInsets().getInsetsIgnoringVisibility(captionBar())); + assertWithMessage("No IME caption bar insets") + .that(mInputMethodService.getWindow().getWindow().getDecorView() + .getRootWindowInsets().getInsetsIgnoringVisibility(captionBar())) + .isEqualTo(Insets.NONE); } /** @@ -693,112 +801,106 @@ public class InputMethodServiceTest { * when the IME does draw the IME navigation bar. */ @Test - public void testShowHideImeNavigationBar_doesDrawImeNavBar() throws Exception { - boolean hasNavigationBar = WindowManagerGlobal.getWindowManagerService() - .hasNavigationBar(mInputMethodService.getDisplayId()); - assumeTrue("Must have a navigation bar", hasNavigationBar); + public void testShowHideImeNavigationBar_doesDrawImeNavBar() { + assumeTrue("Must have a navigation bar", hasNavigationBar()); setShowImeWithHardKeyboard(true /* enabled */); // Show IME verifyInputViewStatusOnMainSync( () -> { - mInputMethodService.getInputMethodInternal().onNavButtonFlagsChanged( - InputMethodNavButtonFlags.IME_DRAWS_IME_NAV_BAR - | InputMethodNavButtonFlags.SHOW_IME_SWITCHER_WHEN_IME_IS_SHOWN - ); - assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(); + setDrawsImeNavBarAndSwitcherButton(true /* enabled */); + mActivity.showImeWithWindowInsetsController(); }, true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); - assertThat(mInputMethodService.isImeNavigationBarShownForTesting()).isTrue(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME navigation bar is initially shown") + .that(mInputMethodService.isImeNavigationBarShownForTesting()).isTrue(); // Try to hide IME nav bar - mInstrumentation.runOnMainSync(() -> mInputMethodService.getWindow().getWindow() - .getInsetsController().hide(captionBar())); + mInstrumentation.runOnMainSync(() -> setShowImeNavigationBar(false /* show */)); mInstrumentation.waitForIdleSync(); - assertThat(mInputMethodService.isImeNavigationBarShownForTesting()).isFalse(); + assertWithMessage("IME navigation bar is not shown after hide request") + .that(mInputMethodService.isImeNavigationBarShownForTesting()).isFalse(); // Try to show IME nav bar - mInstrumentation.runOnMainSync(() -> mInputMethodService.getWindow().getWindow() - .getInsetsController().show(captionBar())); + mInstrumentation.runOnMainSync(() -> setShowImeNavigationBar(true /* show */)); mInstrumentation.waitForIdleSync(); - assertThat(mInputMethodService.isImeNavigationBarShownForTesting()).isTrue(); + assertWithMessage("IME navigation bar is shown after show request") + .that(mInputMethodService.isImeNavigationBarShownForTesting()).isTrue(); } + /** * This checks that trying to show and hide the navigation bar has no effect * when the IME does not draw the IME navigation bar. * - * Note: The IME navigation bar is *never* visible in 3 button navigation mode. + * <p>Note: The IME navigation bar is *never* visible in 3 button navigation mode. */ @Test - public void testShowHideImeNavigationBar_doesNotDrawImeNavBar() throws Exception { - boolean hasNavigationBar = WindowManagerGlobal.getWindowManagerService() - .hasNavigationBar(mInputMethodService.getDisplayId()); - assumeTrue("Must have a navigation bar", hasNavigationBar); + public void testShowHideImeNavigationBar_doesNotDrawImeNavBar() { + assumeTrue("Must have a navigation bar", hasNavigationBar()); setShowImeWithHardKeyboard(true /* enabled */); // Show IME - verifyInputViewStatusOnMainSync(() -> { - mInputMethodService.getInputMethodInternal().onNavButtonFlagsChanged( - 0 /* navButtonFlags */); - assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(); - }, + verifyInputViewStatusOnMainSync( + () -> { + setDrawsImeNavBarAndSwitcherButton(false /* enabled */); + mActivity.showImeWithWindowInsetsController(); + }, true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); - assertThat(mInputMethodService.isImeNavigationBarShownForTesting()).isFalse(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME navigation bar is initially not shown") + .that(mInputMethodService.isImeNavigationBarShownForTesting()).isFalse(); // Try to hide IME nav bar - mInstrumentation.runOnMainSync(() -> mInputMethodService.getWindow().getWindow() - .getInsetsController().hide(captionBar())); + mInstrumentation.runOnMainSync(() -> setShowImeNavigationBar(false /* show */)); mInstrumentation.waitForIdleSync(); - assertThat(mInputMethodService.isImeNavigationBarShownForTesting()).isFalse(); + assertWithMessage("IME navigation bar is not shown after hide request") + .that(mInputMethodService.isImeNavigationBarShownForTesting()).isFalse(); // Try to show IME nav bar - mInstrumentation.runOnMainSync(() -> mInputMethodService.getWindow().getWindow() - .getInsetsController().show(captionBar())); + mInstrumentation.runOnMainSync(() -> setShowImeNavigationBar(true /* show */)); mInstrumentation.waitForIdleSync(); - assertThat(mInputMethodService.isImeNavigationBarShownForTesting()).isFalse(); + assertWithMessage("IME navigation bar is not shown after show request") + .that(mInputMethodService.isImeNavigationBarShownForTesting()).isFalse(); } /** * Verifies that clicking on the IME navigation bar back button hides the IME. */ @Test - public void testBackButtonClick() throws Exception { - boolean hasNavigationBar = WindowManagerGlobal.getWindowManagerService() - .hasNavigationBar(mInputMethodService.getDisplayId()); - assumeTrue("Must have a navigation bar", hasNavigationBar); + public void testBackButtonClick() { + assumeTrue("Must have a navigation bar", hasNavigationBar()); assumeTrue("Must be in gesture navigation mode", isGestureNavEnabled()); + waitUntilActivityReadyForInputInjection(mActivity); + setShowImeWithHardKeyboard(true /* enabled */); verifyInputViewStatusOnMainSync( () -> { - // Ensure the IME navigation bar and the IME switch button are drawn. - mInputMethodService.getInputMethodInternal().onNavButtonFlagsChanged( - InputMethodNavButtonFlags.IME_DRAWS_IME_NAV_BAR - | InputMethodNavButtonFlags.SHOW_IME_SWITCHER_WHEN_IME_IS_SHOWN - ); - assertThat(mActivity.showImeWithWindowInsetsController()).isTrue(); + setDrawsImeNavBarAndSwitcherButton(true /* enabled */); + mActivity.showImeWithWindowInsetsController(); }, true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); - final var backButtonUiObject = getUiObjectById(INPUT_METHOD_NAV_BACK_ID); + final var backButtonUiObject = getUiObject(By.res(INPUT_METHOD_NAV_BACK_ID)); backButtonUiObject.click(); mInstrumentation.waitForIdleSync(); if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) { // The IME visibility is only sent at the end of the animation. Therefore, we have to // wait until the visibility was sent to the server and the IME window hidden. - eventually(() -> assertThat(mInputMethodService.isInputViewShown()).isFalse()); + eventually(() -> assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse()); } else { - assertThat(mInputMethodService.isInputViewShown()).isFalse(); + assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse(); } } @@ -806,37 +908,35 @@ public class InputMethodServiceTest { * Verifies that long clicking on the IME navigation bar back button hides the IME. */ @Test - public void testBackButtonLongClick() throws Exception { - boolean hasNavigationBar = WindowManagerGlobal.getWindowManagerService() - .hasNavigationBar(mInputMethodService.getDisplayId()); - assumeTrue("Must have a navigation bar", hasNavigationBar); + public void testBackButtonLongClick() { + assumeTrue("Must have a navigation bar", hasNavigationBar()); assumeTrue("Must be in gesture navigation mode", isGestureNavEnabled()); + waitUntilActivityReadyForInputInjection(mActivity); + setShowImeWithHardKeyboard(true /* enabled */); verifyInputViewStatusOnMainSync( () -> { - // Ensure the IME navigation bar and the IME switch button are drawn. - mInputMethodService.getInputMethodInternal().onNavButtonFlagsChanged( - InputMethodNavButtonFlags.IME_DRAWS_IME_NAV_BAR - | InputMethodNavButtonFlags.SHOW_IME_SWITCHER_WHEN_IME_IS_SHOWN - ); - assertThat(mActivity.showImeWithWindowInsetsController()).isTrue(); + setDrawsImeNavBarAndSwitcherButton(true /* enabled */); + mActivity.showImeWithWindowInsetsController(); }, true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); - final var backButtonUiObject = getUiObjectById(INPUT_METHOD_NAV_BACK_ID); + final var backButtonUiObject = getUiObject(By.res(INPUT_METHOD_NAV_BACK_ID)); backButtonUiObject.longClick(); mInstrumentation.waitForIdleSync(); if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) { // The IME visibility is only sent at the end of the animation. Therefore, we have to // wait until the visibility was sent to the server and the IME window hidden. - eventually(() -> assertThat(mInputMethodService.isInputViewShown()).isFalse()); + eventually(() -> assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse()); } else { - assertThat(mInputMethodService.isInputViewShown()).isFalse(); + assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse(); } } @@ -845,43 +945,39 @@ public class InputMethodServiceTest { * or switches the input method. */ @Test - public void testImeSwitchButtonClick() throws Exception { - boolean hasNavigationBar = WindowManagerGlobal.getWindowManagerService() - .hasNavigationBar(mInputMethodService.getDisplayId()); - assumeTrue("Must have a navigation bar", hasNavigationBar); + public void testImeSwitchButtonClick() { + assumeTrue("Must have a navigation bar", hasNavigationBar()); assumeTrue("Must be in gesture navigation mode", isGestureNavEnabled()); + waitUntilActivityReadyForInputInjection(mActivity); + setShowImeWithHardKeyboard(true /* enabled */); verifyInputViewStatusOnMainSync( () -> { - // Ensure the IME navigation bar and the IME switch button are drawn. - mInputMethodService.getInputMethodInternal().onNavButtonFlagsChanged( - InputMethodNavButtonFlags.IME_DRAWS_IME_NAV_BAR - | InputMethodNavButtonFlags.SHOW_IME_SWITCHER_WHEN_IME_IS_SHOWN - ); - assertThat(mActivity.showImeWithWindowInsetsController()).isTrue(); + setDrawsImeNavBarAndSwitcherButton(true /* enabled */); + mActivity.showImeWithWindowInsetsController(); }, true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); - final var imm = mContext.getSystemService(InputMethodManager.class); - final var initialInfo = imm.getCurrentInputMethodInfo(); + final var initialInfo = mImm.getCurrentInputMethodInfo(); - final var imeSwitchButtonUiObject = getUiObjectById(INPUT_METHOD_NAV_IME_SWITCHER_ID); + final var imeSwitchButtonUiObject = getUiObject(By.res(INPUT_METHOD_NAV_IME_SWITCHER_ID)); imeSwitchButtonUiObject.click(); mInstrumentation.waitForIdleSync(); - final var newInfo = imm.getCurrentInputMethodInfo(); + final var newInfo = mImm.getCurrentInputMethodInfo(); assertWithMessage("Input Method Switcher Menu is shown or input method was switched") - .that(isInputMethodPickerShown(imm) || !Objects.equals(initialInfo, newInfo)) + .that(isInputMethodPickerShown(mImm) || !Objects.equals(initialInfo, newInfo)) .isTrue(); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is still shown after IME Switcher button was clicked") + .that(mInputMethodService.isInputViewShown()).isTrue(); - // Hide the Picker menu before finishing. + // Hide the IME Switcher Menu before finishing. mUiDevice.pressBack(); } @@ -889,58 +985,44 @@ public class InputMethodServiceTest { * Verifies that long clicking on the IME switch button shows the Input Method Switcher Menu. */ @Test - public void testImeSwitchButtonLongClick() throws Exception { - boolean hasNavigationBar = WindowManagerGlobal.getWindowManagerService() - .hasNavigationBar(mInputMethodService.getDisplayId()); - assumeTrue("Must have a navigation bar", hasNavigationBar); + public void testImeSwitchButtonLongClick() { + assumeTrue("Must have a navigation bar", hasNavigationBar()); assumeTrue("Must be in gesture navigation mode", isGestureNavEnabled()); + waitUntilActivityReadyForInputInjection(mActivity); + setShowImeWithHardKeyboard(true /* enabled */); verifyInputViewStatusOnMainSync( () -> { - // Ensure the IME navigation bar and the IME switch button are drawn. - mInputMethodService.getInputMethodInternal().onNavButtonFlagsChanged( - InputMethodNavButtonFlags.IME_DRAWS_IME_NAV_BAR - | InputMethodNavButtonFlags.SHOW_IME_SWITCHER_WHEN_IME_IS_SHOWN - ); - assertThat(mActivity.showImeWithWindowInsetsController()).isTrue(); + setDrawsImeNavBarAndSwitcherButton(true /* enabled */); + mActivity.showImeWithWindowInsetsController(); }, true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); - - final var imm = mContext.getSystemService(InputMethodManager.class); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); - final var imeSwitchButtonUiObject = getUiObjectById(INPUT_METHOD_NAV_IME_SWITCHER_ID); + final var imeSwitchButtonUiObject = getUiObject(By.res(INPUT_METHOD_NAV_IME_SWITCHER_ID)); imeSwitchButtonUiObject.longClick(); mInstrumentation.waitForIdleSync(); assertWithMessage("Input Method Switcher Menu is shown") - .that(isInputMethodPickerShown(imm)) - .isTrue(); - if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) { - // The IME visibility is only sent at the end of the animation. Therefore, we have to - // wait until the visibility was sent to the server and the IME window hidden. - eventually(() -> assertThat(mInputMethodService.isInputViewShown()).isFalse()); - } else { - assertThat(mInputMethodService.isInputViewShown()).isTrue(); - } + .that(isInputMethodPickerShown(mImm)).isTrue(); + assertWithMessage("IME is still shown after IME Switcher button was long clicked") + .that(mInputMethodService.isInputViewShown()).isTrue(); - // Hide the Picker menu before finishing. + // Hide the IME Switcher Menu before finishing. mUiDevice.pressBack(); } - private void verifyInputViewStatus( - Runnable runnable, boolean expected, boolean inputViewStarted) - throws InterruptedException { + private void verifyInputViewStatus(@NonNull Runnable runnable, boolean expected, + boolean inputViewStarted) { verifyInputViewStatusInternal(runnable, expected, inputViewStarted, false /* runOnMainSync */); } - private void verifyInputViewStatusOnMainSync( - Runnable runnable, boolean expected, boolean inputViewStarted) - throws InterruptedException { + private void verifyInputViewStatusOnMainSync(@NonNull Runnable runnable, boolean expected, + boolean inputViewStarted) { verifyInputViewStatusInternal(runnable, expected, inputViewStarted, true /* runOnMainSync */); } @@ -948,24 +1030,32 @@ public class InputMethodServiceTest { /** * Verifies the status of the Input View after executing the given runnable. * - * @param runnable the runnable to execute for showing or hiding the IME. - * @param expected whether the runnable is expected to trigger the signal. + * @param runnable the runnable to execute for showing or hiding the IME. + * @param expected whether the runnable is expected to trigger the signal. * @param inputViewStarted the expected state of the Input View after executing the runnable. - * @param runOnMainSync whether to execute the runnable on the main thread. + * @param runOnMainSync whether to execute the runnable on the main thread. */ - private void verifyInputViewStatusInternal( - Runnable runnable, boolean expected, boolean inputViewStarted, boolean runOnMainSync) - throws InterruptedException { - CountDownLatch signal = new CountDownLatch(1); - mInputMethodService.setCountDownLatchForTesting(signal); - // Runnable to trigger onStartInputView() / onFinishInputView() / onConfigurationChanged() - if (runOnMainSync) { - mInstrumentation.runOnMainSync(runnable); - } else { - runnable.run(); + private void verifyInputViewStatusInternal(@NonNull Runnable runnable, boolean expected, + boolean inputViewStarted, boolean runOnMainSync) { + final boolean completed; + try { + final var latch = new CountDownLatch(1); + mInputMethodService.setCountDownLatchForTesting(latch); + // Trigger onStartInputView() / onFinishInputView() / onConfigurationChanged() + if (runOnMainSync) { + mInstrumentation.runOnMainSync(runnable); + } else { + runnable.run(); + } + mInstrumentation.waitForIdleSync(); + completed = latch.await(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS); + } catch (InterruptedException e) { + fail("Interrupted while waiting for latch: " + e.getMessage()); + return; + } finally { + mInputMethodService.setCountDownLatchForTesting(null); } - mInstrumentation.waitForIdleSync(); - boolean completed = signal.await(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS); + if (expected && !completed) { fail("Timed out waiting for" + " onStartInputView() / onFinishInputView() / onConfigurationChanged()"); @@ -974,8 +1064,10 @@ public class InputMethodServiceTest { + " onStartInputView() / onFinishInputView() / onConfigurationChanged()"); } // Input is not finished. - assertThat(mInputMethodService.getCurrentInputStarted()).isTrue(); - assertThat(mInputMethodService.getCurrentInputViewStarted()).isEqualTo(inputViewStarted); + assertWithMessage("Input connection is still started") + .that(mInputMethodService.getCurrentInputStarted()).isTrue(); + assertWithMessage("IME visibility matches expected") + .that(mInputMethodService.getCurrentInputViewStarted()).isEqualTo(inputViewStarted); } private void setOrientation(int orientation) { @@ -999,37 +1091,45 @@ public class InputMethodServiceTest { /** * Verifies the IME fullscreen mode state after executing the given runnable. * - * @param runnable the runnable to execute for setting the orientation. - * @param expected whether the runnable is expected to trigger the signal. + * @param runnable the runnable to execute for setting the orientation. + * @param expected whether the runnable is expected to trigger the signal. * @param orientationPortrait whether the orientation is expected to be portrait. */ private void verifyFullscreenMode(@NonNull Runnable runnable, boolean expected, - boolean orientationPortrait) throws InterruptedException { + boolean orientationPortrait) { verifyInputViewStatus(runnable, expected, false /* inputViewStarted */); if (expected) { // Wait for the TestActivity to be recreated. - eventually(() -> - assertThat(TestActivity.getLastCreatedInstance()).isNotEqualTo(mActivity)); + eventually(() -> assertWithMessage("Activity was re-created after rotation") + .that(TestActivity.getLastCreatedInstance()).isNotEqualTo(mActivity)); // Get the new TestActivity. mActivity = TestActivity.getLastCreatedInstance(); + assertWithMessage("Re-created activity is not null").that(mActivity).isNotNull(); } verifyInputViewStatusOnMainSync( () -> mActivity.showImeWithWindowInsetsController(), true /* expected */, true /* inputViewStarted */); - assertThat(mInputMethodService.isInputViewShown()).isTrue(); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); - assertThat(mInputMethodService.getResources().getConfiguration().orientation) + assertWithMessage("IME orientation matches expected") + .that(mInputMethodService.getResources().getConfiguration().orientation) .isEqualTo(orientationPortrait ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE); - EditorInfo editorInfo = mInputMethodService.getCurrentInputEditorInfo(); - assertThat(editorInfo.imeOptions & EditorInfo.IME_FLAG_NO_FULLSCREEN).isEqualTo(0); - assertThat(editorInfo.internalImeOptions & EditorInfo.IME_INTERNAL_FLAG_APP_WINDOW_PORTRAIT) + final var editorInfo = mInputMethodService.getCurrentInputEditorInfo(); + assertWithMessage("IME_FLAG_NO_FULLSCREEN not set") + .that(editorInfo.imeOptions & EditorInfo.IME_FLAG_NO_FULLSCREEN).isEqualTo(0); + assertWithMessage("IME_INTERNAL_FLAG_APP_WINDOW_PORTRAIT matches expected") + .that(editorInfo.internalImeOptions + & EditorInfo.IME_INTERNAL_FLAG_APP_WINDOW_PORTRAIT) .isEqualTo( orientationPortrait ? EditorInfo.IME_INTERNAL_FLAG_APP_WINDOW_PORTRAIT : 0); - assertThat(mInputMethodService.onEvaluateFullscreenMode()).isEqualTo(!orientationPortrait); - assertThat(mInputMethodService.isFullscreenMode()).isEqualTo(!orientationPortrait); + assertWithMessage("onEvaluateFullscreenMode matches orientation") + .that(mInputMethodService.onEvaluateFullscreenMode()) + .isEqualTo(!orientationPortrait); + assertWithMessage("isFullscreenMode matches orientation") + .that(mInputMethodService.isFullscreenMode()).isEqualTo(!orientationPortrait); // Hide IME before finishing the run. verifyInputViewStatusOnMainSync( @@ -1040,45 +1140,62 @@ public class InputMethodServiceTest { if (mFlagsValueProvider.getBoolean(Flags.FLAG_REFACTOR_INSETS_CONTROLLER)) { // The IME visibility is only sent at the end of the animation. Therefore, we have to // wait until the visibility was sent to the server and the IME window hidden. - eventually(() -> assertThat(mInputMethodService.isInputViewShown()).isFalse()); + eventually(() -> assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse()); } else { - assertThat(mInputMethodService.isInputViewShown()).isFalse(); + assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse(); } } - private void prepareIme() throws Exception { + private void prepareIme() { executeShellCommand("ime enable " + mInputMethodId); executeShellCommand("ime set " + mInputMethodId); mInstrumentation.waitForIdleSync(); Log.i(TAG, "Finish preparing IME"); } - private void prepareEditor() { - mActivity = TestActivity.start(mInstrumentation); + private void prepareActivity() { + mActivity = TestActivity.startSync(mInstrumentation); Log.i(TAG, "Finish preparing activity with editor."); } + private void waitUntilActivityReadyForInputInjection(@NonNull TestActivity activity) { + try { + mWmState.waitUntilActivityReadyForInputInjection(activity, mInstrumentation, TAG, + "test: " + mName.getMethodName()); + } catch (InterruptedException e) { + fail("Interrupted while waiting for activity to be ready: " + e.getMessage()); + } + } + + @NonNull private String getInputMethodId() { return mTargetPackageName + "/" + INPUT_METHOD_SERVICE_NAME; } /** - * Sets the value of show_ime_with_hard_keyboard, only if it is different to the default value. + * Sets the value of {@link Settings.Secure#SHOW_IME_WITH_HARD_KEYBOARD}, only if it is + * different to the current value, and waits for the update to take effect. * - * @param enabled the value to be set. + * @param enable the value to be set. */ - private void setShowImeWithHardKeyboard(boolean enabled) throws IOException { - if (mShowImeWithHardKeyboardEnabled != enabled) { - executeShellCommand(enabled + private void setShowImeWithHardKeyboard(boolean enable) { + final boolean currentEnabled = + mInputMethodService.getShouldShowImeWithHardKeyboardForTesting(); + if (currentEnabled != enable) { + executeShellCommand(enable ? ENABLE_SHOW_IME_WITH_HARD_KEYBOARD_CMD : DISABLE_SHOW_IME_WITH_HARD_KEYBOARD_CMD); - mInstrumentation.waitForIdleSync(); + eventually(() -> assertWithMessage("showImeWithHardKeyboard updated") + .that(mInputMethodService.getShouldShowImeWithHardKeyboardForTesting()) + .isEqualTo(enable)); } } - private String executeShellCommand(String cmd) throws IOException { + private static void executeShellCommand(@NonNull String cmd) { Log.i(TAG, "Run command: " + cmd); - return SystemUtil.runShellCommandOrThrow(cmd); + SystemUtil.runShellCommandOrThrow(cmd); } /** @@ -1090,31 +1207,57 @@ public class InputMethodServiceTest { } @NonNull - private UiObject2 getUiObjectById(@NonNull String id) { - final var uiObject = mUiDevice.wait( - Until.findObject(By.res(id)), + private UiObject2 getUiObject(@NonNull BySelector bySelector) { + final var uiObject = mUiDevice.wait(Until.findObject(bySelector), TimeUnit.SECONDS.toMillis(TIMEOUT_IN_SECONDS)); - assertThat(uiObject).isNotNull(); + assertWithMessage("UiObject with " + bySelector + " was found").that(uiObject).isNotNull(); return uiObject; } - /** - * Returns {@code true} if the navigation mode is gesture nav, and {@code false} otherwise. - */ + /** Checks whether gesture navigation move is enabled. */ private boolean isGestureNavEnabled() { return mContext.getResources().getInteger( com.android.internal.R.integer.config_navBarInteractionMode) == WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; } - private void clickOnEditorText() { - // Find the editText and click it. - UiObject2 editTextUiObject = - mUiDevice.wait( - Until.findObject(By.desc(EDIT_TEXT_DESC)), - TimeUnit.SECONDS.toMillis(TIMEOUT_IN_SECONDS)); - assertThat(editTextUiObject).isNotNull(); - editTextUiObject.click(); - mInstrumentation.waitForIdleSync(); + /** Checks whether the device has a navigation bar on the IME's display. */ + private boolean hasNavigationBar() { + try { + return WindowManagerGlobal.getWindowManagerService() + .hasNavigationBar(mInputMethodService.getDisplayId()); + } catch (RemoteException e) { + fail("Failed to check whether the device has a navigation bar: " + e.getMessage()); + return false; + } + } + + /** + * Manually sets whether the IME draws the IME navigation bar and IME Switcher button, + * regardless of the current navigation bar mode. + * + * <p>Note, neither of these are normally drawn when in three button navigation mode. + * + * @param enabled whether the IME nav bar and IME Switcher button are drawn. + */ + private void setDrawsImeNavBarAndSwitcherButton(boolean enabled) { + final int flags = enabled ? IME_DRAWS_IME_NAV_BAR | SHOW_IME_SWITCHER_WHEN_IME_IS_SHOWN : 0; + mInputMethodService.getInputMethodInternal().onNavButtonFlagsChanged(flags); + } + + /** + * Set whether the IME navigation bar should be shown or not. + * + * <p>Note, this has no effect when the IME does not draw the IME navigation bar. + * + * @param show whether the IME navigation bar should be shown. + */ + private void setShowImeNavigationBar(boolean show) { + final var controller = mInputMethodService.getWindow().getWindow().getInsetsController(); + if (show) { + controller.show(captionBar()); + } else { + controller.hide(captionBar()); + } } } diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java index 48942a31658f..61d1bb931a96 100644 --- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java +++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleInputMethodService.java @@ -23,13 +23,15 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputConnection; import android.widget.FrameLayout; +import androidx.annotation.NonNull; + import com.android.apps.inputmethod.simpleime.ims.InputMethodServiceWrapper; -/** The {@link InputMethodService} implementation for SimpeTestIme app. */ -public class SimpleInputMethodService extends InputMethodServiceWrapper { +/** The {@link InputMethodService} implementation for SimpleTestIme app. */ +public final class SimpleInputMethodService extends InputMethodServiceWrapper { + private static final String TAG = "SimpleIMS"; private FrameLayout mInputView; @@ -45,23 +47,18 @@ public class SimpleInputMethodService extends InputMethodServiceWrapper { public void onStartInputView(EditorInfo info, boolean restarting) { super.onStartInputView(info, restarting); mInputView.removeAllViews(); - SimpleKeyboard keyboard = new SimpleKeyboard(this, R.layout.qwerty_10_9_9); + final var keyboard = new SimpleKeyboard(this, R.layout.qwerty_10_9_9); mInputView.addView(keyboard.inflateKeyboardView(LayoutInflater.from(this), mInputView)); } - void handle(String data, int keyboardState) { - InputConnection inputConnection = getCurrentInputConnection(); - Integer keyCode = KeyCodeConstants.KEY_NAME_TO_CODE_MAP.get(data); + void handleKeyPress(@NonNull String keyCodeName, int keyboardState) { + final Integer keyCode = KeyCodeConstants.KEY_NAME_TO_CODE_MAP.get(keyCodeName); Log.v(TAG, "keyCode: " + keyCode); if (keyCode != null) { - inputConnection.sendKeyEvent( - new KeyEvent( - SystemClock.uptimeMillis(), - SystemClock.uptimeMillis(), - KeyEvent.ACTION_DOWN, - keyCode, - 0, - KeyCodeConstants.isAlphaKeyCode(keyCode) ? keyboardState : 0)); + final var downTime = SystemClock.uptimeMillis(); + getCurrentInputConnection().sendKeyEvent(new KeyEvent(downTime, downTime, + KeyEvent.ACTION_DOWN, keyCode, 0 /* repeat */, + KeyCodeConstants.isAlphaKeyCode(keyCode) ? keyboardState : 0) /* metaState */); } } } diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboard.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboard.java index b16ec9ebd718..62d90c8d56b5 100644 --- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboard.java +++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/SimpleKeyboard.java @@ -25,60 +25,65 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + /** Controls the visible virtual keyboard view. */ final class SimpleKeyboard { + private static final String TAG = "SimpleKeyboard"; - private static final int[] SOFT_KEY_IDS = - new int[] { - R.id.key_pos_0_0, - R.id.key_pos_0_1, - R.id.key_pos_0_2, - R.id.key_pos_0_3, - R.id.key_pos_0_4, - R.id.key_pos_0_5, - R.id.key_pos_0_6, - R.id.key_pos_0_7, - R.id.key_pos_0_8, - R.id.key_pos_0_9, - R.id.key_pos_1_0, - R.id.key_pos_1_1, - R.id.key_pos_1_2, - R.id.key_pos_1_3, - R.id.key_pos_1_4, - R.id.key_pos_1_5, - R.id.key_pos_1_6, - R.id.key_pos_1_7, - R.id.key_pos_1_8, - R.id.key_pos_2_0, - R.id.key_pos_2_1, - R.id.key_pos_2_2, - R.id.key_pos_2_3, - R.id.key_pos_2_4, - R.id.key_pos_2_5, - R.id.key_pos_2_6, - R.id.key_pos_shift, - R.id.key_pos_del, - R.id.key_pos_symbol, - R.id.key_pos_comma, - R.id.key_pos_space, - R.id.key_pos_period, - R.id.key_pos_enter, - }; + private static final int[] SOFT_KEY_IDS = new int[]{ + R.id.key_pos_0_0, + R.id.key_pos_0_1, + R.id.key_pos_0_2, + R.id.key_pos_0_3, + R.id.key_pos_0_4, + R.id.key_pos_0_5, + R.id.key_pos_0_6, + R.id.key_pos_0_7, + R.id.key_pos_0_8, + R.id.key_pos_0_9, + R.id.key_pos_1_0, + R.id.key_pos_1_1, + R.id.key_pos_1_2, + R.id.key_pos_1_3, + R.id.key_pos_1_4, + R.id.key_pos_1_5, + R.id.key_pos_1_6, + R.id.key_pos_1_7, + R.id.key_pos_1_8, + R.id.key_pos_2_0, + R.id.key_pos_2_1, + R.id.key_pos_2_2, + R.id.key_pos_2_3, + R.id.key_pos_2_4, + R.id.key_pos_2_5, + R.id.key_pos_2_6, + R.id.key_pos_shift, + R.id.key_pos_del, + R.id.key_pos_symbol, + R.id.key_pos_comma, + R.id.key_pos_space, + R.id.key_pos_period, + R.id.key_pos_enter, + }; + @NonNull private final SimpleInputMethodService mSimpleInputMethodService; private final int mViewResId; private final SparseArray<TextView> mSoftKeyViews = new SparseArray<>(); private View mKeyboardView; private int mKeyboardState; - SimpleKeyboard(SimpleInputMethodService simpleInputMethodService, int viewResId) { - this.mSimpleInputMethodService = simpleInputMethodService; - this.mViewResId = viewResId; - this.mKeyboardState = 0; + SimpleKeyboard(@NonNull SimpleInputMethodService simpleInputMethodService, int viewResId) { + mSimpleInputMethodService = simpleInputMethodService; + mViewResId = viewResId; + mKeyboardState = 0; } - View inflateKeyboardView(LayoutInflater inflater, ViewGroup inputView) { + @NonNull + View inflateKeyboardView(@NonNull LayoutInflater inflater, @NonNull ViewGroup inputView) { mKeyboardView = inflater.inflate(mViewResId, inputView, false); mapSoftKeys(); return mKeyboardView; @@ -86,30 +91,31 @@ final class SimpleKeyboard { private void mapSoftKeys() { for (int id : SOFT_KEY_IDS) { - TextView softKeyView = mKeyboardView.findViewById(id); + final TextView softKeyView = mKeyboardView.requireViewById(id); mSoftKeyViews.put(id, softKeyView); - String tagData = softKeyView.getTag() != null ? softKeyView.getTag().toString() : null; - softKeyView.setOnClickListener(v -> handle(tagData)); + final var keyCodeName = softKeyView.getTag() != null + ? softKeyView.getTag().toString() : null; + softKeyView.setOnClickListener(v -> handleKeyPress(keyCodeName)); } } - private void handle(String data) { - Log.i(TAG, "handle(): " + data); - if (TextUtils.isEmpty(data)) { + private void handleKeyPress(@Nullable String keyCodeName) { + Log.i(TAG, "handle(): " + keyCodeName); + if (TextUtils.isEmpty(keyCodeName)) { return; } - if ("KEYCODE_SHIFT".equals(data)) { + if ("KEYCODE_SHIFT".equals(keyCodeName)) { handleShift(); return; } - mSimpleInputMethodService.handle(data, mKeyboardState); + mSimpleInputMethodService.handleKeyPress(keyCodeName, mKeyboardState); } private void handleShift() { mKeyboardState = toggleShiftState(mKeyboardState); Log.v(TAG, "currentKeyboardState: " + mKeyboardState); - boolean isShiftOn = isShiftOn(mKeyboardState); + final boolean isShiftOn = isShiftOn(mKeyboardState); for (int i = 0; i < mSoftKeyViews.size(); i++) { TextView softKeyView = mSoftKeyViews.valueAt(i); softKeyView.setAllCaps(isShiftOn); diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java index 67212b60f1b8..be59dd2cb7a3 100644 --- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java +++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/ims/InputMethodServiceWrapper.java @@ -25,21 +25,35 @@ import java.util.concurrent.CountDownLatch; /** Wrapper of {@link InputMethodService} to expose interfaces for testing purpose. */ public class InputMethodServiceWrapper extends InputMethodService { - private static final String TAG = "InputMethodServiceWrapper"; - private static InputMethodServiceWrapper sInputMethodServiceWrapper; + private static final String TAG = "InputMethodServiceWrapper"; - public static InputMethodServiceWrapper getInputMethodServiceWrapperForTesting() { - return sInputMethodServiceWrapper; - } + /** Last created instance of this wrapper. */ + private static InputMethodServiceWrapper sInstance; private boolean mInputViewStarted; + + /** + * @see #setCountDownLatchForTesting + */ private CountDownLatch mCountDownLatchForTesting; + /** Gets the last created instance of this wrapper, if available. */ + public static InputMethodServiceWrapper getInstance() { + return sInstance; + } + public boolean getCurrentInputViewStarted() { return mInputViewStarted; } + /** + * Sets the latch used to wait for the IME to start showing ({@link #onStartInputView}, + * start hiding ({@link #onFinishInputView}) or receive a configuration change + * ({@link #onConfigurationChanged}). + * + * @param countDownLatchForTesting the latch to wait on. + */ public void setCountDownLatchForTesting(CountDownLatch countDownLatchForTesting) { mCountDownLatchForTesting = countDownLatchForTesting; } @@ -48,7 +62,7 @@ public class InputMethodServiceWrapper extends InputMethodService { public void onCreate() { Log.i(TAG, "onCreate()"); super.onCreate(); - sInputMethodServiceWrapper = this; + sInstance = this; } @Override @@ -102,12 +116,13 @@ public class InputMethodServiceWrapper extends InputMethodService { } private String dumpEditorInfo(EditorInfo info) { - var sb = new StringBuilder(); - sb.append("EditorInfo{packageName=").append(info.packageName); - sb.append(" fieldId=").append(info.fieldId); - sb.append(" hintText=").append(info.hintText); - sb.append(" privateImeOptions=").append(info.privateImeOptions); - sb.append("}"); - return sb.toString(); + if (info == null) { + return "null"; + } + return "EditorInfo{packageName=" + info.packageName + + " fieldId=" + info.fieldId + + " hintText=" + info.hintText + + " privateImeOptions=" + info.privateImeOptions + + "}"; } } diff --git a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/testing/TestActivity.java b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/testing/TestActivity.java index 37b05ff79977..eadbac3ca74b 100644 --- a/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/testing/TestActivity.java +++ b/services/tests/InputMethodSystemServerTests/test-apps/SimpleTestIme/src/com/android/apps/inputmethod/simpleime/testing/TestActivity.java @@ -25,12 +25,12 @@ import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.WindowInsets; -import android.view.WindowInsetsController; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.LinearLayout; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.lang.ref.WeakReference; @@ -42,10 +42,10 @@ import java.lang.ref.WeakReference; * in the instruments package. More details see {@link * Instrumentation#startActivitySync(Intent)}.</> */ -public class TestActivity extends Activity { +public final class TestActivity extends Activity { + private static final String TAG = "TestActivity"; - private static WeakReference<TestActivity> sLastCreatedInstance = - new WeakReference<>(null); + private static WeakReference<TestActivity> sLastCreatedInstance = new WeakReference<>(null); /** * Start a new test activity with an editor and wait for it to begin running before returning. @@ -53,13 +53,13 @@ public class TestActivity extends Activity { * @param instrumentation application instrumentation * @return the newly started activity */ - public static TestActivity start(Instrumentation instrumentation) { - Intent intent = - new Intent() - .setAction(Intent.ACTION_MAIN) - .setClass(instrumentation.getTargetContext(), TestActivity.class) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + @NonNull + public static TestActivity startSync(@NonNull Instrumentation instrumentation) { + final var intent = new Intent() + .setAction(Intent.ACTION_MAIN) + .setClass(instrumentation.getTargetContext(), TestActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); return (TestActivity) instrumentation.startActivitySync(intent); } @@ -70,12 +70,12 @@ public class TestActivity extends Activity { } @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); - LinearLayout rootView = new LinearLayout(this); + final var rootView = new LinearLayout(this); mEditText = new EditText(this); - mEditText.setContentDescription("Input box"); + mEditText.setHint("editText"); rootView.addView(mEditText, new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT)); rootView.setFitsSystemWindows(true); setContentView(rootView); @@ -83,40 +83,39 @@ public class TestActivity extends Activity { sLastCreatedInstance = new WeakReference<>(this); } - /** Get the last created TestActivity instance. */ - public static @Nullable TestActivity getLastCreatedInstance() { + /** Get the last created TestActivity instance, if available. */ + @Nullable + public static TestActivity getLastCreatedInstance() { return sLastCreatedInstance.get(); } /** Shows soft keyboard via InputMethodManager. */ public boolean showImeWithInputMethodManager(int flags) { - InputMethodManager imm = getSystemService(InputMethodManager.class); - boolean result = imm.showSoftInput(mEditText, flags); + final var imm = getSystemService(InputMethodManager.class); + final boolean result = imm.showSoftInput(mEditText, flags); Log.i(TAG, "showIme() via InputMethodManager, result=" + result); return result; } /** Shows soft keyboard via WindowInsetsController. */ - public boolean showImeWithWindowInsetsController() { - WindowInsetsController windowInsetsController = mEditText.getWindowInsetsController(); - windowInsetsController.show(WindowInsets.Type.ime()); + public void showImeWithWindowInsetsController() { + final var controller = mEditText.getWindowInsetsController(); + controller.show(WindowInsets.Type.ime()); Log.i(TAG, "showIme() via WindowInsetsController"); - return true; } /** Hides soft keyboard via InputMethodManager. */ public boolean hideImeWithInputMethodManager(int flags) { - InputMethodManager imm = getSystemService(InputMethodManager.class); - boolean result = imm.hideSoftInputFromWindow(mEditText.getWindowToken(), flags); + final var imm = getSystemService(InputMethodManager.class); + final boolean result = imm.hideSoftInputFromWindow(mEditText.getWindowToken(), flags); Log.i(TAG, "hideIme() via InputMethodManager, result=" + result); return result; } /** Hides soft keyboard via WindowInsetsController. */ - public boolean hideImeWithWindowInsetsController() { - WindowInsetsController windowInsetsController = mEditText.getWindowInsetsController(); - windowInsetsController.hide(WindowInsets.Type.ime()); + public void hideImeWithWindowInsetsController() { + final var controller = mEditText.getWindowInsetsController(); + controller.hide(WindowInsets.Type.ime()); Log.i(TAG, "hideIme() via WindowInsetsController"); - return true; } } diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java index 86101cf591e7..2cd105ba5317 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java @@ -86,6 +86,8 @@ public class JobStatusTest { private static final double DELTA = 0.00001; private static final String TEST_PACKAGE = "job.test.package"; private static final ComponentName TEST_JOB_COMPONENT = new ComponentName(TEST_PACKAGE, "test"); + private static final String SOURCE_PACKAGE = "com.android.frameworks.mockingservicestests"; + private static final int SOURCE_USER_ID = 0; private static final Uri IMAGES_MEDIA_URI = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; private static final Uri VIDEO_MEDIA_URI = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; @@ -1342,6 +1344,35 @@ public class JobStatusTest { assertFalse(job.readinessStatusWithConstraint(CONSTRAINT_FLEXIBLE, false)); } + @Test + public void testJobName_NoTagNoNamespace() { + final JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar")).build(); + JobStatus jobStatus = createJobStatus(jobInfo, null, -1, null, null); + assertEquals("foo/bar", jobStatus.getBatteryName()); + } + + @Test + public void testJobName_NoTagWithNamespace() { + final JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar")).build(); + JobStatus jobStatus = createJobStatus(jobInfo, null, -1, "TestNamespace", null); + assertEquals("@TestNamespace@foo/bar", jobStatus.getBatteryName()); + } + + @Test + public void testJobName_WithTagNoNamespace() { + final JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar")).build(); + JobStatus jobStatus = createJobStatus(jobInfo, SOURCE_PACKAGE, 0, null, "TestTag"); + assertEquals("TestTag:foo", jobStatus.getBatteryName()); + } + + @Test + public void testJobName_WithTagAndNamespace() { + final JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar")).build(); + JobStatus jobStatus = createJobStatus(jobInfo, SOURCE_PACKAGE, 0, + "TestNamespace", "TestTag"); + assertEquals("@TestNamespace@TestTag:foo", jobStatus.getBatteryName()); + } + private void markExpeditedQuotaApproved(JobStatus job, boolean isApproved) { if (job.isRequestedExpeditedJob()) { job.setExpeditedJobQuotaApproved(sElapsedRealtimeClock.millis(), isApproved); @@ -1369,4 +1400,12 @@ public class JobStatusTest { jobStatus.serviceProcessName = "testProcess"; return jobStatus; } + + private static JobStatus createJobStatus( + JobInfo job, String packageName, int callingUid, String namespace, String tag) { + JobStatus jobStatus = JobStatus.createFromJobInfo( + job, callingUid, packageName, SOURCE_USER_ID, namespace, tag); + jobStatus.serviceProcessName = "testProcess"; + return jobStatus; + } } diff --git a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceVolumeManagerTest.java b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceVolumeManagerTest.java index de5564cb7704..f573add7e253 100644 --- a/services/tests/servicestests/src/com/android/server/audio/AudioDeviceVolumeManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/audio/AudioDeviceVolumeManagerTest.java @@ -16,9 +16,7 @@ package com.android.server.audio; -import static com.android.media.audio.Flags.FLAG_ABS_VOLUME_INDEX_FIX; import static com.android.media.audio.Flags.FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME; -import static com.android.media.audio.Flags.absVolumeIndexFix; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; @@ -34,9 +32,9 @@ import android.media.AudioDeviceInfo; import android.media.AudioManager; import android.media.AudioSystem; import android.media.VolumeInfo; +import android.os.IpcDataCache; import android.os.PermissionEnforcer; import android.os.test.TestLooper; -import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; @@ -71,6 +69,8 @@ public class AudioDeviceVolumeManagerTest { @Before public void setUp() throws Exception { + IpcDataCache.disableForTestMode(); + mTestLooper = new TestLooper(); mContext = InstrumentationRegistry.getTargetContext(); mPackageName = mContext.getOpPackageName(); @@ -121,55 +121,6 @@ public class AudioDeviceVolumeManagerTest { } @Test - @RequiresFlagsDisabled({FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME, FLAG_ABS_VOLUME_INDEX_FIX}) - public void configurablePreScaleAbsoluteVolume_checkIndex() throws Exception { - AudioManager am = mContext.getSystemService(AudioManager.class); - final int minIndex = am.getStreamMinVolume(AudioManager.STREAM_MUSIC); - final int maxIndex = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); - final VolumeInfo volMedia = new VolumeInfo.Builder(AudioManager.STREAM_MUSIC) - .setMinVolumeIndex(minIndex) - .setMaxVolumeIndex(maxIndex) - .build(); - final AudioDeviceAttributes bleDevice = new AudioDeviceAttributes( - /*native type*/ AudioSystem.DEVICE_OUT_BLE_HEADSET, /*address*/ "fake_ble"); - final int maxPreScaleIndex = 3; - final float[] preScale = new float[3]; - preScale[0] = mContext.getResources().getFraction( - com.android.internal.R.fraction.config_prescaleAbsoluteVolume_index1, - 1, 1); - preScale[1] = mContext.getResources().getFraction( - com.android.internal.R.fraction.config_prescaleAbsoluteVolume_index2, - 1, 1); - preScale[2] = mContext.getResources().getFraction( - com.android.internal.R.fraction.config_prescaleAbsoluteVolume_index3, - 1, 1); - - for (int i = 0; i < maxPreScaleIndex; i++) { - final int targetIndex = (int) (preScale[i] * maxIndex); - final VolumeInfo volCur = new VolumeInfo.Builder(volMedia) - .setVolumeIndex(i + 1).build(); - // Adjust stream volume with FLAG_ABSOLUTE_VOLUME set (index:1~3) - mAudioService.setDeviceVolume(volCur, bleDevice, mPackageName); - mTestLooper.dispatchAll(); - - // Stream volume changes - verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS( - AudioManager.STREAM_MUSIC, targetIndex, false, - AudioSystem.DEVICE_OUT_BLE_HEADSET); - } - - // Adjust stream volume with FLAG_ABSOLUTE_VOLUME set (index:4) - final VolumeInfo volIndex4 = new VolumeInfo.Builder(volMedia) - .setVolumeIndex(4).build(); - mAudioService.setDeviceVolume(volIndex4, bleDevice, mPackageName); - mTestLooper.dispatchAll(); - - verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS( - AudioManager.STREAM_MUSIC, maxIndex, false, - AudioSystem.DEVICE_OUT_BLE_HEADSET); - } - - @Test @RequiresFlagsEnabled(FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME) public void disablePreScaleAbsoluteVolume_checkIndex() throws Exception { AudioManager am = mContext.getSystemService(AudioManager.class); @@ -182,7 +133,6 @@ public class AudioDeviceVolumeManagerTest { final AudioDeviceAttributes bleDevice = new AudioDeviceAttributes( /*native type*/ AudioSystem.DEVICE_OUT_BLE_HEADSET, /*address*/ "bla"); final int maxPreScaleIndex = 3; - int passedIndex = maxIndex; for (int i = 0; i < maxPreScaleIndex; i++) { final VolumeInfo volCur = new VolumeInfo.Builder(volMedia) @@ -191,12 +141,9 @@ public class AudioDeviceVolumeManagerTest { mAudioService.setDeviceVolume(volCur, bleDevice, mPackageName); mTestLooper.dispatchAll(); - if (absVolumeIndexFix()) { - passedIndex = i + 1; - } // Stream volume changes verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS( - AudioManager.STREAM_MUSIC, passedIndex, false, + AudioManager.STREAM_MUSIC, /*index=*/i + 1, false, AudioSystem.DEVICE_OUT_BLE_HEADSET); } @@ -206,11 +153,8 @@ public class AudioDeviceVolumeManagerTest { mAudioService.setDeviceVolume(volIndex4, bleDevice, mPackageName); mTestLooper.dispatchAll(); - if (absVolumeIndexFix()) { - passedIndex = 4; - } verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS( - AudioManager.STREAM_MUSIC, passedIndex, false, + AudioManager.STREAM_MUSIC, /*index=*/4, false, AudioSystem.DEVICE_OUT_BLE_HEADSET); } } diff --git a/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java b/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java index 96c6cbc9ec64..aa9d2058e659 100644 --- a/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java @@ -32,6 +32,7 @@ import android.app.AppOpsManager; import android.content.Context; import android.media.AudioDeviceAttributes; import android.media.AudioSystem; +import android.os.IpcDataCache; import android.os.Looper; import android.os.PermissionEnforcer; import android.os.UserHandle; @@ -87,6 +88,8 @@ public class AudioServiceTest { @Before public void setUp() throws Exception { + IpcDataCache.disableForTestMode(); + if (!sLooperPrepared) { Looper.prepare(); sLooperPrepared = true; diff --git a/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java b/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java index 2d81f72e3319..9cf45647a053 100644 --- a/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/audio/VolumeHelperTest.java @@ -40,10 +40,8 @@ import static android.media.audio.Flags.autoPublicVolumeApiHardening; import static android.view.KeyEvent.ACTION_DOWN; import static android.view.KeyEvent.KEYCODE_VOLUME_UP; -import static com.android.media.audio.Flags.FLAG_ABS_VOLUME_INDEX_FIX; import static com.android.media.audio.Flags.FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME; import static com.android.media.audio.Flags.FLAG_RING_MY_CAR; -import static com.android.media.audio.Flags.absVolumeIndexFix; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; @@ -85,7 +83,6 @@ import android.os.Looper; import android.os.PermissionEnforcer; import android.os.test.TestLooper; import android.platform.test.annotations.Presubmit; -import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; @@ -675,56 +672,6 @@ public class VolumeHelperTest { } @Test - @RequiresFlagsDisabled({FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME, FLAG_ABS_VOLUME_INDEX_FIX}) - public void configurablePreScaleAbsoluteVolume_checkIndex() throws Exception { - final int minIndex = mAm.getStreamMinVolume(STREAM_MUSIC); - final int maxIndex = mAm.getStreamMaxVolume(STREAM_MUSIC); - final VolumeInfo volMedia = new VolumeInfo.Builder(STREAM_MUSIC) - .setMinVolumeIndex(minIndex) - .setMaxVolumeIndex(maxIndex) - .build(); - final AudioDeviceAttributes bleDevice = new AudioDeviceAttributes( - /*native type*/ AudioSystem.DEVICE_OUT_BLE_HEADSET, /*address*/ "fake_ble"); - final int maxPreScaleIndex = 3; - final float[] preScale = new float[maxPreScaleIndex]; - preScale[0] = mContext.getResources().getFraction( - com.android.internal.R.fraction.config_prescaleAbsoluteVolume_index1, - 1, 1); - preScale[1] = mContext.getResources().getFraction( - com.android.internal.R.fraction.config_prescaleAbsoluteVolume_index2, - 1, 1); - preScale[2] = mContext.getResources().getFraction( - com.android.internal.R.fraction.config_prescaleAbsoluteVolume_index3, - 1, 1); - - for (int i = 0; i < maxPreScaleIndex; i++) { - final int targetIndex = (int) (preScale[i] * maxIndex); - final VolumeInfo volCur = new VolumeInfo.Builder(volMedia) - .setVolumeIndex(i + 1).build(); - // Adjust stream volume with FLAG_ABSOLUTE_VOLUME set (index:1~3) - mAudioService.setDeviceVolume(volCur, bleDevice, mContext.getOpPackageName()); - mTestLooper.dispatchAll(); - - assertEquals(volCur, - mAudioService.getDeviceVolume(volCur, bleDevice, mContext.getOpPackageName())); - // Stream volume changes - verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS( - STREAM_MUSIC, targetIndex, false, AudioSystem.DEVICE_OUT_BLE_HEADSET); - } - - // Adjust stream volume with FLAG_ABSOLUTE_VOLUME set (index:4) - final VolumeInfo volIndex4 = new VolumeInfo.Builder(volMedia) - .setVolumeIndex(4).build(); - mAudioService.setDeviceVolume(volIndex4, bleDevice, mContext.getOpPackageName()); - mTestLooper.dispatchAll(); - - assertEquals(volIndex4, - mAudioService.getDeviceVolume(volIndex4, bleDevice, mContext.getOpPackageName())); - verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS( - STREAM_MUSIC, maxIndex, false, AudioSystem.DEVICE_OUT_BLE_HEADSET); - } - - @Test @RequiresFlagsEnabled(FLAG_DISABLE_PRESCALE_ABSOLUTE_VOLUME) public void disablePreScaleAbsoluteVolume_checkIndex() throws Exception { final int minIndex = mAm.getStreamMinVolume(STREAM_MUSIC); @@ -736,7 +683,6 @@ public class VolumeHelperTest { final AudioDeviceAttributes bleDevice = new AudioDeviceAttributes( /*native type*/ AudioSystem.DEVICE_OUT_BLE_HEADSET, /*address*/ "bla"); final int maxPreScaleIndex = 3; - int passedIndex = maxIndex; for (int i = 0; i < maxPreScaleIndex; i++) { final VolumeInfo volCur = new VolumeInfo.Builder(volMedia) @@ -745,12 +691,9 @@ public class VolumeHelperTest { mAudioService.setDeviceVolume(volCur, bleDevice, mContext.getOpPackageName()); mTestLooper.dispatchAll(); - if (absVolumeIndexFix()) { - passedIndex = i + 1; - } // Stream volume changes verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS( - STREAM_MUSIC, passedIndex, false, AudioSystem.DEVICE_OUT_BLE_HEADSET); + STREAM_MUSIC, /*index=*/i + 1, false, AudioSystem.DEVICE_OUT_BLE_HEADSET); } // Adjust stream volume with FLAG_ABSOLUTE_VOLUME set (index:4) @@ -759,11 +702,8 @@ public class VolumeHelperTest { mAudioService.setDeviceVolume(volIndex4, bleDevice, mContext.getOpPackageName()); mTestLooper.dispatchAll(); - if (absVolumeIndexFix()) { - passedIndex = 4; - } verify(mSpyAudioSystem, atLeast(1)).setStreamVolumeIndexAS( - STREAM_MUSIC, passedIndex, false, AudioSystem.DEVICE_OUT_BLE_HEADSET); + STREAM_MUSIC, /*index=*/4, false, AudioSystem.DEVICE_OUT_BLE_HEADSET); } // ---------------- DeviceVolumeBehaviorTest ---------------- diff --git a/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java b/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java index 2e489a81c43a..326e95ebaf16 100644 --- a/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java +++ b/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEndpointTest.java @@ -19,14 +19,19 @@ package com.android.server.location.contexthub; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.hardware.contexthub.ErrorCode; import android.hardware.contexthub.HubEndpointInfo; import android.hardware.contexthub.HubEndpointInfo.HubEndpointIdentifier; +import android.hardware.contexthub.HubMessage; import android.hardware.contexthub.IContextHubEndpoint; import android.hardware.contexthub.IContextHubEndpointCallback; import android.hardware.contexthub.IEndpointCommunication; +import android.hardware.contexthub.MessageDeliveryStatus; import android.os.Binder; import android.os.RemoteException; import android.platform.test.annotations.Postsubmit; @@ -38,6 +43,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -121,4 +127,24 @@ public class ContextHubEndpointTest { mEndpointManager.returnSessionId(sessionId); assertThat(mEndpointManager.getNumAvailableSessions()).isEqualTo(SESSION_ID_RANGE); } + + @Test + public void testInvalidMessageReceivedCallback() throws RemoteException { + // Send an invalid call to onMessageReceived (no sessions created) + final int messageType = 1234; + final int sessionId = 4321; + final int sequenceNumber = 5678; + HubMessage message = + new HubMessage.Builder(messageType, new byte[0]).setResponseRequired(true).build(); + message.setMessageSequenceNumber(sequenceNumber); + mEndpointManager.onMessageReceived(sessionId, message); + + // Confirm that we can get a delivery status with DESTINATION_NOT_FOUND error + ArgumentCaptor<MessageDeliveryStatus> statusCaptor = + ArgumentCaptor.forClass(MessageDeliveryStatus.class); + verify(mMockEndpointCommunications) + .sendMessageDeliveryStatusToEndpoint(eq(sessionId), statusCaptor.capture()); + assertThat(statusCaptor.getValue().messageSequenceNumber).isEqualTo(sequenceNumber); + assertThat(statusCaptor.getValue().errorCode).isEqualTo(ErrorCode.DESTINATION_NOT_FOUND); + } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index 03a6ab187204..0373eb6e9318 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -24,7 +24,6 @@ import static android.app.ActivityManagerInternal.ServiceNotificationPolicy.NOT_ import static android.app.ActivityManagerInternal.ServiceNotificationPolicy.SHOW_IMMEDIATELY; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.Flags.FLAG_KEYGUARD_PRIVATE_NOTIFICATIONS; -import static android.app.Flags.FLAG_NM_BINDER_PERF_CACHE_CHANNELS; import static android.app.Flags.FLAG_SORT_SECTION_BY_TIME; import static android.app.Notification.EXTRA_ALLOW_DURING_SETUP; import static android.app.Notification.EXTRA_PICTURE; @@ -816,6 +815,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // make sure PreferencesHelper doesn't try to interact with any real caches PreferencesHelper prefHelper = spy(mService.mPreferencesHelper); doNothing().when(prefHelper).invalidateNotificationChannelCache(); + doNothing().when(prefHelper).invalidateNotificationChannelGroupCache(); mService.setPreferencesHelper(prefHelper); // Return first true for RoleObserver main-thread check @@ -5339,7 +5339,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { mBinderService.getNotificationChannelGroupsFromPrivilegedListener( null, mPkg, Process.myUserHandle()); - verify(mPreferencesHelper, times(1)).getNotificationChannelGroups(anyString(), anyInt()); + verify(mPreferencesHelper, times(1)).getNotificationChannelGroupsWithoutChannels( + anyString(), anyInt()); } @Test @@ -5356,7 +5357,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // pass } - verify(mPreferencesHelper, never()).getNotificationChannelGroups(anyString(), anyInt()); + verify(mPreferencesHelper, never()).getNotificationChannelGroupsWithoutChannels(anyString(), + anyInt()); } @Test @@ -5376,7 +5378,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { // pass } - verify(mPreferencesHelper, never()).getNotificationChannelGroups(anyString(), anyInt()); + verify(mPreferencesHelper, never()).getNotificationChannelGroupsWithoutChannels(anyString(), + anyInt()); } @Test diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java index e42e10c8945c..3f26cd9258af 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -3314,7 +3314,8 @@ public class PreferencesHelperTest extends UiServiceTestCase { PKG_N_MR1, UID_N_MR1, nonGroupedNonDeletedChannel.getId(), false)); // notDeleted - assertEquals(1, mHelper.getNotificationChannelGroups(PKG_N_MR1, UID_N_MR1).size()); + assertEquals(1, mHelper.getNotificationChannelGroups(PKG_N_MR1, UID_N_MR1, + NotificationChannelGroupsHelper.Params.forAllGroups()).getList().size()); verify(mHandler, never()).requestSort(); @@ -3474,7 +3475,7 @@ public class PreferencesHelperTest extends UiServiceTestCase { assertNull(mHelper.getNotificationDelegate(PKG_O, UID_O)); assertEquals(0, mHelper.getAppLockedFields(PKG_O, UID_O)); assertEquals(0, mHelper.getRemovedPkgNotificationChannels(PKG_O, UID_O).size()); - assertEquals(0, mHelper.getNotificationChannelGroups(PKG_O, UID_O).size()); + assertEquals(0, mHelper.getNotificationChannelGroupsWithoutChannels(PKG_O, UID_O).size()); NotificationChannel channel = getChannel(); mHelper.createNotificationChannel(PKG_O, UID_O, channel, true, false, @@ -3496,8 +3497,8 @@ public class PreferencesHelperTest extends UiServiceTestCase { NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1"); mHelper.createNotificationChannelGroup(PKG_N_MR1, UID_N_MR1, ncg, true, UID_N_MR1, false); - assertEquals(ncg, - mHelper.getNotificationChannelGroups(PKG_N_MR1, UID_N_MR1).iterator().next()); + assertEquals(ncg, mHelper.getNotificationChannelGroupsWithoutChannels(PKG_N_MR1, + UID_N_MR1).iterator().next()); verify(mHandler, never()).requestSort(); assertEquals(1, mLogger.getCalls().size()); assertEquals( @@ -6668,7 +6669,7 @@ public class PreferencesHelperTest extends UiServiceTestCase { false); // new channel should invalidate the cache. - assertThat(mHelper.hasCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); // when the channel data is updated, should invalidate the cache again after that. mHelper.resetCacheInvalidation(); @@ -6676,7 +6677,7 @@ public class PreferencesHelperTest extends UiServiceTestCase { newChannel.setName("new name"); newChannel.setImportance(IMPORTANCE_HIGH); mHelper.updateNotificationChannel(PKG_N_MR1, UID_N_MR1, newChannel, true, UID_N_MR1, false); - assertThat(mHelper.hasCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); // also for conversations mHelper.resetCacheInvalidation(); @@ -6688,13 +6689,13 @@ public class PreferencesHelperTest extends UiServiceTestCase { conv.setConversationId(parentId, convId); mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, conv, true, false, UID_N_MR1, false); - assertThat(mHelper.hasCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); mHelper.resetCacheInvalidation(); NotificationChannel newConv = conv.copy(); newConv.setName("changed"); mHelper.updateNotificationChannel(PKG_N_MR1, UID_N_MR1, newConv, true, UID_N_MR1, false); - assertThat(mHelper.hasCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); } @Test @@ -6708,14 +6709,14 @@ public class PreferencesHelperTest extends UiServiceTestCase { mHelper.resetCacheInvalidation(); mHelper.deleteNotificationChannel(PKG_N_MR1, UID_N_MR1, "id", UID_N_MR1, false); - assertThat(mHelper.hasCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); // recreate channel and now permanently delete mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel, true, false, UID_N_MR1, false); mHelper.resetCacheInvalidation(); mHelper.permanentlyDeleteNotificationChannel(PKG_N_MR1, UID_N_MR1, "id"); - assertThat(mHelper.hasCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); } @Test @@ -6735,12 +6736,12 @@ public class PreferencesHelperTest extends UiServiceTestCase { mHelper.updateNotificationChannel(PKG_N_MR1, UID_N_MR1, newChannel, true, UID_N_MR1, false); // because there were no effective changes, we should not see any cache invalidations - assertThat(mHelper.hasCacheBeenInvalidated()).isFalse(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isFalse(); // deletions of a nonexistent channel also don't change anything mHelper.resetCacheInvalidation(); mHelper.deleteNotificationChannel(PKG_N_MR1, UID_N_MR1, "nonexistent", UID_N_MR1, false); - assertThat(mHelper.hasCacheBeenInvalidated()).isFalse(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isFalse(); } @Test @@ -6773,24 +6774,24 @@ public class PreferencesHelperTest extends UiServiceTestCase { NotificationChannel p1u1New = p1u1.copy(); p1u1New.setName("p1u1 new"); mHelper.updateNotificationChannel(PKG_O, UID_O, p1u1New, true, UID_O, false); - assertThat(mHelper.hasCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); // Do it again, but no change for this user mHelper.resetCacheInvalidation(); mHelper.updateNotificationChannel(PKG_O, UID_O, p1u1New.copy(), true, UID_O, false); - assertThat(mHelper.hasCacheBeenInvalidated()).isFalse(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isFalse(); // Delete conversations, but for a package without those conversations mHelper.resetCacheInvalidation(); mHelper.deleteConversations(PKG_O, UID_O, Set.of(p2u1Conv.getConversationId()), UID_O, false); - assertThat(mHelper.hasCacheBeenInvalidated()).isFalse(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isFalse(); // Now delete conversations for the right package mHelper.resetCacheInvalidation(); mHelper.deleteConversations(PKG_N_MR1, UID_N_MR1, Set.of(p2u1Conv.getConversationId()), UID_N_MR1, false); - assertThat(mHelper.hasCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); } @Test @@ -6804,7 +6805,8 @@ public class PreferencesHelperTest extends UiServiceTestCase { // delete user 1; should invalidate cache mHelper.onUserRemoved(1); - assertThat(mHelper.hasCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasGroupCacheBeenInvalidated()).isTrue(); } @Test @@ -6819,32 +6821,39 @@ public class PreferencesHelperTest extends UiServiceTestCase { mHelper.resetCacheInvalidation(); mHelper.onPackagesChanged(true, USER_SYSTEM, new String[]{PKG_N_MR1}, new int[]{UID_N_MR1}); - assertThat(mHelper.hasCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasGroupCacheBeenInvalidated()).isTrue(); - // re-created: expect cache invalidation again + // re-created: expect cache invalidation again, but only specifically for the channel cache, + // as creating package preferences wouldn't necessarily affect groups mHelper.resetCacheInvalidation(); + mHelper.onPackagesChanged(false, UID_N_MR1, new String[]{PKG_N_MR1}, + new int[]{UID_N_MR1}); mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel1, true, false, UID_N_MR1, false); - mHelper.onPackagesChanged(false, USER_SYSTEM, new String[]{PKG_N_MR1}, - new int[]{UID_N_MR1}); - assertThat(mHelper.hasCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); } @Test @DisableFlags(android.app.Flags.FLAG_NM_BINDER_PERF_CACHE_CHANNELS) - public void testInvalidateCache_flagOff_neverTouchesCache() { + public void testInvalidateCache_flagOff_neverTouchesCaches() { // Do a bunch of channel-changing operations. NotificationChannel channel = new NotificationChannel("id", "name1", NotificationManager.IMPORTANCE_HIGH); mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel, true, false, UID_N_MR1, false); + // and also a group + NotificationChannelGroup ncg = new NotificationChannelGroup("1", "group1"); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, ncg, true, UID_O, false); + NotificationChannel copy = channel.copy(); copy.setName("name2"); mHelper.updateNotificationChannel(PKG_N_MR1, UID_N_MR1, copy, true, UID_N_MR1, false); mHelper.deleteNotificationChannel(PKG_N_MR1, UID_N_MR1, "id", UID_N_MR1, false); - assertThat(mHelper.hasCacheBeenInvalidated()).isFalse(); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isFalse(); + assertThat(mHelper.hasGroupCacheBeenInvalidated()).isFalse(); } @Test @@ -6855,6 +6864,98 @@ public class PreferencesHelperTest extends UiServiceTestCase { assertThat(channels.getList().size()).isEqualTo(0); } + @Test + @EnableFlags(android.app.Flags.FLAG_NM_BINDER_PERF_CACHE_CHANNELS) + public void testInvalidateGroupCache_onlyChannelsChanged() { + // Channels change, but groups don't change; we should invalidate the channel cache, but + // not the group cache. + NotificationChannelGroup ncg = new NotificationChannelGroup("1", "group1"); + NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "group2"); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, ncg, true, UID_O, false); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, ncg2, true, UID_O, false); + + NotificationChannel channel = new NotificationChannel("id", "name", IMPORTANCE_DEFAULT); + channel.setGroup("1"); + mHelper.createNotificationChannel(PKG_O, UID_O, channel, true, false, + UID_O, false); + mHelper.resetCacheInvalidation(); + + // change channel to group 2 + NotificationChannel copy = channel.copy(); + copy.setGroup("2"); + mHelper.updateNotificationChannel(PKG_O, UID_O, copy, true, UID_O, false); + + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasGroupCacheBeenInvalidated()).isFalse(); + } + + @Test + @EnableFlags(android.app.Flags.FLAG_NM_BINDER_PERF_CACHE_CHANNELS) + public void testInvalidateGroupCache_onlyGroupsChanged() { + // Group info changes, but the channels associated with the group do not + NotificationChannelGroup ncg = new NotificationChannelGroup("1", "group1"); + NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "group2"); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, ncg, true, UID_O, false); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, ncg2, true, UID_O, false); + + NotificationChannel channel = new NotificationChannel("id", "name", IMPORTANCE_DEFAULT); + channel.setGroup("1"); + mHelper.createNotificationChannel(PKG_O, UID_O, channel, true, false, + UID_O, false); + mHelper.resetCacheInvalidation(); + + NotificationChannelGroup copy = ncg2.clone(); + copy.setDescription("hello world"); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, copy, true, UID_O, false); + + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isFalse(); + assertThat(mHelper.hasGroupCacheBeenInvalidated()).isTrue(); + } + + @Test + @EnableFlags(android.app.Flags.FLAG_NM_BINDER_PERF_CACHE_CHANNELS) + public void testInvalidateGroupCache_groupUnchanged() { + NotificationChannelGroup ncg = new NotificationChannelGroup("1", "group1"); + NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "group2"); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, ncg, true, UID_O, false); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, ncg2, true, UID_O, false); + + mHelper.resetCacheInvalidation(); + + NotificationChannelGroup copy = ncg.clone(); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, copy, true, UID_O, false); + + assertThat(mHelper.hasGroupCacheBeenInvalidated()).isFalse(); + } + + @Test + @EnableFlags(android.app.Flags.FLAG_NM_BINDER_PERF_CACHE_CHANNELS) + public void testInvalidateGroupCache_deletedGroups() { + NotificationChannelGroup ncg = new NotificationChannelGroup("1", "group1"); + NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "group2"); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, ncg, true, UID_O, false); + mHelper.createNotificationChannelGroup(PKG_O, UID_O, ncg2, true, UID_O, false); + + NotificationChannel channel = new NotificationChannel("id", "name", IMPORTANCE_DEFAULT); + channel.setGroup("1"); + mHelper.createNotificationChannel(PKG_O, UID_O, channel, true, false, + UID_O, false); + mHelper.resetCacheInvalidation(); + + // delete group 2: group cache should be cleared but not channel cache + // (doesn't change channel information) + mHelper.deleteNotificationChannelGroup(PKG_O, UID_O, "2", UID_O, false); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isFalse(); + assertThat(mHelper.hasGroupCacheBeenInvalidated()).isTrue(); + + mHelper.resetCacheInvalidation(); + + // Now delete group 1: there is a channel associated, which will also be deleted + mHelper.deleteNotificationChannelGroup(PKG_O, UID_O, "1", UID_O, false); + assertThat(mHelper.hasChannelCacheBeenInvalidated()).isTrue(); + assertThat(mHelper.hasGroupCacheBeenInvalidated()).isTrue(); + } + private static String dumpToString(PreferencesHelper helper) { StringWriter sw = new StringWriter(); try (PrintWriter pw = new PrintWriter(sw)) { @@ -6868,7 +6969,8 @@ public class PreferencesHelperTest extends UiServiceTestCase { // interact with the real IpcDataCache, and instead tracks whether or not the cache has been // invalidated since creation or the last reset. private static class TestPreferencesHelper extends PreferencesHelper { - private boolean mCacheInvalidated = false; + private boolean mChannelCacheInvalidated = false; + private boolean mGroupCacheInvalidated = false; TestPreferencesHelper(Context context, PackageManager pm, RankingHandler rankingHandler, ZenModeHelper zenHelper, PermissionHelper permHelper, PermissionManager permManager, @@ -6883,15 +6985,25 @@ public class PreferencesHelperTest extends UiServiceTestCase { @Override protected void invalidateNotificationChannelCache() { - mCacheInvalidated = true; + mChannelCacheInvalidated = true; + } + + @Override + protected void invalidateNotificationChannelGroupCache() { + mGroupCacheInvalidated = true; + } + + boolean hasChannelCacheBeenInvalidated() { + return mChannelCacheInvalidated; } - boolean hasCacheBeenInvalidated() { - return mCacheInvalidated; + boolean hasGroupCacheBeenInvalidated() { + return mGroupCacheInvalidated; } void resetCacheInvalidation() { - mCacheInvalidated = false; + mChannelCacheInvalidated = false; + mGroupCacheInvalidated = false; } } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java index ee8d7308f6b3..7ab55bf7e874 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java @@ -45,6 +45,9 @@ import static com.android.server.wm.TaskFragment.EMBEDDED_DIM_AREA_PARENT_TASK; import static com.android.server.wm.TaskFragment.EMBEDDED_DIM_AREA_TASK_FRAGMENT; import static com.android.server.wm.TaskFragment.EMBEDDING_DISALLOWED_MIN_DIMENSION_VIOLATION; import static com.android.server.wm.TaskFragment.EMBEDDING_DISALLOWED_UNTRUSTED_HOST; +import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_INVISIBLE; +import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_VISIBLE; +import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT; import static com.android.server.wm.WindowContainer.POSITION_TOP; import static org.junit.Assert.assertEquals; @@ -255,6 +258,74 @@ public class TaskFragmentTest extends WindowTestsBase { } @Test + public void testVisibilityBehindOpaqueTaskFragment_withTranslucentTaskFragmentInTask() { + final Task topTask = createTask(mDisplayContent); + final Rect top = new Rect(); + final Rect bottom = new Rect(); + topTask.getBounds().splitVertically(top, bottom); + + final TaskFragment taskFragmentA = createTaskFragmentWithActivity(topTask); + final TaskFragment taskFragmentB = createTaskFragmentWithActivity(topTask); + final TaskFragment taskFragmentC = createTaskFragmentWithActivity(topTask); + + // B and C split the task window. A is behind B. C is translucent. + taskFragmentA.setBounds(top); + taskFragmentB.setBounds(top); + taskFragmentC.setBounds(bottom); + taskFragmentA.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); + taskFragmentB.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); + taskFragmentC.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); + taskFragmentB.setAdjacentTaskFragments( + new TaskFragment.AdjacentSet(taskFragmentB, taskFragmentC)); + doReturn(true).when(taskFragmentC).isTranslucent(any()); + + // Ensure the activity below is visible + topTask.ensureActivitiesVisible(null /* starting */); + + // B and C should be visible. A should be invisible. + assertEquals(TASK_FRAGMENT_VISIBILITY_INVISIBLE, + taskFragmentA.getVisibility(null /* starting */)); + assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE, + taskFragmentB.getVisibility(null /* starting */)); + assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE, + taskFragmentC.getVisibility(null /* starting */)); + } + + @Test + public void testVisibilityBehindTranslucentTaskFragment() { + final Task topTask = createTask(mDisplayContent); + final Rect top = new Rect(); + final Rect bottom = new Rect(); + topTask.getBounds().splitVertically(top, bottom); + + final TaskFragment taskFragmentA = createTaskFragmentWithActivity(topTask); + final TaskFragment taskFragmentB = createTaskFragmentWithActivity(topTask); + final TaskFragment taskFragmentC = createTaskFragmentWithActivity(topTask); + + // B and C split the task window. A is behind B. B is translucent. + taskFragmentA.setBounds(top); + taskFragmentB.setBounds(top); + taskFragmentC.setBounds(bottom); + taskFragmentA.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); + taskFragmentB.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); + taskFragmentC.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW); + taskFragmentB.setAdjacentTaskFragments( + new TaskFragment.AdjacentSet(taskFragmentB, taskFragmentC)); + doReturn(true).when(taskFragmentB).isTranslucent(any()); + + // Ensure the activity below is visible + topTask.ensureActivitiesVisible(null /* starting */); + + // A, B and C should be visible. + assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE, + taskFragmentC.getVisibility(null /* starting */)); + assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE, + taskFragmentB.getVisibility(null /* starting */)); + assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT, + taskFragmentA.getVisibility(null /* starting */)); + } + + @Test public void testFindTopNonFinishingActivity_ignoresLaunchedFromBubbleActivities() { final ActivityOptions opts = ActivityOptions.makeBasic(); opts.setTaskAlwaysOnTop(true); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java index be79160c3a09..1323d8a59cef 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java @@ -26,6 +26,7 @@ import static android.permission.flags.Flags.FLAG_SENSITIVE_CONTENT_RECENTS_SCRE import static android.permission.flags.Flags.FLAG_SENSITIVE_NOTIFICATION_APP_PROTECTION; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.FLAG_OWN_FOCUS; +import static android.view.Display.FLAG_PRESENTATION; import static android.view.Display.INVALID_DISPLAY; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; @@ -36,6 +37,7 @@ import static android.view.WindowManager.LayoutParams.INVALID_WINDOW_TYPE; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; @@ -53,6 +55,7 @@ import static com.android.server.wm.AppCompatConfiguration.LETTERBOX_BACKGROUND_ import static com.android.server.wm.AppCompatConfiguration.LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING; import static com.android.server.wm.AppCompatConfiguration.LETTERBOX_BACKGROUND_SOLID_COLOR; import static com.android.server.wm.AppCompatConfiguration.LETTERBOX_BACKGROUND_WALLPAPER; +import static com.android.window.flags.Flags.FLAG_ENABLE_PRESENTATION_FOR_CONNECTED_DISPLAYS; import static com.google.common.truth.Truth.assertThat; @@ -99,6 +102,7 @@ import android.provider.Settings; import android.util.ArraySet; import android.util.MergedConfiguration; import android.view.ContentRecordingSession; +import android.view.DisplayInfo; import android.view.IWindow; import android.view.InputChannel; import android.view.InputDevice; @@ -1405,6 +1409,38 @@ public class WindowManagerServiceTests extends WindowTestsBase { assertEquals(activityWindowInfo2, activityWindowInfo3); } + @EnableFlags(FLAG_ENABLE_PRESENTATION_FOR_CONNECTED_DISPLAYS) + @Test + public void testPresentationHidesActivitiesBehind() { + DisplayInfo displayInfo = new DisplayInfo(); + displayInfo.copyFrom(mDisplayInfo); + displayInfo.flags = FLAG_PRESENTATION; + DisplayContent dc = createNewDisplay(displayInfo); + int displayId = dc.getDisplayId(); + doReturn(dc).when(mWm.mRoot).getDisplayContentOrCreate(displayId); + ActivityRecord activity = createActivityRecord(createTask(dc)); + assertTrue(activity.isVisible()); + + doReturn(true).when(() -> UserManager.isVisibleBackgroundUsersEnabled()); + int uid = 100000; // uid for non-system user + Session session = createTestSession(mAtm, 1234 /* pid */, uid); + int userId = UserHandle.getUserId(uid); + doReturn(false).when(mWm.mUmInternal).isUserVisible(eq(userId), eq(displayId)); + WindowManager.LayoutParams params = new WindowManager.LayoutParams( + LayoutParams.TYPE_PRESENTATION); + + final IWindow clientWindow = new TestIWindow(); + int result = mWm.addWindow(session, clientWindow, params, View.VISIBLE, displayId, + userId, WindowInsets.Type.defaultVisible(), null, new InsetsState(), + new InsetsSourceControl.Array(), new Rect(), new float[1]); + assertTrue(result >= WindowManagerGlobal.ADD_OKAY); + assertFalse(activity.isVisible()); + + final WindowState window = mWm.windowForClientLocked(session, clientWindow, false); + window.removeImmediately(); + assertTrue(activity.isVisible()); + } + @Test public void testAddOverlayWindowToUnassignedDisplay_notAllowed_ForVisibleBackgroundUsers() { doReturn(true).when(() -> UserManager.isVisibleBackgroundUsersEnabled()); @@ -1436,6 +1472,52 @@ public class WindowManagerServiceTests extends WindowTestsBase { } @Test + @EnableFlags(Flags.FLAG_FIX_HIDE_OVERLAY_API) + public void testUpdateOverlayWindows_singleWindowRequestsHiding_doNotHideOverlayWithSameUid() { + WindowState overlayWindow = newWindowBuilder("overlay_window", + TYPE_APPLICATION_OVERLAY).build(); + WindowState appWindow = newWindowBuilder("app_window", TYPE_APPLICATION).build(); + makeWindowVisible(appWindow, overlayWindow); + + int uid = 100000; + spyOn(appWindow); + spyOn(overlayWindow); + doReturn(true).when(appWindow).hideNonSystemOverlayWindowsWhenVisible(); + doReturn(uid).when(appWindow).getOwningUid(); + doReturn(uid).when(overlayWindow).getOwningUid(); + + mWm.updateNonSystemOverlayWindowsVisibilityIfNeeded(appWindow, true); + + verify(overlayWindow).setForceHideNonSystemOverlayWindowIfNeeded(false); + } + + @Test + @EnableFlags(Flags.FLAG_FIX_HIDE_OVERLAY_API) + public void testUpdateOverlayWindows_multipleWindowsRequestHiding_hideOverlaysWithAnyUids() { + WindowState overlayWindow = newWindowBuilder("overlay_window", + TYPE_APPLICATION_OVERLAY).build(); + WindowState appWindow1 = newWindowBuilder("app_window_1", TYPE_APPLICATION).build(); + WindowState appWindow2 = newWindowBuilder("app_window_2", TYPE_APPLICATION).build(); + makeWindowVisible(appWindow1, appWindow2, overlayWindow); + + int uid1 = 100000; + int uid2 = 100001; + spyOn(appWindow1); + spyOn(appWindow2); + spyOn(overlayWindow); + doReturn(true).when(appWindow1).hideNonSystemOverlayWindowsWhenVisible(); + doReturn(true).when(appWindow2).hideNonSystemOverlayWindowsWhenVisible(); + doReturn(uid1).when(appWindow1).getOwningUid(); + doReturn(uid1).when(overlayWindow).getOwningUid(); + doReturn(uid2).when(appWindow2).getOwningUid(); + + mWm.updateNonSystemOverlayWindowsVisibilityIfNeeded(appWindow1, true); + mWm.updateNonSystemOverlayWindowsVisibilityIfNeeded(appWindow2, true); + + verify(overlayWindow).setForceHideNonSystemOverlayWindowIfNeeded(true); + } + + @Test @EnableFlags(Flags.FLAG_REPARENT_WINDOW_TOKEN_API) public void reparentWindowContextToDisplayArea_newDisplay_reparented() { final WindowToken windowToken = createTestClientWindowToken(TYPE_NOTIFICATION_SHADE, |