diff options
531 files changed, 17313 insertions, 4634 deletions
diff --git a/Android.bp b/Android.bp index f97cf72a5d33..9b62b7af4558 100644 --- a/Android.bp +++ b/Android.bp @@ -49,8 +49,6 @@ java_defaults { "rs/java/**/*.java", ":framework-javastream-protos", - // TODO: Resolve circular library dependency and remove media1-srcs - ":media1-srcs", "core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl", "core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl", @@ -505,7 +503,11 @@ java_defaults { "media/java/android/media/session/ICallback.aidl", "media/java/android/media/session/IOnMediaKeyListener.aidl", "media/java/android/media/session/IOnVolumeKeyLongPressListener.aidl", + "media/java/android/media/session/ISession.aidl", "media/java/android/media/session/ISession2TokensListener.aidl", + "media/java/android/media/session/ISessionCallback.aidl", + "media/java/android/media/session/ISessionController.aidl", + "media/java/android/media/session/ISessionControllerCallback.aidl", "media/java/android/media/session/ISessionManager.aidl", "media/java/android/media/soundtrigger/ISoundTriggerDetectionService.aidl", "media/java/android/media/soundtrigger/ISoundTriggerDetectionServiceClient.aidl", @@ -520,6 +522,8 @@ java_defaults { "media/java/android/media/tv/ITvInputSessionCallback.aidl", "media/java/android/media/tv/ITvRemoteProvider.aidl", "media/java/android/media/tv/ITvRemoteServiceInput.aidl", + "media/java/android/service/media/IMediaBrowserService.aidl", + "media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl", "telecomm/java/com/android/internal/telecom/ICallRedirectionAdapter.aidl", "telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl", "telecomm/java/com/android/internal/telecom/ICallScreeningAdapter.aidl", @@ -922,6 +926,7 @@ filegroup { "core/java/android/annotation/UnsupportedAppUsage.java", "core/java/android/net/DhcpResults.java", "core/java/android/util/LocalLog.java", + "core/java/com/android/internal/annotations/GuardedBy.java", "core/java/com/android/internal/annotations/VisibleForTesting.java", "core/java/com/android/internal/util/HexDump.java", "core/java/com/android/internal/util/IndentingPrintWriter.java", diff --git a/api/current.txt b/api/current.txt index 10d1697e36ee..4a1fccf0b5ae 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5811,6 +5811,7 @@ package android.app { method public final void setInterruptionFilter(int); method public void setNotificationDelegate(@NonNull String); method public void setNotificationPolicy(@NonNull android.app.NotificationManager.Policy); + method public boolean shouldHideSilentStatusBarIcons(); method public boolean updateAutomaticZenRule(String, android.app.AutomaticZenRule); field public static final String ACTION_APP_BLOCK_STATE_CHANGED = "android.app.action.APP_BLOCK_STATE_CHANGED"; field public static final String ACTION_AUTOMATIC_ZEN_RULE = "android.app.action.AUTOMATIC_ZEN_RULE"; @@ -11232,6 +11233,7 @@ package android.content.pm { public class LauncherApps { method public java.util.List<android.content.pm.LauncherActivityInfo> getActivityList(String, android.os.UserHandle); + method @NonNull public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getAllPackageInstallerSessions(); method @Nullable public android.content.pm.LauncherApps.AppUsageLimit getAppUsageLimit(String, android.os.UserHandle); method public android.content.pm.ApplicationInfo getApplicationInfo(@NonNull String, int, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException; method public android.content.pm.LauncherApps.PinItemRequest getPinItemRequest(android.content.Intent); @@ -11248,13 +11250,16 @@ package android.content.pm { method public void pinShortcuts(@NonNull String, @NonNull java.util.List<java.lang.String>, @NonNull android.os.UserHandle); method public void registerCallback(android.content.pm.LauncherApps.Callback); method public void registerCallback(android.content.pm.LauncherApps.Callback, android.os.Handler); + method public void registerPackageInstallerSessionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.content.pm.PackageInstaller.SessionCallback); method public android.content.pm.LauncherActivityInfo resolveActivity(android.content.Intent, android.os.UserHandle); method public boolean shouldHideFromSuggestions(@NonNull String, @NonNull android.os.UserHandle); method public void startAppDetailsActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle); method public void startMainActivity(android.content.ComponentName, android.os.UserHandle, android.graphics.Rect, android.os.Bundle); + method public void startPackageInstallerSessionDetailsActivity(android.content.pm.PackageInstaller.SessionInfo, android.graphics.Rect, android.os.Bundle); method public void startShortcut(@NonNull String, @NonNull String, @Nullable android.graphics.Rect, @Nullable android.os.Bundle, @NonNull android.os.UserHandle); method public void startShortcut(@NonNull android.content.pm.ShortcutInfo, @Nullable android.graphics.Rect, @Nullable android.os.Bundle); method public void unregisterCallback(android.content.pm.LauncherApps.Callback); + method public void unregisterPackageInstallerSessionCallback(android.content.pm.PackageInstaller.SessionCallback); field public static final String ACTION_CONFIRM_PIN_APPWIDGET = "android.content.pm.action.CONFIRM_PIN_APPWIDGET"; field public static final String ACTION_CONFIRM_PIN_SHORTCUT = "android.content.pm.action.CONFIRM_PIN_SHORTCUT"; field public static final String EXTRA_PIN_ITEM_REQUEST = "android.content.pm.extra.PIN_ITEM_REQUEST"; @@ -11444,6 +11449,7 @@ package android.content.pm { method public long getSize(); method public int getStagedSessionErrorCode(); method public String getStagedSessionErrorMessage(); + method public android.os.UserHandle getUser(); method public boolean isActive(); method public boolean isMultiPackage(); method public boolean isSealed(); @@ -12978,7 +12984,7 @@ package android.database.sqlite { method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder removeOpenFlags(int); method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setCursorFactory(@Nullable android.database.sqlite.SQLiteDatabase.CursorFactory); method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setErrorHandler(@Nullable android.database.DatabaseErrorHandler); - method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setIdleConnectionTimeout(@IntRange(from=0) long); + method @Deprecated @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setIdleConnectionTimeout(@IntRange(from=0) long); method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setJournalMode(@NonNull String); method public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setLookasideConfig(@IntRange(from=0) int, @IntRange(from=0) int); method @NonNull public android.database.sqlite.SQLiteDatabase.OpenParams.Builder setOpenFlags(int); @@ -13039,7 +13045,7 @@ package android.database.sqlite { method public void onDowngrade(android.database.sqlite.SQLiteDatabase, int, int); method public void onOpen(android.database.sqlite.SQLiteDatabase); method public abstract void onUpgrade(android.database.sqlite.SQLiteDatabase, int, int); - method public void setIdleConnectionTimeout(@IntRange(from=0) long); + method @Deprecated public void setIdleConnectionTimeout(@IntRange(from=0) long); method public void setLookasideConfig(@IntRange(from=0) int, @IntRange(from=0) int); method public void setOpenParams(@NonNull android.database.sqlite.SQLiteDatabase.OpenParams); method public void setWriteAheadLoggingEnabled(boolean); @@ -13551,10 +13557,12 @@ package android.graphics { method public static android.graphics.Bitmap createScaledBitmap(@NonNull android.graphics.Bitmap, int, int, boolean); method public int describeContents(); method public void eraseColor(@ColorInt int); + method public void eraseColor(@ColorLong long); method @CheckResult public android.graphics.Bitmap extractAlpha(); method @CheckResult public android.graphics.Bitmap extractAlpha(android.graphics.Paint, int[]); method public int getAllocationByteCount(); method public int getByteCount(); + method public android.graphics.Color getColor(int, int); method @Nullable public android.graphics.ColorSpace getColorSpace(); method public android.graphics.Bitmap.Config getConfig(); method public int getDensity(); @@ -13580,6 +13588,7 @@ package android.graphics { method public void reconfigure(int, int, android.graphics.Bitmap.Config); method public void recycle(); method public boolean sameAs(android.graphics.Bitmap); + method public void setColorSpace(@NonNull android.graphics.ColorSpace); method public void setConfig(android.graphics.Bitmap.Config); method public void setDensity(int); method public void setHasAlpha(boolean); @@ -13766,8 +13775,10 @@ package android.graphics { method public void drawBitmapMesh(@NonNull android.graphics.Bitmap, int, int, @NonNull float[], int, @Nullable int[], int, @Nullable android.graphics.Paint); method public void drawCircle(float, float, float, @NonNull android.graphics.Paint); method public void drawColor(@ColorInt int); + method public void drawColor(@ColorLong long); method @Deprecated public void drawColor(@ColorInt int, @NonNull android.graphics.PorterDuff.Mode); method public void drawColor(@ColorInt int, @NonNull android.graphics.BlendMode); + method public void drawColor(@ColorLong long, @NonNull android.graphics.BlendMode); method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float, float, @NonNull android.graphics.RectF, float, float, @NonNull android.graphics.Paint); method public void drawDoubleRoundRect(@NonNull android.graphics.RectF, float[], @NonNull android.graphics.RectF, float[], @NonNull android.graphics.Paint); method public void drawLine(float, float, float, float, @NonNull android.graphics.Paint); @@ -14379,6 +14390,7 @@ package android.graphics { method @Nullable public android.graphics.BlendMode getBlendMode(); method @ColorInt public int getColor(); method public android.graphics.ColorFilter getColorFilter(); + method @ColorLong public long getColorLong(); method public boolean getFillPath(android.graphics.Path, android.graphics.Path); method public int getFlags(); method public String getFontFeatureSettings(); @@ -14399,6 +14411,7 @@ package android.graphics { method public float getRunAdvance(CharSequence, int, int, int, int, boolean, int); method public android.graphics.Shader getShader(); method @ColorInt public int getShadowLayerColor(); + method @ColorLong public long getShadowLayerColorLong(); method public float getShadowLayerDx(); method public float getShadowLayerDy(); method public float getShadowLayerRadius(); @@ -14453,6 +14466,7 @@ package android.graphics { method public void setAntiAlias(boolean); method public void setBlendMode(@Nullable android.graphics.BlendMode); method public void setColor(@ColorInt int); + method public void setColor(@ColorLong long); method public android.graphics.ColorFilter setColorFilter(android.graphics.ColorFilter); method public void setDither(boolean); method public void setElegantTextHeight(boolean); @@ -14469,6 +14483,7 @@ package android.graphics { method public android.graphics.PathEffect setPathEffect(android.graphics.PathEffect); method public android.graphics.Shader setShader(android.graphics.Shader); method public void setShadowLayer(float, float, float, @ColorInt int); + method public void setShadowLayer(float, float, float, @ColorLong long); method public void setStrikeThruText(boolean); method public void setStrokeCap(android.graphics.Paint.Cap); method public void setStrokeJoin(android.graphics.Paint.Join); @@ -25572,6 +25587,14 @@ package android.media { field public static final int PLAYER_STATE_PAUSED = 1003; // 0x3eb field public static final int PLAYER_STATE_PLAYING = 1004; // 0x3ec field public static final int PLAYER_STATE_PREPARED = 1002; // 0x3ea + field public static final int PREPARE_DRM_STATUS_KEY_EXCHANGE_ERROR = 7; // 0x7 + field public static final int PREPARE_DRM_STATUS_PREPARATION_ERROR = 3; // 0x3 + field public static final int PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR = 1; // 0x1 + field public static final int PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR = 2; // 0x2 + field public static final int PREPARE_DRM_STATUS_RESOURCE_BUSY = 5; // 0x5 + field public static final int PREPARE_DRM_STATUS_RESTORE_ERROR = 6; // 0x6 + field public static final int PREPARE_DRM_STATUS_SUCCESS = 0; // 0x0 + field public static final int PREPARE_DRM_STATUS_UNSUPPORTED_SCHEME = 4; // 0x4 field public static final int SEEK_CLOSEST = 3; // 0x3 field public static final int SEEK_CLOSEST_SYNC = 2; // 0x2 field public static final int SEEK_NEXT_SYNC = 1; // 0x1 @@ -30390,6 +30413,7 @@ package android.net.wifi.p2p { method public void removeLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener); method public void removeServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener); method public void requestConnectionInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener); + method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestDeviceInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.DeviceInfoListener); method public void requestDiscoveryState(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.DiscoveryStateListener); method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.GroupInfoListener); method public void requestNetworkInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.NetworkInfoListener); @@ -30438,6 +30462,10 @@ package android.net.wifi.p2p { method public void onConnectionInfoAvailable(android.net.wifi.p2p.WifiP2pInfo); } + public static interface WifiP2pManager.DeviceInfoListener { + method public void onDeviceInfoAvailable(android.net.wifi.p2p.WifiP2pDevice); + } + public static interface WifiP2pManager.DiscoveryStateListener { method public void onDiscoveryStateAvailable(int); } @@ -36522,7 +36550,7 @@ package android.provider { field public static final String ACCOUNT_TYPE_LOCAL = "LOCAL"; field public static final String ACTION_EVENT_REMINDER = "android.intent.action.EVENT_REMINDER"; field public static final String ACTION_HANDLE_CUSTOM_EVENT = "android.provider.calendar.action.HANDLE_CUSTOM_EVENT"; - field public static final String ACTION_VIEW_WORK_CALENDAR_EVENT = "android.provider.calendar.action.VIEW_WORK_CALENDAR_EVENT"; + field public static final String ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT = "android.provider.calendar.action.VIEW_MANAGED_PROFILE_CALENDAR_EVENT"; field public static final String AUTHORITY = "com.android.calendar"; field public static final String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter"; field public static final android.net.Uri CONTENT_URI; @@ -38482,13 +38510,13 @@ package android.provider { field public static final String BUCKET_ID = "bucket_id"; field public static final String DATE_TAKEN = "datetaken"; field public static final String DESCRIPTION = "description"; + field public static final String GROUP_ID = "group_id"; field public static final String IS_PRIVATE = "isprivate"; field @Deprecated public static final String LATITUDE = "latitude"; field @Deprecated public static final String LONGITUDE = "longitude"; field @Deprecated public static final String MINI_THUMB_MAGIC = "mini_thumb_magic"; field public static final String ORIENTATION = "orientation"; field @Deprecated public static final String PICASA_ID = "picasa_id"; - field public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id"; } public static final class MediaStore.Images.Media implements android.provider.MediaStore.Images.ImageColumns { @@ -38542,6 +38570,8 @@ package android.provider { field public static final String IS_TRASHED = "is_trashed"; field public static final String MIME_TYPE = "mime_type"; field public static final String OWNER_PACKAGE_NAME = "owner_package_name"; + field public static final String PRIMARY_DIRECTORY = "primary_directory"; + field public static final String SECONDARY_DIRECTORY = "secondary_directory"; field public static final String SIZE = "_size"; field public static final String TITLE = "title"; field public static final String WIDTH = "width"; @@ -38609,13 +38639,13 @@ package android.provider { field public static final String DATE_TAKEN = "datetaken"; field public static final String DESCRIPTION = "description"; field public static final String DURATION = "duration"; + field public static final String GROUP_ID = "group_id"; field public static final String IS_PRIVATE = "isprivate"; field public static final String LANGUAGE = "language"; field @Deprecated public static final String LATITUDE = "latitude"; field @Deprecated public static final String LONGITUDE = "longitude"; field @Deprecated public static final String MINI_THUMB_MAGIC = "mini_thumb_magic"; field public static final String RESOLUTION = "resolution"; - field public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id"; field public static final String TAGS = "tags"; } @@ -38839,6 +38869,7 @@ package android.provider { field @Deprecated public static final int LOCATION_MODE_BATTERY_SAVING = 2; // 0x2 field @Deprecated public static final int LOCATION_MODE_HIGH_ACCURACY = 3; // 0x3 field @Deprecated public static final int LOCATION_MODE_OFF = 0; // 0x0 + field @Deprecated public static final int LOCATION_MODE_ON = 3; // 0x3 field @Deprecated public static final int LOCATION_MODE_SENSORS_ONLY = 1; // 0x1 field @Deprecated public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed"; field @Deprecated public static final String LOCK_PATTERN_ENABLED = "lock_pattern_autolock"; @@ -41550,6 +41581,7 @@ package android.service.notification { method public void onNotificationRemoved(android.service.notification.StatusBarNotification); method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap); method public void onNotificationRemoved(android.service.notification.StatusBarNotification, android.service.notification.NotificationListenerService.RankingMap, int); + method public void onStatusBarIconsBehaviorChanged(boolean); method public final void requestInterruptionFilter(int); method public final void requestListenerHints(int); method public static void requestRebind(android.content.ComponentName); @@ -41862,10 +41894,6 @@ package android.service.voice { method public void showSession(android.os.Bundle, int); field public static final String SERVICE_INTERFACE = "android.service.voice.VoiceInteractionService"; field public static final String SERVICE_META_DATA = "android.voice_interaction"; - field public static final int VOICE_STATE_CONDITIONAL_LISTENING = 1; // 0x1 - field public static final int VOICE_STATE_FULFILLING = 3; // 0x3 - field public static final int VOICE_STATE_LISTENING = 2; // 0x2 - field public static final int VOICE_STATE_NONE = 0; // 0x0 } public class VoiceInteractionSession implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback { @@ -45057,6 +45085,7 @@ package android.telephony { method public boolean setVoiceMailNumber(String, String); method @Deprecated public void setVoicemailRingtoneUri(android.telecom.PhoneAccountHandle, android.net.Uri); method @Deprecated public void setVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle, boolean); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void switchMultiSimConfig(int); method public boolean updateAvailableNetworks(java.util.List<android.telephony.AvailableNetworkInfo>); field public static final String ACTION_CONFIGURE_VOICEMAIL = "android.telephony.action.CONFIGURE_VOICEMAIL"; field public static final String ACTION_NETWORK_COUNTRY_CHANGED = "android.telephony.action.NETWORK_COUNTRY_CHANGED"; @@ -52869,7 +52898,7 @@ package android.view.contentcapture { method @NonNull public final android.view.ViewStructure newVirtualViewStructure(@NonNull android.view.autofill.AutofillId, long); method public final void notifyViewAppeared(@NonNull android.view.ViewStructure); method public final void notifyViewDisappeared(@NonNull android.view.autofill.AutofillId); - method public final void notifyViewTextChanged(@NonNull android.view.autofill.AutofillId, @Nullable CharSequence, int); + method public final void notifyViewTextChanged(@NonNull android.view.autofill.AutofillId, @Nullable CharSequence); method public final void notifyViewsDisappeared(@NonNull android.view.autofill.AutofillId, @NonNull long[]); } @@ -52881,6 +52910,9 @@ package android.view.contentcapture { public final class UserDataRemovalRequest implements android.os.Parcelable { method public int describeContents(); + method @NonNull public String getPackageName(); + method @NonNull public java.util.List<android.view.contentcapture.UserDataRemovalRequest.UriRequest> getUriRequests(); + method public boolean isForEverything(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.view.contentcapture.UserDataRemovalRequest> CREATOR; } @@ -52892,6 +52924,11 @@ package android.view.contentcapture { method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder forEverything(); } + public final class UserDataRemovalRequest.UriRequest { + method @NonNull public android.net.Uri getUri(); + method @NonNull public boolean isRecursive(); + } + } package android.view.inputmethod { @@ -58111,13 +58148,13 @@ package java.io { ctor public ByteArrayOutputStream(int); method public void reset(); method public int size(); - method public byte[] toByteArray(); + method @NonNull public byte[] toByteArray(); method @NonNull public String toString(@NonNull String) throws java.io.UnsupportedEncodingException; method @Deprecated @NonNull public String toString(int); method public void write(int); - method public void write(byte[], int, int); + method public void write(@NonNull byte[], int, int); method public void writeTo(@NonNull java.io.OutputStream) throws java.io.IOException; - field protected byte[] buf; + field @NonNull protected byte[] buf; field protected int count; } @@ -58288,12 +58325,12 @@ package java.io { method public boolean isHidden(); method public long lastModified(); method public long length(); - method public String[] list(); - method public String[] list(@Nullable java.io.FilenameFilter); - method public java.io.File[] listFiles(); - method public java.io.File[] listFiles(@Nullable java.io.FilenameFilter); - method public java.io.File[] listFiles(@Nullable java.io.FileFilter); - method public static java.io.File[] listRoots(); + method @Nullable public String[] list(); + method @Nullable public String[] list(@Nullable java.io.FilenameFilter); + method @Nullable public java.io.File[] listFiles(); + method @Nullable public java.io.File[] listFiles(@Nullable java.io.FilenameFilter); + method @Nullable public java.io.File[] listFiles(@Nullable java.io.FileFilter); + method @NonNull public static java.io.File[] listRoots(); method public boolean mkdir(); method public boolean mkdirs(); method public boolean renameTo(@NonNull java.io.File); @@ -58782,8 +58819,8 @@ package java.io { method protected void clearError(); method public void close(); method public void flush(); - method @NonNull public java.io.PrintWriter format(@NonNull String, java.lang.Object...); - method @NonNull public java.io.PrintWriter format(@Nullable java.util.Locale, @NonNull String, java.lang.Object...); + method @NonNull public java.io.PrintWriter format(@NonNull String, @NonNull java.lang.Object...); + method @NonNull public java.io.PrintWriter format(@Nullable java.util.Locale, @NonNull String, @NonNull java.lang.Object...); method public void print(boolean); method public void print(char); method public void print(int); @@ -58793,8 +58830,8 @@ package java.io { method public void print(char[]); method public void print(@Nullable String); method public void print(@Nullable Object); - method @NonNull public java.io.PrintWriter printf(@NonNull String, java.lang.Object...); - method @NonNull public java.io.PrintWriter printf(@Nullable java.util.Locale, @NonNull String, java.lang.Object...); + method @NonNull public java.io.PrintWriter printf(@NonNull String, @NonNull java.lang.Object...); + method @NonNull public java.io.PrintWriter printf(@Nullable java.util.Locale, @NonNull String, @NonNull java.lang.Object...); method public void println(); method public void println(boolean); method public void println(char); @@ -59620,45 +59657,45 @@ package java.lang { method @NonNull public static Class<?> forName(@NonNull String) throws java.lang.ClassNotFoundException; method @NonNull public static Class<?> forName(@NonNull String, boolean, @Nullable ClassLoader) throws java.lang.ClassNotFoundException; method @Nullable public <A extends java.lang.annotation.Annotation> A getAnnotation(@NonNull Class<A>); - method public java.lang.annotation.Annotation[] getAnnotations(); + method @NonNull public java.lang.annotation.Annotation[] getAnnotations(); method @NonNull public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(@NonNull Class<A>); method @Nullable public String getCanonicalName(); method @Nullable public ClassLoader getClassLoader(); - method public Class<?>[] getClasses(); + method @NonNull public Class<?>[] getClasses(); method @Nullable public Class<?> getComponentType(); - method @NonNull public java.lang.reflect.Constructor<T> getConstructor(Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; - method public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException; + method @NonNull public java.lang.reflect.Constructor<T> getConstructor(@Nullable Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; + method @NonNull public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException; method @Nullable public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(@NonNull Class<A>); - method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); - method public Class<?>[] getDeclaredClasses(); - method @NonNull public java.lang.reflect.Constructor<T> getDeclaredConstructor(Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; - method public java.lang.reflect.Constructor<?>[] getDeclaredConstructors() throws java.lang.SecurityException; + method @NonNull public java.lang.annotation.Annotation[] getDeclaredAnnotations(); + method @NonNull public Class<?>[] getDeclaredClasses(); + method @NonNull public java.lang.reflect.Constructor<T> getDeclaredConstructor(@Nullable Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; + method @NonNull public java.lang.reflect.Constructor<?>[] getDeclaredConstructors() throws java.lang.SecurityException; method @NonNull public java.lang.reflect.Field getDeclaredField(@NonNull String) throws java.lang.NoSuchFieldException; - method public java.lang.reflect.Field[] getDeclaredFields(); - method @NonNull public java.lang.reflect.Method getDeclaredMethod(@NonNull String, Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; - method public java.lang.reflect.Method[] getDeclaredMethods() throws java.lang.SecurityException; + method @NonNull public java.lang.reflect.Field[] getDeclaredFields(); + method @NonNull public java.lang.reflect.Method getDeclaredMethod(@NonNull String, @Nullable Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; + method @NonNull public java.lang.reflect.Method[] getDeclaredMethods() throws java.lang.SecurityException; method @Nullable public Class<?> getDeclaringClass(); method @Nullable public Class<?> getEnclosingClass(); method @Nullable public java.lang.reflect.Constructor<?> getEnclosingConstructor(); method @Nullable public java.lang.reflect.Method getEnclosingMethod(); - method public T[] getEnumConstants(); + method @Nullable public T[] getEnumConstants(); method @NonNull public java.lang.reflect.Field getField(@NonNull String) throws java.lang.NoSuchFieldException; - method public java.lang.reflect.Field[] getFields() throws java.lang.SecurityException; - method public java.lang.reflect.Type[] getGenericInterfaces(); + method @NonNull public java.lang.reflect.Field[] getFields() throws java.lang.SecurityException; + method @NonNull public java.lang.reflect.Type[] getGenericInterfaces(); method @Nullable public java.lang.reflect.Type getGenericSuperclass(); - method public Class<?>[] getInterfaces(); - method @NonNull public java.lang.reflect.Method getMethod(@NonNull String, Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; - method public java.lang.reflect.Method[] getMethods() throws java.lang.SecurityException; + method @NonNull public Class<?>[] getInterfaces(); + method @NonNull public java.lang.reflect.Method getMethod(@NonNull String, @Nullable Class<?>...) throws java.lang.NoSuchMethodException, java.lang.SecurityException; + method @NonNull public java.lang.reflect.Method[] getMethods() throws java.lang.SecurityException; method public int getModifiers(); method @NonNull public String getName(); method @Nullable public Package getPackage(); method @Nullable public java.security.ProtectionDomain getProtectionDomain(); method @Nullable public java.net.URL getResource(@NonNull String); method @Nullable public java.io.InputStream getResourceAsStream(@NonNull String); - method public Object[] getSigners(); + method @Nullable public Object[] getSigners(); method @NonNull public String getSimpleName(); method @Nullable public Class<? super T> getSuperclass(); - method public java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters(); + method @NonNull public java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters(); method public boolean isAnnotation(); method public boolean isAnonymousClass(); method public boolean isArray(); @@ -60545,8 +60582,8 @@ package java.lang { method @NonNull public static String copyValueOf(char[]); method public boolean endsWith(@NonNull String); method public boolean equalsIgnoreCase(@Nullable String); - method @NonNull public static String format(@NonNull String, java.lang.Object...); - method @NonNull public static String format(@NonNull java.util.Locale, @NonNull String, java.lang.Object...); + method @NonNull public static String format(@NonNull String, @NonNull java.lang.Object...); + method @NonNull public static String format(@NonNull java.util.Locale, @NonNull String, @NonNull java.lang.Object...); method @Deprecated public void getBytes(int, int, byte[], int); method public byte[] getBytes(@NonNull String) throws java.io.UnsupportedEncodingException; method public byte[] getBytes(@NonNull java.nio.charset.Charset); @@ -60558,7 +60595,7 @@ package java.lang { method public int indexOf(@NonNull String, int); method @NonNull public String intern(); method public boolean isEmpty(); - method @NonNull public static String join(@NonNull CharSequence, java.lang.CharSequence...); + method @NonNull public static String join(@NonNull CharSequence, @Nullable java.lang.CharSequence...); method @NonNull public static String join(@NonNull CharSequence, @NonNull Iterable<? extends java.lang.CharSequence>); method public int lastIndexOf(int); method public int lastIndexOf(int, int); @@ -60573,8 +60610,8 @@ package java.lang { method @NonNull public String replace(@NonNull CharSequence, @NonNull CharSequence); method @NonNull public String replaceAll(@NonNull String, @NonNull String); method @NonNull public String replaceFirst(@NonNull String, @NonNull String); - method public String[] split(@NonNull String, int); - method public String[] split(@NonNull String); + method @NonNull public String[] split(@NonNull String, int); + method @NonNull public String[] split(@NonNull String); method public boolean startsWith(@NonNull String, int); method public boolean startsWith(@NonNull String); method @NonNull public CharSequence subSequence(int, int); @@ -60775,7 +60812,7 @@ package java.lang { method public long getId(); method @NonNull public final String getName(); method public final int getPriority(); - method public StackTraceElement[] getStackTrace(); + method @NonNull public StackTraceElement[] getStackTrace(); method @NonNull public java.lang.Thread.State getState(); method @Nullable public final ThreadGroup getThreadGroup(); method @Nullable public java.lang.Thread.UncaughtExceptionHandler getUncaughtExceptionHandler(); @@ -60873,13 +60910,13 @@ package java.lang { method @Nullable public Throwable getCause(); method @Nullable public String getLocalizedMessage(); method @Nullable public String getMessage(); - method public StackTraceElement[] getStackTrace(); - method public final Throwable[] getSuppressed(); + method @NonNull public StackTraceElement[] getStackTrace(); + method @NonNull public final Throwable[] getSuppressed(); method @NonNull public Throwable initCause(@Nullable Throwable); method public void printStackTrace(); method public void printStackTrace(@NonNull java.io.PrintStream); method public void printStackTrace(@NonNull java.io.PrintWriter); - method public void setStackTrace(StackTraceElement[]); + method public void setStackTrace(@NonNull StackTraceElement[]); } public class TypeNotPresentException extends java.lang.RuntimeException { @@ -61202,8 +61239,8 @@ package java.lang.reflect { public class AccessibleObject implements java.lang.reflect.AnnotatedElement { ctor protected AccessibleObject(); method @Nullable public <T extends java.lang.annotation.Annotation> T getAnnotation(@NonNull Class<T>); - method public java.lang.annotation.Annotation[] getAnnotations(); - method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); + method @NonNull public java.lang.annotation.Annotation[] getAnnotations(); + method @NonNull public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public boolean isAccessible(); method public static void setAccessible(java.lang.reflect.AccessibleObject[], boolean) throws java.lang.SecurityException; method public void setAccessible(boolean) throws java.lang.SecurityException; @@ -61211,10 +61248,10 @@ package java.lang.reflect { public interface AnnotatedElement { method @Nullable public <T extends java.lang.annotation.Annotation> T getAnnotation(@NonNull Class<T>); - method public java.lang.annotation.Annotation[] getAnnotations(); + method @NonNull public java.lang.annotation.Annotation[] getAnnotations(); method public default <T extends java.lang.annotation.Annotation> T[] getAnnotationsByType(@NonNull Class<T>); method @Nullable public default <T extends java.lang.annotation.Annotation> T getDeclaredAnnotation(@NonNull Class<T>); - method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); + method @NonNull public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method public default <T extends java.lang.annotation.Annotation> T[] getDeclaredAnnotationsByType(@NonNull Class<T>); method public default boolean isAnnotationPresent(@NonNull Class<? extends java.lang.annotation.Annotation>); } @@ -61249,20 +61286,20 @@ package java.lang.reflect { method public int getModifiers(); method @NonNull public String getName(); method public java.lang.annotation.Annotation[][] getParameterAnnotations(); - method public Class<?>[] getParameterTypes(); + method @NonNull public Class<?>[] getParameterTypes(); method public java.lang.reflect.TypeVariable<java.lang.reflect.Constructor<T>>[] getTypeParameters(); method @NonNull public T newInstance(java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.InstantiationException, java.lang.reflect.InvocationTargetException; method @NonNull public String toGenericString(); } public abstract class Executable extends java.lang.reflect.AccessibleObject implements java.lang.reflect.GenericDeclaration java.lang.reflect.Member { - method public abstract Class<?>[] getExceptionTypes(); - method public java.lang.reflect.Type[] getGenericExceptionTypes(); - method public java.lang.reflect.Type[] getGenericParameterTypes(); - method public abstract java.lang.annotation.Annotation[][] getParameterAnnotations(); + method @NonNull public abstract Class<?>[] getExceptionTypes(); + method @NonNull public java.lang.reflect.Type[] getGenericExceptionTypes(); + method @NonNull public java.lang.reflect.Type[] getGenericParameterTypes(); + method @NonNull public abstract java.lang.annotation.Annotation[][] getParameterAnnotations(); method public int getParameterCount(); - method public abstract Class<?>[] getParameterTypes(); - method public java.lang.reflect.Parameter[] getParameters(); + method @NonNull public abstract Class<?>[] getParameterTypes(); + method @NonNull public java.lang.reflect.Parameter[] getParameters(); method public final boolean isAnnotationPresent(@NonNull Class<? extends java.lang.annotation.Annotation>); method public boolean isSynthetic(); method public boolean isVarArgs(); @@ -61351,7 +61388,7 @@ package java.lang.reflect { method @NonNull public Class<?>[] getParameterTypes(); method @NonNull public Class<?> getReturnType(); method @NonNull public java.lang.reflect.TypeVariable<java.lang.reflect.Method>[] getTypeParameters(); - method @Nullable public Object invoke(@Nullable Object, java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException; + method @Nullable public Object invoke(@Nullable Object, @Nullable java.lang.Object...) throws java.lang.IllegalAccessException, java.lang.IllegalArgumentException, java.lang.reflect.InvocationTargetException; method public boolean isBridge(); method public boolean isDefault(); method @NonNull public String toGenericString(); @@ -61394,8 +61431,8 @@ package java.lang.reflect { public final class Parameter implements java.lang.reflect.AnnotatedElement { method @Nullable public <T extends java.lang.annotation.Annotation> T getAnnotation(@NonNull Class<T>); - method public java.lang.annotation.Annotation[] getAnnotations(); - method public java.lang.annotation.Annotation[] getDeclaredAnnotations(); + method @NonNull public java.lang.annotation.Annotation[] getAnnotations(); + method @NonNull public java.lang.annotation.Annotation[] getDeclaredAnnotations(); method @NonNull public java.lang.reflect.Executable getDeclaringExecutable(); method public int getModifiers(); method @NonNull public String getName(); @@ -61408,7 +61445,7 @@ package java.lang.reflect { } public interface ParameterizedType extends java.lang.reflect.Type { - method public java.lang.reflect.Type[] getActualTypeArguments(); + method @NonNull public java.lang.reflect.Type[] getActualTypeArguments(); method @Nullable public java.lang.reflect.Type getOwnerType(); method @NonNull public java.lang.reflect.Type getRawType(); } @@ -61416,9 +61453,9 @@ package java.lang.reflect { public class Proxy implements java.io.Serializable { ctor protected Proxy(@NonNull java.lang.reflect.InvocationHandler); method @NonNull public static java.lang.reflect.InvocationHandler getInvocationHandler(@NonNull Object) throws java.lang.IllegalArgumentException; - method @NonNull public static Class<?> getProxyClass(@Nullable ClassLoader, Class<?>...) throws java.lang.IllegalArgumentException; + method @NonNull public static Class<?> getProxyClass(@Nullable ClassLoader, @NonNull Class<?>...) throws java.lang.IllegalArgumentException; method public static boolean isProxyClass(@NonNull Class<?>); - method @NonNull public static Object newProxyInstance(@Nullable ClassLoader, Class<?>[], @NonNull java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException; + method @NonNull public static Object newProxyInstance(@Nullable ClassLoader, @NonNull Class<?>[], @NonNull java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException; field protected java.lang.reflect.InvocationHandler h; } @@ -61432,7 +61469,7 @@ package java.lang.reflect { } public interface TypeVariable<D extends java.lang.reflect.GenericDeclaration> extends java.lang.reflect.Type { - method public java.lang.reflect.Type[] getBounds(); + method @NonNull public java.lang.reflect.Type[] getBounds(); method @NonNull public D getGenericDeclaration(); method @NonNull public String getName(); } @@ -61444,8 +61481,8 @@ package java.lang.reflect { } public interface WildcardType extends java.lang.reflect.Type { - method public java.lang.reflect.Type[] getLowerBounds(); - method public java.lang.reflect.Type[] getUpperBounds(); + method @NonNull public java.lang.reflect.Type[] getLowerBounds(); + method @NonNull public java.lang.reflect.Type[] getUpperBounds(); } } @@ -62489,7 +62526,7 @@ package java.nio { public abstract class ByteBuffer extends java.nio.Buffer implements java.lang.Comparable<java.nio.ByteBuffer> { method @NonNull public static java.nio.ByteBuffer allocate(int); method @NonNull public static java.nio.ByteBuffer allocateDirect(int); - method public final byte[] array(); + method @NonNull public final byte[] array(); method public final int arrayOffset(); method @NonNull public abstract java.nio.CharBuffer asCharBuffer(); method @NonNull public abstract java.nio.DoubleBuffer asDoubleBuffer(); @@ -62503,8 +62540,8 @@ package java.nio { method @NonNull public abstract java.nio.ByteBuffer duplicate(); method public abstract byte get(); method public abstract byte get(int); - method @NonNull public java.nio.ByteBuffer get(byte[], int, int); - method @NonNull public java.nio.ByteBuffer get(byte[]); + method @NonNull public java.nio.ByteBuffer get(@NonNull byte[], int, int); + method @NonNull public java.nio.ByteBuffer get(@NonNull byte[]); method public abstract char getChar(); method public abstract char getChar(int); method public abstract double getDouble(); @@ -62523,8 +62560,8 @@ package java.nio { method @NonNull public abstract java.nio.ByteBuffer put(byte); method @NonNull public abstract java.nio.ByteBuffer put(int, byte); method @NonNull public java.nio.ByteBuffer put(@NonNull java.nio.ByteBuffer); - method @NonNull public java.nio.ByteBuffer put(byte[], int, int); - method @NonNull public final java.nio.ByteBuffer put(byte[]); + method @NonNull public java.nio.ByteBuffer put(@NonNull byte[], int, int); + method @NonNull public final java.nio.ByteBuffer put(@NonNull byte[]); method @NonNull public abstract java.nio.ByteBuffer putChar(char); method @NonNull public abstract java.nio.ByteBuffer putChar(int, char); method @NonNull public abstract java.nio.ByteBuffer putDouble(double); @@ -62538,8 +62575,8 @@ package java.nio { method @NonNull public abstract java.nio.ByteBuffer putShort(short); method @NonNull public abstract java.nio.ByteBuffer putShort(int, short); method @NonNull public abstract java.nio.ByteBuffer slice(); - method @NonNull public static java.nio.ByteBuffer wrap(byte[], int, int); - method @NonNull public static java.nio.ByteBuffer wrap(byte[]); + method @NonNull public static java.nio.ByteBuffer wrap(@NonNull byte[], int, int); + method @NonNull public static java.nio.ByteBuffer wrap(@NonNull byte[]); } public final class ByteOrder { @@ -64372,20 +64409,20 @@ package java.security { public abstract class MessageDigest extends java.security.MessageDigestSpi { ctor protected MessageDigest(@NonNull String); - method public byte[] digest(); - method public int digest(byte[], int, int) throws java.security.DigestException; - method public byte[] digest(byte[]); + method @NonNull public byte[] digest(); + method public int digest(@NonNull byte[], int, int) throws java.security.DigestException; + method @NonNull public byte[] digest(@NonNull byte[]); method @NonNull public final String getAlgorithm(); method public final int getDigestLength(); method @NonNull public static java.security.MessageDigest getInstance(@NonNull String) throws java.security.NoSuchAlgorithmException; method @NonNull public static java.security.MessageDigest getInstance(@NonNull String, @NonNull String) throws java.security.NoSuchAlgorithmException, java.security.NoSuchProviderException; method @NonNull public static java.security.MessageDigest getInstance(@NonNull String, @NonNull java.security.Provider) throws java.security.NoSuchAlgorithmException; method @NonNull public final java.security.Provider getProvider(); - method public static boolean isEqual(byte[], byte[]); + method public static boolean isEqual(@Nullable byte[], @Nullable byte[]); method public void reset(); method public void update(byte); - method public void update(byte[], int, int); - method public void update(byte[]); + method public void update(@NonNull byte[], int, int); + method public void update(@NonNull byte[]); method public final void update(@NonNull java.nio.ByteBuffer); } @@ -66992,7 +67029,7 @@ package java.text { method @NonNull public final StringBuffer format(@NonNull Object, @NonNull StringBuffer, @NonNull java.text.FieldPosition); method @NonNull public abstract StringBuffer format(@NonNull java.util.Date, @NonNull StringBuffer, @NonNull java.text.FieldPosition); method @NonNull public final String format(@NonNull java.util.Date); - method public static java.util.Locale[] getAvailableLocales(); + method @NonNull public static java.util.Locale[] getAvailableLocales(); method @NonNull public java.util.Calendar getCalendar(); method @NonNull public static final java.text.DateFormat getDateInstance(); method @NonNull public static final java.text.DateFormat getDateInstance(int); @@ -67232,7 +67269,7 @@ package java.text { method @NonNull public final String format(long); method @NonNull public abstract StringBuffer format(double, @NonNull StringBuffer, @NonNull java.text.FieldPosition); method @NonNull public abstract StringBuffer format(long, @NonNull StringBuffer, @NonNull java.text.FieldPosition); - method public static java.util.Locale[] getAvailableLocales(); + method @NonNull public static java.util.Locale[] getAvailableLocales(); method @Nullable public java.util.Currency getCurrency(); method @NonNull public static final java.text.NumberFormat getCurrencyInstance(); method @NonNull public static java.text.NumberFormat getCurrencyInstance(@NonNull java.util.Locale); @@ -68886,8 +68923,8 @@ package java.util { method public boolean remove(@Nullable Object); method public boolean removeAll(@NonNull java.util.Collection<?>); method public boolean retainAll(@NonNull java.util.Collection<?>); - method public Object[] toArray(); - method public <T> T[] toArray(T[]); + method @NonNull public Object[] toArray(); + method @NonNull public <T> T[] toArray(@NonNull T[]); } public abstract class AbstractList<E> extends java.util.AbstractCollection<E> implements java.util.List<E> { @@ -68996,161 +69033,161 @@ package java.util { } public class Arrays { - method @NonNull @java.lang.SafeVarargs public static <T> java.util.List<T> asList(T...); - method public static int binarySearch(long[], long); - method public static int binarySearch(long[], int, int, long); - method public static int binarySearch(int[], int); - method public static int binarySearch(int[], int, int, int); - method public static int binarySearch(short[], short); - method public static int binarySearch(short[], int, int, short); - method public static int binarySearch(char[], char); - method public static int binarySearch(char[], int, int, char); - method public static int binarySearch(byte[], byte); - method public static int binarySearch(byte[], int, int, byte); - method public static int binarySearch(double[], double); - method public static int binarySearch(double[], int, int, double); - method public static int binarySearch(float[], float); - method public static int binarySearch(float[], int, int, float); - method public static int binarySearch(Object[], @NonNull Object); - method public static int binarySearch(Object[], int, int, @NonNull Object); - method public static <T> int binarySearch(T[], T, @Nullable java.util.Comparator<? super T>); - method public static <T> int binarySearch(T[], int, int, T, @Nullable java.util.Comparator<? super T>); - method public static <T> T[] copyOf(T[], int); - method public static <T, U> T[] copyOf(U[], int, @NonNull Class<? extends T[]>); - method public static byte[] copyOf(byte[], int); - method public static short[] copyOf(short[], int); - method public static int[] copyOf(int[], int); - method public static long[] copyOf(long[], int); - method public static char[] copyOf(char[], int); - method public static float[] copyOf(float[], int); - method public static double[] copyOf(double[], int); - method public static boolean[] copyOf(boolean[], int); - method public static <T> T[] copyOfRange(T[], int, int); - method public static <T, U> T[] copyOfRange(U[], int, int, @NonNull Class<? extends T[]>); - method public static byte[] copyOfRange(byte[], int, int); - method public static short[] copyOfRange(short[], int, int); - method public static int[] copyOfRange(int[], int, int); - method public static long[] copyOfRange(long[], int, int); - method public static char[] copyOfRange(char[], int, int); - method public static float[] copyOfRange(float[], int, int); - method public static double[] copyOfRange(double[], int, int); - method public static boolean[] copyOfRange(boolean[], int, int); - method public static boolean deepEquals(Object[], Object[]); - method public static int deepHashCode(Object[]); - method @NonNull public static String deepToString(Object[]); - method public static boolean equals(long[], long[]); - method public static boolean equals(int[], int[]); - method public static boolean equals(short[], short[]); - method public static boolean equals(char[], char[]); - method public static boolean equals(byte[], byte[]); - method public static boolean equals(boolean[], boolean[]); - method public static boolean equals(double[], double[]); - method public static boolean equals(float[], float[]); - method public static boolean equals(Object[], Object[]); - method public static void fill(long[], long); - method public static void fill(long[], int, int, long); - method public static void fill(int[], int); - method public static void fill(int[], int, int, int); - method public static void fill(short[], short); - method public static void fill(short[], int, int, short); - method public static void fill(char[], char); - method public static void fill(char[], int, int, char); - method public static void fill(byte[], byte); - method public static void fill(byte[], int, int, byte); - method public static void fill(boolean[], boolean); - method public static void fill(boolean[], int, int, boolean); - method public static void fill(double[], double); - method public static void fill(double[], int, int, double); - method public static void fill(float[], float); - method public static void fill(float[], int, int, float); - method public static void fill(Object[], @Nullable Object); - method public static void fill(Object[], int, int, @Nullable Object); - method public static int hashCode(long[]); - method public static int hashCode(int[]); - method public static int hashCode(short[]); - method public static int hashCode(char[]); - method public static int hashCode(byte[]); - method public static int hashCode(boolean[]); - method public static int hashCode(float[]); - method public static int hashCode(double[]); - method public static int hashCode(Object[]); - method public static <T> void parallelPrefix(T[], @NonNull java.util.function.BinaryOperator<T>); - method public static <T> void parallelPrefix(T[], int, int, @NonNull java.util.function.BinaryOperator<T>); - method public static void parallelPrefix(long[], @NonNull java.util.function.LongBinaryOperator); - method public static void parallelPrefix(long[], int, int, @NonNull java.util.function.LongBinaryOperator); - method public static void parallelPrefix(double[], @NonNull java.util.function.DoubleBinaryOperator); - method public static void parallelPrefix(double[], int, int, @NonNull java.util.function.DoubleBinaryOperator); - method public static void parallelPrefix(int[], @NonNull java.util.function.IntBinaryOperator); - method public static void parallelPrefix(int[], int, int, @NonNull java.util.function.IntBinaryOperator); - method public static <T> void parallelSetAll(T[], @NonNull java.util.function.IntFunction<? extends T>); - method public static void parallelSetAll(int[], @NonNull java.util.function.IntUnaryOperator); - method public static void parallelSetAll(long[], @NonNull java.util.function.IntToLongFunction); - method public static void parallelSetAll(double[], @NonNull java.util.function.IntToDoubleFunction); - method public static void parallelSort(byte[]); - method public static void parallelSort(byte[], int, int); - method public static void parallelSort(char[]); - method public static void parallelSort(char[], int, int); - method public static void parallelSort(short[]); - method public static void parallelSort(short[], int, int); - method public static void parallelSort(int[]); - method public static void parallelSort(int[], int, int); - method public static void parallelSort(long[]); - method public static void parallelSort(long[], int, int); - method public static void parallelSort(float[]); - method public static void parallelSort(float[], int, int); - method public static void parallelSort(double[]); - method public static void parallelSort(double[], int, int); - method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[]); - method public static <T extends java.lang.Comparable<? super T>> void parallelSort(T[], int, int); - method public static <T> void parallelSort(T[], @Nullable java.util.Comparator<? super T>); - method public static <T> void parallelSort(T[], int, int, @Nullable java.util.Comparator<? super T>); - method public static <T> void setAll(T[], @NonNull java.util.function.IntFunction<? extends T>); - method public static void setAll(int[], @NonNull java.util.function.IntUnaryOperator); - method public static void setAll(long[], @NonNull java.util.function.IntToLongFunction); - method public static void setAll(double[], @NonNull java.util.function.IntToDoubleFunction); - method public static void sort(int[]); - method public static void sort(int[], int, int); - method public static void sort(long[]); - method public static void sort(long[], int, int); - method public static void sort(short[]); - method public static void sort(short[], int, int); - method public static void sort(char[]); - method public static void sort(char[], int, int); - method public static void sort(byte[]); - method public static void sort(byte[], int, int); - method public static void sort(float[]); - method public static void sort(float[], int, int); - method public static void sort(double[]); - method public static void sort(double[], int, int); - method public static void sort(Object[]); - method public static void sort(Object[], int, int); - method public static <T> void sort(T[], @Nullable java.util.Comparator<? super T>); - method public static <T> void sort(T[], int, int, @Nullable java.util.Comparator<? super T>); - method @NonNull public static <T> java.util.Spliterator<T> spliterator(T[]); - method @NonNull public static <T> java.util.Spliterator<T> spliterator(T[], int, int); - method @NonNull public static java.util.Spliterator.OfInt spliterator(int[]); - method @NonNull public static java.util.Spliterator.OfInt spliterator(int[], int, int); - method @NonNull public static java.util.Spliterator.OfLong spliterator(long[]); - method @NonNull public static java.util.Spliterator.OfLong spliterator(long[], int, int); - method @NonNull public static java.util.Spliterator.OfDouble spliterator(double[]); - method @NonNull public static java.util.Spliterator.OfDouble spliterator(double[], int, int); - method @NonNull public static <T> java.util.stream.Stream<T> stream(T[]); - method @NonNull public static <T> java.util.stream.Stream<T> stream(T[], int, int); - method @NonNull public static java.util.stream.IntStream stream(int[]); - method @NonNull public static java.util.stream.IntStream stream(int[], int, int); - method @NonNull public static java.util.stream.LongStream stream(long[]); - method @NonNull public static java.util.stream.LongStream stream(long[], int, int); - method @NonNull public static java.util.stream.DoubleStream stream(double[]); - method @NonNull public static java.util.stream.DoubleStream stream(double[], int, int); - method @NonNull public static String toString(long[]); - method @NonNull public static String toString(int[]); - method @NonNull public static String toString(short[]); - method @NonNull public static String toString(char[]); - method @NonNull public static String toString(byte[]); - method @NonNull public static String toString(boolean[]); - method @NonNull public static String toString(float[]); - method @NonNull public static String toString(double[]); - method @NonNull public static String toString(Object[]); + method @NonNull @java.lang.SafeVarargs public static <T> java.util.List<T> asList(@NonNull T...); + method public static int binarySearch(@NonNull long[], long); + method public static int binarySearch(@NonNull long[], int, int, long); + method public static int binarySearch(@NonNull int[], int); + method public static int binarySearch(@NonNull int[], int, int, int); + method public static int binarySearch(@NonNull short[], short); + method public static int binarySearch(@NonNull short[], int, int, short); + method public static int binarySearch(@NonNull char[], char); + method public static int binarySearch(@NonNull char[], int, int, char); + method public static int binarySearch(@NonNull byte[], byte); + method public static int binarySearch(@NonNull byte[], int, int, byte); + method public static int binarySearch(@NonNull double[], double); + method public static int binarySearch(@NonNull double[], int, int, double); + method public static int binarySearch(@NonNull float[], float); + method public static int binarySearch(@NonNull float[], int, int, float); + method public static int binarySearch(@NonNull Object[], @NonNull Object); + method public static int binarySearch(@NonNull Object[], int, int, @NonNull Object); + method public static <T> int binarySearch(@NonNull T[], T, @Nullable java.util.Comparator<? super T>); + method public static <T> int binarySearch(@NonNull T[], int, int, T, @Nullable java.util.Comparator<? super T>); + method @NonNull public static <T> T[] copyOf(@NonNull T[], int); + method @NonNull public static <T, U> T[] copyOf(@NonNull U[], int, @NonNull Class<? extends T[]>); + method @NonNull public static byte[] copyOf(@NonNull byte[], int); + method @NonNull public static short[] copyOf(@NonNull short[], int); + method @NonNull public static int[] copyOf(@NonNull int[], int); + method @NonNull public static long[] copyOf(@NonNull long[], int); + method @NonNull public static char[] copyOf(@NonNull char[], int); + method @NonNull public static float[] copyOf(@NonNull float[], int); + method @NonNull public static double[] copyOf(@NonNull double[], int); + method @NonNull public static boolean[] copyOf(@NonNull boolean[], int); + method @NonNull public static <T> T[] copyOfRange(@NonNull T[], int, int); + method @NonNull public static <T, U> T[] copyOfRange(@NonNull U[], int, int, @NonNull Class<? extends T[]>); + method @NonNull public static byte[] copyOfRange(@NonNull byte[], int, int); + method @NonNull public static short[] copyOfRange(@NonNull short[], int, int); + method @NonNull public static int[] copyOfRange(@NonNull int[], int, int); + method @NonNull public static long[] copyOfRange(@NonNull long[], int, int); + method @NonNull public static char[] copyOfRange(@NonNull char[], int, int); + method @NonNull public static float[] copyOfRange(@NonNull float[], int, int); + method @NonNull public static double[] copyOfRange(@NonNull double[], int, int); + method @NonNull public static boolean[] copyOfRange(@NonNull boolean[], int, int); + method public static boolean deepEquals(@Nullable Object[], @Nullable Object[]); + method public static int deepHashCode(@Nullable Object[]); + method @NonNull public static String deepToString(@Nullable Object[]); + method public static boolean equals(@Nullable long[], @Nullable long[]); + method public static boolean equals(@Nullable int[], @Nullable int[]); + method public static boolean equals(@Nullable short[], @Nullable short[]); + method public static boolean equals(@Nullable char[], @Nullable char[]); + method public static boolean equals(@Nullable byte[], @Nullable byte[]); + method public static boolean equals(@Nullable boolean[], @Nullable boolean[]); + method public static boolean equals(@Nullable double[], @Nullable double[]); + method public static boolean equals(@Nullable float[], @Nullable float[]); + method public static boolean equals(@Nullable Object[], @Nullable Object[]); + method public static void fill(@NonNull long[], long); + method public static void fill(@NonNull long[], int, int, long); + method public static void fill(@NonNull int[], int); + method public static void fill(@NonNull int[], int, int, int); + method public static void fill(@NonNull short[], short); + method public static void fill(@NonNull short[], int, int, short); + method public static void fill(@NonNull char[], char); + method public static void fill(@NonNull char[], int, int, char); + method public static void fill(@NonNull byte[], byte); + method public static void fill(@NonNull byte[], int, int, byte); + method public static void fill(@NonNull boolean[], boolean); + method public static void fill(@NonNull boolean[], int, int, boolean); + method public static void fill(@NonNull double[], double); + method public static void fill(@NonNull double[], int, int, double); + method public static void fill(@NonNull float[], float); + method public static void fill(@NonNull float[], int, int, float); + method public static void fill(@NonNull Object[], @Nullable Object); + method public static void fill(@NonNull Object[], int, int, @Nullable Object); + method public static int hashCode(@Nullable long[]); + method public static int hashCode(@Nullable int[]); + method public static int hashCode(@Nullable short[]); + method public static int hashCode(@Nullable char[]); + method public static int hashCode(@Nullable byte[]); + method public static int hashCode(@Nullable boolean[]); + method public static int hashCode(@Nullable float[]); + method public static int hashCode(@Nullable double[]); + method public static int hashCode(@Nullable Object[]); + method public static <T> void parallelPrefix(@NonNull T[], @NonNull java.util.function.BinaryOperator<T>); + method public static <T> void parallelPrefix(@NonNull T[], int, int, @NonNull java.util.function.BinaryOperator<T>); + method public static void parallelPrefix(@NonNull long[], @NonNull java.util.function.LongBinaryOperator); + method public static void parallelPrefix(@NonNull long[], int, int, @NonNull java.util.function.LongBinaryOperator); + method public static void parallelPrefix(@NonNull double[], @NonNull java.util.function.DoubleBinaryOperator); + method public static void parallelPrefix(@NonNull double[], int, int, @NonNull java.util.function.DoubleBinaryOperator); + method public static void parallelPrefix(@NonNull int[], @NonNull java.util.function.IntBinaryOperator); + method public static void parallelPrefix(@NonNull int[], int, int, @NonNull java.util.function.IntBinaryOperator); + method public static <T> void parallelSetAll(@NonNull T[], @NonNull java.util.function.IntFunction<? extends T>); + method public static void parallelSetAll(@NonNull int[], @NonNull java.util.function.IntUnaryOperator); + method public static void parallelSetAll(@NonNull long[], @NonNull java.util.function.IntToLongFunction); + method public static void parallelSetAll(@NonNull double[], @NonNull java.util.function.IntToDoubleFunction); + method public static void parallelSort(@NonNull byte[]); + method public static void parallelSort(@NonNull byte[], int, int); + method public static void parallelSort(@NonNull char[]); + method public static void parallelSort(@NonNull char[], int, int); + method public static void parallelSort(@NonNull short[]); + method public static void parallelSort(@NonNull short[], int, int); + method public static void parallelSort(@NonNull int[]); + method public static void parallelSort(@NonNull int[], int, int); + method public static void parallelSort(@NonNull long[]); + method public static void parallelSort(@NonNull long[], int, int); + method public static void parallelSort(@NonNull float[]); + method public static void parallelSort(@NonNull float[], int, int); + method public static void parallelSort(@NonNull double[]); + method public static void parallelSort(@NonNull double[], int, int); + method public static <T extends java.lang.Comparable<? super T>> void parallelSort(@NonNull T[]); + method public static <T extends java.lang.Comparable<? super T>> void parallelSort(@NonNull T[], int, int); + method public static <T> void parallelSort(@NonNull T[], @Nullable java.util.Comparator<? super T>); + method public static <T> void parallelSort(@NonNull T[], int, int, @Nullable java.util.Comparator<? super T>); + method public static <T> void setAll(@NonNull T[], @NonNull java.util.function.IntFunction<? extends T>); + method public static void setAll(@NonNull int[], @NonNull java.util.function.IntUnaryOperator); + method public static void setAll(@NonNull long[], @NonNull java.util.function.IntToLongFunction); + method public static void setAll(@NonNull double[], @NonNull java.util.function.IntToDoubleFunction); + method public static void sort(@NonNull int[]); + method public static void sort(@NonNull int[], int, int); + method public static void sort(@NonNull long[]); + method public static void sort(@NonNull long[], int, int); + method public static void sort(@NonNull short[]); + method public static void sort(@NonNull short[], int, int); + method public static void sort(@NonNull char[]); + method public static void sort(@NonNull char[], int, int); + method public static void sort(@NonNull byte[]); + method public static void sort(@NonNull byte[], int, int); + method public static void sort(@NonNull float[]); + method public static void sort(@NonNull float[], int, int); + method public static void sort(@NonNull double[]); + method public static void sort(@NonNull double[], int, int); + method public static void sort(@NonNull Object[]); + method public static void sort(@NonNull Object[], int, int); + method public static <T> void sort(@NonNull T[], @Nullable java.util.Comparator<? super T>); + method public static <T> void sort(@NonNull T[], int, int, @Nullable java.util.Comparator<? super T>); + method @NonNull public static <T> java.util.Spliterator<T> spliterator(@NonNull T[]); + method @NonNull public static <T> java.util.Spliterator<T> spliterator(@NonNull T[], int, int); + method @NonNull public static java.util.Spliterator.OfInt spliterator(@NonNull int[]); + method @NonNull public static java.util.Spliterator.OfInt spliterator(@NonNull int[], int, int); + method @NonNull public static java.util.Spliterator.OfLong spliterator(@NonNull long[]); + method @NonNull public static java.util.Spliterator.OfLong spliterator(@NonNull long[], int, int); + method @NonNull public static java.util.Spliterator.OfDouble spliterator(@NonNull double[]); + method @NonNull public static java.util.Spliterator.OfDouble spliterator(@NonNull double[], int, int); + method @NonNull public static <T> java.util.stream.Stream<T> stream(@NonNull T[]); + method @NonNull public static <T> java.util.stream.Stream<T> stream(@NonNull T[], int, int); + method @NonNull public static java.util.stream.IntStream stream(@NonNull int[]); + method @NonNull public static java.util.stream.IntStream stream(@NonNull int[], int, int); + method @NonNull public static java.util.stream.LongStream stream(@NonNull long[]); + method @NonNull public static java.util.stream.LongStream stream(@NonNull long[], int, int); + method @NonNull public static java.util.stream.DoubleStream stream(@NonNull double[]); + method @NonNull public static java.util.stream.DoubleStream stream(@NonNull double[], int, int); + method @NonNull public static String toString(@Nullable long[]); + method @NonNull public static String toString(@Nullable int[]); + method @NonNull public static String toString(@Nullable short[]); + method @NonNull public static String toString(@Nullable char[]); + method @NonNull public static String toString(@Nullable byte[]); + method @NonNull public static String toString(@Nullable boolean[]); + method @NonNull public static String toString(@Nullable float[]); + method @NonNull public static String toString(@Nullable double[]); + method @NonNull public static String toString(@Nullable Object[]); } public class Base64 { @@ -69234,7 +69271,7 @@ package java.util { method public int getActualMaximum(int); method public int getActualMinimum(int); method @NonNull public static java.util.Set<java.lang.String> getAvailableCalendarTypes(); - method public static java.util.Locale[] getAvailableLocales(); + method @NonNull public static java.util.Locale[] getAvailableLocales(); method @NonNull public String getCalendarType(); method @Nullable public String getDisplayName(int, int, @NonNull java.util.Locale); method @Nullable public java.util.Map<java.lang.String,java.lang.Integer> getDisplayNames(int, int, @NonNull java.util.Locale); @@ -69322,8 +69359,8 @@ package java.util { field public static final int YEAR = 1; // 0x1 field public static final int ZONE_OFFSET = 15; // 0xf field protected boolean areFieldsSet; - field protected int[] fields; - field protected boolean[] isSet; + field @NonNull protected int[] fields; + field @NonNull protected boolean[] isSet; field protected boolean isTimeSet; field protected long time; } @@ -69334,7 +69371,7 @@ package java.util { method @NonNull public java.util.Calendar.Builder set(int, int); method @NonNull public java.util.Calendar.Builder setCalendarType(@NonNull String); method @NonNull public java.util.Calendar.Builder setDate(int, int, int); - method @NonNull public java.util.Calendar.Builder setFields(int...); + method @NonNull public java.util.Calendar.Builder setFields(@NonNull int...); method @NonNull public java.util.Calendar.Builder setInstant(long); method @NonNull public java.util.Calendar.Builder setInstant(@NonNull java.util.Date); method @NonNull public java.util.Calendar.Builder setLenient(boolean); @@ -69364,12 +69401,12 @@ package java.util { method public int size(); method @NonNull public default java.util.Spliterator<E> spliterator(); method @NonNull public default java.util.stream.Stream<E> stream(); - method public Object[] toArray(); - method public <T> T[] toArray(T[]); + method @NonNull public Object[] toArray(); + method @NonNull public <T> T[] toArray(@NonNull T[]); } public class Collections { - method @java.lang.SafeVarargs public static <T> boolean addAll(@NonNull java.util.Collection<? super T>, T...); + method @java.lang.SafeVarargs public static <T> boolean addAll(@NonNull java.util.Collection<? super T>, @NonNull T...); method @NonNull public static <T> java.util.Queue<T> asLifoQueue(@NonNull java.util.Deque<T>); method public static <T> int binarySearch(@NonNull java.util.List<? extends java.lang.Comparable<? super T>>, @NonNull T); method public static <T> int binarySearch(@NonNull java.util.List<? extends T>, T, @Nullable java.util.Comparator<? super T>); @@ -69887,7 +69924,7 @@ package java.util { method @NonNull public static java.util.List<java.lang.String> filterTags(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Collection<java.lang.String>, @NonNull java.util.Locale.FilteringMode); method @NonNull public static java.util.List<java.lang.String> filterTags(@NonNull java.util.List<java.util.Locale.LanguageRange>, @NonNull java.util.Collection<java.lang.String>); method @NonNull public static java.util.Locale forLanguageTag(@NonNull String); - method public static java.util.Locale[] getAvailableLocales(); + method @NonNull public static java.util.Locale[] getAvailableLocales(); method @NonNull public String getCountry(); method @NonNull public static java.util.Locale getDefault(); method @NonNull public static java.util.Locale getDefault(@NonNull java.util.Locale.Category); @@ -69905,8 +69942,8 @@ package java.util { method @NonNull public java.util.Set<java.lang.Character> getExtensionKeys(); method @NonNull public String getISO3Country() throws java.util.MissingResourceException; method @NonNull public String getISO3Language() throws java.util.MissingResourceException; - method public static String[] getISOCountries(); - method public static String[] getISOLanguages(); + method @NonNull public static String[] getISOCountries(); + method @NonNull public static String[] getISOLanguages(); method @NonNull public String getLanguage(); method @NonNull public String getScript(); method @NonNull public java.util.Set<java.lang.String> getUnicodeLocaleAttributes(); @@ -70100,7 +70137,7 @@ package java.util { method public static <T> int compare(T, T, @NonNull java.util.Comparator<? super T>); method public static boolean deepEquals(@Nullable Object, @Nullable Object); method public static boolean equals(@Nullable Object, @Nullable Object); - method public static int hash(java.lang.Object...); + method public static int hash(@Nullable java.lang.Object...); method public static int hashCode(@Nullable Object); method public static boolean isNull(@Nullable Object); method public static boolean nonNull(@Nullable Object); @@ -70765,7 +70802,7 @@ package java.util { method public void addElement(E); method public int capacity(); method @NonNull public Object clone(); - method public void copyInto(Object[]); + method public void copyInto(@NonNull Object[]); method public E elementAt(int); method @NonNull public java.util.Enumeration<E> elements(); method public void ensureCapacity(int); @@ -70785,7 +70822,7 @@ package java.util { method public void trimToSize(); field protected int capacityIncrement; field protected int elementCount; - field protected Object[] elementData; + field @NonNull protected Object[] elementData; } public class WeakHashMap<K, V> extends java.util.AbstractMap<K,V> implements java.util.Map<K,V> { @@ -71176,7 +71213,7 @@ package java.util.concurrent { public class CopyOnWriteArrayList<E> implements java.lang.Cloneable java.util.List<E> java.util.RandomAccess java.io.Serializable { ctor public CopyOnWriteArrayList(); ctor public CopyOnWriteArrayList(@NonNull java.util.Collection<? extends E>); - ctor public CopyOnWriteArrayList(E[]); + ctor public CopyOnWriteArrayList(@NonNull E[]); method public boolean add(E); method public void add(int, E); method public boolean addAll(@NonNull java.util.Collection<? extends E>); @@ -71204,8 +71241,8 @@ package java.util.concurrent { method public E set(int, E); method public int size(); method @NonNull public java.util.List<E> subList(int, int); - method public Object[] toArray(); - method public <T> T[] toArray(T[]); + method @NonNull public Object[] toArray(); + method @NonNull public <T> T[] toArray(@NonNull T[]); } public class CopyOnWriteArraySet<E> extends java.util.AbstractSet<E> implements java.io.Serializable { @@ -72957,7 +72994,7 @@ package java.util.logging { method public void config(@NonNull java.util.function.Supplier<java.lang.String>); method public void entering(@Nullable String, @Nullable String); method public void entering(@Nullable String, @Nullable String, @Nullable Object); - method public void entering(@Nullable String, @Nullable String, Object[]); + method public void entering(@Nullable String, @Nullable String, @Nullable Object[]); method public void exiting(@Nullable String, @Nullable String); method public void exiting(@Nullable String, @Nullable String, @Nullable Object); method public void fine(@Nullable String); @@ -72970,7 +73007,7 @@ package java.util.logging { method @NonNull public static java.util.logging.Logger getAnonymousLogger(@Nullable String); method @Nullable public java.util.logging.Filter getFilter(); method @NonNull public static final java.util.logging.Logger getGlobal(); - method public java.util.logging.Handler[] getHandlers(); + method @NonNull public java.util.logging.Handler[] getHandlers(); method @Nullable public java.util.logging.Level getLevel(); method @NonNull public static java.util.logging.Logger getLogger(@NonNull String); method @NonNull public static java.util.logging.Logger getLogger(@NonNull String, @Nullable String); @@ -72986,7 +73023,7 @@ package java.util.logging { method public void log(@NonNull java.util.logging.Level, @Nullable String); method public void log(@NonNull java.util.logging.Level, @NonNull java.util.function.Supplier<java.lang.String>); method public void log(@NonNull java.util.logging.Level, @Nullable String, @Nullable Object); - method public void log(@NonNull java.util.logging.Level, @Nullable String, Object[]); + method public void log(@NonNull java.util.logging.Level, @Nullable String, @Nullable Object[]); method public void log(@NonNull java.util.logging.Level, @Nullable String, @Nullable Throwable); method public void log(@NonNull java.util.logging.Level, @Nullable Throwable, @NonNull java.util.function.Supplier<java.lang.String>); method public void logp(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String); @@ -72997,8 +73034,8 @@ package java.util.logging { method public void logp(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable Throwable, @NonNull java.util.function.Supplier<java.lang.String>); method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String); method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, @Nullable Object); - method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, Object[]); - method public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable java.util.ResourceBundle, @Nullable String, java.lang.Object...); + method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, @Nullable Object[]); + method public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable java.util.ResourceBundle, @Nullable String, @Nullable java.lang.Object...); method @Deprecated public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable String, @Nullable String, @Nullable Throwable); method public void logrb(@NonNull java.util.logging.Level, @Nullable String, @Nullable String, @Nullable java.util.ResourceBundle, @Nullable String, @Nullable Throwable); method public void removeHandler(@Nullable java.util.logging.Handler) throws java.lang.SecurityException; @@ -73260,8 +73297,8 @@ package java.util.regex { method public static boolean matches(@NonNull String, @NonNull CharSequence); method @NonNull public String pattern(); method @NonNull public static String quote(@NonNull String); - method public String[] split(@NonNull CharSequence, int); - method public String[] split(@NonNull CharSequence); + method @NonNull public String[] split(@NonNull CharSequence, int); + method @NonNull public String[] split(@NonNull CharSequence); method @NonNull public java.util.stream.Stream<java.lang.String> splitAsStream(@NonNull CharSequence); field public static final int CANON_EQ = 128; // 0x80 field public static final int CASE_INSENSITIVE = 2; // 0x2 diff --git a/api/system-current.txt b/api/system-current.txt index d3d9c220f12a..d67974b3bf72 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -501,6 +501,13 @@ package android.app { method public org.json.JSONObject toJson() throws org.json.JSONException; } + public class NotificationManager { + method @Nullable public android.content.ComponentName getAllowedNotificationAssistant(); + method @Nullable public android.content.ComponentName getAllowedNotificationAssistantForUser(android.os.UserHandle); + method public void setNotificationAssistantAccessGranted(android.content.ComponentName, boolean); + method public void setNotificationAssistantAccessGrantedForUser(android.content.ComponentName, android.os.UserHandle, boolean); + } + public final class StatsManager { method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void addConfig(long, byte[]) throws android.app.StatsManager.StatsUnavailableException; method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public boolean addConfiguration(long, byte[]); @@ -983,6 +990,7 @@ package android.app.prediction { } public static final class AppPredictionContext.Builder { + ctor public AppPredictionContext.Builder(@NonNull android.content.Context); method public android.app.prediction.AppPredictionContext build(); method public android.app.prediction.AppPredictionContext.Builder setExtras(@Nullable android.os.Bundle); method public android.app.prediction.AppPredictionContext.Builder setPredictedTargetCount(int); @@ -1014,6 +1022,8 @@ package android.app.prediction { } public final class AppTarget implements android.os.Parcelable { + ctor public AppTarget(@NonNull android.app.prediction.AppTargetId, @NonNull String, @Nullable String, @NonNull android.os.UserHandle); + ctor public AppTarget(@NonNull android.app.prediction.AppTargetId, @NonNull android.content.pm.ShortcutInfo, @Nullable String); method public int describeContents(); method @Nullable public String getClassName(); method @NonNull public android.app.prediction.AppTargetId getId(); @@ -1044,6 +1054,7 @@ package android.app.prediction { } public final class AppTargetId implements android.os.Parcelable { + ctor public AppTargetId(@NonNull String); method public int describeContents(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetId> CREATOR; @@ -1312,6 +1323,7 @@ package android.content { field public static final String ACTION_DEVICE_CUSTOMIZATION_READY = "android.intent.action.DEVICE_CUSTOMIZATION_READY"; field public static final String ACTION_FACTORY_RESET = "android.intent.action.FACTORY_RESET"; field public static final String ACTION_GLOBAL_BUTTON = "android.intent.action.GLOBAL_BUTTON"; + field public static final String ACTION_INCIDENT_REPORT_READY = "android.intent.action.INCIDENT_REPORT_READY"; field public static final String ACTION_INSTALL_INSTANT_APP_PACKAGE = "android.intent.action.INSTALL_INSTANT_APP_PACKAGE"; field public static final String ACTION_INSTANT_APP_RESOLVER_SETTINGS = "android.intent.action.INSTANT_APP_RESOLVER_SETTINGS"; field public static final String ACTION_INTENT_FILTER_NEEDS_VERIFICATION = "android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION"; @@ -1717,9 +1729,9 @@ package android.content.rollback { public final class RollbackInfo implements android.os.Parcelable { method public int describeContents(); method public java.util.List<android.content.pm.VersionedPackage> getCausePackages(); + method public int getCommittedSessionId(); method public java.util.List<android.content.rollback.PackageRollbackInfo> getPackages(); method public int getRollbackId(); - method public int getSessionId(); method public boolean isStaged(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.content.rollback.RollbackInfo> CREATOR; @@ -2959,10 +2971,12 @@ package android.location { public final class GnssMeasurementCorrections implements android.os.Parcelable { method public int describeContents(); method public double getAltitudeMeters(); + method public double getHorizontalPositionUncertaintyMeters(); method public double getLatitudeDegrees(); method public double getLongitudeDegrees(); method @Nullable public java.util.List<android.location.GnssSingleSatCorrection> getSingleSatCorrectionList(); method public long getToaGpsNanosecondsOfWeek(); + method public double getVerticalPositionUncertaintyMeters(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.location.GnssMeasurementCorrections> CREATOR; } @@ -2971,10 +2985,12 @@ package android.location { ctor public GnssMeasurementCorrections.Builder(); method public android.location.GnssMeasurementCorrections build(); method public android.location.GnssMeasurementCorrections.Builder setAltitudeMeters(double); + method public android.location.GnssMeasurementCorrections.Builder setHorizontalPositionUncertaintyMeters(double); method public android.location.GnssMeasurementCorrections.Builder setLatitudeDegrees(double); method public android.location.GnssMeasurementCorrections.Builder setLongitudeDegrees(double); method public android.location.GnssMeasurementCorrections.Builder setSingleSatCorrectionList(@Nullable java.util.List<android.location.GnssSingleSatCorrection>); method public android.location.GnssMeasurementCorrections.Builder setToaGpsNanosecondsOfWeek(long); + method public android.location.GnssMeasurementCorrections.Builder setVerticalPositionUncertaintyMeters(double); } public final class GnssReflectingPlane implements android.os.Parcelable { @@ -3659,7 +3675,7 @@ package android.media.session { } public final class MediaSessionEngine implements java.lang.AutoCloseable { - ctor public MediaSessionEngine(@NonNull android.content.Context, @NonNull android.media.session.SessionLink, @NonNull android.media.session.SessionCallbackLink, @NonNull android.media.session.MediaSessionEngine.CallbackStub); + ctor public MediaSessionEngine(@NonNull android.content.Context, @NonNull android.media.session.SessionLink, @NonNull android.media.session.SessionCallbackLink); method public void close(); method public String getCallingPackage(); method @NonNull public android.media.session.MediaController getController(); @@ -3684,33 +3700,6 @@ package android.media.session { method public void setSessionActivity(@Nullable android.app.PendingIntent); } - public static final class MediaSessionEngine.CallbackStub { - ctor public MediaSessionEngine.CallbackStub(); - method public void onAdjustVolume(String, int, int, android.media.session.ControllerCallbackLink, int); - method public void onCommand(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle, android.os.ResultReceiver); - method public void onCustomAction(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle); - method public void onFastForward(String, int, int, android.media.session.ControllerCallbackLink); - method public void onMediaButton(String, int, int, android.content.Intent, int, android.os.ResultReceiver); - method public void onMediaButtonFromController(String, int, int, android.media.session.ControllerCallbackLink, android.content.Intent); - method public void onNext(String, int, int, android.media.session.ControllerCallbackLink); - method public void onPause(String, int, int, android.media.session.ControllerCallbackLink); - method public void onPlay(String, int, int, android.media.session.ControllerCallbackLink); - method public void onPlayFromMediaId(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle); - method public void onPlayFromSearch(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle); - method public void onPlayFromUri(String, int, int, android.media.session.ControllerCallbackLink, android.net.Uri, android.os.Bundle); - method public void onPrepare(String, int, int, android.media.session.ControllerCallbackLink); - method public void onPrepareFromMediaId(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle); - method public void onPrepareFromSearch(String, int, int, android.media.session.ControllerCallbackLink, String, android.os.Bundle); - method public void onPrepareFromUri(String, int, int, android.media.session.ControllerCallbackLink, android.net.Uri, android.os.Bundle); - method public void onPrevious(String, int, int, android.media.session.ControllerCallbackLink); - method public void onRate(String, int, int, android.media.session.ControllerCallbackLink, android.media.Rating); - method public void onRewind(String, int, int, android.media.session.ControllerCallbackLink); - method public void onSeekTo(String, int, int, android.media.session.ControllerCallbackLink, long); - method public void onSetVolumeTo(String, int, int, android.media.session.ControllerCallbackLink, int); - method public void onSkipToTrack(String, int, int, android.media.session.ControllerCallbackLink, long); - method public void onStop(String, int, int, android.media.session.ControllerCallbackLink); - } - public static interface MediaSessionEngine.MediaButtonEventDelegate { method public boolean onMediaButtonIntent(android.content.Intent); } @@ -4090,6 +4079,7 @@ package android.net { public class CaptivePortal implements android.os.Parcelable { ctor public CaptivePortal(android.os.IBinder); + method public void logEvent(int, String); method public void useNetwork(); field public static final int APP_RETURN_DISMISSED = 0; // 0x0 field public static final int APP_RETURN_UNWANTED = 1; // 0x1 @@ -4972,8 +4962,16 @@ package android.net.wifi { method public int describeContents(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.net.wifi.WifiUsabilityStatsEntry> CREATOR; + field public static final int PROBE_STATUS_FAILURE = 3; // 0x3 + field public static final int PROBE_STATUS_NO_PROBE = 1; // 0x1 + field public static final int PROBE_STATUS_SUCCESS = 2; // 0x2 + field public static final int PROBE_STATUS_UNKNOWN = 0; // 0x0 field public final int linkSpeedMbps; + field public final int probeElapsedTimeMsSinceLastUpdate; + field public final int probeMcsRateSinceLastUpdate; + field public final int probeStatusSinceLastUpdate; field public final int rssi; + field public final int rxLinkSpeedMbps; field public final long timeStampMs; field public final long totalBackgroundScanTimeMs; field public final long totalBeaconRx; @@ -5350,11 +5348,17 @@ package android.os { public class IncidentManager { method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void approveReport(android.net.Uri); method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void cancelAuthorization(android.os.IncidentManager.AuthListener); + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void deleteIncidentReports(android.net.Uri); method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void denyReport(android.net.Uri); + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @Nullable public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri); + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @NonNull public java.util.List<android.net.Uri> getIncidentReportList(String); method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public java.util.List<android.os.IncidentManager.PendingReport> getPendingReports(); method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs); method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener); field public static final int FLAG_CONFIRMATION_DIALOG = 1; // 0x1 + field public static final int PRIVACY_POLICY_AUTO = 200; // 0xc8 + field public static final int PRIVACY_POLICY_EXPLICIT = 100; // 0x64 + field public static final int PRIVACY_POLICY_LOCAL = 0; // 0x0 } public static class IncidentManager.AuthListener { @@ -5363,6 +5367,17 @@ package android.os { method public void onReportDenied(); } + public static class IncidentManager.IncidentReport implements java.io.Closeable android.os.Parcelable { + ctor public IncidentManager.IncidentReport(android.os.Parcel); + method public void close(); + method public int describeContents(); + method public java.io.InputStream getInputStream() throws java.io.IOException; + method public long getPrivacyPolicy(); + method public long getTimestamp(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.os.IncidentManager.IncidentReport> CREATOR; + } + public static class IncidentManager.PendingReport { ctor public IncidentManager.PendingReport(@NonNull android.net.Uri); method public int getFlags(); @@ -5802,6 +5817,7 @@ package android.provider { public static interface DeviceConfig.ActivityManager { field public static final String KEY_COMPACT_ACTION_1 = "compact_action_1"; field public static final String KEY_COMPACT_ACTION_2 = "compact_action_2"; + field public static final String KEY_COMPACT_STATSD_SAMPLE_RATE = "compact_statsd_sample_rate"; field public static final String KEY_COMPACT_THROTTLE_1 = "compact_throttle_1"; field public static final String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2"; field public static final String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3"; @@ -5811,26 +5827,31 @@ package android.provider { field public static final String NAMESPACE = "activity_manager"; } + public static interface DeviceConfig.ActivityManagerNativeBoot { + field public static final String NAMESPACE = "activity_manager_native_boot"; + field public static final String OFFLOAD_QUEUE_ENABLED = "offload_queue_enabled"; + } + public static interface DeviceConfig.AttentionManagerService { + field public static final String COMPONENT_NAME = "component_name"; field public static final String NAMESPACE = "attention_manager_service"; - field public static final String PROPERTY_COMPONENT_NAME = "component_name"; - field public static final String PROPERTY_SERVICE_ENABLED = "service_enabled"; + field public static final String SERVICE_ENABLED = "service_enabled"; } public static interface DeviceConfig.ContentCapture { field public static final String NAMESPACE = "content_capture"; } - public static interface DeviceConfig.FsiBoot { - field public static final String NAMESPACE = "fsi_boot"; - field public static final String OOB_ENABLED = "oob_enabled"; - field public static final String OOB_WHITELIST = "oob_whitelist"; + public static interface DeviceConfig.DexBoot { + field public static final String NAMESPACE = "dex_boot"; + field public static final String PRIV_APPS_OOB_ENABLED = "priv_apps_oob_enabled"; + field public static final String PRIV_APPS_OOB_WHITELIST = "priv_apps_oob_whitelist"; } public static interface DeviceConfig.IntelligenceAttention { + field public static final String ATTENTION_ENABLED = "attention_enabled"; + field public static final String ATTENTION_SETTINGS = "attention_settings"; field public static final String NAMESPACE = "intelligence_attention"; - field public static final String PROPERTY_ATTENTION_ENABLED = "attention_enabled"; - field public static final String PROPERTY_ATTENTION_SETTINGS = "attention_settings"; } public static interface DeviceConfig.NotificationAssistant { @@ -5845,8 +5866,8 @@ package android.provider { public static interface DeviceConfig.Privacy { field public static final String NAMESPACE = "privacy"; - field public static final String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "enable_location_access_check"; - field public static final String PROPERTY_PERMISSIONS_HUB_ENABLED = "enable_permissions_hub"; + field public static final String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "location_access_check_enabled"; + field public static final String PROPERTY_PERMISSIONS_HUB_ENABLED = "permissions_hub_enabled"; } public static interface DeviceConfig.RuntimeNative { @@ -5860,8 +5881,9 @@ package android.provider { public static interface DeviceConfig.Telephony { field public static final String NAMESPACE = "telephony"; - field public static final String PROPERTY_ENABLE_RAMPING_RINGER = "enable_ramping_ringer"; - field public static final String PROPERTY_RAMPING_RINGER_DURATION = "ramping_duration"; + field public static final String RAMPING_RINGER_DURATION = "ramping_ringer_duration"; + field public static final String RAMPING_RINGER_ENABLED = "ramping_ringer_enabled"; + field public static final String RAMPING_RINGER_VIBRATION_DURATION = "ramping_ringer_vibration_duration"; } public final class DocumentsContract { @@ -7884,12 +7906,12 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getEmergencyCallbackMode(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimDomain(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimIst(); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getPreferredNetworkTypeBitmap(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getPreferredNetworkTypeBitmap(); method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public int getRadioPowerState(); method public int getSimApplicationState(); method public int getSimCardState(); method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getSimLocale(); - method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getSupportedRadioAccessFamily(); + method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getSupportedRadioAccessFamily(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms(); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public android.telephony.UiccSlotInfo[] getUiccSlotsInfo(); method @Nullable public android.os.Bundle getVisualVoicemailSettings(); @@ -7917,7 +7939,7 @@ package android.telephony { method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataEnabled(int, boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDataRoamingEnabled(boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setMultisimCarrierRestriction(boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setPreferredNetworkTypeBitmap(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setPreferredNetworkTypeBitmap(long); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadio(boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadioPower(boolean); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerState(int); @@ -7942,25 +7964,26 @@ package android.telephony { field public static final String EXTRA_VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL = "android.telephony.extra.VISUAL_VOICEMAIL_ENABLED_BY_USER_BOOL"; field public static final String EXTRA_VOICEMAIL_SCRAMBLED_PIN_STRING = "android.telephony.extra.VOICEMAIL_SCRAMBLED_PIN_STRING"; field public static final long MAX_NUMBER_VERIFICATION_TIMEOUT_MILLIS = 60000L; // 0xea60L - field public static final int NETWORK_TYPE_BITMASK_1xRTT = 128; // 0x80 - field public static final int NETWORK_TYPE_BITMASK_CDMA = 16; // 0x10 - field public static final int NETWORK_TYPE_BITMASK_EDGE = 4; // 0x4 - field public static final int NETWORK_TYPE_BITMASK_EHRPD = 16384; // 0x4000 - field public static final int NETWORK_TYPE_BITMASK_EVDO_0 = 32; // 0x20 - field public static final int NETWORK_TYPE_BITMASK_EVDO_A = 64; // 0x40 - field public static final int NETWORK_TYPE_BITMASK_EVDO_B = 4096; // 0x1000 - field public static final int NETWORK_TYPE_BITMASK_GPRS = 2; // 0x2 - field public static final int NETWORK_TYPE_BITMASK_GSM = 65536; // 0x10000 - field public static final int NETWORK_TYPE_BITMASK_HSDPA = 256; // 0x100 - field public static final int NETWORK_TYPE_BITMASK_HSPA = 1024; // 0x400 - field public static final int NETWORK_TYPE_BITMASK_HSPAP = 32768; // 0x8000 - field public static final int NETWORK_TYPE_BITMASK_HSUPA = 512; // 0x200 - field public static final int NETWORK_TYPE_BITMASK_LTE = 8192; // 0x2000 - field public static final int NETWORK_TYPE_BITMASK_LTE_CA = 524288; // 0x80000 - field public static final int NETWORK_TYPE_BITMASK_NR = 1048576; // 0x100000 - field public static final int NETWORK_TYPE_BITMASK_TD_SCDMA = 131072; // 0x20000 - field public static final int NETWORK_TYPE_BITMASK_UMTS = 8; // 0x8 - field public static final int NETWORK_TYPE_BITMASK_UNKNOWN = 1; // 0x1 + field public static final long NETWORK_TYPE_BITMASK_1xRTT = 64L; // 0x40L + field public static final long NETWORK_TYPE_BITMASK_CDMA = 8L; // 0x8L + field public static final long NETWORK_TYPE_BITMASK_EDGE = 2L; // 0x2L + field public static final long NETWORK_TYPE_BITMASK_EHRPD = 8192L; // 0x2000L + field public static final long NETWORK_TYPE_BITMASK_EVDO_0 = 16L; // 0x10L + field public static final long NETWORK_TYPE_BITMASK_EVDO_A = 32L; // 0x20L + field public static final long NETWORK_TYPE_BITMASK_EVDO_B = 2048L; // 0x800L + field public static final long NETWORK_TYPE_BITMASK_GPRS = 1L; // 0x1L + field public static final long NETWORK_TYPE_BITMASK_GSM = 32768L; // 0x8000L + field public static final long NETWORK_TYPE_BITMASK_HSDPA = 128L; // 0x80L + field public static final long NETWORK_TYPE_BITMASK_HSPA = 512L; // 0x200L + field public static final long NETWORK_TYPE_BITMASK_HSPAP = 16384L; // 0x4000L + field public static final long NETWORK_TYPE_BITMASK_HSUPA = 256L; // 0x100L + field public static final long NETWORK_TYPE_BITMASK_IWLAN = 131072L; // 0x20000L + field public static final long NETWORK_TYPE_BITMASK_LTE = 4096L; // 0x1000L + field public static final long NETWORK_TYPE_BITMASK_LTE_CA = 262144L; // 0x40000L + field public static final long NETWORK_TYPE_BITMASK_NR = 524288L; // 0x80000L + field public static final long NETWORK_TYPE_BITMASK_TD_SCDMA = 65536L; // 0x10000L + field public static final long NETWORK_TYPE_BITMASK_UMTS = 4L; // 0x4L + field public static final long NETWORK_TYPE_BITMASK_UNKNOWN = 0L; // 0x0L field public static final int RADIO_POWER_OFF = 0; // 0x0 field public static final int RADIO_POWER_ON = 1; // 0x1 field public static final int RADIO_POWER_UNAVAILABLE = 2; // 0x2 @@ -9374,17 +9397,6 @@ package android.view.contentcapture { method public void setContentCaptureFeatureEnabled(boolean); } - public final class UserDataRemovalRequest implements android.os.Parcelable { - method @NonNull public String getPackageName(); - method @NonNull public java.util.List<android.view.contentcapture.UserDataRemovalRequest.UriRequest> getUriRequests(); - method public boolean isForEverything(); - } - - public final class UserDataRemovalRequest.UriRequest { - method @NonNull public android.net.Uri getUri(); - method @NonNull public boolean isRecursive(); - } - public final class ViewNode extends android.app.assist.AssistStructure.ViewNode { method @Nullable public android.view.autofill.AutofillId getParentAutofillId(); } diff --git a/api/test-current.txt b/api/test-current.txt index b1603bc884e0..2f4d45594d89 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -242,6 +242,7 @@ package android.app { public class NotificationManager { method public android.content.ComponentName getEffectsSuppressor(); + method public boolean matchesCallFilter(android.os.Bundle); } public final class PictureInPictureParams implements android.os.Parcelable { @@ -332,6 +333,91 @@ package android.app.backup { } +package android.app.prediction { + + public final class AppPredictionContext implements android.os.Parcelable { + method public int describeContents(); + method @Nullable public android.os.Bundle getExtras(); + method @NonNull public String getPackageName(); + method public int getPredictedTargetCount(); + method public String getUiSurface(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionContext> CREATOR; + } + + public static final class AppPredictionContext.Builder { + ctor public AppPredictionContext.Builder(@NonNull android.content.Context); + method public android.app.prediction.AppPredictionContext build(); + method public android.app.prediction.AppPredictionContext.Builder setExtras(@Nullable android.os.Bundle); + method public android.app.prediction.AppPredictionContext.Builder setPredictedTargetCount(int); + method public android.app.prediction.AppPredictionContext.Builder setUiSurface(@Nullable String); + } + + public final class AppPredictionManager { + method public android.app.prediction.AppPredictor createAppPredictionSession(@NonNull android.app.prediction.AppPredictionContext); + } + + public final class AppPredictionSessionId implements android.os.Parcelable { + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionSessionId> CREATOR; + } + + public final class AppPredictor { + method public void destroy(); + method public android.app.prediction.AppPredictionSessionId getSessionId(); + method public void notifyAppTargetEvent(@NonNull android.app.prediction.AppTargetEvent); + method public void notifyLocationShown(@NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>); + method public void registerPredictionUpdates(@NonNull java.util.concurrent.Executor, @NonNull android.app.prediction.AppPredictor.Callback); + method public void requestPredictionUpdate(); + method @Nullable public void sortTargets(@NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>); + method public void unregisterPredictionUpdates(@NonNull android.app.prediction.AppPredictor.Callback); + } + + public static interface AppPredictor.Callback { + method public void onTargetsAvailable(@NonNull java.util.List<android.app.prediction.AppTarget>); + } + + public final class AppTarget implements android.os.Parcelable { + ctor public AppTarget(@NonNull android.app.prediction.AppTargetId, @NonNull String, @Nullable String, @NonNull android.os.UserHandle); + method public int describeContents(); + method @Nullable public String getClassName(); + method @NonNull public android.app.prediction.AppTargetId getId(); + method @NonNull public String getPackageName(); + method public int getRank(); + method @Nullable public android.content.pm.ShortcutInfo getShortcutInfo(); + method @NonNull public android.os.UserHandle getUser(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.app.prediction.AppTarget> CREATOR; + } + + public final class AppTargetEvent implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public int getAction(); + method @NonNull public String getLaunchLocation(); + method @Nullable public android.app.prediction.AppTarget getTarget(); + method public void writeToParcel(android.os.Parcel, int); + field public static final int ACTION_DISMISS = 2; // 0x2 + field public static final int ACTION_LAUNCH = 1; // 0x1 + field public static final int ACTION_PIN = 3; // 0x3 + field public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetEvent> CREATOR; + } + + public static final class AppTargetEvent.Builder { + ctor public AppTargetEvent.Builder(@Nullable android.app.prediction.AppTarget, int); + method public android.app.prediction.AppTargetEvent build(); + method public android.app.prediction.AppTargetEvent.Builder setLaunchLocation(String); + } + + public final class AppTargetId implements android.os.Parcelable { + ctor public AppTargetId(@NonNull String); + method public int describeContents(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetId> CREATOR; + } + +} + package android.app.role { public final class RoleManager { @@ -518,22 +604,10 @@ package android.database.sqlite { package android.graphics { - public final class Bitmap implements android.os.Parcelable { - method public void eraseColor(@ColorLong long); - method public void setColorSpace(@NonNull android.graphics.ColorSpace); - } - public final class ImageDecoder implements java.lang.AutoCloseable { method @AnyThread @NonNull public static android.graphics.ImageDecoder.Source createSource(android.content.res.Resources, java.io.InputStream, int); } - public class Paint { - method @ColorLong public long getColorLong(); - method @ColorLong public long getShadowLayerColorLong(); - method public void setColor(@ColorLong long); - method public void setShadowLayer(float, float, float, @ColorLong long); - } - } package android.graphics.drawable { @@ -753,6 +827,17 @@ package android.media { method public android.media.BufferingParams.Builder setResumePlaybackMarkMs(int); } + public class MediaPlayer2 implements android.media.AudioRouting java.lang.AutoCloseable { + method public android.media.MediaPlayer2.DrmInfo getDrmInfo(@NonNull android.media.DataSourceDesc); + method public android.media.MediaDrm.KeyRequest getDrmKeyRequest(@NonNull android.media.DataSourceDesc, @Nullable byte[], @Nullable byte[], @Nullable String, int, @Nullable java.util.Map<java.lang.String,java.lang.String>) throws android.media.MediaPlayer2.NoDrmSchemeException; + method public String getDrmPropertyString(@NonNull android.media.DataSourceDesc, @NonNull String) throws android.media.MediaPlayer2.NoDrmSchemeException; + method public Object prepareDrm(@NonNull android.media.DataSourceDesc, @NonNull java.util.UUID); + method public byte[] provideDrmKeyResponse(@NonNull android.media.DataSourceDesc, @Nullable byte[], @NonNull byte[]) throws android.media.DeniedByServerException, android.media.MediaPlayer2.NoDrmSchemeException; + method public void releaseDrm(@NonNull android.media.DataSourceDesc) throws android.media.MediaPlayer2.NoDrmSchemeException; + method public void restoreDrmKeys(@NonNull android.media.DataSourceDesc, @NonNull byte[]) throws android.media.MediaPlayer2.NoDrmSchemeException; + method public void setDrmPropertyString(@NonNull android.media.DataSourceDesc, @NonNull String, @NonNull String) throws android.media.MediaPlayer2.NoDrmSchemeException; + } + public final class PlaybackParams implements android.os.Parcelable { method public int getAudioStretchMode(); method public android.media.PlaybackParams setAudioStretchMode(int); @@ -803,6 +888,7 @@ package android.net { public class CaptivePortal implements android.os.Parcelable { ctor public CaptivePortal(android.os.IBinder); + method public void logEvent(int, String); method public void useNetwork(); field public static final int APP_RETURN_DISMISSED = 0; // 0x0 field public static final int APP_RETURN_UNWANTED = 1; // 0x1 @@ -1285,11 +1371,17 @@ package android.os { public class IncidentManager { method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void approveReport(android.net.Uri); method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void cancelAuthorization(android.os.IncidentManager.AuthListener); + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void deleteIncidentReports(android.net.Uri); method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void denyReport(android.net.Uri); + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @Nullable public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri); + method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) @NonNull public java.util.List<android.net.Uri> getIncidentReportList(String); method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public java.util.List<android.os.IncidentManager.PendingReport> getPendingReports(); method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs); method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener); field public static final int FLAG_CONFIRMATION_DIALOG = 1; // 0x1 + field public static final int PRIVACY_POLICY_AUTO = 200; // 0xc8 + field public static final int PRIVACY_POLICY_EXPLICIT = 100; // 0x64 + field public static final int PRIVACY_POLICY_LOCAL = 0; // 0x0 } public static class IncidentManager.AuthListener { @@ -1298,6 +1390,17 @@ package android.os { method public void onReportDenied(); } + public static class IncidentManager.IncidentReport implements java.io.Closeable android.os.Parcelable { + ctor public IncidentManager.IncidentReport(android.os.Parcel); + method public void close(); + method public int describeContents(); + method public java.io.InputStream getInputStream() throws java.io.IOException; + method public long getPrivacyPolicy(); + method public long getTimestamp(); + method public void writeToParcel(android.os.Parcel, int); + field public static final android.os.Parcelable.Creator<android.os.IncidentManager.IncidentReport> CREATOR; + } + public static class IncidentManager.PendingReport { ctor public IncidentManager.PendingReport(@NonNull android.net.Uri); method public int getFlags(); @@ -1641,7 +1744,7 @@ package android.provider { public static interface DeviceConfig.Privacy { field public static final String NAMESPACE = "privacy"; - field public static final String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "enable_location_access_check"; + field public static final String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "location_access_check_enabled"; } public final class MediaStore { @@ -1755,6 +1858,24 @@ package android.security.keystore { } +package android.service.appprediction { + + public abstract class AppPredictionService extends android.app.Service { + ctor public AppPredictionService(); + method @MainThread public abstract void onAppTargetEvent(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull android.app.prediction.AppTargetEvent); + method public final android.os.IBinder onBind(android.content.Intent); + method public void onCreatePredictionSession(@NonNull android.app.prediction.AppPredictionContext, @NonNull android.app.prediction.AppPredictionSessionId); + method @MainThread public void onDestroyPredictionSession(@NonNull android.app.prediction.AppPredictionSessionId); + method @MainThread public abstract void onLocationShown(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>); + method @MainThread public abstract void onRequestPredictionUpdate(@NonNull android.app.prediction.AppPredictionSessionId); + method @MainThread public abstract void onSortAppTargets(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>); + method @MainThread public void onStartPredictionUpdates(); + method @MainThread public void onStopPredictionUpdates(); + method public final void updatePredictions(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>); + } + +} + package android.service.autofill { public abstract class AutofillFieldClassificationService extends android.app.Service { @@ -2368,6 +2489,10 @@ package android.view { method public boolean isSystemGroup(); } + public abstract class LayoutInflater { + method public void setPrecompiledLayoutsEnabledForTesting(boolean); + } + public final class MotionEvent extends android.view.InputEvent implements android.os.Parcelable { method public void setActionButton(int); method public void setButtonState(int); diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 4718143c3ef1..427662aa9eaa 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -289,6 +289,7 @@ message Atom { DebugElapsedClock debug_elapsed_clock = 10046; DebugFailingElapsedClock debug_failing_elapsed_clock = 10047; NumBiometricsEnrolled num_faces_enrolled = 10048; + RoleHolder role_holder = 10049; } // DO NOT USE field numbers above 100,000 in AOSP. @@ -3974,6 +3975,20 @@ message NumBiometricsEnrolled { optional int32 num_enrolled = 2; } +/** + * A mapping of role holder -> role + */ +message RoleHolder { + // uid of the role holder + optional int32 uid = 1 [(is_uid) = true]; + + // package name of the role holder + optional string package_name = 2; + + // the role held + optional string role = 3; +} + message AggStats { optional int64 min = 1; diff --git a/cmds/statsd/src/external/StatsCompanionServicePuller.cpp b/cmds/statsd/src/external/StatsCompanionServicePuller.cpp index 4e4b8f35726d..f37d2bedf8c2 100644 --- a/cmds/statsd/src/external/StatsCompanionServicePuller.cpp +++ b/cmds/statsd/src/external/StatsCompanionServicePuller.cpp @@ -55,6 +55,10 @@ bool StatsCompanionServicePuller::PullInternal(vector<shared_ptr<LogEvent> >* da Status status = statsCompanionServiceCopy->pullData(mTagId, &returned_value); if (!status.isOk()) { ALOGW("StatsCompanionServicePuller::pull failed for %d", mTagId); + StatsdStats::getInstance().noteStatsCompanionPullFailed(mTagId); + if (status.exceptionCode() == Status::Exception::EX_TRANSACTION_FAILED) { + StatsdStats::getInstance().noteStatsCompanionPullBinderTransactionFailed(mTagId); + } return false; } data->clear(); diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index ba7bcc437d74..6f3eeaa71703 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -220,6 +220,9 @@ const std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = { // BuildInformation. {android::util::BUILD_INFORMATION, {.puller = new StatsCompanionServicePuller(android::util::BUILD_INFORMATION)}}, + // RoleHolder. + {android::util::ROLE_HOLDER, + {.puller = new StatsCompanionServicePuller(android::util::ROLE_HOLDER)}}, }; StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) { @@ -231,6 +234,9 @@ bool StatsPullerManager::Pull(int tagId, vector<shared_ptr<LogEvent>>* data) { if (kAllPullAtomInfo.find(tagId) != kAllPullAtomInfo.end()) { bool ret = kAllPullAtomInfo.find(tagId)->second.puller->Pull(data); VLOG("pulled %d items", (int)data->size()); + if (!ret) { + StatsdStats::getInstance().notePullFailed(tagId); + } return ret; } else { VLOG("Unknown tagId %d", tagId); diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp index f4d0144e8878..37ccad5f4a49 100644 --- a/cmds/statsd/src/guardrail/StatsdStats.cpp +++ b/cmds/statsd/src/guardrail/StatsdStats.cpp @@ -403,6 +403,60 @@ void StatsdStats::noteSystemServerRestart(int32_t timeSec) { mSystemServerRestartSec.push_back(timeSec); } +void StatsdStats::notePullFailed(int atomId) { + lock_guard<std::mutex> lock(mLock); + mPulledAtomStats[atomId].pullFailed++; +} + +void StatsdStats::noteStatsCompanionPullFailed(int atomId) { + lock_guard<std::mutex> lock(mLock); + mPulledAtomStats[atomId].statsCompanionPullFailed++; +} + +void StatsdStats::noteStatsCompanionPullBinderTransactionFailed(int atomId) { + lock_guard<std::mutex> lock(mLock); + mPulledAtomStats[atomId].statsCompanionPullBinderTransactionFailed++; +} + +void StatsdStats::noteEmptyData(int atomId) { + lock_guard<std::mutex> lock(mLock); + mPulledAtomStats[atomId].emptyData++; +} + +void StatsdStats::noteHardDimensionLimitReached(int metricId) { + lock_guard<std::mutex> lock(mLock); + getAtomMetricStats(metricId).hardDimensionLimitReached++; +} + +void StatsdStats::noteLateLogEventSkipped(int metricId) { + lock_guard<std::mutex> lock(mLock); + getAtomMetricStats(metricId).lateLogEventSkipped++; +} + +void StatsdStats::noteSkippedForwardBuckets(int metricId) { + lock_guard<std::mutex> lock(mLock); + getAtomMetricStats(metricId).skippedForwardBuckets++; +} + +void StatsdStats::noteBadValueType(int metricId) { + lock_guard<std::mutex> lock(mLock); + getAtomMetricStats(metricId).badValueType++; +} + +void StatsdStats::noteConditionChangeInNextBucket(int metricId) { + lock_guard<std::mutex> lock(mLock); + getAtomMetricStats(metricId).conditionChangeInNextBucket++; +} + +StatsdStats::AtomMetricStats& StatsdStats::getAtomMetricStats(int metricId) { + auto atomMetricStatsIter = mAtomMetricStats.find(metricId); + if (atomMetricStatsIter != mAtomMetricStats.end()) { + return atomMetricStatsIter->second; + } + auto emplaceResult = mAtomMetricStats.emplace(metricId, AtomMetricStats()); + return emplaceResult.first->second; +} + void StatsdStats::reset() { lock_guard<std::mutex> lock(mLock); resetInternalLocked(); @@ -442,6 +496,7 @@ void StatsdStats::resetInternalLocked() { pullStats.second.pullTimeout = 0; pullStats.second.pullExceedMaxDelay = 0; } + mAtomMetricStats.clear(); } string buildTimeString(int64_t timeSec) { @@ -713,6 +768,10 @@ void StatsdStats::dumpStats(std::vector<uint8_t>* output, bool reset) { android::os::statsd::writePullerStatsToStream(pair, &proto); } + for (const auto& pair : mAtomMetricStats) { + android::os::statsd::writeAtomMetricStatsToStream(pair, &proto); + } + if (mAnomalyAlarmRegisteredStats > 0) { uint64_t token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_ANOMALY_ALARM_STATS); proto.write(FIELD_TYPE_INT32 | FIELD_ID_ANOMALY_ALARMS_REGISTERED, diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h index dc647f888b6f..01e9ca17e5fd 100644 --- a/cmds/statsd/src/guardrail/StatsdStats.h +++ b/cmds/statsd/src/guardrail/StatsdStats.h @@ -318,6 +318,53 @@ public: void noteLogLost(int32_t wallClockTimeSec, int32_t count, int lastError); /** + * Records that the pull of an atom has failed + */ + void notePullFailed(int atomId); + + /** + * Records that the pull of StatsCompanionService atom has failed + */ + void noteStatsCompanionPullFailed(int atomId); + + /** + * Records that the pull of a StatsCompanionService atom has failed due to a failed binder + * transaction. This can happen when StatsCompanionService returns too + * much data (the max Binder parcel size is 1MB) + */ + void noteStatsCompanionPullBinderTransactionFailed(int atomId); + + /** + * A pull with no data occurred + */ + void noteEmptyData(int atomId); + + /** + * Hard limit was reached in the cardinality of an atom + */ + void noteHardDimensionLimitReached(int atomId); + + /** + * A log event was too late, arrived in the wrong bucket and was skipped + */ + void noteLateLogEventSkipped(int atomId); + + /** + * Buckets were skipped as time elapsed without any data for them + */ + void noteSkippedForwardBuckets(int atomId); + + /** + * An unsupported value type was received + */ + void noteBadValueType(int atomId); + + /** + * A condition change was too late, arrived in the wrong bucket and was skipped + */ + void noteConditionChangeInNextBucket(int atomId); + + /** * Reset the historical stats. Including all stats in icebox, and the tracked stats about * metrics, matchers, and atoms. The active configs will be kept and StatsdStats will continue * to collect stats after reset() has been called. @@ -349,8 +396,20 @@ public: long dataError = 0; long pullTimeout = 0; long pullExceedMaxDelay = 0; + long pullFailed = 0; + long statsCompanionPullFailed = 0; + long statsCompanionPullBinderTransactionFailed = 0; + long emptyData = 0; } PulledAtomStats; + typedef struct { + long hardDimensionLimitReached = 0; + long lateLogEventSkipped = 0; + long skippedForwardBuckets = 0; + long badValueType = 0; + long conditionChangeInNextBucket = 0; + } AtomMetricStats; + private: StatsdStats(); @@ -378,6 +437,9 @@ private: // Maps PullAtomId to its stats. The size is capped by the puller atom counts. std::map<int, PulledAtomStats> mPulledAtomStats; + // Maps metric ID to its stats. The size is capped by the number of metrics. + std::map<int, AtomMetricStats> mAtomMetricStats; + struct LogLossStats { LogLossStats(int32_t sec, int32_t count, int32_t error) : mWallClockSec(sec), mCount(count), mLastError(error) { @@ -414,6 +476,12 @@ private: void addToIceBoxLocked(std::shared_ptr<ConfigStats>& stats); + /** + * Get a reference to AtomMetricStats for a metric. If none exists, create it. The reference + * will live as long as `this`. + */ + StatsdStats::AtomMetricStats& getAtomMetricStats(int metricId); + FRIEND_TEST(StatsdStatsTest, TestValidConfigAdd); FRIEND_TEST(StatsdStatsTest, TestInvalidConfigAdd); FRIEND_TEST(StatsdStatsTest, TestConfigRemove); diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp index 5645461cc3ab..6aa8e842b021 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp +++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp @@ -322,6 +322,7 @@ void ValueMetricProducer::onConditionChangedLocked(const bool condition, if (eventTimeNs < mCurrentBucketStartTimeNs) { VLOG("Skip event due to late arrival: %lld vs %lld", (long long)eventTimeNs, (long long)mCurrentBucketStartTimeNs); + StatsdStats::getInstance().noteConditionChangeInNextBucket(mMetricId); return; } @@ -359,6 +360,12 @@ void ValueMetricProducer::pullAndMatchEventsLocked(const int64_t timestampNs) { } StatsdStats::getInstance().notePullDelay(mPullTagId, pullDelayNs); + if (timestampNs < mCurrentBucketStartTimeNs) { + // The data will be skipped in onMatchedLogEventInternalLocked, but we don't want to report + // for every event, just the pull + StatsdStats::getInstance().noteLateLogEventSkipped(mMetricId); + } + for (const auto& data : allData) { // make a copy before doing and changes LogEvent localCopy = data->makeCopy(); @@ -380,6 +387,7 @@ void ValueMetricProducer::onDataPulled(const std::vector<std::shared_ptr<LogEven if (mCondition) { if (allData.size() == 0) { VLOG("Data pulled is empty"); + StatsdStats::getInstance().noteEmptyData(mPullTagId); return; } // For scheduled pulled data, the effective event time is snap to the nearest @@ -394,6 +402,7 @@ void ValueMetricProducer::onDataPulled(const std::vector<std::shared_ptr<LogEven if (bucketEndTime < mCurrentBucketStartTimeNs) { VLOG("Skip bucket end pull due to late arrival: %lld vs %lld", (long long)bucketEndTime, (long long)mCurrentBucketStartTimeNs); + StatsdStats::getInstance().noteLateLogEventSkipped(mMetricId); return; } for (const auto& data : allData) { @@ -442,6 +451,7 @@ bool ValueMetricProducer::hitGuardRailLocked(const MetricDimensionKey& newKey) { if (newTupleCount > mDimensionHardLimit) { ALOGE("ValueMetric %lld dropping data for dimension key %s", (long long)mMetricId, newKey.toString().c_str()); + StatsdStats::getInstance().noteHardDimensionLimitReached(mMetricId); return true; } } @@ -539,6 +549,7 @@ void ValueMetricProducer::onMatchedLogEventInternalLocked(const size_t matcherIn Value value; if (!getDoubleOrLong(event, matcher, value)) { VLOG("Failed to get value %d from event %s", i, event.ToString().c_str()); + StatsdStats::getInstance().noteBadValueType(mMetricId); return; } interval.seenNewData = true; @@ -656,6 +667,7 @@ void ValueMetricProducer::flushIfNeededLocked(const int64_t& eventTimeNs) { if (numBucketsForward > 1) { VLOG("Skipping forward %lld buckets", (long long)numBucketsForward); + StatsdStats::getInstance().noteSkippedForwardBuckets(mMetricId); // take base again in future good bucket. resetBase(); } diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto index e8de875a461b..cca09ac017a3 100644 --- a/cmds/statsd/src/stats_log.proto +++ b/cmds/statsd/src/stats_log.proto @@ -403,9 +403,23 @@ message StatsdStatsReport { optional int64 data_error = 9; optional int64 pull_timeout = 10; optional int64 pull_exceed_max_delay = 11; + optional int64 pull_failed = 12; + optional int64 stats_companion_pull_failed = 13; + optional int64 stats_companion_pull_binder_transaction_failed = 14; + optional int64 empty_data = 15; } repeated PulledAtomStats pulled_atom_stats = 10; + message AtomMetricStats { + optional int64 metric_id = 1; + optional int64 hard_dimension_limit_reached = 2; + optional int64 late_log_event_skipped = 3; + optional int64 skipped_forward_buckets = 4; + optional int64 bad_value_type = 5; + optional int64 condition_change_in_next_bucket = 6; + } + repeated AtomMetricStats atom_metric_stats = 17; + message LoggerErrorStats { optional int32 logger_disconnection_sec = 1; optional int32 error_code = 2; diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp index 7de0bb3290a7..9c9985ed271c 100644 --- a/cmds/statsd/src/stats_log_util.cpp +++ b/cmds/statsd/src/stats_log_util.cpp @@ -66,6 +66,18 @@ const int FIELD_ID_MAX_PULL_DELAY_NANOS = 8; const int FIELD_ID_DATA_ERROR = 9; const int FIELD_ID_PULL_TIMEOUT = 10; const int FIELD_ID_PULL_EXCEED_MAX_DELAY = 11; +const int FIELD_ID_PULL_FAILED = 12; +const int FIELD_ID_STATS_COMPANION_FAILED = 13; +const int FIELD_ID_STATS_COMPANION_BINDER_TRANSACTION_FAILED = 14; +const int FIELD_ID_EMPTY_DATA = 15; +// for AtomMetricStats proto +const int FIELD_ID_ATOM_METRIC_STATS = 17; +const int FIELD_ID_METRIC_ID = 1; +const int FIELD_ID_HARD_DIMENSION_LIMIT_REACHED = 2; +const int FIELD_ID_LATE_LOG_EVENT_SKIPPED = 3; +const int FIELD_ID_SKIPPED_FORWARD_BUCKETS = 4; +const int FIELD_ID_BAD_VALUE_TYPE = 5; +const int FIELD_ID_CONDITION_CHANGE_IN_NEXT_BUCKET = 6; namespace { @@ -456,6 +468,32 @@ void writePullerStatsToStream(const std::pair<int, StatsdStats::PulledAtomStats> (long long)pair.second.pullTimeout); protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_PULL_EXCEED_MAX_DELAY, (long long)pair.second.pullExceedMaxDelay); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_PULL_FAILED, + (long long)pair.second.pullFailed); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_STATS_COMPANION_FAILED, + (long long)pair.second.statsCompanionPullFailed); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_STATS_COMPANION_BINDER_TRANSACTION_FAILED, + (long long)pair.second.statsCompanionPullBinderTransactionFailed); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_EMPTY_DATA, + (long long)pair.second.emptyData); + protoOutput->end(token); +} + +void writeAtomMetricStatsToStream(const std::pair<int, StatsdStats::AtomMetricStats> &pair, + util::ProtoOutputStream *protoOutput) { + uint64_t token = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_ATOM_METRIC_STATS | + FIELD_COUNT_REPEATED); + protoOutput->write(FIELD_TYPE_INT32 | FIELD_ID_METRIC_ID, (int32_t)pair.first); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_HARD_DIMENSION_LIMIT_REACHED, + (long long)pair.second.hardDimensionLimitReached); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_LATE_LOG_EVENT_SKIPPED, + (long long)pair.second.lateLogEventSkipped); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_SKIPPED_FORWARD_BUCKETS, + (long long)pair.second.skippedForwardBuckets); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_BAD_VALUE_TYPE, + (long long)pair.second.badValueType); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_CONDITION_CHANGE_IN_NEXT_BUCKET, + (long long)pair.second.conditionChangeInNextBucket); protoOutput->end(token); } diff --git a/cmds/statsd/src/stats_log_util.h b/cmds/statsd/src/stats_log_util.h index 61f31eb3fa17..dcea0e653e22 100644 --- a/cmds/statsd/src/stats_log_util.h +++ b/cmds/statsd/src/stats_log_util.h @@ -73,6 +73,10 @@ int64_t MillisToNano(const int64_t millis); void writePullerStatsToStream(const std::pair<int, StatsdStats::PulledAtomStats>& pair, util::ProtoOutputStream* protoOutput); +// Helper function to write AtomMetricStats to ProtoOutputStream +void writeAtomMetricStatsToStream(const std::pair<int, StatsdStats::AtomMetricStats> &pair, + util::ProtoOutputStream *protoOutput); + template<class T> bool parseProtoOutputStream(util::ProtoOutputStream& protoOutput, T* message) { std::string pbBytes; diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt index 8e7a58b40d0c..a74895947450 100644 --- a/config/hiddenapi-greylist.txt +++ b/config/hiddenapi-greylist.txt @@ -1942,7 +1942,6 @@ Lcom/android/internal/R$id;->title:I Lcom/android/internal/R$id;->titleDivider:I Lcom/android/internal/R$id;->titleDividerTop:I Lcom/android/internal/R$id;->title_container:I -Lcom/android/internal/R$id;->title_icon:I Lcom/android/internal/R$id;->title_template:I Lcom/android/internal/R$id;->topPanel:I Lcom/android/internal/R$id;->up:I diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index ce5d8a5cfeb2..eae7d6b79f67 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -28,15 +28,12 @@ import android.content.Context; import android.content.Intent; import android.hardware.display.DisplayManager; import android.hardware.display.VirtualDisplay; -import android.hardware.input.InputManager; import android.os.RemoteException; import android.os.UserHandle; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; import android.view.IWindowManager; -import android.view.InputDevice; -import android.view.MotionEvent; import android.view.SurfaceControl; import android.view.SurfaceHolder; import android.view.SurfaceSession; @@ -51,9 +48,7 @@ import dalvik.system.CloseGuard; import java.util.List; /** - * Activity container that allows launching activities into itself and does input forwarding. - * <p>Creation of this view is only allowed to callers who have - * {@link android.Manifest.permission#INJECT_EVENTS} permission. + * Activity container that allows launching activities into itself. * <p>Activity launching into this container is restricted by the same rules that apply to launching * on VirtualDisplays. * @hide @@ -76,9 +71,8 @@ public class ActivityView extends ViewGroup { private StateCallback mActivityViewCallback; private IActivityTaskManager mActivityTaskManager; - private IInputForwarder mInputForwarder; - // Temp container to store view coordinates on screen. - private final int[] mLocationOnScreen = new int[2]; + // Temp container to store view coordinates in window. + private final int[] mLocationInWindow = new int[2]; private TaskStackListener mTaskStackListener; @@ -280,7 +274,7 @@ public class ActivityView extends ViewGroup { } /** - * Triggers an update of {@link ActivityView}'s location on screen to properly set touch exclude + * Triggers an update of {@link ActivityView}'s location in window to properly set touch exclude * regions and avoid focus switches by touches on this view. */ public void onLocationChanged() { @@ -295,45 +289,14 @@ public class ActivityView extends ViewGroup { /** Send current location and size to the WM to set tap exclude region for this view. */ private void updateLocation() { try { - getLocationOnScreen(mLocationOnScreen); + getLocationInWindow(mLocationInWindow); WindowManagerGlobal.getWindowSession().updateTapExcludeRegion(getWindow(), hashCode(), - mLocationOnScreen[0], mLocationOnScreen[1], getWidth(), getHeight()); + mLocationInWindow[0], mLocationInWindow[1], getWidth(), getHeight()); } catch (RemoteException e) { e.rethrowAsRuntimeException(); } } - @Override - public boolean onTouchEvent(MotionEvent event) { - return injectInputEvent(event) || super.onTouchEvent(event); - } - - @Override - public boolean onGenericMotionEvent(MotionEvent event) { - if (event.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { - if (injectInputEvent(event)) { - return true; - } - } - return super.onGenericMotionEvent(event); - } - - private boolean injectInputEvent(MotionEvent event) { - if (mInputForwarder != null) { - try { - // The touch event that the ActivityView gets is in View space, but the event needs - // to get forwarded in screen space. This offsets the touch event by the location - // the ActivityView is on screen and sends it to the input forwarder. - getLocationOnScreen(mLocationOnScreen); - event.offsetLocation(mLocationOnScreen[0], mLocationOnScreen[1]); - return mInputForwarder.forwardEvent(event); - } catch (RemoteException e) { - e.rethrowAsRuntimeException(); - } - } - return false; - } - private class SurfaceCallback implements SurfaceHolder.Callback { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { @@ -416,7 +379,6 @@ public class ActivityView extends ViewGroup { } mTmpTransaction.show(mRootSurfaceControl).apply(); - mInputForwarder = InputManager.getInstance().createInputForwarder(displayId); mTaskStackListener = new TaskStackListenerImpl(); try { mActivityTaskManager.registerTaskStackListener(mTaskStackListener); @@ -432,9 +394,6 @@ public class ActivityView extends ViewGroup { mSurfaceView.getHolder().removeCallback(mSurfaceCallback); - if (mInputForwarder != null) { - mInputForwarder = null; - } cleanTapExcludeRegion(); if (mTaskStackListener != null) { diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java index acc70944abf0..fde1d29eb709 100644 --- a/core/java/android/app/DownloadManager.java +++ b/core/java/android/app/DownloadManager.java @@ -26,7 +26,6 @@ import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; -import android.content.Intent; import android.database.Cursor; import android.database.CursorWrapper; import android.net.ConnectivityManager; @@ -37,7 +36,6 @@ import android.os.Environment; import android.os.FileUtils; import android.os.ParcelFileDescriptor; import android.provider.Downloads; -import android.provider.MediaStore.Images; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; import android.text.TextUtils; @@ -399,14 +397,14 @@ public class DownloadManager { /** if a file is designated as a MediaScanner scannable file, the following value is * stored in the database column {@link Downloads.Impl#COLUMN_MEDIA_SCANNED}. */ - private static final int SCANNABLE_VALUE_YES = 0; + private static final int SCANNABLE_VALUE_YES = Downloads.Impl.MEDIA_NOT_SCANNED; // value of 1 is stored in the above column by DownloadProvider after it is scanned by // MediaScanner /** if a file is designated as a file that should not be scanned by MediaScanner, * the following value is stored in the database column * {@link Downloads.Impl#COLUMN_MEDIA_SCANNED}. */ - private static final int SCANNABLE_VALUE_NO = 2; + private static final int SCANNABLE_VALUE_NO = Downloads.Impl.MEDIA_NOT_SCANNABLE; /** * This download is visible but only shows in the notifications @@ -1264,19 +1262,6 @@ public class DownloadManager { throw new IllegalStateException("Failed to rename to " + after); } - // Update MediaProvider if necessary - if (mimeType.startsWith("image/")) { - context.getContentResolver().delete(Images.Media.EXTERNAL_CONTENT_URI, - Images.Media.DATA + "=?", - new String[] { - before.getAbsolutePath() - }); - - Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); - intent.setData(Uri.fromFile(after)); - context.sendBroadcast(intent); - } - ContentValues values = new ContentValues(); values.put(Downloads.Impl.COLUMN_TITLE, displayName); values.put(Downloads.Impl._DATA, after.toString()); @@ -1329,8 +1314,7 @@ public class DownloadManager { * @param description the description that would appear for this file in Downloads App. * @param isMediaScannerScannable true if the file is to be scanned by MediaScanner. Files * scanned by MediaScanner appear in the applications used to view media (for example, - * Gallery app). Starting from {@link android.os.Build.VERSION_CODES#Q}, this argument is - * ignored and the file is always scanned by MediaScanner. + * Gallery app). * @param mimeType mimetype of the file. * @param path absolute pathname to the file. The file should be world-readable, so that it can * be managed by the Downloads App and any other app that is used to read it (for example, @@ -1359,8 +1343,7 @@ public class DownloadManager { * @param description the description that would appear for this file in Downloads App. * @param isMediaScannerScannable true if the file is to be scanned by MediaScanner. Files * scanned by MediaScanner appear in the applications used to view media (for example, - * Gallery app). Starting from {@link android.os.Build.VERSION_CODES#Q}, this argument is - * ignored and the file is always scanned by MediaScanner. + * Gallery app). * @param mimeType mimetype of the file. * @param path absolute pathname to the file. The file should be world-readable, so that it can * be managed by the Downloads App and any other app that is used to read it (for example, diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index 8953940952a8..df04a6b4d134 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -65,6 +65,9 @@ interface INotificationManager boolean areNotificationsEnabled(String pkg); int getPackageImportance(String pkg); + boolean shouldHideSilentStatusIcons(String callingPkg); + void setHideSilentStatusIcons(boolean hide); + void setBubblesAllowed(String pkg, int uid, boolean allowed); boolean areBubblesAllowed(String pkg); boolean areBubblesAllowedForPackage(String pkg, int uid); @@ -151,6 +154,8 @@ interface INotificationManager void setNotificationAssistantAccessGrantedForUser(in ComponentName assistant, int userId, boolean enabled); List<String> getEnabledNotificationListenerPackages(); List<ComponentName> getEnabledNotificationListeners(int userId); + ComponentName getAllowedNotificationAssistantForUser(int userId); + ComponentName getAllowedNotificationAssistant(); int getZenMode(); ZenModeConfig getZenModeConfig(); diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 621f134dc68e..8207e0a112c5 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -20,6 +20,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; +import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; @@ -353,7 +354,8 @@ public class NotificationManager { public static final int IMPORTANCE_MIN = 1; /** - * Low notification importance: shows everywhere, but is not intrusive. + * Low notification importance: Shows in the shade, and potentially in the status bar + * (see {@link #shouldHideSilentStatusBarIcons()}), but is not audibly intrusive. */ public static final int IMPORTANCE_LOW = 2; @@ -826,6 +828,7 @@ public class NotificationManager { /** * @hide */ + @TestApi public boolean matchesCallFilter(Bundle extras) { INotificationManager service = getService(); try { @@ -1153,6 +1156,19 @@ public class NotificationManager { } } + /** + * Checks whether the user has approved a given + * {@link android.service.notification.NotificationAssistantService}. + * + * <p> + * The assistant service must belong to the calling app. + * + * <p> + * Apps can request notification assistant access by sending the user to the activity that + * matches the system intent action + * TODO: STOPSHIP: Add correct intent + * {@link android.provider.Settings#ACTION_MANAGE_DEFAULT_APPS_SETTINGS}. + */ public boolean isNotificationAssistantAccessGranted(ComponentName assistant) { INotificationManager service = getService(); try { @@ -1162,6 +1178,22 @@ public class NotificationManager { } } + /** + * Returns whether the user wants silent notifications (see {@link #IMPORTANCE_LOW} to appear + * in the status bar. + * + * <p>Only available for {@link #isNotificationListenerAccessGranted(ComponentName) notification + * listeners}. + */ + public boolean shouldHideSilentStatusBarIcons() { + INotificationManager service = getService(); + try { + return service.shouldHideSilentStatusIcons(mContext.getOpPackageName()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** @hide */ public boolean isNotificationPolicyAccessGrantedForPackage(String pkg) { INotificationManager service = getService(); @@ -1248,6 +1280,45 @@ public class NotificationManager { } } + /** + * Grants/revokes Notification Assistant access to {@code assistant} for current user. + * + * @param assistant Name of component to grant/revoke access or {@code null} to revoke access to + * current assistant + * @param granted Grant/revoke access + * @hide + */ + @SystemApi + public void setNotificationAssistantAccessGranted(ComponentName assistant, boolean granted) { + INotificationManager service = getService(); + try { + service.setNotificationAssistantAccessGranted(assistant, granted); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Grants/revokes Notification Assistant access to {@code assistant} for given user. + * + * @param assistant Name of component to grant/revoke access or {@code null} to revoke access to + * current assistant + * @param user handle to associate assistant with + * @param granted Grant/revoke access + * @hide + */ + @SystemApi + public void setNotificationAssistantAccessGrantedForUser(ComponentName assistant, + UserHandle user, boolean granted) { + INotificationManager service = getService(); + try { + service.setNotificationAssistantAccessGrantedForUser(assistant, user.getIdentifier(), + granted); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** @hide */ public List<ComponentName> getEnabledNotificationListeners(int userId) { INotificationManager service = getService(); @@ -1258,6 +1329,29 @@ public class NotificationManager { } } + /** @hide */ + @SystemApi + public @Nullable ComponentName getAllowedNotificationAssistantForUser(UserHandle user) { + INotificationManager service = getService(); + try { + return service.getAllowedNotificationAssistantForUser(user.getIdentifier()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** @hide */ + @SystemApi + public @Nullable ComponentName getAllowedNotificationAssistant() { + INotificationManager service = getService(); + try { + return service.getAllowedNotificationAssistant(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + private Context mContext; private static void checkRequired(String name, Object value) { diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index b8f4385ea74b..f0d0aad76f98 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -9614,12 +9614,18 @@ public class DevicePolicyManager { } /** - * Allows the device owner to enable or disable the backup service. + * Allows the device owner or profile owner to enable or disable the backup service. * - * <p> Backup service manages all backup and restore mechanisms on the device. Setting this to - * false will prevent data from being backed up or restored. + * <p> Each user has its own backup service which manages the backup and restore mechanisms in + * that user. Disabling the backup service will prevent data from being backed up or restored. * - * <p> Backup service is off by default when device owner is present. + * <p> Device owner calls this API to control backup services across all users on the device. + * Profile owner can use this API to enable or disable the profile's backup service. However, + * for a managed profile its backup functionality is only enabled if both the device owner + * and the profile owner have enabled the backup service. + * + * <p> By default, backup service is disabled on a device with device owner, and within a + * managed profile. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param enabled {@code true} to enable the backup service, {@code false} to disable it. @@ -9635,7 +9641,12 @@ public class DevicePolicyManager { } /** - * Return whether the backup service is enabled by the device owner. + * Return whether the backup service is enabled by the device owner or profile owner for the + * current user, as previously set by {@link #setBackupServiceEnabled(ComponentName, boolean)}. + * + * <p> Whether the backup functionality is actually enabled or not depends on settings from both + * the current user and the device owner, please see + * {@link #setBackupServiceEnabled(ComponentName, boolean)} for details. * * <p> Backup service manages all backup and restore mechanisms on the device. * diff --git a/core/java/android/app/prediction/AppPredictionContext.java b/core/java/android/app/prediction/AppPredictionContext.java index 87ccb660e5bd..2fbe6e360085 100644 --- a/core/java/android/app/prediction/AppPredictionContext.java +++ b/core/java/android/app/prediction/AppPredictionContext.java @@ -18,6 +18,7 @@ package android.app.prediction; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.content.Context; import android.os.Bundle; import android.os.Parcel; @@ -29,6 +30,7 @@ import android.os.Parcelable; * @hide */ @SystemApi +@TestApi public final class AppPredictionContext implements Parcelable { private final int mPredictedTargetCount; @@ -73,6 +75,17 @@ public final class AppPredictionContext implements Parcelable { } @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!getClass().equals(o != null ? o.getClass() : null)) return false; + + AppPredictionContext other = (AppPredictionContext) o; + return mPredictedTargetCount == other.mPredictedTargetCount + && mUiSurface.equals(other.mUiSurface) + && mPackageName.equals(other.mPackageName); + } + + @Override public int describeContents() { return 0; } @@ -104,6 +117,7 @@ public final class AppPredictionContext implements Parcelable { * @hide */ @SystemApi + @TestApi public static final class Builder { @NonNull @@ -116,8 +130,12 @@ public final class AppPredictionContext implements Parcelable { private Bundle mExtras; /** + * TODO(b/123591863): Add java docs + * * @hide */ + @SystemApi + @TestApi public Builder(@NonNull Context context) { mPackageName = context.getPackageName(); } diff --git a/core/java/android/app/prediction/AppPredictionManager.java b/core/java/android/app/prediction/AppPredictionManager.java index f8578d4533ef..99f78f1957b9 100644 --- a/core/java/android/app/prediction/AppPredictionManager.java +++ b/core/java/android/app/prediction/AppPredictionManager.java @@ -17,6 +17,7 @@ package android.app.prediction; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.content.Context; import com.android.internal.util.Preconditions; @@ -26,6 +27,7 @@ import com.android.internal.util.Preconditions; * @hide */ @SystemApi +@TestApi public final class AppPredictionManager { private final Context mContext; diff --git a/core/java/android/app/prediction/AppPredictionSessionId.java b/core/java/android/app/prediction/AppPredictionSessionId.java index 1d7308ec2404..1e76c241f8e9 100644 --- a/core/java/android/app/prediction/AppPredictionSessionId.java +++ b/core/java/android/app/prediction/AppPredictionSessionId.java @@ -17,6 +17,7 @@ package android.app.prediction; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -26,6 +27,7 @@ import android.os.Parcelable; * @hide */ @SystemApi +@TestApi public final class AppPredictionSessionId implements Parcelable { private final String mId; diff --git a/core/java/android/app/prediction/AppPredictor.java b/core/java/android/app/prediction/AppPredictor.java index 2ddbd08c7477..12d6ce3c5b90 100644 --- a/core/java/android/app/prediction/AppPredictor.java +++ b/core/java/android/app/prediction/AppPredictor.java @@ -19,6 +19,7 @@ import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.app.prediction.IPredictionCallback.Stub; import android.content.Context; import android.content.pm.ParceledListSlice; @@ -63,6 +64,7 @@ import java.util.function.Consumer; * @hide */ @SystemApi +@TestApi public final class AppPredictor { private static final String TAG = AppPredictor.class.getSimpleName(); @@ -102,6 +104,10 @@ public final class AppPredictor { * Notifies the prediction service of an app target event. */ public void notifyAppTargetEvent(@NonNull AppTargetEvent event) { + if (mIsClosed.get()) { + throw new IllegalStateException("This client has already been destroyed."); + } + try { mPredictionManager.notifyAppTargetEvent(mSessionId, event); } catch (RemoteException e) { @@ -114,6 +120,10 @@ public final class AppPredictor { */ public void notifyLocationShown(@NonNull String launchLocation, @NonNull List<AppTargetId> targetIds) { + if (mIsClosed.get()) { + throw new IllegalStateException("This client has already been destroyed."); + } + try { mPredictionManager.notifyLocationShown(mSessionId, launchLocation, new ParceledListSlice<>(targetIds)); @@ -130,6 +140,10 @@ public final class AppPredictor { */ public void registerPredictionUpdates(@NonNull @CallbackExecutor Executor callbackExecutor, @NonNull AppPredictor.Callback callback) { + if (mIsClosed.get()) { + throw new IllegalStateException("This client has already been destroyed."); + } + if (mRegisteredCallbacks.containsKey(callback)) { // Skip if this callback is already registered return; @@ -149,6 +163,10 @@ public final class AppPredictor { * callback until the callback is re-registered. */ public void unregisterPredictionUpdates(@NonNull AppPredictor.Callback callback) { + if (mIsClosed.get()) { + throw new IllegalStateException("This client has already been destroyed."); + } + if (!mRegisteredCallbacks.containsKey(callback)) { // Skip if this callback was never registered return; @@ -168,6 +186,10 @@ public final class AppPredictor { * @see Callback#onTargetsAvailable(List) */ public void requestPredictionUpdate() { + if (mIsClosed.get()) { + throw new IllegalStateException("This client has already been destroyed."); + } + try { mPredictionManager.requestPredictionUpdate(mSessionId); } catch (RemoteException e) { @@ -182,6 +204,10 @@ public final class AppPredictor { @Nullable public void sortTargets(@NonNull List<AppTarget> targets, @NonNull Executor callbackExecutor, @NonNull Consumer<List<AppTarget>> callback) { + if (mIsClosed.get()) { + throw new IllegalStateException("This client has already been destroyed."); + } + try { mPredictionManager.sortAppTargets(mSessionId, new ParceledListSlice(targets), new CallbackWrapper(callbackExecutor, callback)); @@ -206,6 +232,8 @@ public final class AppPredictor { } catch (RemoteException e) { Log.e(TAG, "Failed to notify app target event", e); } + } else { + throw new IllegalStateException("This client has already been destroyed."); } } @@ -222,6 +250,16 @@ public final class AppPredictor { } /** + * TODO(b/123591863): Add java docs + * + * @hide + */ + @TestApi + public AppPredictionSessionId getSessionId() { + return mSessionId; + } + + /** * Callback for receiving prediction updates. */ public interface Callback { diff --git a/core/java/android/app/prediction/AppTarget.java b/core/java/android/app/prediction/AppTarget.java index 99c1c44866fe..b924cec63823 100644 --- a/core/java/android/app/prediction/AppTarget.java +++ b/core/java/android/app/prediction/AppTarget.java @@ -18,6 +18,7 @@ package android.app.prediction; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.content.pm.ShortcutInfo; import android.os.Parcel; import android.os.Parcelable; @@ -30,6 +31,7 @@ import com.android.internal.util.Preconditions; * @hide */ @SystemApi +@TestApi public final class AppTarget implements Parcelable { private final AppTargetId mId; @@ -42,8 +44,12 @@ public final class AppTarget implements Parcelable { private int mRank; /** + * TODO(b/123591863): Add java docs + * * @hide */ + @SystemApi + @TestApi public AppTarget(@NonNull AppTargetId id, @NonNull String packageName, @Nullable String className, @NonNull UserHandle user) { mId = id; @@ -55,15 +61,19 @@ public final class AppTarget implements Parcelable { } /** + * TODO(b/123591863): Add java docs + * * @hide */ - public AppTarget(@NonNull AppTargetId id, @NonNull ShortcutInfo shortcutInfo) { + @SystemApi + public AppTarget(@NonNull AppTargetId id, @NonNull ShortcutInfo shortcutInfo, + @Nullable String className) { mId = id; mShortcutInfo = Preconditions.checkNotNull(shortcutInfo); mPackageName = mShortcutInfo.getPackage(); mUser = mShortcutInfo.getUserHandle(); - mClassName = null; + mClassName = className; } private AppTarget(Parcel parcel) { @@ -71,13 +81,12 @@ public final class AppTarget implements Parcelable { mShortcutInfo = parcel.readTypedObject(ShortcutInfo.CREATOR); if (mShortcutInfo == null) { mPackageName = parcel.readString(); - mClassName = parcel.readString(); mUser = UserHandle.of(parcel.readInt()); } else { mPackageName = mShortcutInfo.getPackage(); mUser = mShortcutInfo.getUserHandle(); - mClassName = null; } + mClassName = parcel.readString(); mRank = parcel.readInt(); } @@ -129,11 +138,32 @@ public final class AppTarget implements Parcelable { mRank = rank; } + /** + * Returns the rank for the target. + */ public int getRank() { return mRank; } @Override + public boolean equals(Object o) { + if (!getClass().equals(o != null ? o.getClass() : null)) return false; + + AppTarget other = (AppTarget) o; + boolean sameClassName = (mClassName == null && other.mClassName == null) + || (mClassName != null && mClassName.equals(other.mClassName)); + boolean sameShortcutInfo = (mShortcutInfo == null && other.mShortcutInfo == null) + || (mShortcutInfo != null && other.mShortcutInfo != null + && mShortcutInfo.getId() == other.mShortcutInfo.getId()); + return mId.equals(other.mId) + && mPackageName.equals(other.mPackageName) + && sameClassName + && mUser.equals(other.mUser) + && sameShortcutInfo + && mRank == other.mRank; + } + + @Override public int describeContents() { return 0; } @@ -144,9 +174,9 @@ public final class AppTarget implements Parcelable { dest.writeTypedObject(mShortcutInfo, flags); if (mShortcutInfo == null) { dest.writeString(mPackageName); - dest.writeString(mClassName); dest.writeInt(mUser.getIdentifier()); } + dest.writeString(mClassName); dest.writeInt(mRank); } diff --git a/core/java/android/app/prediction/AppTargetEvent.java b/core/java/android/app/prediction/AppTargetEvent.java index 18317e1bf99d..37e41deba544 100644 --- a/core/java/android/app/prediction/AppTargetEvent.java +++ b/core/java/android/app/prediction/AppTargetEvent.java @@ -19,6 +19,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -30,6 +31,7 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi +@TestApi public final class AppTargetEvent implements Parcelable { /** @@ -96,6 +98,16 @@ public final class AppTargetEvent implements Parcelable { } @Override + public boolean equals(Object o) { + if (!getClass().equals(o != null ? o.getClass() : null)) return false; + + AppTargetEvent other = (AppTargetEvent) o; + return mTarget.equals(other.mTarget) + && mLocation.equals(other.mLocation) + && mAction == other.mAction; + } + + @Override public int describeContents() { return 0; } @@ -126,6 +138,7 @@ public final class AppTargetEvent implements Parcelable { * @hide */ @SystemApi + @TestApi public static final class Builder { private AppTarget mTarget; private String mLocation; diff --git a/core/java/android/app/prediction/AppTargetId.java b/core/java/android/app/prediction/AppTargetId.java index 0b8fb47377d2..639ba78f76f5 100644 --- a/core/java/android/app/prediction/AppTargetId.java +++ b/core/java/android/app/prediction/AppTargetId.java @@ -17,6 +17,7 @@ package android.app.prediction; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -25,14 +26,19 @@ import android.os.Parcelable; * @hide */ @SystemApi +@TestApi public final class AppTargetId implements Parcelable { @NonNull private final String mId; /** + * TODO(b/123591863): Add java docs + * * @hide */ + @SystemApi + @TestApi public AppTargetId(@NonNull String id) { mId = id; } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 8d14091478c3..a3021f371e19 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -971,7 +971,8 @@ public class Intent implements Parcelable, Cloneable { * * @param target The Intent that the user will be selecting an activity * to perform. - * @param title Optional title that will be displayed in the chooser. + * @param title Optional title that will be displayed in the chooser, + * only when the target action is not ACTION_SEND or ACTION_SEND_MULTIPLE. * @return Return a new Intent object that you can hand to * {@link Context#startActivity(Intent) Context.startActivity()} and * related methods. @@ -998,7 +999,8 @@ public class Intent implements Parcelable, Cloneable { * * @param target The Intent that the user will be selecting an activity * to perform. - * @param title Optional title that will be displayed in the chooser. + * @param title Optional title that will be displayed in the chooser, + * only when the target action is not ACTION_SEND or ACTION_SEND_MULTIPLE. * @param sender Optional IntentSender to be called when a choice is made. * @return Return a new Intent object that you can hand to * {@link Context#startActivity(Intent) Context.startActivity()} and @@ -1487,6 +1489,24 @@ public class Intent implements Parcelable, Cloneable { "android.intent.action.PENDING_INCIDENT_REPORTS_CHANGED"; /** + * An incident report has been taken, and the user has approved it for sharing. + * <p> + * This will be sent directly to the registered receiver, which must have + * both the DUMP and USAGE_STATS permissions. + * <p> + * After receiving this, the application should wait until a suitable time + * (e.g. network available), get the list of available reports with + * {@link IncidentManager#getIncidentReportList IncidentManager.getIncidentReportList(String)} + * and then when the reports have been successfully uploaded, call + * {@link IncidentManager#deleteIncidentReport IncidentManager.deleteIncidentReport(Uri)}. + * + * @hide + */ + @SystemApi + public static final String ACTION_INCIDENT_REPORT_READY = + "android.intent.action.INCIDENT_REPORT_READY"; + + /** * Activity Action: Show power usage information to the user. * <p>Input: Nothing. * <p>Output: Nothing. diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl index d1bc37791d40..50bb3c721763 100644 --- a/core/java/android/content/pm/ILauncherApps.aidl +++ b/core/java/android/content/pm/ILauncherApps.aidl @@ -24,6 +24,8 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.IOnAppsChangedListener; import android.content.pm.LauncherApps; +import android.content.pm.IPackageInstallerCallback; +import android.content.pm.PackageInstaller; import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.content.pm.ShortcutInfo; @@ -44,6 +46,9 @@ interface ILauncherApps { String callingPackage, String packageName, in UserHandle user); ActivityInfo resolveActivity( String callingPackage, in ComponentName component, in UserHandle user); + void startSessionDetailsActivityAsUser(in IApplicationThread caller, String callingPackage, + in PackageInstaller.SessionInfo sessionInfo, in Rect sourceBounds, in Bundle opts, + in UserHandle user); void startActivityAsUser(in IApplicationThread caller, String callingPackage, in ComponentName component, in Rect sourceBounds, in Bundle opts, in UserHandle user); @@ -79,4 +84,9 @@ interface ILauncherApps { String callingPackage, String packageName, in UserHandle user); IntentSender getShortcutConfigActivityIntent(String callingPackage, in ComponentName component, in UserHandle user); + + // Unregister is performed using package installer + void registerPackageInstallerCallback(String callingPackage, + in IPackageInstallerCallback callback); + ParceledListSlice getAllSessions(String callingPackage); } diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 98dd9b3aa30b..b0d16cdace21 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -16,6 +16,7 @@ package android.content.pm; +import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -32,6 +33,9 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentSender; +import android.content.pm.PackageInstaller.SessionCallback; +import android.content.pm.PackageInstaller.SessionCallbackDelegate; +import android.content.pm.PackageInstaller.SessionInfo; import android.content.pm.PackageManager.ApplicationInfoFlags; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; @@ -65,7 +69,9 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Iterator; import java.util.List; +import java.util.concurrent.Executor; /** * Class for retrieving a list of launchable activities for the current user and any associated @@ -154,8 +160,8 @@ public class LauncherApps { private final PackageManager mPm; private final UserManager mUserManager; - private List<CallbackMessageHandler> mCallbacks - = new ArrayList<CallbackMessageHandler>(); + private final List<CallbackMessageHandler> mCallbacks = new ArrayList<>(); + private final List<SessionCallbackDelegate> mDelegates = new ArrayList<>(); /** * Callbacks for package changes to this and related managed profiles. @@ -572,6 +578,24 @@ public class LauncherApps { } /** + * Starts an activity to show the details of the specified session. + * + * @param sessionInfo The SessionInfo of the session + * @param sourceBounds The Rect containing the source bounds of the clicked icon + * @param opts Options to pass to startActivity + */ + public void startPackageInstallerSessionDetailsActivity(SessionInfo sessionInfo, + Rect sourceBounds, Bundle opts) { + try { + mService.startSessionDetailsActivityAsUser(mContext.getIApplicationThread(), + mContext.getPackageName(), sessionInfo, sourceBounds, opts, + sessionInfo.getUser()); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } + + /** * Starts the settings activity to show the application details for a * package in the specified profile. * @@ -1131,7 +1155,7 @@ public class LauncherApps { } /** - * Registers a callback for changes to packages in current and managed profiles. + * Registers a callback for changes to packages in this user and managed profiles. * * @param callback The callback to register. */ @@ -1140,7 +1164,7 @@ public class LauncherApps { } /** - * Registers a callback for changes to packages in current and managed profiles. + * Registers a callback for changes to packages in this user and managed profiles. * * @param callback The callback to register. * @param handler that should be used to post callbacks on, may be null. @@ -1446,6 +1470,64 @@ public class LauncherApps { } /** + * Register a callback to watch for session lifecycle events in this user and managed profiles. + * @param callback The callback to register. + * @param executor {@link Executor} to handle the callbacks, cannot be null. + * + * @see PackageInstaller#registerSessionCallback(SessionCallback) + */ + public void registerPackageInstallerSessionCallback( + @NonNull @CallbackExecutor Executor executor, @NonNull SessionCallback callback) { + if (executor == null) { + throw new NullPointerException("Executor must not be null"); + } + + synchronized (mDelegates) { + final SessionCallbackDelegate delegate = new SessionCallbackDelegate(callback, + executor); + try { + mService.registerPackageInstallerCallback(mContext.getPackageName(), + delegate); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + mDelegates.add(delegate); + } + } + + /** + * Unregisters a callback that was previously registered. + * + * @param callback The callback to unregister. + * @see #registerPackageInstallerSessionCallback(Executor, SessionCallback) + */ + public void unregisterPackageInstallerSessionCallback(SessionCallback callback) { + synchronized (mDelegates) { + for (Iterator<SessionCallbackDelegate> i = mDelegates.iterator(); i.hasNext();) { + final SessionCallbackDelegate delegate = i.next(); + if (delegate.mCallback == callback) { + mPm.getPackageInstaller().unregisterSessionCallback(delegate.mCallback); + i.remove(); + } + } + } + } + + /** + * Return list of all known install sessions in this user and managed profiles, regardless + * of the installer. + * + * @see PackageInstaller#getAllSessions() + */ + public @NonNull List<SessionInfo> getAllPackageInstallerSessions() { + try { + return mService.getAllSessions(mContext.getPackageName()).getList(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * A helper method to extract a {@link PinItemRequest} set to * the {@link #EXTRA_PIN_ITEM_REQUEST} extra. */ diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 2dc014c45fad..4f674bd378c0 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -36,20 +36,21 @@ import android.net.Uri; import android.os.Build; import android.os.FileBridge; import android.os.Handler; -import android.os.Looper; -import android.os.Message; +import android.os.HandlerExecutor; import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.os.Parcelable; import android.os.ParcelableException; import android.os.RemoteException; import android.os.SystemProperties; +import android.os.UserHandle; import android.system.ErrnoException; import android.system.Os; import android.util.ExceptionUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; +import com.android.internal.util.function.pooled.PooledLambda; import java.io.Closeable; import java.io.IOException; @@ -61,6 +62,7 @@ import java.security.MessageDigest; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.concurrent.Executor; /** * Offers the ability to install, upgrade, and remove applications on the @@ -659,8 +661,7 @@ public class PackageInstaller { } /** {@hide} */ - private static class SessionCallbackDelegate extends IPackageInstallerCallback.Stub implements - Handler.Callback { + static class SessionCallbackDelegate extends IPackageInstallerCallback.Stub { private static final int MSG_SESSION_CREATED = 1; private static final int MSG_SESSION_BADGING_CHANGED = 2; private static final int MSG_SESSION_ACTIVE_CHANGED = 3; @@ -668,63 +669,41 @@ public class PackageInstaller { private static final int MSG_SESSION_FINISHED = 5; final SessionCallback mCallback; - final Handler mHandler; + final Executor mExecutor; - public SessionCallbackDelegate(SessionCallback callback, Looper looper) { + SessionCallbackDelegate(SessionCallback callback, Executor executor) { mCallback = callback; - mHandler = new Handler(looper, this); - } - - @Override - public boolean handleMessage(Message msg) { - final int sessionId = msg.arg1; - switch (msg.what) { - case MSG_SESSION_CREATED: - mCallback.onCreated(sessionId); - return true; - case MSG_SESSION_BADGING_CHANGED: - mCallback.onBadgingChanged(sessionId); - return true; - case MSG_SESSION_ACTIVE_CHANGED: - final boolean active = msg.arg2 != 0; - mCallback.onActiveChanged(sessionId, active); - return true; - case MSG_SESSION_PROGRESS_CHANGED: - mCallback.onProgressChanged(sessionId, (float) msg.obj); - return true; - case MSG_SESSION_FINISHED: - mCallback.onFinished(sessionId, msg.arg2 != 0); - return true; - } - return false; + mExecutor = executor; } @Override public void onSessionCreated(int sessionId) { - mHandler.obtainMessage(MSG_SESSION_CREATED, sessionId, 0).sendToTarget(); + mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onCreated, mCallback, + sessionId).recycleOnUse()); } @Override public void onSessionBadgingChanged(int sessionId) { - mHandler.obtainMessage(MSG_SESSION_BADGING_CHANGED, sessionId, 0).sendToTarget(); + mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onBadgingChanged, + mCallback, sessionId).recycleOnUse()); } @Override public void onSessionActiveChanged(int sessionId, boolean active) { - mHandler.obtainMessage(MSG_SESSION_ACTIVE_CHANGED, sessionId, active ? 1 : 0) - .sendToTarget(); + mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onActiveChanged, + mCallback, sessionId, active).recycleOnUse()); } @Override public void onSessionProgressChanged(int sessionId, float progress) { - mHandler.obtainMessage(MSG_SESSION_PROGRESS_CHANGED, sessionId, 0, progress) - .sendToTarget(); + mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onProgressChanged, + mCallback, sessionId, progress).recycleOnUse()); } @Override public void onSessionFinished(int sessionId, boolean success) { - mHandler.obtainMessage(MSG_SESSION_FINISHED, sessionId, success ? 1 : 0) - .sendToTarget(); + mExecutor.execute(PooledLambda.obtainRunnable(SessionCallback::onFinished, + mCallback, sessionId, success).recycleOnUse()); } } @@ -758,7 +737,7 @@ public class PackageInstaller { public void registerSessionCallback(@NonNull SessionCallback callback, @NonNull Handler handler) { synchronized (mDelegates) { final SessionCallbackDelegate delegate = new SessionCallbackDelegate(callback, - handler.getLooper()); + new HandlerExecutor(handler)); try { mInstaller.registerCallback(delegate, mUserId); } catch (RemoteException e) { @@ -1649,6 +1628,8 @@ public class PackageInstaller { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) public int sessionId; /** {@hide} */ + public int userId; + /** {@hide} */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) public String installerPackageName; /** {@hide} */ @@ -1720,6 +1701,7 @@ public class PackageInstaller { /** {@hide} */ public SessionInfo(Parcel source) { sessionId = source.readInt(); + userId = source.readInt(); installerPackageName = source.readString(); resolvedBaseCodePath = source.readString(); progress = source.readFloat(); @@ -1761,6 +1743,13 @@ public class PackageInstaller { } /** + * Return the user associated with this session. + */ + public UserHandle getUser() { + return new UserHandle(userId); + } + + /** * Return the package name of the app that owns this session. */ public @Nullable String getInstallerPackageName() { @@ -2091,6 +2080,7 @@ public class PackageInstaller { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(sessionId); + dest.writeInt(userId); dest.writeString(installerPackageName); dest.writeString(resolvedBaseCodePath); dest.writeFloat(progress); diff --git a/core/java/android/content/rollback/PackageRollbackInfo.java b/core/java/android/content/rollback/PackageRollbackInfo.java index 4644a83de462..d4ed35a9cb71 100644 --- a/core/java/android/content/rollback/PackageRollbackInfo.java +++ b/core/java/android/content/rollback/PackageRollbackInfo.java @@ -16,10 +16,14 @@ package android.content.rollback; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.content.pm.VersionedPackage; import android.os.Parcel; import android.os.Parcelable; +import android.util.IntArray; + +import java.util.ArrayList; /** * Information about a rollback available for a particular package. @@ -33,6 +37,38 @@ public final class PackageRollbackInfo implements Parcelable { private final VersionedPackage mVersionRolledBackTo; /** + * Encapsulates information required to restore a snapshot of an app's userdata. + * + * @hide + */ + public static class RestoreInfo { + public final int userId; + public final int appId; + public final String seInfo; + + public RestoreInfo(int userId, int appId, String seInfo) { + this.userId = userId; + this.appId = appId; + this.seInfo = seInfo; + } + } + + /* + * The list of users for which we need to backup userdata for this package. Backups of + * credential encrypted data are listed as pending if the user hasn't unlocked their device + * with credentials yet. + */ + // NOTE: Not a part of the Parcelable representation of this object. + private final IntArray mPendingBackups; + + /** + * The list of users for which we need to restore userdata for this package. This field is + * non-null only after a rollback for this package has been committed. + */ + // NOTE: Not a part of the Parcelable representation of this object. + private final ArrayList<RestoreInfo> mPendingRestores; + + /** * Returns the name of the package to roll back from. */ public String getPackageName() { @@ -54,15 +90,46 @@ public final class PackageRollbackInfo implements Parcelable { } /** @hide */ + public IntArray getPendingBackups() { + return mPendingBackups; + } + + /** @hide */ + public ArrayList<RestoreInfo> getPendingRestores() { + return mPendingRestores; + } + + /** @hide */ + public RestoreInfo getRestoreInfo(int userId) { + for (RestoreInfo ri : mPendingRestores) { + if (ri.userId == userId) { + return ri; + } + } + + return null; + } + + /** @hide */ + public void removeRestoreInfo(RestoreInfo ri) { + mPendingRestores.remove(ri); + } + + /** @hide */ public PackageRollbackInfo(VersionedPackage packageRolledBackFrom, - VersionedPackage packageRolledBackTo) { + VersionedPackage packageRolledBackTo, + @NonNull IntArray pendingBackups, @NonNull ArrayList<RestoreInfo> pendingRestores) { this.mVersionRolledBackFrom = packageRolledBackFrom; this.mVersionRolledBackTo = packageRolledBackTo; + this.mPendingBackups = pendingBackups; + this.mPendingRestores = pendingRestores; } private PackageRollbackInfo(Parcel in) { this.mVersionRolledBackFrom = VersionedPackage.CREATOR.createFromParcel(in); this.mVersionRolledBackTo = VersionedPackage.CREATOR.createFromParcel(in); + this.mPendingRestores = null; + this.mPendingBackups = null; } @Override diff --git a/core/java/android/content/rollback/RollbackInfo.java b/core/java/android/content/rollback/RollbackInfo.java index 1111b4320eb9..3fd247670a9d 100644 --- a/core/java/android/content/rollback/RollbackInfo.java +++ b/core/java/android/content/rollback/RollbackInfo.java @@ -83,7 +83,7 @@ public final class RollbackInfo implements Parcelable { * Returns the session ID for the committed rollback for staged rollbacks. * Only applicable for rollbacks that have been committed. */ - public int getSessionId() { + public int getCommittedSessionId() { // TODO: Support rollback of staged installs. return PackageInstaller.SessionInfo.INVALID_ID; } diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index f9c2c3e2c983..a1b0803e0203 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -2644,10 +2644,29 @@ public final class SQLiteDatabase extends SQLiteClosable { * Sets the maximum number of milliseconds that SQLite connection is allowed to be idle * before it is closed and removed from the pool. * + * <p>DO NOT USE this method unless you fully understand the implication + * of what it does. + * A connection timeout allows the system to internally close a connection to a SQLite + * database after a given timeout. + * This is good for reducing app's memory consumption, but it has + * side effects that are hard to predict. For example, SQLite internally maintains + * a lot of "per-connection" states that apps can typically modify with a {@code PRAGMA} + * statement, and such states will be reset once the connection is closed. + * The system does not provide a callback that would allow apps to + * reconfigure a newly created connection and thus there's no way to re-configure + * connections when they're re-made internally. Do not use it unless you're sure + * your app uses no per-connection states. + * * @param idleConnectionTimeoutMs timeout in milliseconds. Use {@link Long#MAX_VALUE} * to allow unlimited idle connections. + * + * @see SQLiteOpenHelper#setIdleConnectionTimeout(long) + * + * @deprecated DO NOT USE this method unless you fully understand the implication + * of what it does. */ @NonNull + @Deprecated public Builder setIdleConnectionTimeout( @IntRange(from = 0) long idleConnectionTimeoutMs) { Preconditions.checkArgument(idleConnectionTimeoutMs >= 0, diff --git a/core/java/android/database/sqlite/SQLiteOpenHelper.java b/core/java/android/database/sqlite/SQLiteOpenHelper.java index 19c6745ef8d4..ceeecbc311d8 100644 --- a/core/java/android/database/sqlite/SQLiteOpenHelper.java +++ b/core/java/android/database/sqlite/SQLiteOpenHelper.java @@ -263,9 +263,21 @@ public abstract class SQLiteOpenHelper implements AutoCloseable { * <p>This method should be called from the constructor of the subclass, * before opening the database * + * <p>DO NOT USE this method unless you fully understand the implication + * of what it does. + * See the javadoc of + * {@link SQLiteDatabase.OpenParams.Builder#setIdleConnectionTimeout(long)} + * for the details. + * * @param idleConnectionTimeoutMs timeout in milliseconds. Use {@link Long#MAX_VALUE} value * to allow unlimited idle connections. + * + * @see SQLiteDatabase.OpenParams.Builder#setIdleConnectionTimeout(long) + * + * @deprecated DO NOT USE this method unless you fully understand the implication + * of what it does. */ + @Deprecated public void setIdleConnectionTimeout(@IntRange(from = 0) final long idleConnectionTimeoutMs) { synchronized (this) { if (mDatabase != null && mDatabase.isOpen()) { diff --git a/core/java/android/net/CaptivePortal.java b/core/java/android/net/CaptivePortal.java index 3b0126673779..3ab35e1eebf0 100644 --- a/core/java/android/net/CaptivePortal.java +++ b/core/java/android/net/CaptivePortal.java @@ -117,4 +117,17 @@ public class CaptivePortal implements Parcelable { } catch (RemoteException e) { } } + + /** + * Log a captive portal login event. + * @hide + */ + @SystemApi + @TestApi + public void logEvent(int eventId, String packageName) { + try { + ICaptivePortal.Stub.asInterface(mBinder).logEvent(eventId, packageName); + } catch (RemoteException e) { + } + } } diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 3bae12e93745..869cf6477df0 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -1033,34 +1033,6 @@ public class ConnectivityManager { } } - /** - * Configures an always-on VPN connection through a specific application. - * This connection is automatically granted and persisted after a reboot. - * - * <p>The designated package should declare a {@link VpnService} in its - * manifest guarded by {@link android.Manifest.permission.BIND_VPN_SERVICE}, - * otherwise the call will fail. - * - * @param userId The identifier of the user to set an always-on VPN for. - * @param vpnPackage The package name for an installed VPN app on the device, or {@code null} - * to remove an existing always-on VPN configuration. - * @param lockdownEnabled {@code true} to disallow networking when the VPN is not connected or - * {@code false} otherwise. - * @return {@code true} if the package is set as always-on VPN controller; - * {@code false} otherwise. - * @hide - */ - @RequiresPermission(android.Manifest.permission.CONTROL_ALWAYS_ON_VPN) - public boolean setAlwaysOnVpnPackageForUser(int userId, @Nullable String vpnPackage, - boolean lockdownEnabled) { - try { - return mService.setAlwaysOnVpnPackage( - userId, vpnPackage, lockdownEnabled, /* whitelist */ null); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - /** * Returns the package name of the currently set always-on VPN application. * If there is no always-on VPN set, or the VPN is provided by the system instead @@ -2918,11 +2890,11 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** {@hide} - returns the factory serial number */ @UnsupportedAppUsage - public void registerNetworkFactory(Messenger messenger, String name) { + public int registerNetworkFactory(Messenger messenger, String name) { try { - mService.registerNetworkFactory(messenger, name); + return mService.registerNetworkFactory(messenger, name); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -2938,6 +2910,10 @@ public class ConnectivityManager { } } + // TODO : remove this method. It is a stopgap measure to help sheperding a number + // of dependent changes that would conflict throughout the automerger graph. Having this + // temporarily helps with the process of going through with all these dependent changes across + // the entire tree. /** * @hide * Register a NetworkAgent with ConnectivityService. @@ -2945,8 +2921,20 @@ public class ConnectivityManager { */ public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp, NetworkCapabilities nc, int score, NetworkMisc misc) { + return registerNetworkAgent(messenger, ni, lp, nc, score, misc, + NetworkFactory.SerialNumber.NONE); + } + + /** + * @hide + * Register a NetworkAgent with ConnectivityService. + * @return NetID corresponding to NetworkAgent. + */ + public int registerNetworkAgent(Messenger messenger, NetworkInfo ni, LinkProperties lp, + NetworkCapabilities nc, int score, NetworkMisc misc, int factorySerialNumber) { try { - return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc); + return mService.registerNetworkAgent(messenger, ni, lp, nc, score, misc, + factorySerialNumber); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/net/DhcpResults.java b/core/java/android/net/DhcpResults.java index 6c291c25dbdf..6f9e65fdf12c 100644 --- a/core/java/android/net/DhcpResults.java +++ b/core/java/android/net/DhcpResults.java @@ -17,6 +17,7 @@ package android.net; import android.annotation.UnsupportedAppUsage; +import android.net.shared.InetAddressUtils; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; @@ -73,19 +74,21 @@ public final class DhcpResults implements Parcelable { public StaticIpConfiguration toStaticIpConfiguration() { final StaticIpConfiguration s = new StaticIpConfiguration(); // All these except dnsServers are immutable, so no need to make copies. - s.ipAddress = ipAddress; - s.gateway = gateway; - s.dnsServers.addAll(dnsServers); - s.domains = domains; + s.setIpAddress(ipAddress); + s.setGateway(gateway); + for (InetAddress addr : dnsServers) { + s.addDnsServer(addr); + } + s.setDomains(domains); return s; } public DhcpResults(StaticIpConfiguration source) { if (source != null) { - ipAddress = source.ipAddress; - gateway = source.gateway; - dnsServers.addAll(source.dnsServers); - domains = source.domains; + ipAddress = source.getIpAddress(); + gateway = source.getGateway(); + dnsServers.addAll(source.getDnsServers()); + domains = source.getDomains(); } } @@ -177,7 +180,7 @@ public final class DhcpResults implements Parcelable { toStaticIpConfiguration().writeToParcel(dest, flags); dest.writeInt(leaseDuration); dest.writeInt(mtu); - NetworkUtils.parcelInetAddress(dest, serverAddress, flags); + InetAddressUtils.parcelInetAddress(dest, serverAddress, flags); dest.writeString(vendorInfo); } @@ -191,7 +194,7 @@ public final class DhcpResults implements Parcelable { final DhcpResults dhcpResults = new DhcpResults(s); dhcpResults.leaseDuration = in.readInt(); dhcpResults.mtu = in.readInt(); - dhcpResults.serverAddress = (Inet4Address) NetworkUtils.unparcelInetAddress(in); + dhcpResults.serverAddress = (Inet4Address) InetAddressUtils.unparcelInetAddress(in); dhcpResults.vendorInfo = in.readString(); return dhcpResults; } @@ -200,7 +203,7 @@ public final class DhcpResults implements Parcelable { // Not part of the superclass because they're only used by the JNI iterface to the DHCP daemon. public boolean setIpAddress(String addrString, int prefixLength) { try { - Inet4Address addr = (Inet4Address) NetworkUtils.numericToInetAddress(addrString); + Inet4Address addr = (Inet4Address) InetAddresses.parseNumericAddress(addrString); ipAddress = new LinkAddress(addr, prefixLength); } catch (IllegalArgumentException|ClassCastException e) { Log.e(TAG, "setIpAddress failed with addrString " + addrString + "/" + prefixLength); @@ -211,7 +214,7 @@ public final class DhcpResults implements Parcelable { public boolean setGateway(String addrString) { try { - gateway = NetworkUtils.numericToInetAddress(addrString); + gateway = InetAddresses.parseNumericAddress(addrString); } catch (IllegalArgumentException e) { Log.e(TAG, "setGateway failed with addrString " + addrString); return true; @@ -222,7 +225,7 @@ public final class DhcpResults implements Parcelable { public boolean addDns(String addrString) { if (TextUtils.isEmpty(addrString) == false) { try { - dnsServers.add(NetworkUtils.numericToInetAddress(addrString)); + dnsServers.add(InetAddresses.parseNumericAddress(addrString)); } catch (IllegalArgumentException e) { Log.e(TAG, "addDns failed with addrString " + addrString); return true; diff --git a/core/java/android/net/ICaptivePortal.aidl b/core/java/android/net/ICaptivePortal.aidl index 56ae57dc0e8d..707b4f699873 100644 --- a/core/java/android/net/ICaptivePortal.aidl +++ b/core/java/android/net/ICaptivePortal.aidl @@ -22,4 +22,5 @@ package android.net; */ oneway interface ICaptivePortal { void appResponse(int response); + void logEvent(int eventId, String packageName); } diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index fd7360fd4c17..f88adc2c64b7 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -139,14 +139,14 @@ interface IConnectivityManager void setAirplaneMode(boolean enable); - void registerNetworkFactory(in Messenger messenger, in String name); + int registerNetworkFactory(in Messenger messenger, in String name); boolean requestBandwidthUpdate(in Network network); void unregisterNetworkFactory(in Messenger messenger); int registerNetworkAgent(in Messenger messenger, in NetworkInfo ni, in LinkProperties lp, - in NetworkCapabilities nc, int score, in NetworkMisc misc); + in NetworkCapabilities nc, int score, in NetworkMisc misc, in int factorySerialNumber); NetworkRequest requestNetwork(in NetworkCapabilities networkCapabilities, in Messenger messenger, int timeoutSec, in IBinder binder, int legacy); diff --git a/core/java/android/net/INetworkMonitorCallbacks.aidl b/core/java/android/net/INetworkMonitorCallbacks.aidl index 0bc25750129b..a8682f9ddd3b 100644 --- a/core/java/android/net/INetworkMonitorCallbacks.aidl +++ b/core/java/android/net/INetworkMonitorCallbacks.aidl @@ -26,4 +26,5 @@ oneway interface INetworkMonitorCallbacks { void notifyPrivateDnsConfigResolved(in PrivateDnsConfigParcel config); void showProvisioningNotification(String action); void hideProvisioningNotification(); + void logCaptivePortalLoginEvent(int eventId, String packageName); }
\ No newline at end of file diff --git a/core/java/android/net/INetworkStackConnector.aidl b/core/java/android/net/INetworkStackConnector.aidl index 8b64f1c7c45a..e052488f38c8 100644 --- a/core/java/android/net/INetworkStackConnector.aidl +++ b/core/java/android/net/INetworkStackConnector.aidl @@ -16,6 +16,7 @@ package android.net; import android.net.INetworkMonitorCallbacks; +import android.net.NetworkParcelable; import android.net.dhcp.DhcpServingParamsParcel; import android.net.dhcp.IDhcpServerCallbacks; import android.net.ip.IIpClientCallbacks; @@ -24,6 +25,7 @@ import android.net.ip.IIpClientCallbacks; oneway interface INetworkStackConnector { void makeDhcpServer(in String ifName, in DhcpServingParamsParcel params, in IDhcpServerCallbacks cb); - void makeNetworkMonitor(int netId, String name, in INetworkMonitorCallbacks cb); + void makeNetworkMonitor(in NetworkParcelable network, String name, + in INetworkMonitorCallbacks cb); void makeIpClient(in String ifName, in IIpClientCallbacks callbacks); }
\ No newline at end of file diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java index 99bfc140f140..204c25f01d01 100644 --- a/core/java/android/net/NetworkAgent.java +++ b/core/java/android/net/NetworkAgent.java @@ -58,6 +58,7 @@ public abstract class NetworkAgent extends Handler { private static final long BW_REFRESH_MIN_WIN_MS = 500; private boolean mPollLceScheduled = false; private AtomicBoolean mPollLcePending = new AtomicBoolean(false); + public final int mFactorySerialNumber; private static final int BASE = Protocol.BASE_NETWORK_AGENT; @@ -193,16 +194,31 @@ public abstract class NetworkAgent extends Handler { */ public static final int CMD_PREVENT_AUTOMATIC_RECONNECT = BASE + 15; + // TODO : remove these two constructors. They are a stopgap measure to help sheperding a number + // of dependent changes that would conflict throughout the automerger graph. Having these + // temporarily helps with the process of going through with all these dependent changes across + // the entire tree. public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score) { - this(looper, context, logTag, ni, nc, lp, score, null); + this(looper, context, logTag, ni, nc, lp, score, null, NetworkFactory.SerialNumber.NONE); } - public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) { + this(looper, context, logTag, ni, nc, lp, score, misc, NetworkFactory.SerialNumber.NONE); + } + + public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, + NetworkCapabilities nc, LinkProperties lp, int score, int factorySerialNumber) { + this(looper, context, logTag, ni, nc, lp, score, null, factorySerialNumber); + } + + public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, + NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc, + int factorySerialNumber) { super(looper); LOG_TAG = logTag; mContext = context; + mFactorySerialNumber = factorySerialNumber; if (ni == null || nc == null || lp == null) { throw new IllegalArgumentException(); } @@ -211,7 +227,8 @@ public abstract class NetworkAgent extends Handler { ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService( Context.CONNECTIVITY_SERVICE); netId = cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni), - new LinkProperties(lp), new NetworkCapabilities(nc), score, misc); + new LinkProperties(lp), new NetworkCapabilities(nc), score, misc, + factorySerialNumber); } @Override diff --git a/core/java/android/net/NetworkFactory.java b/core/java/android/net/NetworkFactory.java index 181cab41e928..0dfe7a495738 100644 --- a/core/java/android/net/NetworkFactory.java +++ b/core/java/android/net/NetworkFactory.java @@ -32,6 +32,7 @@ import com.android.internal.util.Protocol; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.concurrent.atomic.AtomicInteger; /** * A NetworkFactory is an entity that creates NetworkAgent objects. @@ -49,6 +50,20 @@ import java.io.PrintWriter; * @hide **/ public class NetworkFactory extends Handler { + /** @hide */ + public static class SerialNumber { + // Guard used by no network factory. + public static final int NONE = -1; + // A hardcoded serial number for NetworkAgents representing VPNs. These agents are + // not created by any factory, so they use this constant for clarity instead of NONE. + public static final int VPN = -2; + private static final AtomicInteger sNetworkFactorySerialNumber = new AtomicInteger(1); + /** Returns a unique serial number for a factory. */ + public static final int nextSerialNumber() { + return sNetworkFactorySerialNumber.getAndIncrement(); + } + } + private static final boolean DBG = true; private static final boolean VDBG = false; @@ -64,7 +79,7 @@ public class NetworkFactory extends Handler { * disregard any that it will never be able to service, for example * those requiring a different bearer. * msg.obj = NetworkRequest - * msg.arg1 = score - the score of the any network currently satisfying this + * msg.arg1 = score - the score of the network currently satisfying this * request. If this bearer knows in advance it cannot * exceed this score it should not try to connect, holding the request * for the future. @@ -74,6 +89,8 @@ public class NetworkFactory extends Handler { * with the same NetworkRequest but an updated score. * Also, network conditions may change for this bearer * allowing for a better score in the future. + * msg.arg2 = the serial number of the factory currently responsible for the + * NetworkAgent handling this request, or SerialNumber.NONE if none. */ public static final int CMD_REQUEST_NETWORK = BASE; @@ -107,6 +124,7 @@ public class NetworkFactory extends Handler { private int mRefCount = 0; private Messenger mMessenger = null; + private int mSerialNumber; @UnsupportedAppUsage public NetworkFactory(Looper looper, Context context, String logTag, @@ -121,7 +139,8 @@ public class NetworkFactory extends Handler { if (DBG) log("Registering NetworkFactory"); if (mMessenger == null) { mMessenger = new Messenger(this); - ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger, LOG_TAG); + mSerialNumber = ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger, + LOG_TAG); } } @@ -137,7 +156,7 @@ public class NetworkFactory extends Handler { public void handleMessage(Message msg) { switch (msg.what) { case CMD_REQUEST_NETWORK: { - handleAddRequest((NetworkRequest)msg.obj, msg.arg1); + handleAddRequest((NetworkRequest) msg.obj, msg.arg1, msg.arg2); break; } case CMD_CANCEL_REQUEST: { @@ -159,11 +178,13 @@ public class NetworkFactory extends Handler { public final NetworkRequest request; public int score; public boolean requested; // do we have a request outstanding, limited by score + public int factorySerialNumber; - public NetworkRequestInfo(NetworkRequest request, int score) { + NetworkRequestInfo(NetworkRequest request, int score, int factorySerialNumber) { this.request = request; this.score = score; this.requested = false; + this.factorySerialNumber = factorySerialNumber; } @Override @@ -172,16 +193,51 @@ public class NetworkFactory extends Handler { } } + /** + * Add a NetworkRequest that the bearer may want to attempt to satisfy. + * @see #CMD_REQUEST_NETWORK + * + * @param request the request to handle. + * @param score the score of the NetworkAgent currently satisfying this request. + * @param servingFactorySerialNumber the serial number of the NetworkFactory that + * created the NetworkAgent currently satisfying this request. + */ + // TODO : remove this method. It is a stopgap measure to help sheperding a number + // of dependent changes that would conflict throughout the automerger graph. Having this + // temporarily helps with the process of going through with all these dependent changes across + // the entire tree. @VisibleForTesting protected void handleAddRequest(NetworkRequest request, int score) { + handleAddRequest(request, score, SerialNumber.NONE); + } + + /** + * Add a NetworkRequest that the bearer may want to attempt to satisfy. + * @see #CMD_REQUEST_NETWORK + * + * @param request the request to handle. + * @param score the score of the NetworkAgent currently satisfying this request. + * @param servingFactorySerialNumber the serial number of the NetworkFactory that + * created the NetworkAgent currently satisfying this request. + */ + @VisibleForTesting + protected void handleAddRequest(NetworkRequest request, int score, + int servingFactorySerialNumber) { NetworkRequestInfo n = mNetworkRequests.get(request.requestId); if (n == null) { - if (DBG) log("got request " + request + " with score " + score); - n = new NetworkRequestInfo(request, score); + if (DBG) { + log("got request " + request + " with score " + score + + " and serial " + servingFactorySerialNumber); + } + n = new NetworkRequestInfo(request, score, servingFactorySerialNumber); mNetworkRequests.put(n.request.requestId, n); } else { - if (VDBG) log("new score " + score + " for exisiting request " + request); + if (VDBG) { + log("new score " + score + " for exisiting request " + request + + " with serial " + servingFactorySerialNumber); + } n.score = score; + n.factorySerialNumber = servingFactorySerialNumber; } if (VDBG) log(" my score=" + mScore + ", my filter=" + mCapabilityFilter); @@ -231,16 +287,19 @@ public class NetworkFactory extends Handler { } private void evalRequest(NetworkRequestInfo n) { - if (VDBG) log("evalRequest"); - if (n.requested == false && n.score < mScore && - n.request.networkCapabilities.satisfiedByNetworkCapabilities( - mCapabilityFilter) && acceptRequest(n.request, n.score)) { + if (VDBG) { + log("evalRequest"); + log(" n.requests = " + n.requested); + log(" n.score = " + n.score); + log(" mScore = " + mScore); + log(" n.factorySerialNumber = " + n.factorySerialNumber); + log(" mSerialNumber = " + mSerialNumber); + } + if (shouldNeedNetworkFor(n)) { if (VDBG) log(" needNetworkFor"); needNetworkFor(n.request, n.score); n.requested = true; - } else if (n.requested == true && - (n.score > mScore || n.request.networkCapabilities.satisfiedByNetworkCapabilities( - mCapabilityFilter) == false || acceptRequest(n.request, n.score) == false)) { + } else if (shouldReleaseNetworkFor(n)) { if (VDBG) log(" releaseNetworkFor"); releaseNetworkFor(n.request); n.requested = false; @@ -249,10 +308,39 @@ public class NetworkFactory extends Handler { } } + private boolean shouldNeedNetworkFor(NetworkRequestInfo n) { + // If this request is already tracked, it doesn't qualify for need + return !n.requested + // If the score of this request is higher or equal to that of this factory and some + // other factory is responsible for it, then this factory should not track the request + // because it has no hope of satisfying it. + && (n.score < mScore || n.factorySerialNumber == mSerialNumber) + // If this factory can't satisfy the capability needs of this request, then it + // should not be tracked. + && n.request.networkCapabilities.satisfiedByNetworkCapabilities(mCapabilityFilter) + // Finally if the concrete implementation of the factory rejects the request, then + // don't track it. + && acceptRequest(n.request, n.score); + } + + private boolean shouldReleaseNetworkFor(NetworkRequestInfo n) { + // Don't release a request that's not tracked. + return n.requested + // The request should be released if it can't be satisfied by this factory. That + // means either of the following conditions are met : + // - Its score is too high to be satisfied by this factory and it's not already + // assigned to the factory + // - This factory can't satisfy the capability needs of the request + // - The concrete implementation of the factory rejects the request + && ((n.score > mScore && n.factorySerialNumber != mSerialNumber) + || !n.request.networkCapabilities.satisfiedByNetworkCapabilities( + mCapabilityFilter) + || !acceptRequest(n.request, n.score)); + } + private void evalRequests() { for (int i = 0; i < mNetworkRequests.size(); i++) { NetworkRequestInfo n = mNetworkRequests.valueAt(i); - evalRequest(n); } } @@ -280,16 +368,6 @@ public class NetworkFactory extends Handler { if (--mRefCount == 0) stopNetwork(); } - - public void addNetworkRequest(NetworkRequest networkRequest, int score) { - sendMessage(obtainMessage(CMD_REQUEST_NETWORK, - new NetworkRequestInfo(networkRequest, score))); - } - - public void removeNetworkRequest(NetworkRequest networkRequest) { - sendMessage(obtainMessage(CMD_CANCEL_REQUEST, networkRequest)); - } - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) public void setScoreFilter(int score) { sendMessage(obtainMessage(CMD_SET_SCORE, score, 0)); @@ -304,6 +382,10 @@ public class NetworkFactory extends Handler { return mNetworkRequests.size(); } + public int getSerialNumber() { + return mSerialNumber; + } + protected void log(String s) { Log.d(LOG_TAG, s); } @@ -321,10 +403,11 @@ public class NetworkFactory extends Handler { @Override public String toString() { - StringBuilder sb = new StringBuilder("{").append(LOG_TAG).append(" - ScoreFilter="). - append(mScore).append(", Filter=").append(mCapabilityFilter).append(", requests="). - append(mNetworkRequests.size()).append(", refCount=").append(mRefCount). - append("}"); + StringBuilder sb = new StringBuilder("{").append(LOG_TAG).append(" - mSerialNumber=") + .append(mSerialNumber).append(", ScoreFilter=") + .append(mScore).append(", Filter=").append(mCapabilityFilter).append(", requests=") + .append(mNetworkRequests.size()).append(", refCount=").append(mRefCount) + .append("}"); return sb.toString(); } } diff --git a/core/java/android/net/NetworkStack.java b/core/java/android/net/NetworkStack.java index d277034650a1..ac6bff029e8c 100644 --- a/core/java/android/net/NetworkStack.java +++ b/core/java/android/net/NetworkStack.java @@ -104,10 +104,11 @@ public class NetworkStack { * * <p>The INetworkMonitor will be returned asynchronously through the provided callbacks. */ - public void makeNetworkMonitor(Network network, String name, INetworkMonitorCallbacks cb) { + public void makeNetworkMonitor( + NetworkParcelable network, String name, INetworkMonitorCallbacks cb) { requestConnector(connector -> { try { - connector.makeNetworkMonitor(network.netId, name, cb); + connector.makeNetworkMonitor(network, name, cb); } catch (RemoteException e) { e.rethrowFromSystemServer(); } diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java index 39db4fef78b5..6a1720353f17 100644 --- a/core/java/android/net/NetworkUtils.java +++ b/core/java/android/net/NetworkUtils.java @@ -23,7 +23,6 @@ import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.net.shared.Inet4AddressUtils; import android.os.Build; -import android.os.Parcel; import android.system.ErrnoException; import android.system.Os; import android.util.Log; @@ -252,32 +251,6 @@ public class NetworkUtils { } /** - * Writes an InetAddress to a parcel. The address may be null. This is likely faster than - * calling writeSerializable. - */ - protected static void parcelInetAddress(Parcel parcel, InetAddress address, int flags) { - byte[] addressArray = (address != null) ? address.getAddress() : null; - parcel.writeByteArray(addressArray); - } - - /** - * Reads an InetAddress from a parcel. Returns null if the address that was written was null - * or if the data is invalid. - */ - protected static InetAddress unparcelInetAddress(Parcel in) { - byte[] addressArray = in.createByteArray(); - if (addressArray == null) { - return null; - } - try { - return InetAddress.getByAddress(addressArray); - } catch (UnknownHostException e) { - return null; - } - } - - - /** * Masks a raw IP address byte array with the specified prefix length. */ public static void maskRawAddress(byte[] array, int prefixLength) { diff --git a/core/java/android/net/StaticIpConfiguration.java b/core/java/android/net/StaticIpConfiguration.java index 25bae3c57423..99cf3a99f57a 100644 --- a/core/java/android/net/StaticIpConfiguration.java +++ b/core/java/android/net/StaticIpConfiguration.java @@ -19,6 +19,7 @@ package android.net; import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; +import android.net.shared.InetAddressUtils; import android.os.Parcel; import android.os.Parcelable; @@ -232,10 +233,10 @@ public final class StaticIpConfiguration implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeParcelable(ipAddress, flags); - NetworkUtils.parcelInetAddress(dest, gateway, flags); + InetAddressUtils.parcelInetAddress(dest, gateway, flags); dest.writeInt(dnsServers.size()); for (InetAddress dnsServer : dnsServers) { - NetworkUtils.parcelInetAddress(dest, dnsServer, flags); + InetAddressUtils.parcelInetAddress(dest, dnsServer, flags); } dest.writeString(domains); } @@ -244,11 +245,11 @@ public final class StaticIpConfiguration implements Parcelable { public static StaticIpConfiguration readFromParcel(Parcel in) { final StaticIpConfiguration s = new StaticIpConfiguration(); s.ipAddress = in.readParcelable(null); - s.gateway = NetworkUtils.unparcelInetAddress(in); + s.gateway = InetAddressUtils.unparcelInetAddress(in); s.dnsServers.clear(); int size = in.readInt(); for (int i = 0; i < size; i++) { - s.dnsServers.add(NetworkUtils.unparcelInetAddress(in)); + s.dnsServers.add(InetAddressUtils.unparcelInetAddress(in)); } s.domains = in.readString(); return s; diff --git a/core/java/android/net/metrics/DhcpClientEvent.java b/core/java/android/net/metrics/DhcpClientEvent.java index 2a942eedcb47..3008115e063b 100644 --- a/core/java/android/net/metrics/DhcpClientEvent.java +++ b/core/java/android/net/metrics/DhcpClientEvent.java @@ -31,10 +31,6 @@ import android.os.Parcelable; public final class DhcpClientEvent implements IpConnectivityLog.Event { // Names for recording DhcpClient pseudo-state transitions. - /** {@hide} Represents transitions from DhcpInitState to DhcpBoundState */ - public static final String INITIAL_BOUND = "InitialBoundState"; - /** {@hide} Represents transitions from and to DhcpBoundState via DhcpRenewingState */ - public static final String RENEWING_BOUND = "RenewingBoundState"; /** @hide */ public final String msg; diff --git a/core/java/android/net/shared/FdEventsReader.java b/core/java/android/net/shared/FdEventsReader.java index 5ccc560a3091..bffbfb115886 100644 --- a/core/java/android/net/shared/FdEventsReader.java +++ b/core/java/android/net/shared/FdEventsReader.java @@ -21,15 +21,15 @@ import static android.os.MessageQueue.OnFileDescriptorEventListener.EVENT_INPUT; import android.annotation.NonNull; import android.annotation.Nullable; +import android.net.util.SocketUtils; import android.os.Handler; import android.os.Looper; import android.os.MessageQueue; import android.system.ErrnoException; import android.system.OsConstants; -import libcore.io.IoUtils; - import java.io.FileDescriptor; +import java.io.IOException; /** @@ -81,7 +81,10 @@ public abstract class FdEventsReader<BufferType> { private long mPacketsReceived; protected static void closeFd(FileDescriptor fd) { - IoUtils.closeQuietly(fd); + try { + SocketUtils.closeSocket(fd); + } catch (IOException ignored) { + } } protected FdEventsReader(@NonNull Handler h, @NonNull BufferType buffer) { @@ -136,8 +139,8 @@ public abstract class FdEventsReader<BufferType> { } /** - * Subclasses MUST create the listening socket here, including setting - * all desired socket options, interface or address/port binding, etc. + * Subclasses MUST create the listening socket here, including setting all desired socket + * options, interface or address/port binding, etc. The socket MUST be created nonblocking. */ @Nullable protected abstract FileDescriptor createFd(); @@ -181,10 +184,6 @@ public abstract class FdEventsReader<BufferType> { try { mFd = createFd(); - if (mFd != null) { - // Force the socket to be non-blocking. - IoUtils.setBlocking(mFd, false); - } } catch (Exception e) { logError("Failed to create socket: ", e); closeFd(mFd); diff --git a/core/java/android/net/shared/InetAddressUtils.java b/core/java/android/net/shared/InetAddressUtils.java new file mode 100644 index 000000000000..c9ee3a7cce4b --- /dev/null +++ b/core/java/android/net/shared/InetAddressUtils.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.shared; + +import android.os.Parcel; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * Collection of utilities to interact with {@link InetAddress} + * @hide + */ +public class InetAddressUtils { + + /** + * Writes an InetAddress to a parcel. The address may be null. This is likely faster than + * calling writeSerializable. + * @hide + */ + public static void parcelInetAddress(Parcel parcel, InetAddress address, int flags) { + byte[] addressArray = (address != null) ? address.getAddress() : null; + parcel.writeByteArray(addressArray); + } + + /** + * Reads an InetAddress from a parcel. Returns null if the address that was written was null + * or if the data is invalid. + * @hide + */ + public static InetAddress unparcelInetAddress(Parcel in) { + byte[] addressArray = in.createByteArray(); + if (addressArray == null) { + return null; + } + try { + return InetAddress.getByAddress(addressArray); + } catch (UnknownHostException e) { + return null; + } + } + + private InetAddressUtils() {} +} diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index 93360a5fa377..ddec688931cb 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -34,14 +34,11 @@ import com.android.framework.protobuf.InvalidProtocolBufferException; import dalvik.system.VMRuntime; -import java.io.BufferedReader; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -63,7 +60,6 @@ public class GraphicsEnvironment { private static final boolean DEBUG = false; private static final String TAG = "GraphicsEnvironment"; private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; - private static final String GAME_DRIVER_WHITELIST_FILENAME = "whitelist.txt"; private static final String ANGLE_RULES_FILE = "a4a_rules.json"; private static final String ANGLE_TEMP_RULES = "debug.angle.rules"; private static final String ACTION_ANGLE_FOR_ANDROID = "android.app.action.ANGLE_FOR_ANDROID"; @@ -553,8 +549,9 @@ public class GraphicsEnvironment { boolean isOptIn = getGlobalSettingsString(coreSettings, Settings.Global.GAME_DRIVER_OPT_IN_APPS) .contains(ai.packageName); - - if (!isOptIn && !onWhitelist(context, driverPackageName, ai.packageName)) { + if (!isOptIn + && !getGlobalSettingsString(coreSettings, Settings.Global.GAME_DRIVER_WHITELIST) + .contains(ai.packageName)) { if (DEBUG) { Log.w(TAG, ai.packageName + " is not on the whitelist."); } @@ -647,31 +644,6 @@ public class GraphicsEnvironment { return null; } - private static boolean onWhitelist(Context context, String driverPackageName, - String applicationPackageName) { - try { - Context driverContext = context.createPackageContext(driverPackageName, - Context.CONTEXT_RESTRICTED); - AssetManager assets = driverContext.getAssets(); - InputStream stream = assets.open(GAME_DRIVER_WHITELIST_FILENAME); - BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); - for (String packageName; (packageName = reader.readLine()) != null; ) { - if (packageName.equals(applicationPackageName)) { - return true; - } - } - } catch (PackageManager.NameNotFoundException e) { - if (DEBUG) { - Log.w(TAG, "driver package '" + driverPackageName + "' not installed"); - } - } catch (IOException e) { - if (DEBUG) { - Log.w(TAG, "Failed to load whitelist driver package, abort."); - } - } - return false; - } - private static native int getCanLoadSystemLibraries(); private static native void setLayerPaths(ClassLoader classLoader, String layerPaths); private static native void setDebugLayers(String layers); diff --git a/core/java/android/os/IncidentManager.java b/core/java/android/os/IncidentManager.java index 88a578a5b6de..a1c7b08b8ba3 100644 --- a/core/java/android/os/IncidentManager.java +++ b/core/java/android/os/IncidentManager.java @@ -16,7 +16,9 @@ package android.os; +import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; @@ -25,6 +27,11 @@ import android.content.Context; import android.net.Uri; import android.util.Slog; +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; @@ -95,6 +102,33 @@ public class IncidentManager { */ public static final int FLAG_CONFIRMATION_DIALOG = 0x1; + /** + * Flag marking fields and incident reports than can be taken + * off the device only via adb. + */ + public static final int PRIVACY_POLICY_LOCAL = 0; + + /** + * Flag marking fields and incident reports than can be taken + * off the device with contemporary consent. + */ + public static final int PRIVACY_POLICY_EXPLICIT = 100; + + /** + * Flag marking fields and incident reports than can be taken + * off the device with prior consent. + */ + public static final int PRIVACY_POLICY_AUTO = 200; + + /** @hide */ + @IntDef(flag = false, prefix = { "PRIVACY_POLICY_" }, value = { + PRIVACY_POLICY_AUTO, + PRIVACY_POLICY_EXPLICIT, + PRIVACY_POLICY_LOCAL, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface PrivacyPolicy {} + private final Context mContext; private Object mLock = new Object(); @@ -203,6 +237,110 @@ public class IncidentManager { } /** + * Record of an incident report that has previously been taken. + * @hide + */ + @SystemApi + @TestApi + public static class IncidentReport implements Parcelable, Closeable { + private final long mTimestampMs; + private final int mPrivacyPolicy; + private ParcelFileDescriptor mFileDescriptor; + + public IncidentReport(Parcel in) { + mTimestampMs = in.readLong(); + mPrivacyPolicy = in.readInt(); + if (in.readInt() != 0) { + mFileDescriptor = ParcelFileDescriptor.CREATOR.createFromParcel(in); + } else { + mFileDescriptor = null; + } + } + + /** + * Close the input stream associated with this entry. + */ + public void close() { + try { + if (mFileDescriptor != null) { + mFileDescriptor.close(); + mFileDescriptor = null; + } + } catch (IOException e) { + } + } + + /** + * Get the time at which this incident report was taken, in wall clock time + * ({@link System#uptimeMillis System.uptimeMillis()} time base). + */ + public long getTimestamp() { + return mTimestampMs; + } + + /** + * Get the privacy level to which this report has been filtered. + * + * @see #PRIVACY_POLICY_AUTO + * @see #PRIVACY_POLICY_EXPLICIT + * @see #PRIVACY_POLICY_LOCAL + */ + public long getPrivacyPolicy() { + return mPrivacyPolicy; + } + + /** + * Get the contents of this incident report. + */ + public InputStream getInputStream() throws IOException { + if (mFileDescriptor == null) { + return null; + } + return new ParcelFileDescriptor.AutoCloseInputStream(mFileDescriptor); + } + + /** + * @inheritDoc + */ + public int describeContents() { + return mFileDescriptor != null ? Parcelable.CONTENTS_FILE_DESCRIPTOR : 0; + } + + /** + * @inheritDoc + */ + public void writeToParcel(Parcel out, int flags) { + out.writeLong(mTimestampMs); + out.writeInt(mPrivacyPolicy); + if (mFileDescriptor != null) { + out.writeInt(1); + mFileDescriptor.writeToParcel(out, flags); + } else { + out.writeInt(0); + } + } + + /** + * {@link Parcelable.Creator Creator} for {@link IncidentReport}. + */ + public static final Parcelable.Creator<IncidentReport> CREATOR = new Parcelable.Creator() { + /** + * @inheritDoc + */ + public IncidentReport[] newArray(int size) { + return new IncidentReport[size]; + } + + /** + * @inheritDoc + */ + public IncidentReport createFromParcel(Parcel in) { + return new IncidentReport(in); + } + }; + } + + /** * Listener for the status of an incident report being authroized or denied. * * @see #requestAuthorization @@ -242,7 +380,7 @@ public class IncidentManager { } /** - * Take an incident report and put it in dropbox. + * Take an incident report. */ @RequiresPermission(allOf = { android.Manifest.permission.DUMP, @@ -325,6 +463,52 @@ public class IncidentManager { } } + /** + * Get the incident reports that are available for upload for the supplied + * broadcast recevier. + * + * @param receiverClass Class name of broadcast receiver in this package that + * was registered to retrieve reports. + * + * @return A list of {@link Uri Uris} that are awaiting upload. + */ + @RequiresPermission(allOf = { + android.Manifest.permission.DUMP, + android.Manifest.permission.PACKAGE_USAGE_STATS + }) + public @NonNull List<Uri> getIncidentReportList(String receiverClass) { + throw new RuntimeException("implement me"); + } + + /** + * Get the incident report with the given URI id. + * + * @param uri Identifier of the incident report. + * + * @return an IncidentReport object, or null if the incident report has been + * expired from disk. + */ + @RequiresPermission(allOf = { + android.Manifest.permission.DUMP, + android.Manifest.permission.PACKAGE_USAGE_STATS + }) + public @Nullable IncidentReport getIncidentReport(Uri uri) { + throw new RuntimeException("implement me"); + } + + /** + * Delete the incident report with the given URI id. + * + * @param uri Identifier of the incident report. + */ + @RequiresPermission(allOf = { + android.Manifest.permission.DUMP, + android.Manifest.permission.PACKAGE_USAGE_STATS + }) + public void deleteIncidentReports(Uri uri) { + throw new RuntimeException("implement me"); + } + private void reportIncidentInternal(IncidentReportArgs args) { try { final IIncidentManager service = getIIncidentManagerLocked(); diff --git a/core/java/android/os/IncidentReportArgs.java b/core/java/android/os/IncidentReportArgs.java index 3ca7f77b90d7..8d4472702206 100644 --- a/core/java/android/os/IncidentReportArgs.java +++ b/core/java/android/os/IncidentReportArgs.java @@ -32,19 +32,16 @@ import java.util.ArrayList; @TestApi public final class IncidentReportArgs implements Parcelable { - private static final int DEST_EXPLICIT = 100; - private static final int DEST_AUTO = 200; - private final IntArray mSections = new IntArray(); private final ArrayList<byte[]> mHeaders = new ArrayList<byte[]>(); private boolean mAll; - private int mDest; + private int mPrivacyPolicy; /** * Construct an incident report args with no fields. */ public IncidentReportArgs() { - mDest = DEST_AUTO; + mPrivacyPolicy = IncidentManager.PRIVACY_POLICY_AUTO; } /** @@ -75,7 +72,7 @@ public final class IncidentReportArgs implements Parcelable { out.writeByteArray(mHeaders.get(i)); } - out.writeInt(mDest); + out.writeInt(mPrivacyPolicy); } public void readFromParcel(Parcel in) { @@ -93,7 +90,7 @@ public final class IncidentReportArgs implements Parcelable { mHeaders.add(in.createByteArray()); } - mDest = in.readInt(); + mPrivacyPolicy = in.readInt(); } public static final Parcelable.Creator<IncidentReportArgs> CREATOR @@ -128,7 +125,7 @@ public final class IncidentReportArgs implements Parcelable { sb.append(", "); sb.append(mHeaders.size()); sb.append(" headers), "); - sb.append("Dest enum value: ").append(mDest); + sb.append("privacy: ").append(mPrivacyPolicy); return sb.toString(); } @@ -145,14 +142,15 @@ public final class IncidentReportArgs implements Parcelable { /** * Set this incident report privacy policy spec. */ - public void setPrivacyPolicy(int dest) { - switch (dest) { - case DEST_EXPLICIT: - case DEST_AUTO: - mDest = dest; + public void setPrivacyPolicy(int privacyPolicy) { + switch (privacyPolicy) { + case IncidentManager.PRIVACY_POLICY_LOCAL: + case IncidentManager.PRIVACY_POLICY_EXPLICIT: + case IncidentManager.PRIVACY_POLICY_AUTO: + mPrivacyPolicy = privacyPolicy; break; default: - mDest = DEST_AUTO; + mPrivacyPolicy = IncidentManager.PRIVACY_POLICY_AUTO; } } diff --git a/core/java/android/os/OWNERS b/core/java/android/os/OWNERS new file mode 100644 index 000000000000..b568f157c01d --- /dev/null +++ b/core/java/android/os/OWNERS @@ -0,0 +1,2 @@ +# Zygote +per-file ZygoteProcess.java = chriswailes@google.com, ngeoffray@google.com, sehr@google.com, narayan@google.com, maco@google.com diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java index 8a52f1f0eec0..3e5bd4b72513 100644 --- a/core/java/android/provider/CalendarContract.java +++ b/core/java/android/provider/CalendarContract.java @@ -138,8 +138,8 @@ public final class CalendarContract { * Action used to help apps show calendar events in the managed profile. */ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) - public static final String ACTION_VIEW_WORK_CALENDAR_EVENT = - "android.provider.calendar.action.VIEW_WORK_CALENDAR_EVENT"; + public static final String ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT = + "android.provider.calendar.action.VIEW_MANAGED_PROFILE_CALENDAR_EVENT"; /** * Intent Extras key: {@link EventsColumns#CUSTOM_APP_URI} for the event in @@ -166,7 +166,7 @@ public final class CalendarContract { public static final String EXTRA_EVENT_ALL_DAY = "allDay"; /** - * Intent Extras key: The id of an event. + * Intent Extras key: An extra of type {@code long} holding the id of an event. */ public static final String EXTRA_EVENT_ID = "id"; @@ -218,7 +218,7 @@ public final class CalendarContract { * When this API is called, the system will attempt to start an activity * in the managed profile with an intent targeting the same caller package. * The intent will have its action set to - * {@link CalendarContract#ACTION_VIEW_WORK_CALENDAR_EVENT} and contain extras + * {@link CalendarContract#ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT} and contain extras * corresponding to the API's arguments. A calendar app intending to support * cross-profile events viewing should handle this intent, parse the arguments * and show the appropriate UI. @@ -226,10 +226,10 @@ public final class CalendarContract { * @param context the context. * @param eventId the id of the event to be viewed. Will be put into {@link #EXTRA_EVENT_ID} * field of the intent. - * @param start the start time of the event. Will be put into {@link #EXTRA_EVENT_BEGIN_TIME} - * field of the intent. - * @param end the end time of the event. Will be put into {@link #EXTRA_EVENT_END_TIME} field - * of the intent. + * @param startMs the start time of the event in milliseconds since epoch. + * Will be put into {@link #EXTRA_EVENT_BEGIN_TIME} field of the intent. + * @param endMs the end time of the event in milliseconds since epoch. + * Will be put into {@link #EXTRA_EVENT_END_TIME} field of the intent. * @param allDay if the event is an all-day event. Will be put into * {@link #EXTRA_EVENT_ALL_DAY} field of the intent. * @param flags flags to be set on the intent via {@link Intent#setFlags} @@ -241,12 +241,12 @@ public final class CalendarContract { * @see #EXTRA_EVENT_ALL_DAY */ public static boolean startViewCalendarEventInManagedProfile(@NonNull Context context, - long eventId, long start, long end, boolean allDay, int flags) { + long eventId, long startMs, long endMs, boolean allDay, int flags) { Preconditions.checkNotNull(context, "Context is null"); final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService( Context.DEVICE_POLICY_SERVICE); - return dpm.startViewCalendarEventInManagedProfile(eventId, start, - end, allDay, flags); + return dpm.startViewCalendarEventInManagedProfile(eventId, startMs, + endMs, allDay, flags); } /** diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index 0b23fe3e9168..92650e114a66 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -160,6 +160,18 @@ public final class DeviceConfig { } /** + * Namespace for all activity manager related features that are used at the native level. + * These features are applied at reboot. + * + * @hide + */ + @SystemApi + public interface ActivityManagerNativeBoot { + String NAMESPACE = "activity_manager_native_boot"; + String OFFLOAD_QUEUE_ENABLED = "offload_queue_enabled"; + } + + /** * Namespace for attention-based features provided by on-device machine intelligence. * * @hide @@ -169,10 +181,10 @@ public final class DeviceConfig { String NAMESPACE = "intelligence_attention"; /** If {@code true}, enables the attention features. */ - String PROPERTY_ATTENTION_ENABLED = "attention_enabled"; + String ATTENTION_ENABLED = "attention_enabled"; /** Settings for the attention features. */ - String PROPERTY_ATTENTION_SETTINGS = "attention_settings"; + String ATTENTION_SETTINGS = "attention_settings"; } /** @@ -191,12 +203,12 @@ public final class DeviceConfig { * @hide */ @SystemApi - String PROPERTY_PERMISSIONS_HUB_ENABLED = "enable_permissions_hub"; + String PROPERTY_PERMISSIONS_HUB_ENABLED = "permissions_hub_enabled"; /** * Whether to show location access check notifications. */ - String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "enable_location_access_check"; + String PROPERTY_LOCATION_ACCESS_CHECK_ENABLED = "location_access_check_enabled"; } /** @@ -208,26 +220,29 @@ public final class DeviceConfig { public interface Telephony { String NAMESPACE = "telephony"; /** + * Ringer ramping time in milliseconds. + */ + String RAMPING_RINGER_DURATION = "ramping_ringer_duration"; + /** * Whether to apply ramping ringer on incoming phone calls. */ - String PROPERTY_ENABLE_RAMPING_RINGER = "enable_ramping_ringer"; + String RAMPING_RINGER_ENABLED = "ramping_ringer_enabled"; /** - * Ringer ramping time in milliseconds. + * Vibration time in milliseconds before ramping ringer starts. */ - String PROPERTY_RAMPING_RINGER_DURATION = "ramping_duration"; + String RAMPING_RINGER_VIBRATION_DURATION = "ramping_ringer_vibration_duration"; } /** - * Namespace for Full Stack Integrity to run privileged apps only in JIT mode. The flag applies - * at process start, so reboot is a way to bring the device to a clean state. + * Namespace for how dex runs. The feature may requires reboot to a clean state. * * @hide */ @SystemApi - public interface FsiBoot { - String NAMESPACE = "fsi_boot"; - String OOB_ENABLED = "oob_enabled"; - String OOB_WHITELIST = "oob_whitelist"; + public interface DexBoot { + String NAMESPACE = "dex_boot"; + String PRIV_APPS_OOB_ENABLED = "priv_apps_oob_enabled"; + String PRIV_APPS_OOB_WHITELIST = "priv_apps_oob_whitelist"; } /** @@ -250,6 +265,7 @@ public final class DeviceConfig { String KEY_COMPACT_THROTTLE_2 = "compact_throttle_2"; String KEY_COMPACT_THROTTLE_3 = "compact_throttle_3"; String KEY_COMPACT_THROTTLE_4 = "compact_throttle_4"; + String KEY_COMPACT_STATSD_SAMPLE_RATE = "compact_statsd_sample_rate"; /** * Maximum number of cached processes. See @@ -268,10 +284,10 @@ public final class DeviceConfig { String NAMESPACE = "attention_manager_service"; /** If {@code true}, enables {@link AttentionManagerService} features. */ - String PROPERTY_SERVICE_ENABLED = "service_enabled"; + String SERVICE_ENABLED = "service_enabled"; /** Allows a CTS to inject a fake implementation. */ - String PROPERTY_COMPONENT_NAME = "component_name"; + String COMPONENT_NAME = "component_name"; } /** diff --git a/core/java/android/provider/Downloads.java b/core/java/android/provider/Downloads.java index 63bbb9c0bc12..89d1c447a709 100644 --- a/core/java/android/provider/Downloads.java +++ b/core/java/android/provider/Downloads.java @@ -419,12 +419,20 @@ public final class Downloads { /** * The column that is used to remember whether the media scanner was invoked. - * It can take the values: null or 0(not scanned), 1(scanned), 2 (not scannable). + * It can take the values: {@link #MEDIA_NOT_SCANNED}, {@link #MEDIA_SCANNED} or + * {@link #MEDIA_NOT_SCANNABLE} or {@code null}. If it's value is {@code null}, it will be + * treated as {@link #MEDIA_NOT_SCANNED}. + * * <P>Type: TEXT</P> */ @UnsupportedAppUsage public static final String COLUMN_MEDIA_SCANNED = "scanned"; + /** Possible values for column {@link #COLUMN_MEDIA_SCANNED} */ + public static final int MEDIA_NOT_SCANNED = 0; + public static final int MEDIA_SCANNED = 1; + public static final int MEDIA_NOT_SCANNABLE = 2; + /** * The column with errorMsg for a failed downloaded. * Used only for debugging purposes. diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index 124c50a3393e..0743c23080fd 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -641,6 +641,8 @@ public final class MediaStore { * location. For example, when this value is left undefined, pending * {@link MediaStore.Audio.Media} items are stored under * {@link Environment#DIRECTORY_MUSIC}. + * + * @see MediaColumns#PRIMARY_DIRECTORY */ public void setPrimaryDirectory(@Nullable String primaryDirectory) { this.primaryDirectory = primaryDirectory; @@ -652,6 +654,8 @@ public final class MediaStore { * <p> * You may leave this value undefined to store the media as a direct * descendant of the {@link #setPrimaryDirectory(String)} location. + * + * @see MediaColumns#SECONDARY_DIRECTORY */ public void setSecondaryDirectory(@Nullable String secondaryDirectory) { this.secondaryDirectory = secondaryDirectory; @@ -980,6 +984,26 @@ public final class MediaStore { * Type: TEXT */ public static final String OWNER_PACKAGE_NAME = "owner_package_name"; + + /** + * The primary directory name this media exists under. The value may be + * {@code NULL} if the media doesn't have a primary directory name. + * <p> + * Type: TEXT + * + * @see PendingParams#setPrimaryDirectory(String) + */ + public static final String PRIMARY_DIRECTORY = "primary_directory"; + + /** + * The secondary directory name this media exists under. The value may + * be {@code NULL} if the media doesn't have a secondary directory name. + * <p> + * Type: TEXT + * + * @see PendingParams#setSecondaryDirectory(String) + */ + public static final String SECONDARY_DIRECTORY = "secondary_directory"; } /** @@ -1428,13 +1452,20 @@ public final class MediaStore { public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; /** - * The secondary bucket ID of this media item. This can be useful to - * present the user a second-level clustering of related media - * items. This is a read-only column that is automatically computed. + * The group ID of this media item. This can be useful to present + * the user a grouping of related media items, such a burst of + * images, or a {@code JPG} and {@code DNG} version of the same + * image. + * <p> + * This is a read-only column that is automatically computed based + * on the first portion of the filename. For example, + * {@code IMG1024.BURST001.JPG} and {@code IMG1024.BURST002.JPG} + * will have the same {@link #GROUP_ID} because the first portion of + * their filenames is identical. * <p> * Type: INTEGER */ - public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id"; + public static final String GROUP_ID = "group_id"; } public static final class Media implements ImageColumns { @@ -2697,13 +2728,20 @@ public final class MediaStore { public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; /** - * The secondary bucket ID of this media item. This can be useful to - * present the user a second-level clustering of related media - * items. This is a read-only column that is automatically computed. + * The group ID of this media item. This can be useful to present + * the user a grouping of related media items, such a burst of + * images, or a {@code JPG} and {@code DNG} version of the same + * image. + * <p> + * This is a read-only column that is automatically computed based + * on the first portion of the filename. For example, + * {@code IMG1024.BURST001.JPG} and {@code IMG1024.BURST002.JPG} + * will have the same {@link #GROUP_ID} because the first portion of + * their filenames is identical. * <p> * Type: INTEGER */ - public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id"; + public static final String GROUP_ID = "group_id"; /** * The bookmark for the video. Time in ms. Represents the location in the video that the diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 794c2f1b991b..afa21100f022 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -5874,30 +5874,24 @@ public final class Settings { "unknown_sources_default_reversed"; /** - * Comma-separated list of location providers that activities may access. Do not rely on - * this value being present in settings.db or on ContentObserver notifications on the + * Comma-separated list of location providers that are accessible. Do not rely on + * this value being present or correct, or on ContentObserver notifications on the * corresponding Uri. * - * @deprecated Providers should not be controlled individually. See {@link #LOCATION_MODE} - * documentation for information on reading/writing location information. + * @deprecated The preferred methods for checking provider status and listening for changes + * are via {@link LocationManager#isProviderEnabled(String)} and + * {@link LocationManager#PROVIDERS_CHANGED_ACTION}. */ @Deprecated public static final String LOCATION_PROVIDERS_ALLOWED = "location_providers_allowed"; /** - * The degree of location access enabled by the user. - * <p> - * When used with {@link #putInt(ContentResolver, String, int)}, must be one of {@link - * #LOCATION_MODE_HIGH_ACCURACY}, {@link #LOCATION_MODE_SENSORS_ONLY}, {@link - * #LOCATION_MODE_BATTERY_SAVING}, or {@link #LOCATION_MODE_OFF}. When used with {@link - * #getInt(ContentResolver, String)}, the caller must gracefully handle additional location - * modes that might be added in the future. - * <p> - * Note: do not rely on this value being present in settings.db or on ContentObserver - * notifications for the corresponding Uri. Use {@link LocationManager#MODE_CHANGED_ACTION} - * to receive changes in this value. + * The current location mode of the device. Do not rely on this value being present or on + * ContentObserver notifications on the corresponding Uri. * - * @deprecated To check location mode, use {@link LocationManager#isLocationEnabled()}. + * @deprecated The preferred methods for checking location mode and listening for changes + * are via {@link LocationManager#isLocationEnabled()} and + * {@link LocationManager#MODE_CHANGED_ACTION}. */ @Deprecated public static final String LOCATION_MODE = "location_mode"; @@ -5924,7 +5918,7 @@ public final class Settings { public static final int LOCATION_CHANGER_QUICK_SETTINGS = 2; /** - * Location access disabled. + * Location mode is off. * * @deprecated See {@link #LOCATION_MODE}. */ @@ -5932,34 +5926,41 @@ public final class Settings { public static final int LOCATION_MODE_OFF = 0; /** - * Network Location Provider disabled, but GPS and other sensors enabled. + * This mode no longer has any distinct meaning, but is interpreted as the location mode is + * on. * - * @deprecated To check location status, use {@link LocationManager#isLocationEnabled()}. To - * get the status of a location provider, use - * {@link LocationManager#isProviderEnabled(String)}. + * @deprecated See {@link #LOCATION_MODE_ON}. */ @Deprecated public static final int LOCATION_MODE_SENSORS_ONLY = 1; /** - * Reduced power usage, such as limiting the number of GPS updates per hour. Requests - * with {@link android.location.Criteria#POWER_HIGH} may be downgraded to - * {@link android.location.Criteria#POWER_MEDIUM}. + * This mode no longer has any distinct meaning, but is interpreted as the location mode is + * on. * - * @deprecated See {@link #LOCATION_MODE}. + * @deprecated See {@link #LOCATION_MODE_ON}. */ @Deprecated public static final int LOCATION_MODE_BATTERY_SAVING = 2; /** - * Best-effort location computation allowed. + * This mode no longer has any distinct meaning, but is interpreted as the location mode is + * on. * - * @deprecated See {@link #LOCATION_MODE}. + * @deprecated See {@link #LOCATION_MODE_ON}. */ @Deprecated public static final int LOCATION_MODE_HIGH_ACCURACY = 3; /** + * Location mode is on. + * + * @deprecated See {@link #LOCATION_MODE}. + */ + @Deprecated + public static final int LOCATION_MODE_ON = LOCATION_MODE_HIGH_ACCURACY; + + /** * A flag containing settings used for biometric weak * @hide */ @@ -10521,8 +10522,10 @@ public final class Settings { /** * Setting to enable connected MAC randomization in Wi-Fi; disabled by default, and * setting to 1 will enable it. In the future, additional values may be supported. + * @deprecated MAC randomization is now a per-network setting * @hide */ + @Deprecated public static final String WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED = "wifi_connected_mac_randomization_enabled"; @@ -10598,6 +10601,18 @@ public final class Settings { private static final Validator WIFI_PNO_RECENCY_SORTING_ENABLED_VALIDATOR = BOOLEAN_VALIDATOR; + /** + * Setting to enable the Wi-Fi link probing. + * Disabled by default, and setting it to 1 will enable it. + * The value is boolean (0 or 1). + * @hide + */ + public static final String WIFI_LINK_PROBING_ENABLED = + "wifi_link_probing_enabled"; + + private static final Validator WIFI_LINK_PROBING_ENABLED_VALIDATOR = + BOOLEAN_VALIDATOR; + /** * The maximum number of times we will retry a connection to an access * point for which we have failed in acquiring an IP address from DHCP. @@ -13391,6 +13406,7 @@ public final class Settings { WIFI_PNO_FREQUENCY_CULLING_ENABLED_VALIDATOR); VALIDATORS.put(WIFI_PNO_RECENCY_SORTING_ENABLED, WIFI_PNO_RECENCY_SORTING_ENABLED_VALIDATOR); + VALIDATORS.put(WIFI_LINK_PROBING_ENABLED, WIFI_LINK_PROBING_ENABLED_VALIDATOR); } /** diff --git a/core/java/android/service/appprediction/AppPredictionService.java b/core/java/android/service/appprediction/AppPredictionService.java index b77405affaec..d0128514d3e7 100644 --- a/core/java/android/service/appprediction/AppPredictionService.java +++ b/core/java/android/service/appprediction/AppPredictionService.java @@ -21,6 +21,7 @@ import android.annotation.CallSuper; import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.app.Service; import android.app.prediction.AppPredictionContext; import android.app.prediction.AppPredictionSessionId; @@ -49,6 +50,7 @@ import java.util.function.Consumer; * @hide */ @SystemApi +@TestApi public abstract class AppPredictionService extends Service { private static final String TAG = "AppPredictionService"; @@ -140,6 +142,7 @@ public abstract class AppPredictionService extends Service { @Override public final IBinder onBind(Intent intent) { + // TODO(b/111701043): Verify that the action is valid return mInterface.asBinder(); } @@ -228,6 +231,7 @@ public abstract class AppPredictionService extends Service { public void onStopPredictionUpdates() {} private void doRequestPredictionUpdate(@NonNull AppPredictionSessionId sessionId) { + // Just an optimization, if there are no callbacks, then don't bother notifying the service final ArrayList<CallbackWrapper> callbacks = mSessionCallbacks.get(sessionId); if (callbacks != null && !callbacks.isEmpty()) { onRequestPredictionUpdate(sessionId); diff --git a/core/java/android/service/attention/AttentionService.java b/core/java/android/service/attention/AttentionService.java index f6e448dc4757..24d74ffd747d 100644 --- a/core/java/android/service/attention/AttentionService.java +++ b/core/java/android/service/attention/AttentionService.java @@ -64,10 +64,10 @@ public abstract class AttentionService extends Service { /** Attention is present. */ public static final int ATTENTION_SUCCESS_PRESENT = 1; - /** Preempted by other camera user. */ + /** Preempted by other client. */ public static final int ATTENTION_FAILURE_PREEMPTED = 2; - /** Preempted by other camera user. */ + /** Request timed out. */ public static final int ATTENTION_FAILURE_TIMED_OUT = 3; /** Unknown reasons for failing to determine the attention. */ diff --git a/core/java/android/service/dreams/OWNERS b/core/java/android/service/dreams/OWNERS index 3c9bbf8797ea..426f002ad236 100644 --- a/core/java/android/service/dreams/OWNERS +++ b/core/java/android/service/dreams/OWNERS @@ -1,3 +1,3 @@ -dsandler@google.com +dsandler@android.com michaelwr@google.com roosa@google.com diff --git a/core/java/android/service/notification/INotificationListener.aidl b/core/java/android/service/notification/INotificationListener.aidl index 1ddc099efa49..22104b5089cf 100644 --- a/core/java/android/service/notification/INotificationListener.aidl +++ b/core/java/android/service/notification/INotificationListener.aidl @@ -33,6 +33,7 @@ oneway interface INotificationListener void onListenerConnected(in NotificationRankingUpdate update); void onNotificationPosted(in IStatusBarNotificationHolder notificationHolder, in NotificationRankingUpdate update); + void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons); // stats only for assistant void onNotificationRemoved(in IStatusBarNotificationHolder notificationHolder, in NotificationRankingUpdate update, in NotificationStats stats, int reason); diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index c734b630759b..d4e887970a47 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -469,6 +469,17 @@ public abstract class NotificationListenerService extends Service { } /** + * Implement this method to be notified when the behavior of silent notifications in the status + * bar changes. See {@link NotificationManager#shouldHideSilentStatusBarIcons()}. + * + * @param hideSilentStatusIcons whether or not status bar icons should be hidden for silent + * notifications + */ + public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) { + // optional + } + + /** * Implement this method to learn about notification channel modifications. * * <p>The caller must have {@link CompanionDeviceManager#getAssociations() an associated @@ -1411,6 +1422,12 @@ public abstract class NotificationListenerService extends Service { mHandler.obtainMessage( MyHandler.MSG_ON_NOTIFICATION_CHANNEL_GROUP_MODIFIED, args).sendToTarget(); } + + @Override + public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) { + mHandler.obtainMessage(MyHandler.MSG_ON_STATUS_BAR_ICON_BEHAVIOR_CHANGED, + hideSilentStatusIcons).sendToTarget(); + } } /** @@ -2142,6 +2159,7 @@ public abstract class NotificationListenerService extends Service { public static final int MSG_ON_INTERRUPTION_FILTER_CHANGED = 6; public static final int MSG_ON_NOTIFICATION_CHANNEL_MODIFIED = 7; public static final int MSG_ON_NOTIFICATION_CHANNEL_GROUP_MODIFIED = 8; + public static final int MSG_ON_STATUS_BAR_ICON_BEHAVIOR_CHANGED = 9; public MyHandler(Looper looper) { super(looper, null, false); @@ -2207,6 +2225,10 @@ public abstract class NotificationListenerService extends Service { int modificationType = (int) args.arg4; onNotificationChannelGroupModified(pkgName, user, group, modificationType); } break; + + case MSG_ON_STATUS_BAR_ICON_BEHAVIOR_CHANGED: { + onStatusBarIconsBehaviorChanged((Boolean) msg.obj); + } break; } } } diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java index 2789651c4eaf..e76e0966b817 100644 --- a/core/java/android/service/voice/VoiceInteractionService.java +++ b/core/java/android/service/voice/VoiceInteractionService.java @@ -16,7 +16,6 @@ package android.service.voice; -import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; @@ -41,8 +40,6 @@ import com.android.internal.util.function.pooled.PooledLambda; import java.io.FileDescriptor; import java.io.PrintWriter; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -80,33 +77,6 @@ public class VoiceInteractionService extends Service { */ public static final String SERVICE_META_DATA = "android.voice_interaction"; - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(prefix = {"VOICE_STATE_"}, value = { - VOICE_STATE_NONE, - VOICE_STATE_CONDITIONAL_LISTENING, - VOICE_STATE_LISTENING, - VOICE_STATE_FULFILLING}) - public @interface VoiceState { - } - - /** - * Voice assistant inactive. - */ - public static final int VOICE_STATE_NONE = 0; - /** - * Voice assistant listening, but will only trigger if it hears a request it can fulfill. - */ - public static final int VOICE_STATE_CONDITIONAL_LISTENING = 1; - /** - * Voice assistant is listening to user speech. - */ - public static final int VOICE_STATE_LISTENING = 2; - /** - * Voice assistant is fulfilling an action requested by the user. - */ - public static final int VOICE_STATE_FULFILLING = 3; - IVoiceInteractionService mInterface = new IVoiceInteractionService.Stub() { @Override public void ready() { @@ -376,7 +346,7 @@ public class VoiceInteractionService extends Service { * * @param state value indicating whether the assistant is listening, fulfilling, etc. */ - public final void setVoiceState(@VoiceState int state) { + public final void setVoiceState(int state) { try { mSystemService.setVoiceState(state); } catch (RemoteException e) { diff --git a/core/java/android/util/FeatureFlagUtils.java b/core/java/android/util/FeatureFlagUtils.java index db9351b030df..2e8b7f021ff6 100644 --- a/core/java/android/util/FeatureFlagUtils.java +++ b/core/java/android/util/FeatureFlagUtils.java @@ -57,6 +57,7 @@ public class FeatureFlagUtils { DEFAULT_FLAGS.put("settings_wifi_dpp", "true"); DEFAULT_FLAGS.put("settings_wifi_mac_randomization", "true"); DEFAULT_FLAGS.put("settings_wifi_sharing", "true"); + DEFAULT_FLAGS.put("settings_mainline_module", "false"); DEFAULT_FLAGS.put(HEARING_AID_SETTINGS, "false"); DEFAULT_FLAGS.put(SAFETY_HUB, "false"); DEFAULT_FLAGS.put(SCREENRECORD_LONG_PRESS, "false"); diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index eb41e078e59f..59e562fe8071 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -41,12 +41,14 @@ import android.view.View.AttachInfo; import android.view.accessibility.AccessibilityInteractionClient; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.accessibility.AccessibilityNodeProvider; import android.view.accessibility.AccessibilityRequestPreparer; import android.view.accessibility.IAccessibilityInteractionConnectionCallback; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.SomeArgs; import java.util.ArrayList; @@ -64,8 +66,11 @@ import java.util.function.Predicate; * called from the interaction connection ViewAncestor gives the system to * talk to it and a corresponding *UiThread method that is executed on the * UI thread. + * + * @hide */ -final class AccessibilityInteractionController { +@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) +public final class AccessibilityInteractionController { private static final String LOG_TAG = "AccessibilityInteractionController"; @@ -85,7 +90,7 @@ final class AccessibilityInteractionController { private final Object mLock = new Object(); - private final Handler mHandler; + private final PrivateHandler mHandler; private final ViewRootImpl mViewRootImpl; @@ -131,11 +136,19 @@ final class AccessibilityInteractionController { // thread in this process, set the message as a static reference so // after this call completes the same thread but in the interrogating // client can handle the message to generate the result. - if (interrogatingPid == mMyProcessId && interrogatingTid == mMyLooperThreadId) { + if (interrogatingPid == mMyProcessId && interrogatingTid == mMyLooperThreadId + && mHandler.hasAccessibilityCallback(message)) { AccessibilityInteractionClient.getInstanceForThread( interrogatingTid).setSameThreadMessage(message); } else { - mHandler.sendMessage(message); + // For messages without callback of interrogating client, just handle the + // message immediately if this is UI thread. + if (!mHandler.hasAccessibilityCallback(message) + && Thread.currentThread().getId() == mMyLooperThreadId) { + mHandler.handleMessage(message); + } else { + mHandler.sendMessage(message); + } } } } @@ -731,6 +744,52 @@ final class AccessibilityInteractionController { } } + /** + * Finds the accessibility focused node in the root, and clears the accessibility focus. + */ + public void clearAccessibilityFocusClientThread() { + final Message message = mHandler.obtainMessage(); + message.what = PrivateHandler.MSG_CLEAR_ACCESSIBILITY_FOCUS; + + // Don't care about pid and tid because there's no interrogating client for this message. + scheduleMessage(message, 0, 0, CONSIDER_REQUEST_PREPARERS); + } + + private void clearAccessibilityFocusUiThread() { + if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) { + return; + } + try { + mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = + AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; + final View root = mViewRootImpl.mView; + if (root != null && isShown(root)) { + final View host = mViewRootImpl.mAccessibilityFocusedHost; + // If there is no accessibility focus host or it is not a descendant + // of the root from which to start the search, then the search failed. + if (host == null || !ViewRootImpl.isViewDescendantOf(host, root)) { + return; + } + final AccessibilityNodeProvider provider = host.getAccessibilityNodeProvider(); + final AccessibilityNodeInfo focusNode = + mViewRootImpl.mAccessibilityFocusedVirtualView; + if (provider != null && focusNode != null) { + final int virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId( + focusNode.getSourceNodeId()); + provider.performAction(virtualNodeId, + AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS.getId(), + null); + } else { + host.performAccessibilityAction( + AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS.getId(), + null); + } + } + } finally { + mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0; + } + } + private View findViewByAccessibilityId(int accessibilityId) { View root = mViewRootImpl.mView; if (root == null) { @@ -1294,6 +1353,12 @@ final class AccessibilityInteractionController { private static final int MSG_APP_PREPARATION_FINISHED = 8; private static final int MSG_APP_PREPARATION_TIMEOUT = 9; + // Uses FIRST_NO_ACCESSIBILITY_CALLBACK_MSG for messages that don't need to call back + // results to interrogating client. + private static final int FIRST_NO_ACCESSIBILITY_CALLBACK_MSG = 100; + private static final int MSG_CLEAR_ACCESSIBILITY_FOCUS = + FIRST_NO_ACCESSIBILITY_CALLBACK_MSG + 1; + public PrivateHandler(Looper looper) { super(looper); } @@ -1320,6 +1385,8 @@ final class AccessibilityInteractionController { return "MSG_APP_PREPARATION_FINISHED"; case MSG_APP_PREPARATION_TIMEOUT: return "MSG_APP_PREPARATION_TIMEOUT"; + case MSG_CLEAR_ACCESSIBILITY_FOCUS: + return "MSG_CLEAR_ACCESSIBILITY_FOCUS"; default: throw new IllegalArgumentException("Unknown message type: " + type); } @@ -1356,10 +1423,17 @@ final class AccessibilityInteractionController { case MSG_APP_PREPARATION_TIMEOUT: { requestPreparerTimeoutUiThread(); } break; + case MSG_CLEAR_ACCESSIBILITY_FOCUS: { + clearAccessibilityFocusUiThread(); + } break; default: throw new IllegalArgumentException("Unknown message type: " + type); } } + + boolean hasAccessibilityCallback(Message message) { + return message.what < FIRST_NO_ACCESSIBILITY_CALLBACK_MSG ? true : false; + } } private final class AddNodeInfosForViewId implements Predicate<View> { diff --git a/core/java/android/view/InputWindowHandle.java b/core/java/android/view/InputWindowHandle.java index 92e0009bc21a..ec79eea45ee6 100644 --- a/core/java/android/view/InputWindowHandle.java +++ b/core/java/android/view/InputWindowHandle.java @@ -16,10 +16,10 @@ package android.view; +import static android.view.Display.INVALID_DISPLAY; + import android.graphics.Region; import android.os.IBinder; -import android.view.IWindow; -import android.view.InputChannel; /** * Functions as a handle for a window that can receive input. @@ -94,6 +94,10 @@ public final class InputWindowHandle { // Display this input is on. public int displayId; + // If this value is set to a valid display ID, it indicates this window is a portal which + // transports the touch of this window to the display indicated by portalToDisplayId. + public int portalToDisplayId = INVALID_DISPLAY; + private native void nativeDispose(); public InputWindowHandle(InputApplicationHandle inputApplicationHandle, diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java index dc7c343c2c3e..6061cb2963eb 100644 --- a/core/java/android/view/LayoutInflater.java +++ b/core/java/android/view/LayoutInflater.java @@ -20,6 +20,7 @@ import android.annotation.LayoutRes; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemService; +import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.pm.ApplicationInfo; @@ -399,10 +400,15 @@ public abstract class LayoutInflater { } private void initPrecompiledViews() { - // Check if precompiled layouts are enabled by a system property. - mUseCompiledView = - SystemProperties.getBoolean(USE_PRECOMPILED_LAYOUT_SYSTEM_PROPERTY, false); + initPrecompiledViews( + SystemProperties.getBoolean(USE_PRECOMPILED_LAYOUT_SYSTEM_PROPERTY, false)); + } + + private void initPrecompiledViews(boolean enablePrecompiledViews) { + mUseCompiledView = enablePrecompiledViews; + if (!mUseCompiledView) { + mPrecompiledClassLoader = null; return; } @@ -431,6 +437,17 @@ public abstract class LayoutInflater { } mUseCompiledView = false; } + if (!mUseCompiledView) { + mPrecompiledClassLoader = null; + } + } + + /** + * @hide for use by CTS tests + */ + @TestApi + public void setPrecompiledLayoutsEnabledForTesting(boolean enablePrecompiledLayouts) { + initPrecompiledViews(enablePrecompiledLayouts); } /** diff --git a/core/java/android/view/RemoteAnimationTarget.java b/core/java/android/view/RemoteAnimationTarget.java index 1d2cf4b78756..9b3efe138170 100644 --- a/core/java/android/view/RemoteAnimationTarget.java +++ b/core/java/android/view/RemoteAnimationTarget.java @@ -246,8 +246,12 @@ public class RemoteAnimationTarget implements Parcelable { position.writeToProto(proto, POSITION); sourceContainerBounds.writeToProto(proto, SOURCE_CONTAINER_BOUNDS); windowConfiguration.writeToProto(proto, WINDOW_CONFIGURATION); - startLeash.writeToProto(proto, START_LEASH); - startBounds.writeToProto(proto, START_BOUNDS); + if (startLeash != null) { + startLeash.writeToProto(proto, START_LEASH); + } + if (startBounds != null) { + startBounds.writeToProto(proto, START_BOUNDS); + } proto.end(token); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index a17a188071ec..519181d364c2 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -8210,7 +8210,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * changed by calling * {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)}, * {@link ContentCaptureSession#notifyViewDisappeared(AutofillId)}, and - * {@link ContentCaptureSession#notifyViewTextChanged(AutofillId, CharSequence, int)} + * {@link ContentCaptureSession#notifyViewTextChanged(AutofillId, CharSequence)} * respectively. The structure for the a child must be created using * {@link ContentCaptureSession#newVirtualViewStructure(AutofillId, long)}, and the * {@code autofillId} for a child can be obtained either through diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index f47eb10efd29..9213f32326b4 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -8718,6 +8718,15 @@ public final class ViewRootImpl implements ViewParent, } } } + + @Override + public void clearAccessibilityFocus() { + ViewRootImpl viewRootImpl = mViewRootImpl.get(); + if (viewRootImpl != null && viewRootImpl.mView != null) { + viewRootImpl.getAccessibilityInteractionController() + .clearAccessibilityFocusClientThread(); + } + } } private class SendWindowContentChangedAccessibilityEvent implements Runnable { diff --git a/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl b/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl index 4c0fdfd5afdf..947ff056627e 100644 --- a/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl +++ b/core/java/android/view/accessibility/IAccessibilityInteractionConnection.aidl @@ -55,4 +55,6 @@ oneway interface IAccessibilityInteractionConnection { void performAccessibilityAction(long accessibilityNodeId, int action, in Bundle arguments, int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid, long interrogatingTid); + + void clearAccessibilityFocus(); } diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java index e6ee6ed6c55f..68a3e8a1eb32 100644 --- a/core/java/android/view/contentcapture/ContentCaptureSession.java +++ b/core/java/android/view/contentcapture/ContentCaptureSession.java @@ -54,7 +54,7 @@ public abstract class ContentCaptureSession implements AutoCloseable { * @hide */ // NOTE: not prefixed by STATE_ so it's not printed on getStateAsString() - public static final int UNKNWON_STATE = 0x0; + public static final int UNKNOWN_STATE = 0x0; /** * Service's startSession() was called, but server didn't confirm it was created yet. @@ -160,7 +160,7 @@ public abstract class ContentCaptureSession implements AutoCloseable { @Nullable protected final String mId; - private int mState = UNKNWON_STATE; + private int mState = UNKNOWN_STATE; // Lazily created on demand. private ContentCaptureSessionId mContentCaptureSessionId; @@ -350,10 +350,8 @@ public abstract class ContentCaptureSession implements AutoCloseable { * * @param id of the node. * @param text new text. - * @param flags currently ignored. */ - public final void notifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text, - int flags) { + public final void notifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text) { Preconditions.checkNotNull(id); if (!isContentCaptureEnabled()) return; @@ -439,7 +437,7 @@ public abstract class ContentCaptureSession implements AutoCloseable { /** @hide */ @NonNull protected static String getStateAsString(int state) { - return state + " (" + (state == UNKNWON_STATE ? "UNKNOWN" + return state + " (" + (state == UNKNOWN_STATE ? "UNKNOWN" : DebugUtils.flagsToString(ContentCaptureSession.class, "STATE_", state)) + ")"; } diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java index 72aefb20f2cb..2eca51f61e91 100644 --- a/core/java/android/view/contentcapture/MainContentCaptureSession.java +++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java @@ -115,7 +115,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession { @Nullable private DeathRecipient mDirectServiceVulture; - private int mState = UNKNWON_STATE; + private int mState = UNKNOWN_STATE; @Nullable private IBinder mApplicationToken; @@ -367,7 +367,7 @@ public final class MainContentCaptureSession extends ContentCaptureSession { } private boolean handleHasStarted() { - return mState != UNKNWON_STATE; + return mState != UNKNOWN_STATE; } private void handleScheduleFlush(@FlushReason int reason, boolean checkExisting) { diff --git a/core/java/android/view/contentcapture/UserDataRemovalRequest.java b/core/java/android/view/contentcapture/UserDataRemovalRequest.java index 8ee63ef74685..8fedcd54b1fc 100644 --- a/core/java/android/view/contentcapture/UserDataRemovalRequest.java +++ b/core/java/android/view/contentcapture/UserDataRemovalRequest.java @@ -16,7 +16,6 @@ package android.view.contentcapture; import android.annotation.NonNull; -import android.annotation.SystemApi; import android.app.ActivityThread; import android.net.Uri; import android.os.Parcel; @@ -67,9 +66,7 @@ public final class UserDataRemovalRequest implements Parcelable { /** * Gets the name of the app that's making the request. - * @hide */ - @SystemApi @NonNull public String getPackageName() { return mPackageName; @@ -77,20 +74,14 @@ public final class UserDataRemovalRequest implements Parcelable { /** * Checks if app is requesting to remove all user data associated with its package. - * - * @hide */ - @SystemApi public boolean isForEverything() { return mForEverything; } /** * Gets the list of {@code Uri}s the apps is requesting to remove. - * - * @hide */ - @SystemApi @NonNull public List<UriRequest> getUriRequests() { return mUriRequests; @@ -203,9 +194,7 @@ public final class UserDataRemovalRequest implements Parcelable { /** * Representation of a request to remove data associated with an {@link Uri}. - * @hide */ - @SystemApi public final class UriRequest { private final @NonNull Uri mUri; private final boolean mRecursive; diff --git a/core/java/android/view/textclassifier/ExtrasUtils.java b/core/java/android/view/textclassifier/ExtrasUtils.java new file mode 100644 index 000000000000..602455c65beb --- /dev/null +++ b/core/java/android/view/textclassifier/ExtrasUtils.java @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view.textclassifier; + +import android.annotation.Nullable; +import android.app.RemoteAction; +import android.content.Intent; +import android.os.Bundle; + +import java.util.ArrayList; + +/** + * Utility class for inserting and retrieving data in TextClassifier request/response extras. + * @hide + */ +public final class ExtrasUtils { + + private static final String ACTIONS_INTENTS = "actions-intents"; + private static final String FOREIGN_LANGUAGE = "foreign-language"; + private static final String ENTITY_TYPE = "entity-type"; + private static final String SCORE = "score"; + private static final String MODEL_VERSION = "model-version"; + private static final String MODEL_NAME = "model-name"; + + private ExtrasUtils() {} + + /** + * Bundles and returns foreign language detection information for TextClassifier responses. + */ + static Bundle createForeignLanguageExtra( + String language, float score, int modelVersion) { + final Bundle bundle = new Bundle(); + bundle.putString(ENTITY_TYPE, language); + bundle.putFloat(SCORE, score); + bundle.putInt(MODEL_VERSION, modelVersion); + bundle.putString(MODEL_NAME, "langId_v" + modelVersion); + return bundle; + } + + /** + * Stores {@code extra} as foreign language information in TextClassifier response object's + * extras {@code container}. + */ + static void putForeignLanguageExtra(Bundle container, Bundle extra) { + container.putParcelable(FOREIGN_LANGUAGE, extra); + } + + /** + * Returns foreign language detection information contained in the TextClassification object. + * responses. + */ + @Nullable + public static Bundle getForeignLanguageExtra(TextClassification classification) { + return classification.getExtras().getBundle(FOREIGN_LANGUAGE); + } + + /** + * Stores {@code actionIntents} information in TextClassifier response object's extras + * {@code container}. + */ + static void putActionsIntents(Bundle container, ArrayList<Intent> actionsIntents) { + container.putParcelableArrayList(ACTIONS_INTENTS, actionsIntents); + } + + /** + * Returns {@code actionIntents} information contained in the TextClassification object. + */ + @Nullable + public static ArrayList<Intent> getActionsIntents(TextClassification classification) { + return classification.getExtras().getParcelableArrayList(ACTIONS_INTENTS); + } + + /** + * Returns the first "translate" action found in the {@code classification} object. + */ + @Nullable + public static RemoteAction findTranslateAction(TextClassification classification) { + final ArrayList<Intent> actionIntents = getActionsIntents(classification); + if (actionIntents != null) { + final int size = actionIntents.size(); + for (int i = 0; i < size; i++) { + if (Intent.ACTION_TRANSLATE.equals(actionIntents.get(i).getAction())) { + return classification.getActions().get(i); + } + } + } + return null; + } + + /** + * Returns the entity type contained in the {@code extra}. + */ + @Nullable + public static String getEntityType(Bundle extra) { + return extra.getString(ENTITY_TYPE); + } + + /** + * Returns the score contained in the {@code extra}. + */ + @Nullable + public static float getScore(Bundle extra) { + return extra.getFloat(SCORE, -1); + } + + /** + * Returns the model name contained in the {@code extra}. + */ + @Nullable + public static String getModelName(Bundle extra) { + return extra.getString(MODEL_NAME); + } +} diff --git a/core/java/android/view/textclassifier/TextClassification.java b/core/java/android/view/textclassifier/TextClassification.java index d9f79655d588..a05920960dcf 100644 --- a/core/java/android/view/textclassifier/TextClassification.java +++ b/core/java/android/view/textclassifier/TextClassification.java @@ -378,6 +378,8 @@ public final class TextClassification implements Parcelable { @Nullable private OnClickListener mLegacyOnClickListener; @Nullable private String mId; @Nullable private Bundle mExtras; + @NonNull private final ArrayList<Intent> mActionIntents = new ArrayList<>(); + @Nullable private Bundle mForeignLanguageExtra; /** * Sets the classified text. @@ -412,8 +414,19 @@ public final class TextClassification implements Parcelable { */ @NonNull public Builder addAction(@NonNull RemoteAction action) { + return addAction(action, null); + } + + /** + * @param intent the intent in the remote action. + * @see #addAction(RemoteAction) + * @hide + */ + @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) + public Builder addAction(RemoteAction action, @Nullable Intent intent) { Preconditions.checkArgument(action != null); mActions.add(action); + mActionIntents.add(intent); return this; } @@ -499,13 +512,33 @@ public final class TextClassification implements Parcelable { } /** + * @see #setExtras(Bundle) + * @hide + */ + @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) + public Builder setForeignLanguageExtra(@Nullable Bundle extra) { + mForeignLanguageExtra = extra; + return this; + } + + /** * Builds and returns a {@link TextClassification} object. */ @NonNull public TextClassification build() { return new TextClassification(mText, mLegacyIcon, mLegacyLabel, mLegacyIntent, - mLegacyOnClickListener, mActions, mEntityConfidence, mId, - mExtras == null ? Bundle.EMPTY : mExtras.deepCopy()); + mLegacyOnClickListener, mActions, mEntityConfidence, mId, buildExtras()); + } + + private Bundle buildExtras() { + final Bundle extras = mExtras == null ? new Bundle() : mExtras.deepCopy(); + if (!mActionIntents.isEmpty()) { + ExtrasUtils.putActionsIntents(extras, mActionIntents); + } + if (mForeignLanguageExtra != null) { + ExtrasUtils.putForeignLanguageExtra(extras, mForeignLanguageExtra); + } + return extras.isEmpty() ? Bundle.EMPTY : extras; } } diff --git a/core/java/android/view/textclassifier/TextClassificationSession.java b/core/java/android/view/textclassifier/TextClassificationSession.java index 45668c01a8d3..ba1287fc6b0f 100644 --- a/core/java/android/view/textclassifier/TextClassificationSession.java +++ b/core/java/android/view/textclassifier/TextClassificationSession.java @@ -71,10 +71,23 @@ final class TextClassificationSession implements TextClassifier { @Override public void onSelectionEvent(SelectionEvent event) { - checkDestroyed(); - Preconditions.checkNotNull(event); - if (mEventHelper.sanitizeEvent(event)) { - mDelegate.onSelectionEvent(event); + try { + if (mEventHelper.sanitizeEvent(event)) { + mDelegate.onSelectionEvent(event); + } + } catch (Exception e) { + // Avoid crashing for event reporting. + Log.e(LOG_TAG, "Error reporting text classifier selection event", e); + } + } + + @Override + public void onTextClassifierEvent(TextClassifierEvent event) { + try { + mDelegate.onTextClassifierEvent(event); + } catch (Exception e) { + // Avoid crashing for event reporting. + Log.e(LOG_TAG, "Error reporting text classifier event", e); } } diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java index 5a5613605e36..e0101556910f 100644 --- a/core/java/android/view/textclassifier/TextClassifier.java +++ b/core/java/android/view/textclassifier/TextClassifier.java @@ -161,12 +161,18 @@ public interface TextClassifier { * No-op TextClassifier. * This may be used to turn off TextClassifier features. */ - TextClassifier NO_OP = new TextClassifier() {}; + TextClassifier NO_OP = new TextClassifier() { + @Override + public String toString() { + return "TextClassifier.NO_OP"; + } + }; /** - * Used as a boolean value to indicate the intent is generated by TextClassifier. + * Extra that is included on activity intents coming from a TextClassifier when + * it suggests actions to its caller. * <p> - * All {@link TextClassifier} implementations should set this boolean extra to be true in their + * All {@link TextClassifier} implementations should make sure this extra exists in their * generated intents. */ String EXTRA_FROM_TEXT_CLASSIFIER = "android.view.textclassifier.extra.FROM_TEXT_CLASSIFIER"; diff --git a/core/java/android/view/textclassifier/TextClassifierEvent.java b/core/java/android/view/textclassifier/TextClassifierEvent.java index cd13cc0ec577..0d4338b0af6b 100644 --- a/core/java/android/view/textclassifier/TextClassifierEvent.java +++ b/core/java/android/view/textclassifier/TextClassifierEvent.java @@ -141,6 +141,8 @@ public final class TextClassifierEvent implements Parcelable { @Nullable private final String mLanguage; private final float mScore; + @Nullable private final String mModelName; + private TextClassifierEvent( int eventCategory, int eventType, @@ -156,7 +158,8 @@ public final class TextClassifierEvent implements Parcelable { int relativeSuggestedWordEndIndex, int[] actionIndex, String language, - float score) { + float score, + String modelVersion) { mEventCategory = eventCategory; mEventType = eventType; mEntityTypes = entityTypes; @@ -172,6 +175,7 @@ public final class TextClassifierEvent implements Parcelable { mActionIndices = actionIndex; mLanguage = language; mScore = score; + mModelName = modelVersion; } @Override @@ -196,6 +200,7 @@ public final class TextClassifierEvent implements Parcelable { dest.writeIntArray(mActionIndices); dest.writeString(mLanguage); dest.writeFloat(mScore); + dest.writeString(mModelName); } private static TextClassifierEvent readFromParcel(Parcel in) { @@ -214,7 +219,8 @@ public final class TextClassifierEvent implements Parcelable { /* relativeSuggestedWordEndIndex= */ in.readInt(), /* actionIndices= */ in.createIntArray(), /* language= */ in.readString(), - /* score= */ in.readFloat()); + /* score= */ in.readFloat(), + /* modelVersion= */ in.readString()); } /** @@ -264,6 +270,7 @@ public final class TextClassifierEvent implements Parcelable { return mEventIndex; } + // TODO: Remove this API. /** * Returns the time this event occurred. This is the number of milliseconds since * January 1, 1970, 00:00:00 GMT. 0 indicates not set. @@ -339,6 +346,15 @@ public final class TextClassifierEvent implements Parcelable { } /** + * Returns the model name. + * @hide + */ + @Nullable + public String getModelName() { + return mModelName; + } + + /** * Builder to build a text classifier event. */ public static final class Builder { @@ -359,6 +375,8 @@ public final class TextClassifierEvent implements Parcelable { @Nullable private String mLanguage; private float mScore; + private String mModelName; + /** * Creates a builder for building {@link TextClassifierEvent}s. * @@ -407,6 +425,7 @@ public final class TextClassifierEvent implements Parcelable { return this; } + // TODO: Remove this API. /** * Sets the time this event occurred. This is the number of milliseconds since * January 1, 1970, 00:00:00 GMT. 0 indicates not set. @@ -501,6 +520,15 @@ public final class TextClassifierEvent implements Parcelable { } /** + * Sets the model name string. + * @hide + */ + public Builder setModelName(@Nullable String modelVersion) { + mModelName = modelVersion; + return this; + } + + /** * Builds and returns a text classifier event. */ @NonNull @@ -521,7 +549,8 @@ public final class TextClassifierEvent implements Parcelable { mRelativeSuggestedWordEndIndex, mActionIndices, mLanguage, - mScore); + mScore, + mModelName); } // TODO: Add build(boolean validate). } @@ -544,6 +573,7 @@ public final class TextClassifierEvent implements Parcelable { out.append(", mActionIndices=").append(Arrays.toString(mActionIndices)); out.append(", mLanguage=").append(mLanguage); out.append(", mScore=").append(mScore); + out.append(", mModelName=").append(mModelName); out.append("}"); return out.toString(); } diff --git a/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java b/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java index 5563dfc2eee5..6a122506d0ac 100644 --- a/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java +++ b/core/java/android/view/textclassifier/TextClassifierEventTronLogger.java @@ -16,7 +16,6 @@ package android.view.textclassifier; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXTCLASSIFIER_MODEL; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_EVENT_TIME; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SCORE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_TEXT_CLASSIFIER_SECOND_ENTITY_TYPE; @@ -46,7 +45,7 @@ public final class TextClassifierEventTronLogger { private final MetricsLogger mMetricsLogger; public TextClassifierEventTronLogger() { - mMetricsLogger = new MetricsLogger(); + this(new MetricsLogger()); } @VisibleForTesting @@ -57,6 +56,7 @@ public final class TextClassifierEventTronLogger { /** Emits a text classifier event to the logs. */ public void writeEvent(TextClassifierEvent event) { Preconditions.checkNotNull(event); + int category = getCategory(event); if (category == -1) { Log.w(TAG, "Unknown category: " + event.getEventCategory()); @@ -65,14 +65,12 @@ public final class TextClassifierEventTronLogger { final LogMaker log = new LogMaker(category) .setSubtype(getLogType(event)) .addTaggedData(FIELD_TEXT_CLASSIFIER_SESSION_ID, event.getResultId()) - .addTaggedData(FIELD_TEXT_CLASSIFIER_EVENT_TIME, event.getEventTime()) - .addTaggedData(FIELD_TEXTCLASSIFIER_MODEL, - SelectionSessionLogger.SignatureParser.getModelName(event.getResultId())) + .addTaggedData(FIELD_TEXTCLASSIFIER_MODEL, getModelName(event)) .addTaggedData(FIELD_TEXT_CLASSIFIER_SCORE, event.getScore()); String[] entityTypes = event.getEntityTypes(); - // TRON does not support a field of list type, and thus workaround by store them - // in three separate fields. This is no longer an issue once we have moved to Westworld. + // The old logger does not support a field of list type, and thus workaround by store them + // in three separate fields. This is not an issue with the new logger. if (entityTypes.length >= 1) { log.addTaggedData(FIELD_TEXT_CLASSIFIER_FIRST_ENTITY_TYPE, entityTypes[0]); } @@ -93,6 +91,13 @@ public final class TextClassifierEventTronLogger { debugLog(log); } + private static String getModelName(TextClassifierEvent event) { + if (event.getModelName() != null) { + return event.getModelName(); + } + return SelectionSessionLogger.SignatureParser.getModelName(event.getResultId()); + } + private static int getCategory(TextClassifierEvent event) { switch (event.getEventCategory()) { case TextClassifierEvent.CATEGORY_CONVERSATION_ACTIONS: diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java index c297928ae5f6..14afa339f192 100644 --- a/core/java/android/view/textclassifier/TextClassifierImpl.java +++ b/core/java/android/view/textclassifier/TextClassifierImpl.java @@ -65,9 +65,6 @@ import java.util.Objects; */ public final class TextClassifierImpl implements TextClassifier { - /** @hide */ - public static final String ACTIONS_INTENTS = "actions-intents"; - private static final String LOG_TAG = DEFAULT_LOG_TAG; private static final boolean DEBUG = false; @@ -343,7 +340,11 @@ public final class TextClassifierImpl implements TextClassifier { if (DEBUG) { Log.d(DEFAULT_LOG_TAG, "onTextClassifierEvent() called with: event = [" + event + "]"); } - mTextClassifierEventTronLogger.writeEvent(event); + try { + mTextClassifierEventTronLogger.writeEvent(event); + } catch (Exception e) { + Log.e(LOG_TAG, "Error writing event", e); + } } /** @inheritDoc */ @@ -566,12 +567,16 @@ public final class TextClassifierImpl implements TextClassifier { final float foreignTextThreshold = mSettings.getLangIdThresholdOverride() >= 0 ? mSettings.getLangIdThresholdOverride() : 0.5f /* TODO: Load this from the langId model. */; + final Bundle foreignLanguageBundle = + detectForeignLanguage(classifiedText, foreignTextThreshold); + builder.setForeignLanguageExtra(foreignLanguageBundle); + boolean isPrimaryAction = true; final ArrayList<Intent> sourceIntents = new ArrayList<>(); List<LabeledIntent> labeledIntents = mIntentFactory.create( mContext, classifiedText, - isForeignText(classifiedText, foreignTextThreshold), + foreignLanguageBundle != null, referenceTime, highestScoringResult); for (LabeledIntent labeledIntent : labeledIntents) { @@ -590,28 +595,28 @@ public final class TextClassifierImpl implements TextClassifier { labeledIntent.getIntent(), labeledIntent.getRequestCode()))); isPrimaryAction = false; } - builder.addAction(action); - sourceIntents.add(labeledIntent.getIntent()); + builder.addAction(action, labeledIntent.getIntent()); } - final Bundle extras = new Bundle(); - extras.putParcelableArrayList(ACTIONS_INTENTS, sourceIntents); - - return builder.setId(createId(text, start, end)) - .setExtras(extras) - .build(); + return builder.setId(createId(text, start, end)).build(); } - private boolean isForeignText(String text, float threshold) { + /** + * Returns a bundle with the language and confidence score if it finds the text to be + * in a foreign language. Otherwise returns null. + */ + @Nullable + private Bundle detectForeignLanguage(String text, float threshold) { if (threshold > 1) { - return false; + return null; } // TODO: Revisit this algorithm. try { - final LangIdModel.LanguageResult[] langResults = getLangIdImpl().detectLanguages(text); + final LangIdModel langId = getLangIdImpl(); + final LangIdModel.LanguageResult[] langResults = langId.detectLanguages(text); if (langResults.length <= 0) { - return false; + return null; } LangIdModel.LanguageResult highestScoringResult = langResults[0]; @@ -621,7 +626,7 @@ public final class TextClassifierImpl implements TextClassifier { } } if (highestScoringResult.getScore() < threshold) { - return false; + return null; } // TODO: Remove Log.d(LOG_TAG, String.format("Language detected: <%s:%s>", @@ -632,14 +637,15 @@ public final class TextClassifierImpl implements TextClassifier { final int size = deviceLocales.size(); for (int i = 0; i < size; i++) { if (deviceLocales.get(i).getLanguage().equals(detected.getLanguage())) { - return false; + return null; } } - return true; + return ExtrasUtils.createForeignLanguageExtra( + detected.getLanguage(), highestScoringResult.getScore(), langId.getVersion()); } catch (Throwable t) { Log.e(LOG_TAG, "Error detecting foreign text. Ignored.", t); } - return false; + return null; } @Override @@ -773,3 +779,4 @@ public final class TextClassifierImpl implements TextClassifier { } } } + diff --git a/core/java/android/webkit/WebViewZygote.java b/core/java/android/webkit/WebViewZygote.java index de1f3df61462..09aa066549cb 100644 --- a/core/java/android/webkit/WebViewZygote.java +++ b/core/java/android/webkit/WebViewZygote.java @@ -163,7 +163,7 @@ public class WebViewZygote { TextUtils.join(",", Build.SUPPORTED_ABIS), null, // instructionSet Process.FIRST_ISOLATED_UID, - Process.LAST_ISOLATED_UID); + Integer.MAX_VALUE); // TODO(b/123615476) deal with user-id ranges properly ZygoteProcess.waitForConnectionToZygote(sZygote.getPrimarySocketAddress()); if (sPackageOriginalAppInfo.sourceDir.equals(sPackage.applicationInfo.sourceDir)) { diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 4a60b6a8185a..c38566b87d9c 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -4112,9 +4112,9 @@ public class Editor { } } - private MenuItem addAssistMenuItem(Menu menu, RemoteAction action, int intemId, int order, + private MenuItem addAssistMenuItem(Menu menu, RemoteAction action, int itemId, int order, int showAsAction) { - final MenuItem item = menu.add(TextView.ID_ASSIST, intemId, order, action.getTitle()) + final MenuItem item = menu.add(TextView.ID_ASSIST, itemId, order, action.getTitle()) .setContentDescription(action.getContentDescription()); if (action.shouldShowIcon()) { item.setIcon(action.getIcon().loadDrawable(mTextView.getContext())); @@ -4188,7 +4188,8 @@ public class Editor { @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - getSelectionActionModeHelper().onSelectionAction(item.getItemId()); + getSelectionActionModeHelper() + .onSelectionAction(item.getItemId(), item.getTitle().toString()); if (mProcessTextIntentActionsHandler.performMenuItemAction(item)) { return true; diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java index 4caf28881edc..564cfdd20d76 100644 --- a/core/java/android/widget/SelectionActionModeHelper.java +++ b/core/java/android/widget/SelectionActionModeHelper.java @@ -20,12 +20,14 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UiThread; import android.annotation.WorkerThread; +import android.app.RemoteAction; import android.content.Context; import android.graphics.Canvas; import android.graphics.PointF; import android.graphics.RectF; import android.os.AsyncTask; import android.os.Build; +import android.os.Bundle; import android.os.LocaleList; import android.text.Layout; import android.text.Selection; @@ -34,13 +36,16 @@ import android.text.TextUtils; import android.text.util.Linkify; import android.util.Log; import android.view.ActionMode; +import android.view.textclassifier.ExtrasUtils; import android.view.textclassifier.SelectionEvent; import android.view.textclassifier.SelectionEvent.InvocationMethod; import android.view.textclassifier.SelectionSessionLogger; import android.view.textclassifier.TextClassification; import android.view.textclassifier.TextClassificationConstants; +import android.view.textclassifier.TextClassificationContext; import android.view.textclassifier.TextClassificationManager; import android.view.textclassifier.TextClassifier; +import android.view.textclassifier.TextClassifierEvent; import android.view.textclassifier.TextSelection; import android.widget.Editor.SelectionModifierCursorController; @@ -166,16 +171,17 @@ public final class SelectionActionModeHelper { } } - public void onSelectionAction(int menuItemId) { + /** Reports a selection action event. */ + public void onSelectionAction(int menuItemId, @Nullable String actionLabel) { mSelectionTracker.onSelectionAction( mTextView.getSelectionStart(), mTextView.getSelectionEnd(), - getActionType(menuItemId), mTextClassification); + getActionType(menuItemId), actionLabel, mTextClassification); } public void onSelectionDrag() { mSelectionTracker.onSelectionAction( mTextView.getSelectionStart(), mTextView.getSelectionEnd(), - SelectionEvent.ACTION_DRAG, mTextClassification); + SelectionEvent.ACTION_DRAG, /* actionLabel= */ null, mTextClassification); } public void onTextChanged(int start, int end) { @@ -511,8 +517,11 @@ public final class SelectionActionModeHelper { mOriginalEnd = mSelectionEnd = selectionEnd; mAllowReset = false; maybeInvalidateLogger(); - mLogger.logSelectionStarted(mTextView.getTextClassificationSession(), - text, selectionStart, + mLogger.logSelectionStarted( + mTextView.getTextClassificationSession(), + mTextView.getTextClassificationContext(), + text, + selectionStart, isLink ? SelectionEvent.INVOCATION_LINK : SelectionEvent.INVOCATION_MANUAL); } @@ -570,10 +579,12 @@ public final class SelectionActionModeHelper { public void onSelectionAction( int selectionStart, int selectionEnd, @SelectionEvent.ActionType int action, + @Nullable String actionLabel, @Nullable TextClassification classification) { if (isSelectionStarted()) { mAllowReset = false; - mLogger.logSelectionAction(selectionStart, selectionEnd, action, classification); + mLogger.logSelectionAction( + selectionStart, selectionEnd, action, actionLabel, classification); } } @@ -596,7 +607,8 @@ public final class SelectionActionModeHelper { mSelectionEnd = editor.getTextView().getSelectionEnd(); mLogger.logSelectionAction( textView.getSelectionStart(), textView.getSelectionEnd(), - SelectionEvent.ACTION_RESET, null /* classification */); + SelectionEvent.ACTION_RESET, + /* actionLabel= */ null, /* classification= */ null); } return selected; } @@ -605,7 +617,9 @@ public final class SelectionActionModeHelper { public void onTextChanged(int start, int end, TextClassification classification) { if (isSelectionStarted() && start == mSelectionStart && end == mSelectionEnd) { - onSelectionAction(start, end, SelectionEvent.ACTION_OVERTYPE, classification); + onSelectionAction( + start, end, SelectionEvent.ACTION_OVERTYPE, + /* actionLabel= */ null, classification); } } @@ -644,7 +658,8 @@ public final class SelectionActionModeHelper { if (mIsPending) { mLogger.logSelectionAction( mSelectionStart, mSelectionEnd, - SelectionEvent.ACTION_ABANDON, null /* classification */); + SelectionEvent.ACTION_ABANDON, + /* actionLabel= */ null, /* classification= */ null); mSelectionStart = mSelectionEnd = -1; mLogger.endTextClassificationSession(); mIsPending = false; @@ -679,6 +694,11 @@ public final class SelectionActionModeHelper { private final BreakIterator mTokenIterator; @Nullable private TextClassifier mClassificationSession; + @Nullable private TextClassificationContext mClassificationContext; + + @Nullable private TextClassifierEvent mTranslateViewEvent; + @Nullable private TextClassifierEvent mTranslateClickEvent; + private int mStartIndex; private String mText; @@ -690,6 +710,7 @@ public final class SelectionActionModeHelper { public void logSelectionStarted( TextClassifier classificationSession, + TextClassificationContext classificationContext, CharSequence text, int index, @InvocationMethod int invocationMethod) { try { @@ -701,6 +722,7 @@ public final class SelectionActionModeHelper { mTokenIterator.setText(mText); mStartIndex = index; mClassificationSession = classificationSession; + mClassificationContext = classificationContext; if (hasActiveClassificationSession()) { mClassificationSession.onSelectionEvent( SelectionEvent.createSelectionStartedEvent(invocationMethod, 0)); @@ -731,6 +753,7 @@ public final class SelectionActionModeHelper { SelectionEvent.createSelectionModifiedEvent( wordIndices[0], wordIndices[1])); } + maybeGenerateTranslateViewEvent(classification); } } catch (Exception e) { // Avoid crashes due to logging. @@ -741,6 +764,7 @@ public final class SelectionActionModeHelper { public void logSelectionAction( int start, int end, @SelectionEvent.ActionType int action, + @Nullable String actionLabel, @Nullable TextClassification classification) { try { if (hasActiveClassificationSession()) { @@ -757,6 +781,9 @@ public final class SelectionActionModeHelper { SelectionEvent.createSelectionActionEvent( wordIndices[0], wordIndices[1], action)); } + + maybeGenerateTranslateClickEvent(classification, actionLabel); + if (SelectionEvent.isTerminal(action)) { endTextClassificationSession(); } @@ -773,6 +800,7 @@ public final class SelectionActionModeHelper { public void endTextClassificationSession() { if (hasActiveClassificationSession()) { + maybeReportTranslateEvents(); mClassificationSession.destroy(); } } @@ -843,6 +871,78 @@ public final class SelectionActionModeHelper { private boolean isWhitespace(int start, int end) { return PATTERN_WHITESPACE.matcher(mText.substring(start, end)).matches(); } + + private void maybeGenerateTranslateViewEvent(@Nullable TextClassification classification) { + if (classification != null) { + final TextClassifierEvent event = generateTranslateEvent( + TextClassifierEvent.TYPE_ACTIONS_SHOWN, + classification, mClassificationContext, /* actionLabel= */null); + mTranslateViewEvent = (event != null) ? event : mTranslateViewEvent; + } + } + + private void maybeGenerateTranslateClickEvent( + @Nullable TextClassification classification, String actionLabel) { + if (classification != null) { + mTranslateClickEvent = generateTranslateEvent( + TextClassifierEvent.TYPE_SMART_ACTION, + classification, mClassificationContext, actionLabel); + } + } + + private void maybeReportTranslateEvents() { + // Translate view and click events should only be logged once per selection session. + if (mTranslateViewEvent != null) { + mClassificationSession.onTextClassifierEvent(mTranslateViewEvent); + mTranslateViewEvent = null; + } + if (mTranslateClickEvent != null) { + mClassificationSession.onTextClassifierEvent(mTranslateClickEvent); + mTranslateClickEvent = null; + } + } + + @Nullable + private static TextClassifierEvent generateTranslateEvent( + int eventType, TextClassification classification, + TextClassificationContext classificationContext, @Nullable String actionLabel) { + + // The platform attempts to log "views" and "clicks" of the "Translate" action. + // Views are logged if a user is presented with the translate action during a selection + // session. + // Clicks are logged if the user clicks on the translate action. + // The index of the translate action is also logged to indicate whether it might have + // been in the main panel or overflow panel of the selection toolbar. + // NOTE that the "views" metric may be flawed if a TextView removes the translate menu + // item via a custom action mode callback or does not show a selection menu item. + + final RemoteAction translateAction = ExtrasUtils.findTranslateAction(classification); + if (translateAction == null) { + // No translate action present. Nothing to log. Exit. + return null; + } + + if (eventType == TextClassifierEvent.TYPE_SMART_ACTION + && !translateAction.getTitle().toString().equals(actionLabel)) { + // Clicked action is not a translate action. Nothing to log. Exit. + // Note that we don't expect an actionLabel for "view" events. + return null; + } + + final Bundle foreignLanguageExtra = ExtrasUtils.getForeignLanguageExtra(classification); + final String language = ExtrasUtils.getEntityType(foreignLanguageExtra); + final float score = ExtrasUtils.getScore(foreignLanguageExtra); + final String model = ExtrasUtils.getModelName(foreignLanguageExtra); + return new TextClassifierEvent.Builder( + TextClassifierEvent.CATEGORY_LANGUAGE_DETECTION, eventType) + .setEventContext(classificationContext) + .setResultId(classification.getId()) + .setEntityTypes(language) + .setScore(score) + .setActionIndices(classification.getActions().indexOf(translateAction)) + .setModelName(model) + .build(); + } } /** diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 780fe8d821d6..8029cf0eb50e 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -456,6 +456,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private TextClassifier mTextClassifier; private TextClassifier mTextClassificationSession; + private TextClassificationContext mTextClassificationContext; // A flag to prevent repeated movements from escaping the enclosing text view. The idea here is // that if a user is holding down a movement key to traverse text, we shouldn't also traverse @@ -10275,7 +10276,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final ContentCaptureSession session = getContentCaptureSession(); if (session != null) { // TODO(b/111276913): pass flags when edited by user / add CTS test - session.notifyViewTextChanged(getAutofillId(), getText(), /* flags= */ 0); + session.notifyViewTextChanged(getAutofillId(), getText()); } } } @@ -12068,16 +12069,15 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } else { widgetType = TextClassifier.WIDGET_TYPE_UNSELECTABLE_TEXTVIEW; } - final TextClassificationContext textClassificationContext = - new TextClassificationContext.Builder( - mContext.getPackageName(), widgetType) - .build(); + mTextClassificationContext = new TextClassificationContext.Builder( + mContext.getPackageName(), widgetType) + .build(); if (mTextClassifier != null) { mTextClassificationSession = tcm.createTextClassificationSession( - textClassificationContext, mTextClassifier); + mTextClassificationContext, mTextClassifier); } else { mTextClassificationSession = tcm.createTextClassificationSession( - textClassificationContext); + mTextClassificationContext); } } else { mTextClassificationSession = TextClassifier.NO_OP; @@ -12087,6 +12087,15 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } /** + * Returns the {@link TextClassificationContext} for the current TextClassifier session. + * @see #getTextClassificationSession() + */ + @Nullable + TextClassificationContext getTextClassificationContext() { + return mTextClassificationContext; + } + + /** * Returns true if this TextView uses a no-op TextClassifier. */ boolean usesNoOpTextClassifier() { diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 299801a1b8fc..46f42f7864c5 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -24,6 +24,7 @@ import android.app.prediction.AppPredictor; import android.app.prediction.AppTarget; import android.app.prediction.AppTargetEvent; import android.app.prediction.AppTargetId; +import android.content.ClipData; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -41,9 +42,13 @@ import android.content.pm.ResolveInfo; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; import android.database.DataSetObserver; +import android.graphics.Bitmap; +import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.Path; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; +import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; @@ -62,7 +67,9 @@ import android.service.chooser.ChooserTargetService; import android.service.chooser.IChooserTargetResult; import android.service.chooser.IChooserTargetService; import android.text.TextUtils; +import android.util.AttributeSet; import android.util.Log; +import android.util.Size; import android.util.Slog; import android.view.LayoutInflater; import android.view.View; @@ -73,9 +80,11 @@ import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AbsListView; import android.widget.BaseAdapter; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.Space; +import android.widget.TextView; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; @@ -85,6 +94,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.google.android.collect.Lists; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -262,16 +272,31 @@ public class ChooserActivity extends ResolverActivity { } mReplacementExtras = intent.getBundleExtra(Intent.EXTRA_REPLACEMENT_EXTRAS); - CharSequence title = intent.getCharSequenceExtra(Intent.EXTRA_TITLE); + + // Do not allow the title to be changed when sharing content + CharSequence title = null; + if (target != null) { + String targetAction = target.getAction(); + if (!(Intent.ACTION_SEND.equals(targetAction) || Intent.ACTION_SEND_MULTIPLE.equals( + targetAction))) { + title = intent.getCharSequenceExtra(Intent.EXTRA_TITLE); + } else { + Log.w(TAG, "Ignoring intent's EXTRA_TITLE, deprecated in P. You may wish to set a" + + " preview title by using EXTRA_TITLE property of the wrapped" + + " EXTRA_INTENT."); + } + } + int defaultTitleRes = 0; if (title == null) { defaultTitleRes = com.android.internal.R.string.chooseActivity; } + Parcelable[] pa = intent.getParcelableArrayExtra(Intent.EXTRA_INITIAL_INTENTS); Intent[] initialIntents = null; if (pa != null) { initialIntents = new Intent[pa.length]; - for (int i=0; i<pa.length; i++) { + for (int i = 0; i < pa.length; i++) { if (!(pa[i] instanceof Intent)) { Log.w(TAG, "Initial intent #" + i + " not an Intent: " + pa[i]); finish(); @@ -364,6 +389,68 @@ public class ChooserActivity extends ResolverActivity { } } + /** + * Override method to add content preview area, specific to the chooser activity. + */ + @Override + public void setHeader() { + super.setHeader(); + + Intent targetIntent = getTargetIntent(); + if (targetIntent == null) { + return; + } + + ViewGroup contentPreviewLayout = findViewById(R.id.content_preview); + String action = targetIntent.getAction(); + if (!(Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action))) { + contentPreviewLayout.setVisibility(View.GONE); + return; + } + + showDefaultContentPreview(contentPreviewLayout, targetIntent); + } + + private void showDefaultContentPreview(final ViewGroup parentLayout, + final Intent targetIntent) { + CharSequence sharingText = targetIntent.getCharSequenceExtra(Intent.EXTRA_TEXT); + TextView previewTextView = findViewById(R.id.content_preview_text); + if (sharingText == null) { + previewTextView.setVisibility(View.GONE); + } else { + previewTextView.setText(sharingText); + } + + String previewTitle = targetIntent.getStringExtra(Intent.EXTRA_TITLE); + TextView previewTitleView = findViewById(R.id.content_preview_title); + if (previewTitle == null) { + previewTitleView.setVisibility(View.GONE); + } else { + previewTitleView.setText(previewTitle); + } + + ClipData previewData = targetIntent.getClipData(); + Uri previewThumbnail = null; + if (previewData != null) { + if (previewData.getItemCount() > 0) { + ClipData.Item previewDataItem = previewData.getItemAt(0); + previewThumbnail = previewDataItem.getUri(); + } + } + + ImageView previewThumbnailView = findViewById(R.id.content_preview_thumbnail); + if (previewThumbnail == null) { + previewThumbnailView.setVisibility(View.GONE); + } else { + Bitmap bmp = loadThumbnail(previewThumbnail, new Size(200, 200)); + if (bmp == null) { + previewThumbnailView.setVisibility(View.GONE); + } else { + previewThumbnailView.setImageBitmap(bmp); + } + } + } + static SharedPreferences getPinnedSharedPrefs(Context context) { // The code below is because in the android:ui process, no one can hear you scream. // The package info in the context isn't initialized in the way it is for normal apps, @@ -630,15 +717,19 @@ public class ChooserActivity extends ResolverActivity { } } if (targetsToQuery >= QUERY_TARGET_SERVICE_LIMIT) { - if (DEBUG) Log.d(TAG, "queryTargets hit query target limit " - + QUERY_TARGET_SERVICE_LIMIT); + if (DEBUG) { + Log.d(TAG, "queryTargets hit query target limit " + + QUERY_TARGET_SERVICE_LIMIT); + } break; } } if (!mServiceConnections.isEmpty()) { - if (DEBUG) Log.d(TAG, "queryTargets setting watchdog timer for " - + WATCHDOG_TIMEOUT_MILLIS + "ms"); + if (DEBUG) { + Log.d(TAG, "queryTargets setting watchdog timer for " + + WATCHDOG_TIMEOUT_MILLIS + "ms"); + } mChooserHandler.sendEmptyMessageDelayed(CHOOSER_TARGET_SERVICE_WATCHDOG_TIMEOUT, WATCHDOG_TIMEOUT_MILLIS); } else { @@ -969,6 +1060,20 @@ public class ChooserActivity extends ResolverActivity { mLaunchedFromUid); } + @VisibleForTesting + protected Bitmap loadThumbnail(Uri uri, Size size) { + if (uri == null || size == null) { + return null; + } + + try { + return getContentResolver().loadThumbnail(uri, size, null); + } catch (IOException | NullPointerException ex) { + Log.w(TAG, "Error loading preview thumbnail for uri: " + uri.toString(), ex); + } + return null; + } + final class ChooserTargetInfo implements TargetInfo { private final DisplayResolveInfo mSourceInfo; private final ResolveInfo mBackupResolveInfo; @@ -1247,7 +1352,7 @@ public class ChooserActivity extends ResolverActivity { UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE); if (ii instanceof LabeledIntent) { - LabeledIntent li = (LabeledIntent)ii; + LabeledIntent li = (LabeledIntent) ii; ri.resolvePackageName = li.getSourcePackage(); ri.labelRes = li.getLabelResource(); ri.nonLocalizedLabel = li.getNonLocalizedLabel(); @@ -1391,8 +1496,10 @@ public class ChooserActivity extends ResolverActivity { } public void addServiceResults(DisplayResolveInfo origTarget, List<ChooserTarget> targets) { - if (DEBUG) Log.d(TAG, "addServiceResults " + origTarget + ", " + targets.size() - + " targets"); + if (DEBUG) { + Log.d(TAG, "addServiceResults " + origTarget + ", " + targets.size() + + " targets"); + } if (mTargetsNeedPruning && targets.size() > 0) { // First proper update since we got an onListRebuilt() with (transient) 0 items. @@ -1492,8 +1599,9 @@ public class ChooserActivity extends ResolverActivity { public int getCount() { return (int) ( getCallerTargetRowCount() - + getServiceTargetRowCount() - + Math.ceil((float) mChooserListAdapter.getStandardTargetCount() / mColumnCount) + + getServiceTargetRowCount() + + Math.ceil( + (float) mChooserListAdapter.getStandardTargetCount() / mColumnCount) ); } @@ -1860,7 +1968,7 @@ public class ChooserActivity extends ResolverActivity { final int chooserTargetRows = mChooserRowAdapter.getServiceTargetRowCount(); int offset = 0; - for (int i = 0; i < chooserTargetRows; i++) { + for (int i = 0; i < chooserTargetRows; i++) { final int pos = mChooserRowAdapter.getCallerTargetRowCount() + i; final int vt = mChooserRowAdapter.getItemViewType(pos); if (vt != mCachedViewType) { @@ -1882,4 +1990,65 @@ public class ChooserActivity extends ResolverActivity { mResolverDrawerLayout.setCollapsibleHeightReserved(offset); } } + + + /** + * Used internally to round image corners while obeying view padding. + */ + public static class RoundedRectImageView extends ImageView { + private int mRadius = 0; + private Path mPath = new Path(); + + public RoundedRectImageView(Context context) { + super(context); + } + + public RoundedRectImageView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public RoundedRectImageView(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public RoundedRectImageView(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + mRadius = context.getResources().getDimensionPixelSize(R.dimen.chooser_corner_radius); + } + + private void updatePath(int width, int height) { + mPath.reset(); + + int imageWidth = width - getPaddingLeft() - getPaddingRight(); + int imageHeight = height - getPaddingTop() - getPaddingBottom(); + mPath.addRoundRect(getPaddingLeft(), getPaddingTop(), imageWidth, imageHeight, mRadius, + mRadius, Path.Direction.CW); + } + + /** + * Sets the corner radius on all corners + * + * param radius 0 for no radius, > 0 for a visible corner radius + */ + public void setRadius(int radius) { + mRadius = radius; + updatePath(getWidth(), getHeight()); + } + + @Override + protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { + super.onSizeChanged(width, height, oldWidth, oldHeight); + updatePath(width, height); + } + + @Override + protected void onDraw(Canvas canvas) { + if (mRadius != 0) { + canvas.clipPath(mPath); + } + + super.onDraw(canvas); + } + } } diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index a50c736e195e..091991130391 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -1044,7 +1044,10 @@ public class ResolverActivity extends Activity { } } - public void setTitleAndIcon() { + /** + * Configure the area above the app selection list (title, content preview, etc). + */ + public void setHeader() { if (mAdapter.getCount() == 0 && mAdapter.mPlaceholderCount == 0) { final TextView titleView = findViewById(R.id.title); if (titleView != null) { @@ -1062,23 +1065,6 @@ public class ResolverActivity extends Activity { titleView.setText(title); } setTitle(title); - - // Try to initialize the title icon if we have a view for it and a title to match - final ImageView titleIcon = findViewById(R.id.title_icon); - if (titleIcon != null) { - ApplicationInfo ai = null; - try { - if (!TextUtils.isEmpty(mReferrerPackage)) { - ai = mPm.getApplicationInfo(mReferrerPackage, 0); - } - } catch (NameNotFoundException e) { - Log.e(TAG, "Could not find referrer package " + mReferrerPackage); - } - - if (ai != null) { - titleIcon.setImageDrawable(ai.loadIcon(mPm)); - } - } } final ImageView iconView = findViewById(R.id.icon); @@ -1692,7 +1678,7 @@ public class ResolverActivity extends Activity { mPostListReadyRunnable = new Runnable() { @Override public void run() { - setTitleAndIcon(); + setHeader(); resetButtonBar(); onListRebuilt(); mPostListReadyRunnable = null; diff --git a/core/java/com/android/internal/os/AppZygoteInit.java b/core/java/com/android/internal/os/AppZygoteInit.java index afe6dade62ac..6ba584d76ee8 100644 --- a/core/java/com/android/internal/os/AppZygoteInit.java +++ b/core/java/com/android/internal/os/AppZygoteInit.java @@ -73,6 +73,9 @@ class AppZygoteInit { Log.i(TAG, "Beginning application preload for " + appInfo.packageName); LoadedApk loadedApk = new LoadedApk(null, appInfo, null, null, false, true, false); ClassLoader loader = loadedApk.getClassLoader(); + + Zygote.allowAppFilesAcrossFork(appInfo); + Class<?> cl; Method m; try { diff --git a/core/java/com/android/internal/os/ChildZygoteInit.java b/core/java/com/android/internal/os/ChildZygoteInit.java index a052a3b3ab6a..cc74863632dd 100644 --- a/core/java/com/android/internal/os/ChildZygoteInit.java +++ b/core/java/com/android/internal/os/ChildZygoteInit.java @@ -98,9 +98,11 @@ public class ChildZygoteInit { throw new RuntimeException("Passed in UID range is invalid, min > max."); } - // Verify the UIDs are in the isolated UID range, as that's the only thing that we should - // be forking right now - if (!Process.isIsolated(uidGidMin) || !Process.isIsolated(uidGidMax)) { + // Verify the UIDs at least do not include system UIDs; we can't easily verify there + // are just isolated UIDs in the range, because for the webview zygote, there is no + // single range that captures all possible isolated UIDs. + // TODO(b/123615476) narrow this down + if (uidGidMin < Process.FIRST_ISOLATED_UID) { throw new RuntimeException("Passed in UID range does not map to isolated processes."); } diff --git a/core/java/com/android/internal/os/OWNERS b/core/java/com/android/internal/os/OWNERS new file mode 100644 index 000000000000..928310549e6e --- /dev/null +++ b/core/java/com/android/internal/os/OWNERS @@ -0,0 +1 @@ +per-file ZygoteArguments.java,ZygoteConnection.java,ZygoteInit.java,Zygote.java,ZygoteServer.java = chriswailes@google.com, ngeoffray@google.com, sehr@google.com, narayan@google.com, maco@google.com diff --git a/core/java/com/android/internal/os/RoSystemProperties.java b/core/java/com/android/internal/os/RoSystemProperties.java index b529bbe51e93..f4902d46992b 100644 --- a/core/java/com/android/internal/os/RoSystemProperties.java +++ b/core/java/com/android/internal/os/RoSystemProperties.java @@ -17,6 +17,7 @@ package com.android.internal.os; import android.os.SystemProperties; +import android.sysprop.CryptoProperties; /** * This is a cache of various ro.* properties so that they can be read just once @@ -61,7 +62,7 @@ public class RoSystemProperties { // ------ ro.crypto.* -------- // public static final String CRYPTO_STATE = SystemProperties.get("ro.crypto.state"); - public static final String CRYPTO_TYPE = SystemProperties.get("ro.crypto.type"); + public static final String CRYPTO_TYPE = CryptoProperties.type().orElse(""); // These are pseudo-properties public static final boolean CRYPTO_ENCRYPTABLE = !CRYPTO_STATE.isEmpty() && !"unsupported".equals(CRYPTO_STATE); diff --git a/core/java/com/android/internal/os/WebViewZygoteInit.java b/core/java/com/android/internal/os/WebViewZygoteInit.java index c8d30b27d4dc..9ed738406707 100644 --- a/core/java/com/android/internal/os/WebViewZygoteInit.java +++ b/core/java/com/android/internal/os/WebViewZygoteInit.java @@ -78,18 +78,7 @@ class WebViewZygoteInit { ClassLoader loader = loadedApk.getClassLoader(); doPreload(loader, WebViewFactory.getWebViewLibrary(appInfo)); - // Add the APK to the Zygote's list of allowed files for children. - Zygote.nativeAllowFileAcrossFork(appInfo.sourceDir); - if (appInfo.splitSourceDirs != null) { - for (String path : appInfo.splitSourceDirs) { - Zygote.nativeAllowFileAcrossFork(path); - } - } - if (appInfo.sharedLibraryFiles != null) { - for (String path : appInfo.sharedLibraryFiles) { - Zygote.nativeAllowFileAcrossFork(path); - } - } + Zygote.allowAppFilesAcrossFork(appInfo); Log.i(TAG, "Application preload done"); } diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index bc7cf8755786..474d4d7cd90e 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -20,6 +20,7 @@ import static android.system.OsConstants.O_CLOEXEC; import static com.android.internal.os.ZygoteConnectionConstants.MAX_ZYGOTE_ARGC; +import android.content.pm.ApplicationInfo; import android.net.Credentials; import android.net.LocalServerSocket; import android.net.LocalSocket; @@ -370,6 +371,27 @@ public final class Zygote { protected static native void nativeAllowFileAcrossFork(String path); /** + * Lets children of the zygote inherit open file descriptors that belong to the + * ApplicationInfo that is passed in. + * + * @param appInfo ApplicationInfo of the application + */ + protected static void allowAppFilesAcrossFork(ApplicationInfo appInfo) { + Zygote.nativeAllowFileAcrossFork(appInfo.sourceDir); + if (appInfo.splitSourceDirs != null) { + for (String path : appInfo.splitSourceDirs) { + Zygote.nativeAllowFileAcrossFork(path); + } + } + // As well as its shared libs + if (appInfo.sharedLibraryFiles != null) { + for (String path : appInfo.sharedLibraryFiles) { + Zygote.nativeAllowFileAcrossFork(path); + } + } + } + + /** * Installs a seccomp filter that limits setresuid()/setresgid() to the passed-in range * @param uidGidMin The smallest allowed uid/gid * @param uidGidMax The largest allowed uid/gid diff --git a/core/jni/Android.bp b/core/jni/Android.bp index 9afd5d0bff03..51a3b48e58ec 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -301,6 +301,7 @@ cc_library_shared { "libhwui", "libdl", "libstatslog", + "server_configurable_flags", ], generated_sources: ["android_util_StatsLog.cpp"], diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index c90071a0de44..49598bbb5ada 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -31,6 +31,7 @@ #include <binder/Parcel.h> #include <utils/threads.h> #include <cutils/properties.h> +#include <server_configurable_flags/get_flags.h> #include <SkGraphics.h> @@ -774,7 +775,17 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote) addOption("-XX:LowMemoryMode"); } - parseRuntimeOption("dalvik.vm.gctype", gctypeOptsBuf, "-Xgc:"); + std::string gc_type_override = + server_configurable_flags::GetServerConfigurableFlag("runtime_native", "gctype", ""); + std::string gc_type_override_temp; + if (gc_type_override.empty()) { + parseRuntimeOption("dalvik.vm.gctype", gctypeOptsBuf, "-Xgc:"); + } else { + // Copy the string so it doesn't go out of scope since addOption does not make a copy. + gc_type_override_temp = "-Xgc:" + gc_type_override; + addOption(gc_type_override_temp.c_str()); + } + parseRuntimeOption("dalvik.vm.backgroundgctype", backgroundgcOptsBuf, "-XX:BackgroundGC="); /* diff --git a/core/jni/OWNERS b/core/jni/OWNERS index a365a566f038..86342c47c455 100644 --- a/core/jni/OWNERS +++ b/core/jni/OWNERS @@ -4,3 +4,6 @@ per-file *Camera*,*camera* = shuzhenwang@google.com, yinchiayeh@google.com, zhij # Connectivity per-file android_net_* = ek@google.com, lorenzo@google.com, satk@google.com + +# Zygote +per-file com_android_inernal_os_Zygote.*,fd_utils.* = chriswailes@google.com, ngeoffray@google.com, sehr@google.com, narayan@google.com, maco@google.com diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index c74797b60e69..d215f965b3c2 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -986,6 +986,19 @@ static jint Bitmap_getPixel(JNIEnv* env, jobject, jlong bitmapHandle, return static_cast<jint>(dst); } +static jlong Bitmap_getColor(JNIEnv* env, jobject, jlong bitmapHandle, + jint x, jint y) { + SkBitmap bitmap; + reinterpret_cast<BitmapWrapper*>(bitmapHandle)->getSkBitmap(&bitmap); + + SkImageInfo dstInfo = SkImageInfo::Make( + 1, 1, kRGBA_F16_SkColorType, kUnpremul_SkAlphaType, bitmap.refColorSpace()); + + uint64_t dst; + bitmap.readPixels(dstInfo, &dst, dstInfo.minRowBytes(), x, y); + return static_cast<jlong>(dst); +} + static void Bitmap_getPixels(JNIEnv* env, jobject, jlong bitmapHandle, jintArray pixelArray, jint offset, jint stride, jint x, jint y, jint width, jint height) { @@ -1231,6 +1244,7 @@ static const JNINativeMethod gBitmapMethods[] = { (void*)Bitmap_extractAlpha }, { "nativeGenerationId", "(J)I", (void*)Bitmap_getGenerationId }, { "nativeGetPixel", "(JII)I", (void*)Bitmap_getPixel }, + { "nativeGetColor", "(JII)J", (void*)Bitmap_getColor }, { "nativeGetPixels", "(J[IIIIIII)V", (void*)Bitmap_getPixels }, { "nativeSetPixel", "(JIII)V", (void*)Bitmap_setPixel }, { "nativeSetPixels", "(J[IIIIIII)V", (void*)Bitmap_setPixels }, diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp index fc9ea76f6ed3..9c48c33dc2ed 100644 --- a/core/jni/android_graphics_Canvas.cpp +++ b/core/jni/android_graphics_Canvas.cpp @@ -222,6 +222,18 @@ static void drawColor(JNIEnv* env, jobject, jlong canvasHandle, jint color, jint get_canvas(canvasHandle)->drawColor(color, mode); } +static void drawColorLong(JNIEnv* env, jobject, jlong canvasHandle, jlong colorSpaceHandle, + jlong colorLong, jint modeHandle) { + SkColor4f color = GraphicsJNI::convertColorLong(colorLong); + sk_sp<SkColorSpace> cs = GraphicsJNI::getNativeColorSpace(colorSpaceHandle); + SkPaint p; + p.setColor4f(color, cs.get()); + + SkBlendMode mode = static_cast<SkBlendMode>(modeHandle); + p.setBlendMode(mode); + get_canvas(canvasHandle)->drawPaint(p); +} + static void drawPaint(JNIEnv* env, jobject, jlong canvasHandle, jlong paintHandle) { Paint* paint = reinterpret_cast<Paint*>(paintHandle); get_canvas(canvasHandle)->drawPaint(*paint); @@ -677,6 +689,7 @@ static const JNINativeMethod gMethods[] = { // If called from DisplayListCanvas they are @FastNative static const JNINativeMethod gDrawMethods[] = { {"nDrawColor","(JII)V", (void*) CanvasJNI::drawColor}, + {"nDrawColor","(JJJI)V", (void*) CanvasJNI::drawColorLong}, {"nDrawPaint","(JJ)V", (void*) CanvasJNI::drawPaint}, {"nDrawPoint", "(JFFJ)V", (void*) CanvasJNI::drawPoint}, {"nDrawPoints", "(J[FIIJ)V", (void*) CanvasJNI::drawPoints}, diff --git a/core/jni/android_hardware_input_InputWindowHandle.cpp b/core/jni/android_hardware_input_InputWindowHandle.cpp index c0e45b12cf76..67a74419e771 100644 --- a/core/jni/android_hardware_input_InputWindowHandle.cpp +++ b/core/jni/android_hardware_input_InputWindowHandle.cpp @@ -55,6 +55,7 @@ static struct { jfieldID ownerUid; jfieldID inputFeatures; jfieldID displayId; + jfieldID portalToDisplayId; } gInputWindowHandleClassInfo; static Mutex gHandleMutex; @@ -154,6 +155,8 @@ bool NativeInputWindowHandle::updateInfo() { gInputWindowHandleClassInfo.inputFeatures); mInfo.displayId = env->GetIntField(obj, gInputWindowHandleClassInfo.displayId); + mInfo.portalToDisplayId = env->GetIntField(obj, + gInputWindowHandleClassInfo.portalToDisplayId); jobject inputApplicationHandleObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.inputApplicationHandle); @@ -307,6 +310,9 @@ int register_android_view_InputWindowHandle(JNIEnv* env) { GET_FIELD_ID(gInputWindowHandleClassInfo.displayId, clazz, "displayId", "I"); + + GET_FIELD_ID(gInputWindowHandleClassInfo.portalToDisplayId, clazz, + "portalToDisplayId", "I"); return 0; } diff --git a/core/jni/android_media_AudioAttributes.cpp b/core/jni/android_media_AudioAttributes.cpp index 4be4def4a87b..b87a34d6c7aa 100644 --- a/core/jni/android_media_AudioAttributes.cpp +++ b/core/jni/android_media_AudioAttributes.cpp @@ -135,7 +135,7 @@ JNIAudioAttributeHelper::UniqueAaPtr JNIAudioAttributeHelper::makeUnique() { audio_attributes_t *aa = new (calloc(1, sizeof(audio_attributes_t))) audio_attributes_t{AUDIO_ATTRIBUTES_INITIALIZER}; - return UniqueAaPtr{aa, free}; + return UniqueAaPtr{aa}; } jint JNIAudioAttributeHelper::nativeFromJava(JNIEnv* env, jobject jAudioAttributes, diff --git a/core/jni/android_media_AudioAttributes.h b/core/jni/android_media_AudioAttributes.h index c55835222086..628f7e3469e8 100644 --- a/core/jni/android_media_AudioAttributes.h +++ b/core/jni/android_media_AudioAttributes.h @@ -27,7 +27,11 @@ namespace android { class JNIAudioAttributeHelper { public: - using UniqueAaPtr = std::unique_ptr<audio_attributes_t, decltype(free)*>; + struct FreeDeleter { + void operator()(void *p) const { ::free(p); } + }; + + using UniqueAaPtr = std::unique_ptr<audio_attributes_t, FreeDeleter>; /** * @brief makeUnique helper to prevent leak diff --git a/core/jni/android_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp index e64d2afe7bf3..ee11b6162db0 100644 --- a/core/jni/android_os_VintfObject.cpp +++ b/core/jni/android_os_VintfObject.cpp @@ -96,7 +96,7 @@ static jobjectArray android_os_VintfObject_report(JNIEnv* env, jclass) return toJavaStringArray(env, cStrings); } -static jint verify(JNIEnv* env, jobjectArray packageInfo, android::vintf::CheckFlags::Type checks) { +static jint android_os_VintfObject_verify(JNIEnv* env, jclass, jobjectArray packageInfo) { std::vector<std::string> cPackageInfo; if (packageInfo) { size_t count = env->GetArrayLength(packageInfo); @@ -109,18 +109,19 @@ static jint verify(JNIEnv* env, jobjectArray packageInfo, android::vintf::CheckF } } std::string error; - int32_t status = VintfObject::CheckCompatibility(cPackageInfo, &error, checks); + int32_t status = VintfObject::CheckCompatibility(cPackageInfo, &error); if (status) LOG(WARNING) << "VintfObject.verify() returns " << status << ": " << error; return status; } -static jint android_os_VintfObject_verify(JNIEnv* env, jclass, jobjectArray packageInfo) { - return verify(env, packageInfo, ::android::vintf::CheckFlags::ENABLE_ALL_CHECKS); -} - static jint android_os_VintfObject_verifyWithoutAvb(JNIEnv* env, jclass) { - return verify(env, nullptr, ::android::vintf::CheckFlags::DISABLE_AVB_CHECK); + std::string error; + int32_t status = VintfObject::CheckCompatibility({}, &error, + ::android::vintf::CheckFlags::DISABLE_AVB_CHECK); + if (status) + LOG(WARNING) << "VintfObject.verifyWithoutAvb() returns " << status << ": " << error; + return status; } static jobjectArray android_os_VintfObject_getHalNamesAndVersions(JNIEnv* env, jclass) { diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto index 94a6734b69c8..f2f7304a2e4a 100644 --- a/core/proto/android/app/settings_enums.proto +++ b/core/proto/android/app/settings_enums.proto @@ -2189,4 +2189,9 @@ enum PageId { // OPEN: Settings > System > Aware > Disable > Dialog DIALOG_AWARE_DISABLE = 1633; + + // OPEN: Settings > Settings > Network & internet > Click Mobile network to land on page with + // details for a SIM/eSIM mobile network > Click edit icon to bring up a rename dialog. + // OS: Q + MOBILE_NETWORK_RENAME_DIALOG = 1642; } diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index e0eaf14d24c8..a160451ecfed 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -230,8 +230,6 @@ message GlobalSettingsProto { } optional Connectivity connectivity = 32; - reserved 145; // Used to be ContentCapture, which moved to DeviceConfig - optional SettingProto contact_metadata_sync_enabled = 33 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto contacts_database_wal_enabled = 34 [ (android.privacy).dest = DEST_AUTOMATIC ]; @@ -999,7 +997,7 @@ message GlobalSettingsProto { optional SettingProto watchdog_poor_network_test_enabled = 22 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto suspend_optimizations_enabled = 23 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto verbose_logging_enabled = 24 [ (android.privacy).dest = DEST_AUTOMATIC ]; - optional SettingProto connected_mac_randomization_enabled = 25 [ (android.privacy).dest = DEST_AUTOMATIC ]; + reserved 25; // connected_mac_randomization_enabled optional SettingProto max_dhcp_retry_count = 26 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto mobile_data_transition_wakelock_timeout_ms = 27 [ (android.privacy).dest = DEST_AUTOMATIC ]; // Controls whether WiFi configurations created by a Device Owner app should @@ -1039,5 +1037,5 @@ message GlobalSettingsProto { // Please insert fields in alphabetical order and group them into messages // if possible (to avoid reaching the method limit). - // Next tag = 149; + // Next tag = 145 then 149; // (145 was removed) } diff --git a/core/res/res/layout/chooser_grid.xml b/core/res/res/layout/chooser_grid.xml index ded2b3569952..c42f43ac0df5 100644 --- a/core/res/res/layout/chooser_grid.xml +++ b/core/res/res/layout/chooser_grid.xml @@ -29,8 +29,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alwaysShow="true" - android:elevation="8dp" - android:paddingStart="16dp" android:background="?attr/colorBackgroundFloating" > <TextView android:id="@+id/profile_button" android:layout_width="wrap_content" @@ -46,25 +44,66 @@ android:layout_alignParentTop="true" android:layout_alignParentRight="true" android:singleLine="true"/> - <ImageView android:id="@+id/title_icon" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_marginEnd="16dp" - android:visibility="gone" - android:scaleType="fitCenter" - android:layout_below="@id/profile_button" - android:layout_alignParentLeft="true"/> + <TextView android:id="@+id/title" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textAppearance="?attr/textAppearanceMedium" - android:textSize="14sp" - android:gravity="start|center_vertical" + android:textSize="20sp" + android:gravity="center" android:paddingEnd="?attr/dialogPreferredPadding" android:paddingTop="12dp" - android:paddingBottom="12dp" + android:paddingBottom="6dp" android:layout_below="@id/profile_button" - android:layout_toRightOf="@id/title_icon"/> + android:layout_centerHorizontal="true"/> + </RelativeLayout> + + <RelativeLayout + android:id="@+id/content_preview" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?attr/colorBackgroundFloating"> + + <view class="com.android.internal.app.ChooserActivity$RoundedRectImageView" + android:id="@+id/content_preview_thumbnail" + android:layout_alignParentTop="true" + android:layout_width="100dp" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:gravity="center" + android:adjustViewBounds="true" + android:maxWidth="90dp" + android:maxHeight="90dp" + android:scaleType="fitCenter" + android:padding="5dp"/> + + <TextView + android:id="@+id/content_preview_title" + android:layout_alignParentTop="true" + android:layout_toEndOf="@id/content_preview_thumbnail" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="start|top" + android:textAppearance="?attr/textAppearanceMedium" + android:maxLines="2" + android:ellipsize="end" + android:paddingStart="15dp" + android:paddingEnd="15dp" + android:paddingTop="10dp" /> + + <TextView + android:id="@+id/content_preview_text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/content_preview_title" + android:layout_toEndOf="@id/content_preview_thumbnail" + android:gravity="start|top" + android:maxLines="2" + android:ellipsize="end" + android:paddingStart="15dp" + android:paddingEnd="15dp" + android:paddingTop="10dp" + android:paddingBottom="5dp"/> </RelativeLayout> <ListView diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 67b06525a7e4..eb214bab2a4e 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -712,6 +712,9 @@ <!-- Indicates that connected MAC randomization is supported on this device --> <bool translatable="false" name="config_wifi_connected_mac_randomization_supported">false</bool> + <!-- Indicates that wifi link probing is supported on this device --> + <bool translatable="false" name="config_wifi_link_probing_supported">false</bool> + <!-- Flag indicating whether we should enable the automatic brightness. Software implementation will be used if config_hardware_auto_brightness_available is not set --> <bool name="config_automatic_brightness_available">false</bool> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index c8706838df57..ef3834cccc15 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -714,4 +714,7 @@ <dimen name="harmful_app_message_padding_bottom">24dp</dimen> <!-- Line spacing modifier for the message field of the harmful app dialog --> <item name="harmful_app_message_line_spacing_modifier" type="dimen">1.22</item> + + <!-- chooser corner radius --> + <dimen name="chooser_corner_radius">4dp</dimen> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index a761baf95b0d..6adb4a711857 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3082,7 +3082,7 @@ <!-- Label for a link to a intent resolver dialog when selecting an editor application --> <string name="whichEditApplicationLabel">Edit</string> <!-- Title of intent resolver dialog when selecting a sharing application to run. --> - <string name="whichSendApplication">Share with</string> + <string name="whichSendApplication">Share</string> <!-- Title of intent resolver dialog when selecting a sharing application to run and a previously used application is known. --> <string name="whichSendApplicationNamed">Share with %1$s</string> diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml index 79afe697c504..0dc54e091f9d 100644 --- a/core/res/res/values/styles_device_defaults.xml +++ b/core/res/res/values/styles_device_defaults.xml @@ -374,7 +374,9 @@ easier. <style name="TextAppearance.DeviceDefault.Caption" parent="TextAppearance.Material.Caption"> <item name="fontFamily">@string/config_bodyFontFamily</item> </style> - <style name="TextAppearance.DeviceDefault.ListItem" parent="TextAppearance.DeviceDefault.Subhead"/> + <style name="TextAppearance.DeviceDefault.ListItem" parent="TextAppearance.DeviceDefault.Subhead"> + <item name="fontFamily">@string/config_headlineFontFamily</item> + </style> <style name="TextAppearance.DeviceDefault.ListItemSecondary" parent="TextAppearance.DeviceDefault.Body1"/> <!-- Preference Styles --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index ca8e226a9911..5400d94ed033 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -50,6 +50,10 @@ <java-symbol type="id" name="characterPicker" /> <java-symbol type="id" name="clearDefaultHint" /> <java-symbol type="id" name="contentPanel" /> + <java-symbol type="id" name="content_preview" /> + <java-symbol type="id" name="content_preview_thumbnail" /> + <java-symbol type="id" name="content_preview_text" /> + <java-symbol type="id" name="content_preview_title" /> <java-symbol type="id" name="current_scene" /> <java-symbol type="id" name="scene_layoutid_cache" /> <java-symbol type="id" name="customPanel" /> @@ -1906,6 +1910,7 @@ <java-symbol type="bool" name="config_wifi_convert_apband_5ghz_to_any" /> <java-symbol type="bool" name="config_wifi_local_only_hotspot_5ghz" /> <java-symbol type="bool" name="config_wifi_connected_mac_randomization_supported" /> + <java-symbol type="bool" name="config_wifi_link_probing_supported" /> <java-symbol type="bool" name="config_wifi_fast_bss_transition_enabled" /> <java-symbol type="bool" name="config_wimaxEnabled" /> <java-symbol type="bool" name="show_ongoing_ime_switcher" /> @@ -2703,9 +2708,9 @@ <java-symbol type="layout" name="date_picker_month_item_material" /> <java-symbol type="id" name="month_view" /> <java-symbol type="integer" name="config_zen_repeat_callers_threshold" /> + <java-symbol type="dimen" name="chooser_corner_radius" /> <java-symbol type="layout" name="chooser_grid" /> <java-symbol type="layout" name="resolve_grid_item" /> - <java-symbol type="id" name="title_icon" /> <java-symbol type="id" name="day_picker_view_pager" /> <java-symbol type="layout" name="day_picker_content_material" /> <java-symbol type="drawable" name="scroll_indicator_material" /> diff --git a/core/tests/coretests/Android.mk b/core/tests/coretests/Android.mk index 9d04e6392fd0..6a8105088b88 100644 --- a/core/tests/coretests/Android.mk +++ b/core/tests/coretests/Android.mk @@ -37,7 +37,9 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ mockwebserver \ guava \ androidx.test.runner \ + androidx.test.ext.junit \ androidx.test.rules \ + androidx.test.espresso.core \ mockito-target-minus-junit4 \ espresso-core \ ub-uiautomator \ diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml index 86818c611c1f..268bb81e8736 100644 --- a/core/tests/coretests/AndroidManifest.xml +++ b/core/tests/coretests/AndroidManifest.xml @@ -62,6 +62,7 @@ <uses-permission android:name="android.permission.READ_LOGS"/> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_SMS"/> + <uses-permission android:name="android.permission.START_ACTIVITIES_FROM_BACKGROUND"/> <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> @@ -1144,6 +1145,14 @@ </intent-filter> </activity> + <activity android:name="android.view.accessibility.AccessibilityTestActivity" + android:label="AccessibilityTestActivity" > + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" /> + </intent-filter> + </activity> + <!-- Activity-level metadata --> <meta-data android:name="com.android.frameworks.coretests.isApp" android:value="true" /> <meta-data android:name="com.android.frameworks.coretests.string" android:value="foo" /> diff --git a/core/tests/coretests/res/layout/accessibility_test.xml b/core/tests/coretests/res/layout/accessibility_test.xml new file mode 100644 index 000000000000..1bdd21b2acc8 --- /dev/null +++ b/core/tests/coretests/res/layout/accessibility_test.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2018 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <Button android:id="@+id/appNameBtn" + android:text="@string/app_name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginRight="60dp" + android:bufferType="normal"> + </Button> +</LinearLayout> diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 0b5bde767ac9..f38abd7cc570 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -509,7 +509,6 @@ public class SettingsBackupTest { Settings.Global.WIFI_ALWAYS_REQUESTED, Settings.Global.WIFI_BADGING_THRESHOLDS, Settings.Global.WIFI_BOUNCE_DELAY_OVERRIDE_MS, - Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, Settings.Global.WIFI_COUNTRY_CODE, Settings.Global.WIFI_DATA_STALL_MIN_TX_BAD, Settings.Global.WIFI_DATA_STALL_MIN_TX_SUCCESS_WITHOUT_RX, @@ -526,6 +525,7 @@ public class SettingsBackupTest { Settings.Global.WIFI_LINK_SPEED_METRICS_ENABLED, Settings.Global.WIFI_PNO_FREQUENCY_CULLING_ENABLED, Settings.Global.WIFI_PNO_RECENCY_SORTING_ENABLED, + Settings.Global.WIFI_LINK_PROBING_ENABLED, Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT, Settings.Global.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS, Settings.Global.WIFI_NETWORK_SHOW_RSSI, diff --git a/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java b/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java new file mode 100644 index 000000000000..d0719cbea86e --- /dev/null +++ b/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java @@ -0,0 +1,220 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view; + +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + +import android.accessibilityservice.AccessibilityServiceInfo; +import android.app.Activity; +import android.app.Instrumentation; +import android.app.Service; +import android.app.UiAutomation; +import android.graphics.Rect; +import android.os.SystemClock; +import android.support.test.InstrumentationRegistry; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; +import android.text.TextUtils; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityTestActivity; +import android.view.accessibility.AccessibilityWindowInfo; + +import com.android.compatibility.common.util.TestUtils; +import com.android.frameworks.coretests.R; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.List; +import java.util.concurrent.TimeoutException; + +@RunWith(AndroidJUnit4.class) +public class AccessibilityInteractionControllerTest { + static final long TIMEOUT_DEFAULT = 10000; // 10 seconds + + private static Instrumentation sInstrumentation; + private static UiAutomation sUiAutomation; + + @Rule + public ActivityTestRule<AccessibilityTestActivity> mActivityRule = new ActivityTestRule<>( + AccessibilityTestActivity.class, false, false); + + private AccessibilityInteractionController mAccessibilityInteractionController; + private ViewRootImpl mViewRootImpl; + private View mButton; + + @BeforeClass + public static void oneTimeSetup() { + sInstrumentation = InstrumentationRegistry.getInstrumentation(); + sUiAutomation = sInstrumentation.getUiAutomation(); + } + + @AfterClass + public static void postTestTearDown() { + sUiAutomation.destroy(); + } + + @Before + public void setUp() throws Throwable { + launchActivity(); + enableTouchExploration(true); + mActivityRule.runOnUiThread(() -> { + mViewRootImpl = mActivityRule.getActivity().getWindow().getDecorView() + .getViewRootImpl(); + mButton = mActivityRule.getActivity().findViewById(R.id.appNameBtn); + }); + mAccessibilityInteractionController = + mViewRootImpl.getAccessibilityInteractionController(); + } + + @After + public void tearDown() { + enableTouchExploration(false); + } + + @Test + public void clearAccessibilityFocus_shouldClearFocus() throws Exception { + performAccessibilityFocus("com.android.frameworks.coretests:id/appNameBtn"); + assertTrue("Button should have a11y focus", + mButton.isAccessibilityFocused()); + mAccessibilityInteractionController.clearAccessibilityFocusClientThread(); + sInstrumentation.waitForIdleSync(); + assertFalse("Button should not have a11y focus", + mButton.isAccessibilityFocused()); + } + + @Test + public void clearAccessibilityFocus_uiThread_shouldClearFocus() throws Exception { + performAccessibilityFocus("com.android.frameworks.coretests:id/appNameBtn"); + assertTrue("Button should have a11y focus", + mButton.isAccessibilityFocused()); + sInstrumentation.runOnMainSync(() -> { + mAccessibilityInteractionController.clearAccessibilityFocusClientThread(); + }); + assertFalse("Button should not have a11y focus", + mButton.isAccessibilityFocused()); + } + + private void launchActivity() { + final Object waitObject = new Object(); + final int[] location = new int[2]; + final StringBuilder activityPackage = new StringBuilder(); + final Rect bounds = new Rect(); + final StringBuilder activityTitle = new StringBuilder(); + try { + final long executionStartTimeMillis = SystemClock.uptimeMillis(); + sUiAutomation.setOnAccessibilityEventListener((event) -> { + if (event.getEventTime() < executionStartTimeMillis) { + return; + } + synchronized (waitObject) { + waitObject.notifyAll(); + } + }); + enableRetrieveAccessibilityWindows(); + + final Activity activity = mActivityRule.launchActivity(null); + sInstrumentation.runOnMainSync(() -> { + activity.getWindow().getDecorView().getLocationOnScreen(location); + activityPackage.append(activity.getPackageName()); + activityTitle.append(activity.getTitle()); + }); + sInstrumentation.waitForIdleSync(); + + TestUtils.waitOn(waitObject, () -> { + final AccessibilityWindowInfo window = findWindowByTitle(activityTitle); + if (window == null) return false; + window.getBoundsInScreen(bounds); + activity.getWindow().getDecorView().getLocationOnScreen(location); + if (bounds.isEmpty()) { + return false; + } + return (!bounds.isEmpty()) + && (bounds.left == location[0]) && (bounds.top == location[1]); + }, TIMEOUT_DEFAULT, "Launch Activity"); + } finally { + sUiAutomation.setOnAccessibilityEventListener(null); + } + } + + private void enableRetrieveAccessibilityWindows() { + AccessibilityServiceInfo info = sUiAutomation.getServiceInfo(); + info.flags |= AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS; + sUiAutomation.setServiceInfo(info); + } + + private void enableTouchExploration(boolean enabled) { + final Object waitObject = new Object(); + final AccessibilityManager accessibilityManager = + (AccessibilityManager) sInstrumentation.getContext().getSystemService( + Service.ACCESSIBILITY_SERVICE); + final AccessibilityManager.TouchExplorationStateChangeListener listener = status -> { + synchronized (waitObject) { + waitObject.notifyAll(); + } + }; + try { + accessibilityManager.addTouchExplorationStateChangeListener(listener); + final AccessibilityServiceInfo info = sUiAutomation.getServiceInfo(); + if (enabled) { + info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE; + } else { + info.flags &= ~AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE; + } + sUiAutomation.setServiceInfo(info); + TestUtils.waitOn(waitObject, + () -> accessibilityManager.isTouchExplorationEnabled() == enabled, + TIMEOUT_DEFAULT, + (enabled ? "Enable" : "Disable") + "touch exploration"); + } finally { + accessibilityManager.removeTouchExplorationStateChangeListener(listener); + } + } + + private void performAccessibilityFocus(String viewId) throws TimeoutException { + final AccessibilityNodeInfo node = sUiAutomation.getRootInActiveWindow() + .findAccessibilityNodeInfosByViewId(viewId).get(0); + // Perform an action and wait for an event + sUiAutomation.executeAndWaitForEvent( + () -> node.performAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS), + event -> event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED, + TIMEOUT_DEFAULT); + node.refresh(); + } + + private AccessibilityWindowInfo findWindowByTitle(CharSequence title) { + final List<AccessibilityWindowInfo> windows = sUiAutomation.getWindows(); + AccessibilityWindowInfo returnValue = null; + for (int i = 0; i < windows.size(); i++) { + final AccessibilityWindowInfo window = windows.get(i); + if (TextUtils.equals(title, window.getTitle())) { + returnValue = window; + } else { + window.recycle(); + } + } + return returnValue; + } +} diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityTestActivity.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityTestActivity.java new file mode 100644 index 000000000000..a17fa7326a5d --- /dev/null +++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityTestActivity.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view.accessibility; + +import android.app.Activity; +import android.app.KeyguardManager; +import android.content.Context; +import android.os.Bundle; + +import com.android.frameworks.coretests.R; + +/** + * An activity for accessibility test. + */ +public class AccessibilityTestActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + turnOnScreen(); + super.onCreate(savedInstanceState); + setContentView(R.layout.accessibility_test); + } + + private void turnOnScreen() { + setTurnScreenOn(true); + setShowWhenLocked(true); + KeyguardManager keyguardManager = (KeyguardManager) getSystemService( + Context.KEYGUARD_SERVICE); + keyguardManager.requestDismissKeyguard(this, null); + } +} diff --git a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java index bfa6e062b08d..71612e685920 100644 --- a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java +++ b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureSessionTest.java @@ -78,7 +78,7 @@ public class ContentCaptureSessionTest { assertThrows(NullPointerException.class, () -> mSession1.notifyViewAppeared(null)); assertThrows(NullPointerException.class, () -> mSession1.notifyViewDisappeared(null)); assertThrows(NullPointerException.class, - () -> mSession1.notifyViewTextChanged(null, "whatever", 0)); + () -> mSession1.notifyViewTextChanged(null, "whatever")); } @Test diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java index 5e58f82038f1..582be9d51731 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextClassifierTest.java @@ -21,8 +21,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; +import android.app.RemoteAction; import android.content.Context; import android.content.Intent; +import android.os.Bundle; import android.os.LocaleList; import android.text.Spannable; import android.text.SpannableString; @@ -246,25 +248,31 @@ public class TextClassifierTest { public void testClassifyText_foreignText() { LocaleList originalLocales = LocaleList.getDefault(); LocaleList.setDefault(LocaleList.forLanguageTags("en")); - String foreignText = "これは日本語のテキストです"; + String japaneseText = "これは日本語のテキストです"; Context context = new FakeContextBuilder() .setIntentComponent(Intent.ACTION_TRANSLATE, FakeContextBuilder.DEFAULT_COMPONENT) .build(); TextClassifier classifier = new TextClassifierImpl(context, TC_CONSTANTS); TextClassification.Request request = new TextClassification.Request.Builder( - foreignText, 0, foreignText.length()) + japaneseText, 0, japaneseText.length()) .setDefaultLocales(LOCALES) .build(); TextClassification classification = classifier.classifyText(request); + RemoteAction translateAction = classification.getActions().get(0); assertEquals(1, classification.getActions().size()); assertEquals( context.getString(com.android.internal.R.string.translate), - classification.getActions().get(0).getTitle()); - Intent intent = (Intent) classification.getExtras() - .getParcelableArrayList(TextClassifierImpl.ACTIONS_INTENTS).get(0); + translateAction.getTitle()); + + assertEquals(translateAction, ExtrasUtils.findTranslateAction(classification)); + Intent intent = ExtrasUtils.getActionsIntents(classification).get(0); assertEquals(Intent.ACTION_TRANSLATE, intent.getAction()); + Bundle foreignLanguageInfo = ExtrasUtils.getForeignLanguageExtra(classification); + assertEquals("ja", ExtrasUtils.getEntityType(foreignLanguageInfo)); + assertTrue(ExtrasUtils.getScore(foreignLanguageInfo) >= 0); + assertTrue(ExtrasUtils.getScore(foreignLanguageInfo) <= 1); LocaleList.setDefault(originalLocales); } diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java index aaa624e6b25e..21fcae780b80 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java @@ -16,12 +16,12 @@ package com.android.internal.app; -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withText; import static com.android.internal.app.ChooserWrapperActivity.sOverrides; @@ -33,12 +33,18 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.usage.UsageStatsManager; +import android.content.ClipData; import android.content.Intent; import android.content.pm.ResolveInfo; - -import androidx.test.InstrumentationRegistry; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.net.Uri; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.rule.ActivityTestRule; -import androidx.test.runner.AndroidJUnit4; import com.android.internal.R; import com.android.internal.app.ResolverActivity.ResolvedComponentInfo; @@ -69,20 +75,34 @@ public class ChooserActivityTest { @Test public void customTitle() throws InterruptedException { - Intent sendIntent = createSendImageIntent(); + Intent viewIntent = createViewTextIntent(); List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.isA(List.class))).thenReturn(resolvedComponentInfos); - mActivityRule.launchActivity(Intent.createChooser(sendIntent, "chooser test")); + mActivityRule.launchActivity(Intent.createChooser(viewIntent, "chooser test")); + waitForIdle(); onView(withId(R.id.title)).check(matches(withText("chooser test"))); } @Test + public void customTitleIgnoredForSendIntents() throws InterruptedException { + Intent sendIntent = createSendTextIntent(); + List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); + + when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), + Mockito.anyBoolean(), + Mockito.isA(List.class))).thenReturn(resolvedComponentInfos); + mActivityRule.launchActivity(Intent.createChooser(sendIntent, "chooser test")); + waitForIdle(); + onView(withId(R.id.title)).check(matches(withText(R.string.whichSendApplication))); + } + + @Test public void emptyTitle() throws InterruptedException { - Intent sendIntent = createSendImageIntent(); + Intent sendIntent = createSendTextIntent(); List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), @@ -95,8 +115,72 @@ public class ChooserActivityTest { } @Test + public void emptyPreviewTitleAndThumbnail() throws InterruptedException { + Intent sendIntent = createSendTextIntentWithPreview(null, null); + List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); + + when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), + Mockito.anyBoolean(), + Mockito.isA(List.class))).thenReturn(resolvedComponentInfos); + mActivityRule.launchActivity(Intent.createChooser(sendIntent, null)); + waitForIdle(); + onView(withId(R.id.content_preview_title)).check(matches(not(isDisplayed()))); + onView(withId(R.id.content_preview_thumbnail)).check(matches(not(isDisplayed()))); + } + + @Test + public void visiblePreviewTitleWithoutThumbnail() throws InterruptedException { + String previewTitle = "My Content Preview Title"; + Intent sendIntent = createSendTextIntentWithPreview(previewTitle, null); + List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); + + when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), + Mockito.anyBoolean(), + Mockito.isA(List.class))).thenReturn(resolvedComponentInfos); + mActivityRule.launchActivity(Intent.createChooser(sendIntent, null)); + waitForIdle(); + onView(withId(R.id.content_preview_title)).check(matches(isDisplayed())); + onView(withId(R.id.content_preview_title)).check(matches(withText(previewTitle))); + onView(withId(R.id.content_preview_thumbnail)).check(matches(not(isDisplayed()))); + } + + @Test + public void visiblePreviewTitleWithInvalidThumbnail() throws InterruptedException { + String previewTitle = "My Content Preview Title"; + Intent sendIntent = createSendTextIntentWithPreview(previewTitle, + Uri.parse("tel:(+49)12345789")); + List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); + + when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), + Mockito.anyBoolean(), + Mockito.isA(List.class))).thenReturn(resolvedComponentInfos); + mActivityRule.launchActivity(Intent.createChooser(sendIntent, null)); + waitForIdle(); + onView(withId(R.id.content_preview_title)).check(matches(isDisplayed())); + onView(withId(R.id.content_preview_thumbnail)).check(matches(not(isDisplayed()))); + } + + @Test + public void visiblePreviewTitleAndThumbnail() throws InterruptedException { + String previewTitle = "My Content Preview Title"; + Intent sendIntent = createSendTextIntentWithPreview(previewTitle, + Uri.parse("android.resource://com.android.frameworks.coretests/" + + com.android.frameworks.coretests.R.drawable.test320x240)); + sOverrides.previewThumbnail = createBitmap(); + List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); + + when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), + Mockito.anyBoolean(), + Mockito.isA(List.class))).thenReturn(resolvedComponentInfos); + mActivityRule.launchActivity(Intent.createChooser(sendIntent, null)); + waitForIdle(); + onView(withId(R.id.content_preview_title)).check(matches(isDisplayed())); + onView(withId(R.id.content_preview_thumbnail)).check(matches(isDisplayed())); + } + + @Test public void twoOptionsAndUserSelectsOne() throws InterruptedException { - Intent sendIntent = createSendImageIntent(); + Intent sendIntent = createSendTextIntent(); List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), @@ -125,7 +209,7 @@ public class ChooserActivityTest { @Test public void updateChooserCountsAndModelAfterUserSelection() throws InterruptedException { - Intent sendIntent = createSendImageIntent(); + Intent sendIntent = createSendTextIntent(); List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTest(2); when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), @@ -158,7 +242,7 @@ public class ChooserActivityTest { when(sOverrides.resolverListController.getResolversForIntent(Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.isA(List.class))).thenReturn(null); - Intent sendIntent = createSendImageIntent(); + Intent sendIntent = createSendTextIntent(); final ChooserWrapperActivity activity = mActivityRule .launchActivity(Intent.createChooser(sendIntent, null)); waitForIdle(); @@ -186,7 +270,7 @@ public class ChooserActivityTest { Mockito.anyBoolean(), Mockito.isA(List.class))).thenReturn(resolvedComponentInfos); - Intent sendIntent = createSendImageIntent(); + Intent sendIntent = createSendTextIntent(); final ChooserWrapperActivity activity = mActivityRule .launchActivity(Intent.createChooser(sendIntent, null)); waitForIdle(); @@ -197,7 +281,7 @@ public class ChooserActivityTest { @Test public void hasOtherProfileOneOption() throws Exception { - Intent sendIntent = createSendImageIntent(); + Intent sendIntent = createSendTextIntent(); List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTestWithOtherProfile(2); ResolveInfo toChoose = resolvedComponentInfos.get(1).getResolveInfoAt(0); @@ -234,7 +318,7 @@ public class ChooserActivityTest { @Test public void hasOtherProfileTwoOptionsAndUserSelectsOne() throws Exception { - Intent sendIntent = createSendImageIntent(); + Intent sendIntent = createSendTextIntent(); List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTestWithOtherProfile(3); ResolveInfo toChoose = resolvedComponentInfos.get(1).getResolveInfoAt(0); @@ -273,7 +357,7 @@ public class ChooserActivityTest { @Test public void hasLastChosenActivityAndOtherProfile() throws Exception { - Intent sendIntent = createSendImageIntent(); + Intent sendIntent = createSendTextIntent(); List<ResolvedComponentInfo> resolvedComponentInfos = createResolvedComponentsForTestWithOtherProfile(3); ResolveInfo toChoose = resolvedComponentInfos.get(1).getResolveInfoAt(0); @@ -308,14 +392,33 @@ public class ChooserActivityTest { assertThat(chosen[0], is(toChoose)); } - private Intent createSendImageIntent() { + private Intent createSendTextIntent() { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "testing intent sending"); - sendIntent.setType("image/jpeg"); return sendIntent; } + private Intent createSendTextIntentWithPreview(String title, Uri imageThumbnail) { + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, "testing intent sending"); + sendIntent.putExtra(Intent.EXTRA_TITLE, title); + if (imageThumbnail != null) { + ClipData.Item clipItem = new ClipData.Item(imageThumbnail); + sendIntent.setClipData(new ClipData("Clip Label", new String[]{"image/png"}, clipItem)); + } + + return sendIntent; + } + + private Intent createViewTextIntent() { + Intent viewIntent = new Intent(); + viewIntent.setAction(Intent.ACTION_VIEW); + viewIntent.putExtra(Intent.EXTRA_TEXT, "testing intent viewing"); + return viewIntent; + } + private List<ResolvedComponentInfo> createResolvedComponentsForTest(int numberOfResults) { List<ResolvedComponentInfo> infoList = new ArrayList<>(numberOfResults); for (int i = 0; i < numberOfResults; i++) { @@ -340,4 +443,24 @@ public class ChooserActivityTest { private void waitForIdle() { InstrumentationRegistry.getInstrumentation().waitForIdleSync(); } -}
\ No newline at end of file + + private Bitmap createBitmap() { + int width = 200; + int height = 200; + Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + + Paint paint = new Paint(); + paint.setColor(Color.RED); + paint.setStyle(Paint.Style.FILL); + canvas.drawPaint(paint); + + paint.setColor(Color.WHITE); + paint.setAntiAlias(true); + paint.setTextSize(14.f); + paint.setTextAlign(Paint.Align.CENTER); + canvas.drawText("Hi!", (width / 2.f), (height / 2.f), paint); + + return bitmap; + } +} diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java index 60529f6d4071..637d2eafc7af 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserWrapperActivity.java @@ -21,6 +21,9 @@ import static org.mockito.Mockito.mock; import android.app.usage.UsageStatsManager; import android.content.Context; import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.net.Uri; +import android.util.Size; import java.util.function.Function; @@ -74,6 +77,14 @@ public class ChooserWrapperActivity extends ChooserActivity { return super.getPackageManager(); } + @Override + protected Bitmap loadThumbnail(Uri uri, Size size) { + if (sOverrides.previewThumbnail != null) { + return sOverrides.previewThumbnail; + } + return super.loadThumbnail(uri, size); + } + /** * We cannot directly mock the activity created since instrumentation creates it. * <p> @@ -85,11 +96,13 @@ public class ChooserWrapperActivity extends ChooserActivity { public Function<TargetInfo, Boolean> onSafelyStartCallback; public ResolverListController resolverListController; public Boolean isVoiceInteraction; + public Bitmap previewThumbnail; public void reset() { onSafelyStartCallback = null; isVoiceInteraction = null; createPackageManager = null; + previewThumbnail = null; resolverListController = mock(ResolverListController.class); } } diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index a47ab875804f..bcac5fd63930 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -329,6 +329,7 @@ applications that come with the platform <permission name="android.permission.USE_RESERVED_DISK"/> <permission name="android.permission.WRITE_MEDIA_STORAGE"/> <permission name="android.permission.WRITE_SECURE_SETTINGS"/> + <permission name="android.permission.STATUS_BAR_SERVICE"/> <permission name="android.permission.REQUEST_INCIDENT_REPORT_APPROVAL"/> </privapp-permissions> diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java index 65aaba17a55d..aaf40b41bc31 100644 --- a/graphics/java/android/graphics/BaseCanvas.java +++ b/graphics/java/android/graphics/BaseCanvas.java @@ -17,6 +17,7 @@ package android.graphics; import android.annotation.ColorInt; +import android.annotation.ColorLong; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Size; @@ -258,6 +259,16 @@ public abstract class BaseCanvas { nDrawColor(mNativeCanvasWrapper, color, mode.getXfermode().porterDuffMode); } + /** + * Make lint happy. + * See {@link Canvas#drawColor(long, BlendMode)} + */ + public void drawColor(@ColorLong long color, @NonNull BlendMode mode) { + ColorSpace cs = Color.colorSpace(color); + nDrawColor(mNativeCanvasWrapper, cs.getNativeInstance(), color, + mode.getXfermode().porterDuffMode); + } + public void drawLine(float startX, float startY, float stopX, float stopY, @NonNull Paint paint) { throwIfHasHwBitmapInSwMode(paint); @@ -669,6 +680,9 @@ public abstract class BaseCanvas { private static native void nDrawColor(long nativeCanvas, int color, int mode); + private static native void nDrawColor(long nativeCanvas, long nativeColorSpace, + @ColorLong long color, int mode); + private static native void nDrawPaint(long nativeCanvas, long nativePaint); private static native void nDrawPoint(long canvasHandle, float x, float y, long paintHandle); diff --git a/graphics/java/android/graphics/BaseRecordingCanvas.java b/graphics/java/android/graphics/BaseRecordingCanvas.java index 4f6093500cad..3e117411db01 100644 --- a/graphics/java/android/graphics/BaseRecordingCanvas.java +++ b/graphics/java/android/graphics/BaseRecordingCanvas.java @@ -17,6 +17,7 @@ package android.graphics; import android.annotation.ColorInt; +import android.annotation.ColorLong; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Size; @@ -217,6 +218,13 @@ public class BaseRecordingCanvas extends Canvas { } @Override + public final void drawColor(@ColorLong long color, @NonNull BlendMode mode) { + ColorSpace cs = Color.colorSpace(color); + nDrawColor(mNativeCanvasWrapper, cs.getNativeInstance(), color, + mode.getXfermode().porterDuffMode); + } + + @Override public final void drawLine(float startX, float startY, float stopX, float stopY, @NonNull Paint paint) { nDrawLine(mNativeCanvasWrapper, startX, startY, stopX, stopY, paint.getNativeInstance()); @@ -590,6 +598,10 @@ public class BaseRecordingCanvas extends Canvas { private static native void nDrawColor(long nativeCanvas, int color, int mode); @FastNative + private static native void nDrawColor(long nativeCanvas, long nativeColorSpace, + @ColorLong long color, int mode); + + @FastNative private static native void nDrawPaint(long nativeCanvas, long nativePaint); @FastNative diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index f0e236168858..f9e7dd177342 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -21,7 +21,6 @@ import android.annotation.ColorInt; import android.annotation.ColorLong; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.annotation.WorkerThread; import android.content.res.ResourcesImpl; @@ -31,6 +30,7 @@ import android.os.Parcelable; import android.os.StrictMode; import android.os.Trace; import android.util.DisplayMetrics; +import android.util.Half; import android.util.Log; import android.view.ThreadedRenderer; @@ -1761,9 +1761,7 @@ public final class Bitmap implements Parcelable { * previously assigned color space. * * @param colorSpace to assign to the bitmap - * @hide */ - @TestApi public void setColorSpace(@NonNull ColorSpace colorSpace) { checkRecycled("setColorSpace called on a recycled bitmap"); if (colorSpace == null) { @@ -1814,9 +1812,7 @@ public final class Bitmap implements Parcelable { * @throws IllegalArgumentException if the color space encoded in the long * is invalid or unknown. * - * @hide pending API approval */ - @TestApi public void eraseColor(@ColorLong long c) { checkRecycled("Can't erase a recycled bitmap"); if (!isMutable()) { @@ -1848,6 +1844,45 @@ public final class Bitmap implements Parcelable { return nativeGetPixel(mNativePtr, x, y); } + private static float clamp(float value, @NonNull ColorSpace cs, int index) { + return Math.max(Math.min(value, cs.getMaxValue(index)), cs.getMinValue(index)); + } + + /** + * Returns the {@link Color} at the specified location. Throws an exception + * if x or y are out of bounds (negative or >= to the width or height + * respectively). + * + * @param x The x coordinate (0...width-1) of the pixel to return + * @param y The y coordinate (0...height-1) of the pixel to return + * @return The {@link Color} at the specified coordinate + * @throws IllegalArgumentException if x, y exceed the bitmap's bounds + * @throws IllegalStateException if the bitmap's config is {@link Config#HARDWARE} + * + */ + public Color getColor(int x, int y) { + checkRecycled("Can't call getColor() on a recycled bitmap"); + checkHardware("unable to getColor(), " + + "pixel access is not supported on Config#HARDWARE bitmaps"); + checkPixelAccess(x, y); + + final ColorSpace cs = getColorSpace(); + if (cs.equals(ColorSpace.get(ColorSpace.Named.SRGB))) { + return Color.valueOf(nativeGetPixel(mNativePtr, x, y)); + } + // The returned value is in kRGBA_F16_SkColorType, which is packed as + // four half-floats, r,g,b,a. + long rgba = nativeGetColor(mNativePtr, x, y); + float r = Half.toFloat((short) ((rgba >> 0) & 0xffff)); + float g = Half.toFloat((short) ((rgba >> 16) & 0xffff)); + float b = Half.toFloat((short) ((rgba >> 32) & 0xffff)); + float a = Half.toFloat((short) ((rgba >> 48) & 0xffff)); + + // Skia may draw outside of the numerical range of the colorSpace. + // Clamp to get an expected value. + return Color.valueOf(clamp(r, cs, 0), clamp(g, cs, 1), clamp(b, cs, 2), a, cs); + } + /** * Returns in pixels[] a copy of the data in the bitmap. Each value is * a packed int representing a {@link Color}. The stride parameter allows @@ -2176,6 +2211,7 @@ public final class Bitmap implements Parcelable { private static native boolean nativeIsConfigF16(long nativeBitmap); private static native int nativeGetPixel(long nativeBitmap, int x, int y); + private static native long nativeGetColor(long nativeBitmap, int x, int y); private static native void nativeGetPixels(long nativeBitmap, int[] pixels, int offset, int stride, int x, int y, int width, int height); diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 8c1bae2a0527..034dff09946d 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -17,6 +17,7 @@ package android.graphics; import android.annotation.ColorInt; +import android.annotation.ColorLong; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -1682,6 +1683,18 @@ public class Canvas extends BaseCanvas { } /** + * Fill the entire canvas' bitmap (restricted to the current clip) with the specified color, + * using srcover porterduff mode. + * + * @param color the color to draw onto the canvas + * @throws IllegalArgumentException if the color space encoded in the long + * is invalid or unknown. + */ + public void drawColor(@ColorLong long color) { + super.drawColor(color, BlendMode.SRC_OVER); + } + + /** * Fill the entire canvas' bitmap (restricted to the current clip) with the specified color and * porter-duff xfermode. * @@ -1707,6 +1720,19 @@ public class Canvas extends BaseCanvas { } /** + * Fill the entire canvas' bitmap (restricted to the current clip) with the specified color and + * blendmode. + * + * @param color the color to draw with + * @param mode the blendmode to apply to the color + * @throws IllegalArgumentException if the color space encoded in the long + * is invalid or unknown. + */ + public void drawColor(@ColorLong long color, @NonNull BlendMode mode) { + super.drawColor(color, mode); + } + + /** * Draw a line segment with the specified start and stop x,y coordinates, using the specified * paint. * <p> diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index 7eee6f4bf37d..73442db1c143 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -24,7 +24,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Px; import android.annotation.Size; -import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.graphics.fonts.FontVariationAxis; import android.os.Build; @@ -974,10 +973,7 @@ public class Paint { * @see Color for APIs that help manipulate a color long. * * @return the paint's color (and alpha). - * - * @hide pending API approval */ - @TestApi @ColorLong public long getColorLong() { return mColor; @@ -1006,10 +1002,7 @@ public class Paint { * to set in the paint. * @throws IllegalArgumentException if the color space encoded in the long * is invalid or unknown. - * - * @hide pending API approval */ - @TestApi public void setColor(@ColorLong long color) { ColorSpace cs = Color.colorSpace(color); float r = Color.red(color); @@ -1445,10 +1438,7 @@ public class Paint { * * @throws IllegalArgumentException if the color space encoded in the long * is invalid or unknown. - * - * @hide pending API approval */ - @TestApi public void setShadowLayer(float radius, float dx, float dy, @ColorLong long shadowColor) { ColorSpace cs = Color.colorSpace(shadowColor); float r = Color.red(shadowColor); @@ -1517,9 +1507,7 @@ public class Paint { * Returns the color of the shadow layer. * @see #setShadowLayer(float,float,float,int) * @see #setShadowLayer(float,float,float,long) - * @hide pending API approval */ - @TestApi public @ColorLong long getShadowLayerColorLong() { return mShadowLayerColor; } diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp index 6dc9d34cc3fd..85947665839a 100644 --- a/libs/hwui/RecordingCanvas.cpp +++ b/libs/hwui/RecordingCanvas.cpp @@ -759,6 +759,8 @@ RecordingCanvas::RecordingCanvas() : INHERITED(1, 1), fDL(nullptr) {} void RecordingCanvas::reset(DisplayListData* dl, const SkIRect& bounds) { this->resetCanvas(bounds.right(), bounds.bottom()); fDL = dl; + mClipMayBeComplex = false; + mSaveCount = mComplexSaveCount = 0; } sk_sp<SkSurface> RecordingCanvas::onNewSurface(const SkImageInfo&, const SkSurfaceProps&) { @@ -770,6 +772,7 @@ void RecordingCanvas::onFlush() { } void RecordingCanvas::willSave() { + mSaveCount++; fDL->save(); } SkCanvas::SaveLayerStrategy RecordingCanvas::getSaveLayerStrategy(const SaveLayerRec& rec) { @@ -778,6 +781,11 @@ SkCanvas::SaveLayerStrategy RecordingCanvas::getSaveLayerStrategy(const SaveLaye return SkCanvas::kNoLayer_SaveLayerStrategy; } void RecordingCanvas::willRestore() { + mSaveCount--; + if (mSaveCount < mComplexSaveCount) { + mClipMayBeComplex = false; + mComplexSaveCount = 0; + } fDL->restore(); } @@ -798,17 +806,27 @@ void RecordingCanvas::didTranslate(SkScalar dx, SkScalar dy) { void RecordingCanvas::onClipRect(const SkRect& rect, SkClipOp op, ClipEdgeStyle style) { fDL->clipRect(rect, op, style == kSoft_ClipEdgeStyle); + if (!getTotalMatrix().isScaleTranslate()) { + setClipMayBeComplex(); + } this->INHERITED::onClipRect(rect, op, style); } void RecordingCanvas::onClipRRect(const SkRRect& rrect, SkClipOp op, ClipEdgeStyle style) { + if (rrect.getType() > SkRRect::kRect_Type || !getTotalMatrix().isScaleTranslate()) { + setClipMayBeComplex(); + } fDL->clipRRect(rrect, op, style == kSoft_ClipEdgeStyle); this->INHERITED::onClipRRect(rrect, op, style); } void RecordingCanvas::onClipPath(const SkPath& path, SkClipOp op, ClipEdgeStyle style) { + setClipMayBeComplex(); fDL->clipPath(path, op, style == kSoft_ClipEdgeStyle); this->INHERITED::onClipPath(path, op, style); } void RecordingCanvas::onClipRegion(const SkRegion& region, SkClipOp op) { + if (region.isComplex() || !getTotalMatrix().isScaleTranslate()) { + setClipMayBeComplex(); + } fDL->clipRegion(region, op); this->INHERITED::onClipRegion(region, op); } diff --git a/libs/hwui/RecordingCanvas.h b/libs/hwui/RecordingCanvas.h index caaef67f724f..3a76ca1137a5 100644 --- a/libs/hwui/RecordingCanvas.h +++ b/libs/hwui/RecordingCanvas.h @@ -203,10 +203,41 @@ public: void drawVectorDrawable(VectorDrawableRoot* tree); + /** + * If "isClipMayBeComplex" returns false, it is guaranteed the current clip is a rectangle. + * If the return value is true, then clip may or may not be complex (there is no guarantee). + */ + inline bool isClipMayBeComplex() { return mClipMayBeComplex; } + private: typedef SkCanvasVirtualEnforcer<SkNoDrawCanvas> INHERITED; + inline void setClipMayBeComplex() { + if (!mClipMayBeComplex) { + mComplexSaveCount = mSaveCount; + mClipMayBeComplex = true; + } + } + DisplayListData* fDL; + + /** + * mClipMayBeComplex tracks if the current clip is a rectangle. This flag is used to promote + * FunctorDrawable to a layer, if it is clipped by a non-rect. + */ + bool mClipMayBeComplex = false; + + /** + * mSaveCount is the current level of our save tree. + */ + int mSaveCount = 0; + + /** + * mComplexSaveCount is the first save level, which has a complex clip. Every level below + * mComplexSaveCount is assumed to have a complex clip and every level above mComplexSaveCount + * is guaranteed to not be complex. + */ + int mComplexSaveCount = 0; }; } // namespace uirenderer diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h index ddb7e4e4ce74..e6710cc8f950 100644 --- a/libs/hwui/RenderProperties.h +++ b/libs/hwui/RenderProperties.h @@ -151,6 +151,7 @@ public: // parent may have already dictated that a descendant layer is needed bool functorsNeedLayer = ancestorDictatesFunctorsNeedLayer + || CC_UNLIKELY(isClipMayBeComplex()) // Round rect clipping forces layer for functors || CC_UNLIKELY(getOutline().willRoundRectClip()) || @@ -193,6 +194,12 @@ public: bool isProjectionReceiver() const { return mPrimitiveFields.mProjectionReceiver; } + bool setClipMayBeComplex(bool isClipMayBeComplex) { + return RP_SET(mPrimitiveFields.mClipMayBeComplex, isClipMayBeComplex); + } + + bool isClipMayBeComplex() const { return mPrimitiveFields.mClipMayBeComplex; } + bool setStaticMatrix(const SkMatrix* matrix) { delete mStaticMatrix; if (matrix) { @@ -563,6 +570,7 @@ private: bool mProjectBackwards = false; bool mProjectionReceiver = false; bool mAllowForceDark = true; + bool mClipMayBeComplex = false; Rect mClipBounds; Outline mOutline; RevealClip mRevealClip; diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp index 230065c222a9..29d5ef233338 100644 --- a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp +++ b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp @@ -73,7 +73,6 @@ bool SkiaDisplayList::prepareListAndChildren( RenderNode* childNode = child.getRenderNode(); Matrix4 mat4(child.getRecordedMatrix()); info.damageAccumulator->pushTransform(&mat4); - // TODO: a layer is needed if the canvas is rotated or has a non-rect clip info.hasBackwardProjectedNodes = false; childFn(childNode, observer, info, functorsNeedLayer); hasBackwardProjectedNodesSubtree |= info.hasBackwardProjectedNodes; diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp index d54275fe7e19..b67aea224055 100644 --- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp +++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp @@ -113,6 +113,10 @@ void SkiaRecordingCanvas::drawRenderNode(uirenderer::RenderNode* renderNode) { // Record the child node. Drawable dtor will be invoked when mChildNodes deque is cleared. mDisplayList->mChildNodes.emplace_back(renderNode, asSkCanvas(), true, mCurrentBarrier); auto& renderNodeDrawable = mDisplayList->mChildNodes.back(); + if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaVulkan) { + // Put Vulkan WebViews with non-rectangular clips in a HW layer + renderNode->mutateStagingProperties().setClipMayBeComplex(mRecorder.isClipMayBeComplex()); + } drawDrawable(&renderNodeDrawable); // use staging property, since recording on UI thread diff --git a/libs/hwui/private/hwui/DrawVkInfo.h b/libs/hwui/private/hwui/DrawVkInfo.h index abc4dbf9fa1c..fb55f5ca4c93 100644 --- a/libs/hwui/private/hwui/DrawVkInfo.h +++ b/libs/hwui/private/hwui/DrawVkInfo.h @@ -29,7 +29,7 @@ struct VkFunctorInitParams { VkDevice device; VkQueue queue; uint32_t graphics_queue_index; - uint32_t instance_version; + uint32_t api_version; const char* const* enabled_instance_extension_names; uint32_t enabled_instance_extension_names_length; const char* const* enabled_device_extension_names; diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index 1e7520216d66..582d51e6af94 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -83,7 +83,6 @@ void VulkanManager::destroy() { mDevice = VK_NULL_HANDLE; mPhysicalDevice = VK_NULL_HANDLE; mInstance = VK_NULL_HANDLE; - mInstanceVersion = 0u; mInstanceExtensions.clear(); mDeviceExtensions.clear(); free_features_extensions_structs(mPhysicalDeviceFeatures2); @@ -100,7 +99,7 @@ bool VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe 0, // applicationVersion "android framework", // pEngineName 0, // engineVerison - VK_MAKE_VERSION(1, 1, 0), // apiVersion + mAPIVersion, // apiVersion }; { @@ -377,8 +376,9 @@ void VulkanManager::initialize() { } GET_PROC(EnumerateInstanceVersion); - LOG_ALWAYS_FATAL_IF(mEnumerateInstanceVersion(&mInstanceVersion)); - LOG_ALWAYS_FATAL_IF(mInstanceVersion < VK_MAKE_VERSION(1, 1, 0)); + uint32_t instanceVersion; + LOG_ALWAYS_FATAL_IF(mEnumerateInstanceVersion(&instanceVersion)); + LOG_ALWAYS_FATAL_IF(instanceVersion < VK_MAKE_VERSION(1, 1, 0)); GrVkExtensions extensions; LOG_ALWAYS_FATAL_IF(!this->setupDevice(extensions, mPhysicalDeviceFeatures2)); @@ -398,7 +398,7 @@ void VulkanManager::initialize() { backendContext.fDevice = mDevice; backendContext.fQueue = mGraphicsQueue; backendContext.fGraphicsQueueIndex = mGraphicsQueueIndex; - backendContext.fInstanceVersion = mInstanceVersion; + backendContext.fMaxAPIVersion = mAPIVersion; backendContext.fVkExtensions = &extensions; backendContext.fDeviceFeatures2 = &mPhysicalDeviceFeatures2; backendContext.fGetProc = std::move(getProc); @@ -446,7 +446,7 @@ VkFunctorInitParams VulkanManager::getVkFunctorInitParams() const { .device = mDevice, .queue = mGraphicsQueue, .graphics_queue_index = mGraphicsQueueIndex, - .instance_version = mInstanceVersion, + .api_version = mAPIVersion, .enabled_instance_extension_names = mInstanceExtensions.data(), .enabled_instance_extension_names_length = static_cast<uint32_t>(mInstanceExtensions.size()), diff --git a/libs/hwui/renderthread/VulkanManager.h b/libs/hwui/renderthread/VulkanManager.h index abe78efc9174..6426fe2808b7 100644 --- a/libs/hwui/renderthread/VulkanManager.h +++ b/libs/hwui/renderthread/VulkanManager.h @@ -246,7 +246,7 @@ private: VkCommandBuffer mDummyCB = VK_NULL_HANDLE; // Variables saved to populate VkFunctorInitParams. - uint32_t mInstanceVersion = 0u; + static const uint32_t mAPIVersion = VK_MAKE_VERSION(1, 1, 0); std::vector<const char*> mInstanceExtensions; std::vector<const char*> mDeviceExtensions; VkPhysicalDeviceFeatures2 mPhysicalDeviceFeatures2{}; diff --git a/location/java/android/location/GnssMeasurementCorrections.java b/location/java/android/location/GnssMeasurementCorrections.java index b81bf908053c..3ce48b4f7627 100644 --- a/location/java/android/location/GnssMeasurementCorrections.java +++ b/location/java/android/location/GnssMeasurementCorrections.java @@ -43,13 +43,27 @@ public final class GnssMeasurementCorrections implements Parcelable { * are computed. */ private double mAltitudeMeters; + /** + * Represents the horizontal uncertainty (68% confidence) in meters on the device position at + * which the corrections are provided. + * + * <p> This value is useful for example to judge how accurate the provided corrections are. + */ + private double mHorizontalPositionUncertaintyMeters; + /** + * Represents the vertical uncertainty (68% confidence) in meters on the device position at + * which the corrections are provided. + * + * <p> This value is useful for example to judge how accurate the provided corrections are. + */ + private double mVerticalPositionUncertaintyMeters; - /** Time Of Applicability, GPS time of week */ + /** Time Of Applicability, GPS time of week in nanoseconds. */ private long mToaGpsNanosecondsOfWeek; /** * A set of {@link GnssSingleSatCorrection} each containing measurement corrections for a - * satellite in view + * satellite in view. */ private @Nullable List<GnssSingleSatCorrection> mSingleSatCorrectionList; @@ -57,6 +71,8 @@ public final class GnssMeasurementCorrections implements Parcelable { mLatitudeDegrees = builder.mLatitudeDegrees; mLongitudeDegrees = builder.mLongitudeDegrees; mAltitudeMeters = builder.mAltitudeMeters; + mHorizontalPositionUncertaintyMeters = builder.mHorizontalPositionUncertaintyMeters; + mVerticalPositionUncertaintyMeters = builder.mVerticalPositionUncertaintyMeters; mToaGpsNanosecondsOfWeek = builder.mToaGpsNanosecondsOfWeek; mSingleSatCorrectionList = builder.mSingleSatCorrectionList == null @@ -83,6 +99,22 @@ public final class GnssMeasurementCorrections implements Parcelable { return mAltitudeMeters; } + /** + * Gets the horizontal uncertainty (68% confidence) in meters on the device position at + * which the corrections are provided. + */ + public double getHorizontalPositionUncertaintyMeters() { + return mHorizontalPositionUncertaintyMeters; + } + + /** + * Gets the vertical uncertainty (68% confidence) in meters on the device position at + * which the corrections are provided. + */ + public double getVerticalPositionUncertaintyMeters() { + return mVerticalPositionUncertaintyMeters; + } + /** Gets the time of applicability, GPS time of week in nanoseconds. */ public long getToaGpsNanosecondsOfWeek() { return mToaGpsNanosecondsOfWeek; @@ -110,6 +142,8 @@ public final class GnssMeasurementCorrections implements Parcelable { .setLatitudeDegrees(parcel.readDouble()) .setLongitudeDegrees(parcel.readDouble()) .setAltitudeMeters(parcel.readDouble()) + .setHorizontalPositionUncertaintyMeters(parcel.readDouble()) + .setVerticalPositionUncertaintyMeters(parcel.readDouble()) .setToaGpsNanosecondsOfWeek(parcel.readLong()); List<GnssSingleSatCorrection> singleSatCorrectionList = new ArrayList<>(); parcel.readTypedList(singleSatCorrectionList, GnssSingleSatCorrection.CREATOR); @@ -131,6 +165,10 @@ public final class GnssMeasurementCorrections implements Parcelable { builder.append(String.format(format, "LatitudeDegrees = ", mLatitudeDegrees)); builder.append(String.format(format, "LongitudeDegrees = ", mLongitudeDegrees)); builder.append(String.format(format, "AltitudeMeters = ", mAltitudeMeters)); + builder.append(String.format(format, "HorizontalPositionUncertaintyMeters = ", + mHorizontalPositionUncertaintyMeters)); + builder.append(String.format(format, "VerticalPositionUncertaintyMeters = ", + mVerticalPositionUncertaintyMeters)); builder.append( String.format(format, "ToaGpsNanosecondsOfWeek = ", mToaGpsNanosecondsOfWeek)); builder.append( @@ -143,6 +181,8 @@ public final class GnssMeasurementCorrections implements Parcelable { parcel.writeDouble(mLatitudeDegrees); parcel.writeDouble(mLongitudeDegrees); parcel.writeDouble(mAltitudeMeters); + parcel.writeDouble(mHorizontalPositionUncertaintyMeters); + parcel.writeDouble(mVerticalPositionUncertaintyMeters); parcel.writeLong(mToaGpsNanosecondsOfWeek); parcel.writeTypedList(mSingleSatCorrectionList); } @@ -154,9 +194,10 @@ public final class GnssMeasurementCorrections implements Parcelable { * GnssMeasurementCorrections}. */ private double mLatitudeDegrees; - private double mLongitudeDegrees; private double mAltitudeMeters; + private double mHorizontalPositionUncertaintyMeters; + private double mVerticalPositionUncertaintyMeters; private long mToaGpsNanosecondsOfWeek; private List<GnssSingleSatCorrection> mSingleSatCorrectionList; @@ -181,6 +222,27 @@ public final class GnssMeasurementCorrections implements Parcelable { return this; } + + /** + * Sets the horizontal uncertainty (68% confidence) in meters on the device position at + * which the corrections are provided. + */ + public Builder setHorizontalPositionUncertaintyMeters( + double horizontalPositionUncertaintyMeters) { + mHorizontalPositionUncertaintyMeters = horizontalPositionUncertaintyMeters; + return this; + } + + /** + * Sets the vertical uncertainty (68% confidence) in meters on the device position at which + * the corrections are provided. + */ + public Builder setVerticalPositionUncertaintyMeters( + double verticalPositionUncertaintyMeters) { + mVerticalPositionUncertaintyMeters = verticalPositionUncertaintyMeters; + return this; + } + /** Sets the time of applicability, GPS time of week in nanoseconds. */ public Builder setToaGpsNanosecondsOfWeek(long toaGpsNanosecondsOfWeek) { mToaGpsNanosecondsOfWeek = toaGpsNanosecondsOfWeek; diff --git a/location/java/android/location/GnssSingleSatCorrection.java b/location/java/android/location/GnssSingleSatCorrection.java index 3922d2f9f558..4d5303f18b81 100644 --- a/location/java/android/location/GnssSingleSatCorrection.java +++ b/location/java/android/location/GnssSingleSatCorrection.java @@ -317,8 +317,8 @@ public final class GnssSingleSatCorrection implements Parcelable { * between 0 and 1. */ public Builder setProbSatIsLos(@FloatRange(from = 0f, to = 1f) float probSatIsLos) { - Preconditions.checkArgumentInRange(probSatIsLos, 0, 1, - "probSatIsLos should be between 0 and 1."); + Preconditions.checkArgumentInRange( + probSatIsLos, 0, 1, "probSatIsLos should be between 0 and 1."); mProbSatIsLos = probSatIsLos; mSingleSatCorrectionFlags = (byte) (mSingleSatCorrectionFlags | HAS_PROB_SAT_IS_LOS_MASK); diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 59c6a0a21cd1..63b57d166f1f 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -181,22 +181,14 @@ public class LocationManager { "android.location.GPS_ENABLED_CHANGE"; /** - * Broadcast intent action when the configured location providers - * change. For use with {@link #isProviderEnabled(String)}. If you're interacting with the - * {@link android.provider.Settings.Secure#LOCATION_MODE} API, use {@link #MODE_CHANGED_ACTION} - * instead. + * Broadcast intent action when the set of enabled location providers changes. To check the + * status of a provider, use {@link #isProviderEnabled(String)}. */ - public static final String PROVIDERS_CHANGED_ACTION = - "android.location.PROVIDERS_CHANGED"; + public static final String PROVIDERS_CHANGED_ACTION = "android.location.PROVIDERS_CHANGED"; /** - * Broadcast intent action when {@link android.provider.Settings.Secure#LOCATION_MODE} changes. - * For use with the {@link android.provider.Settings.Secure#LOCATION_MODE} API. - * If you're interacting with {@link #isProviderEnabled(String)}, use - * {@link #PROVIDERS_CHANGED_ACTION} instead. - * - * In the future, there may be mode changes that do not result in - * {@link #PROVIDERS_CHANGED_ACTION} broadcasts. + * Broadcast intent action when the device location mode changes. To check the location mode, + * use {@link #isLocationEnabled()}. */ public static final String MODE_CHANGED_ACTION = "android.location.MODE_CHANGED"; @@ -207,8 +199,10 @@ public class LocationManager { * If you're interacting with {@link #isProviderEnabled(String)}, use * {@link #PROVIDERS_CHANGED_ACTION} instead. * + * @deprecated Do not use. * @hide */ + @Deprecated public static final String MODE_CHANGING_ACTION = "com.android.settings.location.MODE_CHANGING"; /** @@ -299,7 +293,7 @@ public class LocationManager { "com.android.settings.location.FOOTER_STRING"; // Map from LocationListeners to their associated ListenerTransport objects - private HashMap<LocationListener,ListenerTransport> mListeners = + private final HashMap<LocationListener, ListenerTransport> mListeners = new HashMap<LocationListener,ListenerTransport>(); private class ListenerTransport extends ILocationListener.Stub { @@ -1264,39 +1258,20 @@ public class LocationManager { } /** - * Returns the current enabled/disabled status of location + * Returns the current enabled/disabled state of location. To listen for changes, see + * {@link #MODE_CHANGED_ACTION}. * - * @return true if location is enabled. false if location is disabled. + * @return true if location is enabled and false if location is disabled. */ public boolean isLocationEnabled() { return isLocationEnabledForUser(Process.myUserHandle()); } /** - * Method for enabling or disabling location. - * - * @param enabled true to enable location. false to disable location - * @param userHandle the user to set - * - * @hide - */ - @SystemApi - @RequiresPermission(WRITE_SECURE_SETTINGS) - public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) { - Settings.Secure.putIntForUser( - mContext.getContentResolver(), - Settings.Secure.LOCATION_MODE, - enabled - ? Settings.Secure.LOCATION_MODE_HIGH_ACCURACY - : Settings.Secure.LOCATION_MODE_OFF, - userHandle.getIdentifier()); - } - - /** - * Returns the current enabled/disabled status of location + * Returns the current enabled/disabled state of location. * * @param userHandle the user to query - * @return true location is enabled. false if location is disabled. + * @return true if location is enabled and false if location is disabled. * * @hide */ @@ -1310,19 +1285,32 @@ public class LocationManager { } /** - * Returns the current enabled/disabled status of the given provider. + * Enables or disables the location setting. * - * <p>If the user has enabled this provider in the Settings menu, true - * is returned otherwise false is returned + * @param enabled true to enable location and false to disable location. + * @param userHandle the user to set * - * <p>Callers should instead use {@link #isLocationEnabled()} - * unless they depend on provider-specific APIs such as - * {@link #requestLocationUpdates(String, long, float, LocationListener)}. + * @hide + */ + @SystemApi + @RequiresPermission(WRITE_SECURE_SETTINGS) + public void setLocationEnabledForUser(boolean enabled, UserHandle userHandle) { + Settings.Secure.putIntForUser( + mContext.getContentResolver(), + Settings.Secure.LOCATION_MODE, + enabled + ? Settings.Secure.LOCATION_MODE_ON + : Settings.Secure.LOCATION_MODE_OFF, + userHandle.getIdentifier()); + } + + /** + * Returns the current enabled/disabled status of the given provider. To listen for changes, see + * {@link #PROVIDERS_CHANGED_ACTION}. * - * <p> - * Before API version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this - * method would throw {@link SecurityException} if the location permissions - * were not sufficient to use the specified provider. + * Before API version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method would throw + * {@link SecurityException} if the location permissions were not sufficient to use the + * specified provider. * * @param provider the name of the provider * @return true if the provider exists and is enabled @@ -1334,19 +1322,13 @@ public class LocationManager { } /** - * Returns the current enabled/disabled status of the given provider and user. - * - * <p>If the user has enabled this provider in the Settings menu, true - * is returned otherwise false is returned - * - * <p>Callers should instead use {@link #isLocationEnabled()} - * unless they depend on provider-specific APIs such as - * {@link #requestLocationUpdates(String, long, float, LocationListener)}. + * Returns the current enabled/disabled status of the given provider and user. Callers should + * prefer {@link #isLocationEnabledForUser(UserHandle)} unless they depend on provider-specific + * APIs. * - * <p> - * Before API version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this - * method would throw {@link SecurityException} if the location permissions - * were not sufficient to use the specified provider. + * Before API version {@link android.os.Build.VERSION_CODES#LOLLIPOP}, this method would throw + * {@link SecurityException} if the location permissions were not sufficient to use the + * specified provider. * * @param provider the name of the provider * @param userHandle the user to query @@ -1367,12 +1349,14 @@ public class LocationManager { } /** - * Method for enabling or disabling a single location provider. + * Method for enabling or disabling a single location provider. This method is deprecated and + * functions as a best effort. It should not be relied on in any meaningful sense as providers + * may no longer be enabled or disabled by clients. * * @param provider the name of the provider * @param enabled true to enable the provider. false to disable the provider * @param userHandle the user to set - * @return true if the value was set, false on database errors + * @return true if the value was set, false otherwise * * @throws IllegalArgumentException if provider is null * @deprecated Do not manipulate providers individually, use diff --git a/location/java/android/location/LocationRequest.java b/location/java/android/location/LocationRequest.java index 3d0afb098697..0480eab580ac 100644 --- a/location/java/android/location/LocationRequest.java +++ b/location/java/android/location/LocationRequest.java @@ -683,6 +683,7 @@ public final class LocationRequest implements Parcelable { request.setSmallestDisplacement(in.readFloat()); request.setHideFromAppOps(in.readInt() != 0); request.setLowPowerMode(in.readInt() != 0); + request.setLocationSettingsIgnored(in.readInt() != 0); String provider = in.readString(); if (provider != null) request.setProvider(provider); WorkSource workSource = in.readParcelable(null); @@ -711,6 +712,7 @@ public final class LocationRequest implements Parcelable { parcel.writeFloat(mSmallestDisplacement); parcel.writeInt(mHideFromAppOps ? 1 : 0); parcel.writeInt(mLowPowerMode ? 1 : 0); + parcel.writeInt(mLocationSettingsIgnored ? 1 : 0); parcel.writeString(mProvider); parcel.writeParcelable(mWorkSource, 0); } @@ -755,6 +757,9 @@ public final class LocationRequest implements Parcelable { s.append(" num=").append(mNumUpdates); } s.append(" lowPowerMode=").append(mLowPowerMode); + if (mLocationSettingsIgnored) { + s.append(" ignoreSettings"); + } s.append(']'); return s.toString(); } diff --git a/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java b/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java index d6227bbfcd0d..8f46e84195d5 100644 --- a/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java +++ b/location/tests/locationtests/src/android/location/GnssMeasurementCorrectionsTest.java @@ -48,6 +48,8 @@ public class GnssMeasurementCorrectionsTest extends TestCase { assertEquals(37.386051, measurementCorrections.getLatitudeDegrees()); assertEquals(-122.083855, measurementCorrections.getLongitudeDegrees()); assertEquals(32.0, measurementCorrections.getAltitudeMeters()); + assertEquals(9.25, measurementCorrections.getHorizontalPositionUncertaintyMeters()); + assertEquals(2.3, measurementCorrections.getVerticalPositionUncertaintyMeters()); assertEquals(604000000000000L, measurementCorrections.getToaGpsNanosecondsOfWeek()); GnssSingleSatCorrection singleSatCorrection = @@ -74,6 +76,8 @@ public class GnssMeasurementCorrectionsTest extends TestCase { .setLatitudeDegrees(37.386051) .setLongitudeDegrees(-122.083855) .setAltitudeMeters(32) + .setHorizontalPositionUncertaintyMeters(9.25) + .setVerticalPositionUncertaintyMeters(2.3) .setToaGpsNanosecondsOfWeek(604000000000000L); List<GnssSingleSatCorrection> singleSatCorrectionList = new ArrayList<>(); singleSatCorrectionList.add(GnssSingleSatCorrectionsTest.generateTestSingleSatCorrection()); diff --git a/media/Android.bp b/media/Android.bp index 3181a2988d99..d7b8dd23bd6b 100644 --- a/media/Android.bp +++ b/media/Android.bp @@ -1,30 +1,4 @@ java_library { - name: "updatable-media1", - - srcs: [ - ":media1-srcs", - ":framework-media-annotation-srcs", - ], - - aidl: { - export_include_dirs: [ - "apex/java", - ], - - // TODO: find out a way to include only the necessary aidl files instead of dirs. - include_dirs: [ - "frameworks/base/core/java", - "frameworks/base/media/java", - ], - }, - - installable: true, - - // Make sure that the implementaion only relies on SDK or system APIs. - sdk_version: "system_current", -} - -java_library { name: "updatable-media", srcs: [ @@ -57,53 +31,12 @@ java_library { filegroup { name: "media-srcs-without-aidls", srcs : [ - ":media1-srcs-without-aidls", ":mediasession2-srcs-without-aidls", ":mediaplayer2-srcs", ], } filegroup { - name: "media1-srcs", - srcs: [ - "apex/java/android/media/MediaParceledListSlice.java", - "apex/java/android/media/VolumeProvider.java", - "apex/java/android/media/browse/MediaBrowser.java", - "apex/java/android/media/browse/MediaBrowserUtils.java", - "apex/java/android/media/session/ControllerCallbackLink.java", - "apex/java/android/media/session/ControllerLink.java", - "apex/java/android/media/session/ISession.aidl", - "apex/java/android/media/session/ISessionCallback.aidl", - "apex/java/android/media/session/ISessionController.aidl", - "apex/java/android/media/session/ISessionControllerCallback.aidl", - "apex/java/android/media/session/MediaController.java", - "apex/java/android/media/session/MediaSessionEngine.java", - "apex/java/android/media/session/MediaSessionProviderService.java", - "apex/java/android/media/session/PlaybackState.java", - "apex/java/android/media/session/SessionCallbackLink.java", - "apex/java/android/media/session/SessionLink.java", - "apex/java/android/service/media/IMediaBrowserService.aidl", - "apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl", - "apex/java/android/service/media/MediaBrowserService.java", - ], -} - -filegroup { - name: "media1-srcs-without-aidls", - srcs: [ - ":media1-srcs", - ], - exclude_srcs: [ - "apex/java/android/media/session/ISession.aidl", - "apex/java/android/media/session/ISessionCallback.aidl", - "apex/java/android/media/session/ISessionController.aidl", - "apex/java/android/media/session/ISessionControllerCallback.aidl", - "apex/java/android/service/media/IMediaBrowserService.aidl", - "apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl", - ], -} - -filegroup { name: "mediasession2-srcs", srcs: [ "apex/java/android/media/Controller2Link.java", diff --git a/media/apex/java/android/media/MediaPlayer2.java b/media/apex/java/android/media/MediaPlayer2.java index 1a1f6fb4457a..0fd496bda251 100644 --- a/media/apex/java/android/media/MediaPlayer2.java +++ b/media/apex/java/android/media/MediaPlayer2.java @@ -21,6 +21,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.StringDef; +import android.annotation.TestApi; import android.content.ContentResolver; import android.content.Context; import android.content.res.AssetFileDescriptor; @@ -3667,53 +3668,66 @@ public class MediaPlayer2 implements AutoCloseable } /** - * The status codes for {@link DrmEventCallback#onDrmPrepared} listener. + * A status code for {@link DrmEventCallback#onDrmPrepared} listener. * <p> * * DRM preparation has succeeded. - * @hide */ public static final int PREPARE_DRM_STATUS_SUCCESS = 0; /** + * A status code for {@link DrmEventCallback#onDrmPrepared} listener. + * <p> + * * The device required DRM provisioning but couldn't reach the provisioning server. - * @hide */ public static final int PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR = 1; /** + * A status code for {@link DrmEventCallback#onDrmPrepared} listener. + * <p> + * * The device required DRM provisioning but the provisioning server denied the request. - * @hide */ public static final int PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR = 2; /** + * A status code for {@link DrmEventCallback#onDrmPrepared} listener. + * <p> + * * The DRM preparation has failed . - * @hide */ public static final int PREPARE_DRM_STATUS_PREPARATION_ERROR = 3; /** + * A status code for {@link DrmEventCallback#onDrmPrepared} listener. + * <p> + * * The crypto scheme UUID is not supported by the device. - * @hide */ public static final int PREPARE_DRM_STATUS_UNSUPPORTED_SCHEME = 4; /** + * A status code for {@link DrmEventCallback#onDrmPrepared} listener. + * <p> + * * The hardware resources are not available, due to being in use. - * @hide */ public static final int PREPARE_DRM_STATUS_RESOURCE_BUSY = 5; /** + * A status code for {@link DrmEventCallback#onDrmPrepared} listener. + * <p> + * * Restoring persisted offline keys failed. - * @hide */ public static final int PREPARE_DRM_STATUS_RESTORE_ERROR = 6; /** + * A status code for {@link DrmEventCallback#onDrmPrepared} listener. + * <p> + * * Error during key request/response exchange with license server. - * @hide */ public static final int PREPARE_DRM_STATUS_KEY_EXCHANGE_ERROR = 7; @@ -3758,6 +3772,7 @@ public class MediaPlayer2 implements AutoCloseable * @throws IllegalStateException if called before being prepared * @hide */ + @TestApi public DrmInfo getDrmInfo(@NonNull DataSourceDesc dsd) { final SourceInfo sourceInfo = getSourceInfo(dsd); if (sourceInfo != null) { @@ -3814,6 +3829,7 @@ public class MediaPlayer2 implements AutoCloseable * @hide */ // This is an asynchronous call. + @TestApi public Object prepareDrm(@NonNull DataSourceDesc dsd, @NonNull UUID uuid) { return addTask(newPrepareDrmTask(dsd, uuid)); } @@ -3905,6 +3921,7 @@ public class MediaPlayer2 implements AutoCloseable * @hide */ // This is a synchronous call. + @TestApi public void releaseDrm(@NonNull DataSourceDesc dsd) throws NoDrmSchemeException { final SourceInfo sourceInfo = getSourceInfo(dsd); @@ -3955,6 +3972,7 @@ public class MediaPlayer2 implements AutoCloseable * @throws NoDrmSchemeException if there is no active DRM session * @hide */ + @TestApi public MediaDrm.KeyRequest getDrmKeyRequest( @NonNull DataSourceDesc dsd, @Nullable byte[] keySetId, @Nullable byte[] initData, @@ -3997,6 +4015,7 @@ public class MediaPlayer2 implements AutoCloseable * @hide */ // This is a synchronous call. + @TestApi public byte[] provideDrmKeyResponse( @NonNull DataSourceDesc dsd, @Nullable byte[] keySetId, @NonNull byte[] response) @@ -4023,6 +4042,7 @@ public class MediaPlayer2 implements AutoCloseable * @hide */ // This is a synchronous call. + @TestApi public void restoreDrmKeys( @NonNull DataSourceDesc dsd, @NonNull byte[] keySetId) @@ -4050,6 +4070,7 @@ public class MediaPlayer2 implements AutoCloseable * @throws NoDrmSchemeException if there is no active DRM session * @hide */ + @TestApi public String getDrmPropertyString( @NonNull DataSourceDesc dsd, @NonNull @MediaDrmStringProperty String propertyName) @@ -4078,6 +4099,7 @@ public class MediaPlayer2 implements AutoCloseable * @hide */ // This is a synchronous call. + @TestApi public void setDrmPropertyString( @NonNull DataSourceDesc dsd, @NonNull @MediaDrmStringProperty String propertyName, @NonNull String value) diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index f756658b4fa8..0c3d6255f871 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -3314,7 +3314,7 @@ final public class MediaCodec { */ public void setAudioPresentation(@NonNull AudioPresentation presentation) { if (presentation == null) { - throw new IllegalArgumentException("audio presentation is null"); + throw new NullPointerException("audio presentation is null"); } native_setAudioPresentation(presentation.getPresentationId(), presentation.getProgramId()); } diff --git a/media/java/android/media/MediaDescription.java b/media/java/android/media/MediaDescription.java index 31079e5c54d4..39eeb3eae49f 100644 --- a/media/java/android/media/MediaDescription.java +++ b/media/java/android/media/MediaDescription.java @@ -1,3 +1,19 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package android.media; import android.annotation.Nullable; @@ -226,7 +242,7 @@ public class MediaDescription implements Parcelable { return false; } - if (!(o instanceof MediaDescription)){ + if (!(o instanceof MediaDescription)) { return false; } @@ -375,6 +391,11 @@ public class MediaDescription implements Parcelable { return this; } + /** + * Build {@link MediaDescription}. + * + * @return a new media description. + */ public MediaDescription build() { return new MediaDescription(mMediaId, mTitle, mSubtitle, mDescription, mIcon, mIconUri, mExtras, mMediaUri); diff --git a/media/apex/java/android/media/MediaParceledListSlice.aidl b/media/java/android/media/MediaParceledListSlice.aidl index 5c0e5bc84720..5c0e5bc84720 100644 --- a/media/apex/java/android/media/MediaParceledListSlice.aidl +++ b/media/java/android/media/MediaParceledListSlice.aidl diff --git a/media/apex/java/android/media/MediaParceledListSlice.java b/media/java/android/media/MediaParceledListSlice.java index 16a37d99fb86..16a37d99fb86 100644 --- a/media/apex/java/android/media/MediaParceledListSlice.java +++ b/media/java/android/media/MediaParceledListSlice.java diff --git a/media/java/android/media/Rating.java b/media/java/android/media/Rating.java index 04d5364f7c81..ffe7e48f25e4 100644 --- a/media/java/android/media/Rating.java +++ b/media/java/android/media/Rating.java @@ -33,7 +33,7 @@ import java.lang.annotation.RetentionPolicy; * through one of the factory methods. */ public final class Rating implements Parcelable { - private final static String TAG = "Rating"; + private static final String TAG = "Rating"; /** * @hide @@ -55,40 +55,40 @@ public final class Rating implements Parcelable { * type, but can be used by other classes to indicate they do not support * Rating. */ - public final static int RATING_NONE = 0; + public static final int RATING_NONE = 0; /** * A rating style with a single degree of rating, "heart" vs "no heart". Can be used to * indicate the content referred to is a favorite (or not). */ - public final static int RATING_HEART = 1; + public static final int RATING_HEART = 1; /** * A rating style for "thumb up" vs "thumb down". */ - public final static int RATING_THUMB_UP_DOWN = 2; + public static final int RATING_THUMB_UP_DOWN = 2; /** * A rating style with 0 to 3 stars. */ - public final static int RATING_3_STARS = 3; + public static final int RATING_3_STARS = 3; /** * A rating style with 0 to 4 stars. */ - public final static int RATING_4_STARS = 4; + public static final int RATING_4_STARS = 4; /** * A rating style with 0 to 5 stars. */ - public final static int RATING_5_STARS = 5; + public static final int RATING_5_STARS = 5; /** * A rating style expressed as a percentage. */ - public final static int RATING_PERCENTAGE = 6; + public static final int RATING_PERCENTAGE = 6; - private final static float RATING_NOT_RATED = -1.0f; + private static final float RATING_NOT_RATED = -1.0f; private final int mRatingStyle; @@ -116,8 +116,7 @@ public final class Rating implements Parcelable { dest.writeFloat(mRatingValue); } - public static final Parcelable.Creator<Rating> CREATOR - = new Parcelable.Creator<Rating>() { + public static final Parcelable.Creator<Rating> CREATOR = new Parcelable.Creator<Rating>() { /** * Rebuilds a Rating previously stored with writeToParcel(). * @param p Parcel object to read the Rating from @@ -205,7 +204,7 @@ public final class Rating implements Parcelable { break; default: Log.e(TAG, "Invalid rating style (" + starRatingStyle + ") for a star rating"); - return null; + return null; } if ((starRating < 0.0f) || (starRating > maxRating)) { Log.e(TAG, "Trying to set out of range star-based rating"); @@ -281,16 +280,16 @@ public final class Rating implements Parcelable { * not star-based, or if it is unrated. */ public float getStarRating() { + float ratingValue = -1.0f; switch (mRatingStyle) { case RATING_3_STARS: case RATING_4_STARS: case RATING_5_STARS: if (isRated()) { - return mRatingValue; + ratingValue = mRatingValue; } - default: - return -1.0f; } + return ratingValue; } /** diff --git a/media/apex/java/android/media/VolumeProvider.java b/media/java/android/media/VolumeProvider.java index 49202eecef19..49202eecef19 100644 --- a/media/apex/java/android/media/VolumeProvider.java +++ b/media/java/android/media/VolumeProvider.java diff --git a/media/apex/java/android/media/browse/MediaBrowser.aidl b/media/java/android/media/browse/MediaBrowser.aidl index 782e09471a56..782e09471a56 100644 --- a/media/apex/java/android/media/browse/MediaBrowser.aidl +++ b/media/java/android/media/browse/MediaBrowser.aidl diff --git a/media/apex/java/android/media/browse/MediaBrowser.java b/media/java/android/media/browse/MediaBrowser.java index 2dffef9fb40a..2dffef9fb40a 100644 --- a/media/apex/java/android/media/browse/MediaBrowser.java +++ b/media/java/android/media/browse/MediaBrowser.java diff --git a/media/apex/java/android/media/browse/MediaBrowserUtils.java b/media/java/android/media/browse/MediaBrowserUtils.java index 19d9f008d3db..19d9f008d3db 100644 --- a/media/apex/java/android/media/browse/MediaBrowserUtils.java +++ b/media/java/android/media/browse/MediaBrowserUtils.java diff --git a/media/apex/java/android/media/session/ControllerCallbackLink.aidl b/media/java/android/media/session/ControllerCallbackLink.aidl index 8ee8c7d00148..8ee8c7d00148 100644 --- a/media/apex/java/android/media/session/ControllerCallbackLink.aidl +++ b/media/java/android/media/session/ControllerCallbackLink.aidl diff --git a/media/apex/java/android/media/session/ControllerCallbackLink.java b/media/java/android/media/session/ControllerCallbackLink.java index adc14a550b7d..adc14a550b7d 100644 --- a/media/apex/java/android/media/session/ControllerCallbackLink.java +++ b/media/java/android/media/session/ControllerCallbackLink.java diff --git a/media/apex/java/android/media/session/ControllerLink.aidl b/media/java/android/media/session/ControllerLink.aidl index 532df59d16cf..532df59d16cf 100644 --- a/media/apex/java/android/media/session/ControllerLink.aidl +++ b/media/java/android/media/session/ControllerLink.aidl diff --git a/media/apex/java/android/media/session/ControllerLink.java b/media/java/android/media/session/ControllerLink.java index f60ec000f2d2..f60ec000f2d2 100644 --- a/media/apex/java/android/media/session/ControllerLink.java +++ b/media/java/android/media/session/ControllerLink.java diff --git a/media/apex/java/android/media/session/ISession.aidl b/media/java/android/media/session/ISession.aidl index 9b1ad7bcf77c..9b1ad7bcf77c 100644 --- a/media/apex/java/android/media/session/ISession.aidl +++ b/media/java/android/media/session/ISession.aidl diff --git a/media/apex/java/android/media/session/ISessionCallback.aidl b/media/java/android/media/session/ISessionCallback.aidl index 9b86bfced340..9b86bfced340 100644 --- a/media/apex/java/android/media/session/ISessionCallback.aidl +++ b/media/java/android/media/session/ISessionCallback.aidl diff --git a/media/apex/java/android/media/session/ISessionController.aidl b/media/java/android/media/session/ISessionController.aidl index e697c65e11c0..e697c65e11c0 100644 --- a/media/apex/java/android/media/session/ISessionController.aidl +++ b/media/java/android/media/session/ISessionController.aidl diff --git a/media/apex/java/android/media/session/ISessionControllerCallback.aidl b/media/java/android/media/session/ISessionControllerCallback.aidl index 56ae852d6f50..56ae852d6f50 100644 --- a/media/apex/java/android/media/session/ISessionControllerCallback.aidl +++ b/media/java/android/media/session/ISessionControllerCallback.aidl diff --git a/media/apex/java/android/media/session/MediaController.aidl b/media/java/android/media/session/MediaController.aidl index 17167f45d0e3..17167f45d0e3 100644 --- a/media/apex/java/android/media/session/MediaController.aidl +++ b/media/java/android/media/session/MediaController.aidl diff --git a/media/apex/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java index 1333ab097219..1333ab097219 100644 --- a/media/apex/java/android/media/session/MediaController.java +++ b/media/java/android/media/session/MediaController.java diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java index ca3346c9a8c4..03627de9343c 100644 --- a/media/java/android/media/session/MediaSession.java +++ b/media/java/android/media/session/MediaSession.java @@ -142,10 +142,9 @@ public final class MediaSession { MediaSessionManager manager = (MediaSessionManager) context .getSystemService(Context.MEDIA_SESSION_SERVICE); try { - MediaSessionEngine.CallbackStub cbStub = new MediaSessionEngine.CallbackStub(); - SessionCallbackLink cbLink = new SessionCallbackLink(context, cbStub); + SessionCallbackLink cbLink = new SessionCallbackLink(context); SessionLink sessionLink = manager.createSession(cbLink, tag); - mImpl = new MediaSessionEngine(context, sessionLink, cbLink, cbStub); + mImpl = new MediaSessionEngine(context, sessionLink, cbLink); mMaxBitmapSize = context.getResources().getDimensionPixelSize( android.R.dimen.config_mediaMetadataBitmapMaxSize); } catch (RuntimeException e) { diff --git a/media/apex/java/android/media/session/MediaSessionEngine.java b/media/java/android/media/session/MediaSessionEngine.java index 31714e1bde7f..7fea90dd0c43 100644 --- a/media/apex/java/android/media/session/MediaSessionEngine.java +++ b/media/java/android/media/session/MediaSessionEngine.java @@ -19,7 +19,6 @@ package android.media.session; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.UnsupportedAppUsage; import android.app.Activity; import android.app.PendingIntent; import android.content.Context; @@ -44,7 +43,6 @@ import android.util.Pair; import android.view.KeyEvent; import android.view.ViewConfiguration; -import java.lang.ref.WeakReference; import java.util.List; import java.util.Objects; @@ -60,10 +58,7 @@ public final class MediaSessionEngine implements AutoCloseable { private final MediaSession.Token mSessionToken; private final MediaController mController; private final SessionLink mSessionLink; - private final SessionCallbackLink mCbLink; - // Do not change the name of mCallbackWrapper. Support lib accesses this by using reflection. - @UnsupportedAppUsage private CallbackMessageHandler mCallbackHandler; private VolumeProvider mVolumeProvider; private PlaybackState mPlaybackState; @@ -78,14 +73,12 @@ public final class MediaSessionEngine implements AutoCloseable { * * @param context The context to use to create the session. * @param sessionLink A session link for the binder of MediaSessionRecord - * @param cbStub A callback link that handles incoming command to {@link MediaSession.Callback}. */ public MediaSessionEngine(@NonNull Context context, @NonNull SessionLink sessionLink, - @NonNull SessionCallbackLink cbLink, @NonNull CallbackStub cbStub) { + @NonNull SessionCallbackLink cbLink) { mSessionLink = sessionLink; - mCbLink = cbLink; - cbStub.setSessionImpl(this); + cbLink.setSessionEngine(this); mSessionToken = new MediaSession.Token(mSessionLink.getController()); mController = new MediaController(context, mSessionToken); } @@ -479,97 +472,97 @@ public final class MediaSessionEngine implements AutoCloseable { } } - private void dispatchPrepare(RemoteUserInfo caller) { + void dispatchPrepare(RemoteUserInfo caller) { postToCallback(caller, CallbackMessageHandler.MSG_PREPARE, null, null); } - private void dispatchPrepareFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) { + void dispatchPrepareFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) { postToCallback(caller, CallbackMessageHandler.MSG_PREPARE_MEDIA_ID, mediaId, extras); } - private void dispatchPrepareFromSearch(RemoteUserInfo caller, String query, Bundle extras) { + void dispatchPrepareFromSearch(RemoteUserInfo caller, String query, Bundle extras) { postToCallback(caller, CallbackMessageHandler.MSG_PREPARE_SEARCH, query, extras); } - private void dispatchPrepareFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) { + void dispatchPrepareFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) { postToCallback(caller, CallbackMessageHandler.MSG_PREPARE_URI, uri, extras); } - private void dispatchPlay(RemoteUserInfo caller) { + void dispatchPlay(RemoteUserInfo caller) { postToCallback(caller, CallbackMessageHandler.MSG_PLAY, null, null); } - private void dispatchPlayFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) { + void dispatchPlayFromMediaId(RemoteUserInfo caller, String mediaId, Bundle extras) { postToCallback(caller, CallbackMessageHandler.MSG_PLAY_MEDIA_ID, mediaId, extras); } - private void dispatchPlayFromSearch(RemoteUserInfo caller, String query, Bundle extras) { + void dispatchPlayFromSearch(RemoteUserInfo caller, String query, Bundle extras) { postToCallback(caller, CallbackMessageHandler.MSG_PLAY_SEARCH, query, extras); } - private void dispatchPlayFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) { + void dispatchPlayFromUri(RemoteUserInfo caller, Uri uri, Bundle extras) { postToCallback(caller, CallbackMessageHandler.MSG_PLAY_URI, uri, extras); } - private void dispatchSkipToItem(RemoteUserInfo caller, long id) { + void dispatchSkipToItem(RemoteUserInfo caller, long id) { postToCallback(caller, CallbackMessageHandler.MSG_SKIP_TO_ITEM, id, null); } - private void dispatchPause(RemoteUserInfo caller) { + void dispatchPause(RemoteUserInfo caller) { postToCallback(caller, CallbackMessageHandler.MSG_PAUSE, null, null); } - private void dispatchStop(RemoteUserInfo caller) { + void dispatchStop(RemoteUserInfo caller) { postToCallback(caller, CallbackMessageHandler.MSG_STOP, null, null); } - private void dispatchNext(RemoteUserInfo caller) { + void dispatchNext(RemoteUserInfo caller) { postToCallback(caller, CallbackMessageHandler.MSG_NEXT, null, null); } - private void dispatchPrevious(RemoteUserInfo caller) { + void dispatchPrevious(RemoteUserInfo caller) { postToCallback(caller, CallbackMessageHandler.MSG_PREVIOUS, null, null); } - private void dispatchFastForward(RemoteUserInfo caller) { + void dispatchFastForward(RemoteUserInfo caller) { postToCallback(caller, CallbackMessageHandler.MSG_FAST_FORWARD, null, null); } - private void dispatchRewind(RemoteUserInfo caller) { + void dispatchRewind(RemoteUserInfo caller) { postToCallback(caller, CallbackMessageHandler.MSG_REWIND, null, null); } - private void dispatchSeekTo(RemoteUserInfo caller, long pos) { + void dispatchSeekTo(RemoteUserInfo caller, long pos) { postToCallback(caller, CallbackMessageHandler.MSG_SEEK_TO, pos, null); } - private void dispatchRate(RemoteUserInfo caller, Rating rating) { + void dispatchRate(RemoteUserInfo caller, Rating rating) { postToCallback(caller, CallbackMessageHandler.MSG_RATE, rating, null); } - private void dispatchCustomAction(RemoteUserInfo caller, String action, Bundle args) { + void dispatchCustomAction(RemoteUserInfo caller, String action, Bundle args) { postToCallback(caller, CallbackMessageHandler.MSG_CUSTOM_ACTION, action, args); } - private void dispatchMediaButton(RemoteUserInfo caller, Intent mediaButtonIntent) { + void dispatchMediaButton(RemoteUserInfo caller, Intent mediaButtonIntent) { postToCallback(caller, CallbackMessageHandler.MSG_MEDIA_BUTTON, mediaButtonIntent, null); } - private void dispatchMediaButtonDelayed(RemoteUserInfo info, Intent mediaButtonIntent, + void dispatchMediaButtonDelayed(RemoteUserInfo info, Intent mediaButtonIntent, long delay) { postToCallbackDelayed(info, CallbackMessageHandler.MSG_PLAY_PAUSE_KEY_DOUBLE_TAP_TIMEOUT, mediaButtonIntent, null, delay); } - private void dispatchAdjustVolume(RemoteUserInfo caller, int direction) { + void dispatchAdjustVolume(RemoteUserInfo caller, int direction) { postToCallback(caller, CallbackMessageHandler.MSG_ADJUST_VOLUME, direction, null); } - private void dispatchSetVolumeTo(RemoteUserInfo caller, int volume) { + void dispatchSetVolumeTo(RemoteUserInfo caller, int volume) { postToCallback(caller, CallbackMessageHandler.MSG_SET_VOLUME, volume, null); } - private void dispatchCommand(RemoteUserInfo caller, String command, Bundle args, + void dispatchCommand(RemoteUserInfo caller, String command, Bundle args, ResultReceiver resultCb) { Command cmd = new Command(command, args, resultCb); postToCallback(caller, CallbackMessageHandler.MSG_COMMAND, cmd, null); @@ -979,259 +972,7 @@ public final class MediaSessionEngine implements AutoCloseable { } } - /** - * @hide - */ - @SystemApi - public static final class CallbackStub extends SessionCallbackLink.CallbackStub { - private WeakReference<MediaSessionEngine> mSessionImpl; - - private static RemoteUserInfo createRemoteUserInfo(String packageName, int pid, int uid) { - return new RemoteUserInfo(packageName, pid, uid); - } - - public CallbackStub() { - } - - @Override - public void onCommand(String packageName, int pid, int uid, - ControllerCallbackLink caller, String command, Bundle args, ResultReceiver cb) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchCommand(createRemoteUserInfo(packageName, pid, uid), - command, args, cb); - } - } - - @Override - public void onMediaButton(String packageName, int pid, int uid, Intent mediaButtonIntent, - int sequenceNumber, ResultReceiver cb) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - try { - if (sessionImpl != null) { - sessionImpl.dispatchMediaButton( - createRemoteUserInfo(packageName, pid, uid), mediaButtonIntent); - } - } finally { - if (cb != null) { - cb.send(sequenceNumber, null); - } - } - } - - @Override - public void onMediaButtonFromController(String packageName, int pid, int uid, - ControllerCallbackLink caller, Intent mediaButtonIntent) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchMediaButton(createRemoteUserInfo(packageName, pid, uid), - mediaButtonIntent); - } - } - - @Override - public void onPrepare(String packageName, int pid, int uid, - ControllerCallbackLink caller) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchPrepare(createRemoteUserInfo(packageName, pid, uid)); - } - } - - @Override - public void onPrepareFromMediaId(String packageName, int pid, int uid, - ControllerCallbackLink caller, String mediaId, - Bundle extras) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchPrepareFromMediaId( - createRemoteUserInfo(packageName, pid, uid), mediaId, extras); - } - } - - @Override - public void onPrepareFromSearch(String packageName, int pid, int uid, - ControllerCallbackLink caller, String query, - Bundle extras) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchPrepareFromSearch( - createRemoteUserInfo(packageName, pid, uid), query, extras); - } - } - - @Override - public void onPrepareFromUri(String packageName, int pid, int uid, - ControllerCallbackLink caller, Uri uri, Bundle extras) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchPrepareFromUri( - createRemoteUserInfo(packageName, pid, uid), uri, extras); - } - } - - @Override - public void onPlay(String packageName, int pid, int uid, - ControllerCallbackLink caller) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchPlay(createRemoteUserInfo(packageName, pid, uid)); - } - } - - @Override - public void onPlayFromMediaId(String packageName, int pid, int uid, - ControllerCallbackLink caller, String mediaId, - Bundle extras) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchPlayFromMediaId( - createRemoteUserInfo(packageName, pid, uid), mediaId, extras); - } - } - - @Override - public void onPlayFromSearch(String packageName, int pid, int uid, - ControllerCallbackLink caller, String query, - Bundle extras) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchPlayFromSearch( - createRemoteUserInfo(packageName, pid, uid), query, extras); - } - } - - @Override - public void onPlayFromUri(String packageName, int pid, int uid, - ControllerCallbackLink caller, Uri uri, Bundle extras) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchPlayFromUri( - createRemoteUserInfo(packageName, pid, uid), uri, extras); - } - } - - @Override - public void onSkipToTrack(String packageName, int pid, int uid, - ControllerCallbackLink caller, long id) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchSkipToItem( - createRemoteUserInfo(packageName, pid, uid), id); - } - } - - @Override - public void onPause(String packageName, int pid, int uid, - ControllerCallbackLink caller) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchPause(createRemoteUserInfo(packageName, pid, uid)); - } - } - - @Override - public void onStop(String packageName, int pid, int uid, - ControllerCallbackLink caller) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchStop(createRemoteUserInfo(packageName, pid, uid)); - } - } - - @Override - public void onNext(String packageName, int pid, int uid, - ControllerCallbackLink caller) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchNext(createRemoteUserInfo(packageName, pid, uid)); - } - } - - @Override - public void onPrevious(String packageName, int pid, int uid, - ControllerCallbackLink caller) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchPrevious(createRemoteUserInfo(packageName, pid, uid)); - } - } - - @Override - public void onFastForward(String packageName, int pid, int uid, - ControllerCallbackLink caller) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchFastForward( - createRemoteUserInfo(packageName, pid, uid)); - } - } - - @Override - public void onRewind(String packageName, int pid, int uid, - ControllerCallbackLink caller) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchRewind(createRemoteUserInfo(packageName, pid, uid)); - } - } - - @Override - public void onSeekTo(String packageName, int pid, int uid, - ControllerCallbackLink caller, long pos) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchSeekTo( - createRemoteUserInfo(packageName, pid, uid), pos); - } - } - - @Override - public void onRate(String packageName, int pid, int uid, ControllerCallbackLink caller, - Rating rating) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchRate( - createRemoteUserInfo(packageName, pid, uid), rating); - } - } - - @Override - public void onCustomAction(String packageName, int pid, int uid, - ControllerCallbackLink caller, String action, Bundle args) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchCustomAction( - createRemoteUserInfo(packageName, pid, uid), action, args); - } - } - - @Override - public void onAdjustVolume(String packageName, int pid, int uid, - ControllerCallbackLink caller, int direction) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchAdjustVolume( - createRemoteUserInfo(packageName, pid, uid), direction); - } - } - - @Override - public void onSetVolumeTo(String packageName, int pid, int uid, - ControllerCallbackLink caller, int value) { - MediaSessionEngine sessionImpl = mSessionImpl.get(); - if (sessionImpl != null) { - sessionImpl.dispatchSetVolumeTo( - createRemoteUserInfo(packageName, pid, uid), value); - } - } - - void setSessionImpl(MediaSessionEngine sessionImpl) { - mSessionImpl = new WeakReference<>(sessionImpl); - } - } - - /** + /** * A single item that is part of the play queue. It contains a description * of the item and its id in the queue. */ diff --git a/media/apex/java/android/media/session/MediaSessionProviderService.java b/media/java/android/media/session/MediaSessionProviderService.java index 9a346ff4a12e..9a346ff4a12e 100644 --- a/media/apex/java/android/media/session/MediaSessionProviderService.java +++ b/media/java/android/media/session/MediaSessionProviderService.java diff --git a/media/apex/java/android/media/session/PlaybackState.aidl b/media/java/android/media/session/PlaybackState.aidl index 0876ebd2d4d2..0876ebd2d4d2 100644 --- a/media/apex/java/android/media/session/PlaybackState.aidl +++ b/media/java/android/media/session/PlaybackState.aidl diff --git a/media/apex/java/android/media/session/PlaybackState.java b/media/java/android/media/session/PlaybackState.java index 6b28c976c710..6b28c976c710 100644 --- a/media/apex/java/android/media/session/PlaybackState.java +++ b/media/java/android/media/session/PlaybackState.java diff --git a/media/apex/java/android/media/session/SessionCallbackLink.aidl b/media/java/android/media/session/SessionCallbackLink.aidl index c489e5bee6e2..c489e5bee6e2 100644 --- a/media/apex/java/android/media/session/SessionCallbackLink.aidl +++ b/media/java/android/media/session/SessionCallbackLink.aidl diff --git a/media/apex/java/android/media/session/SessionCallbackLink.java b/media/java/android/media/session/SessionCallbackLink.java index 3bcb65c42010..4c2918a0fa94 100644 --- a/media/apex/java/android/media/session/SessionCallbackLink.java +++ b/media/java/android/media/session/SessionCallbackLink.java @@ -25,6 +25,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.media.Rating; +import android.media.session.MediaSessionManager.RemoteUserInfo; import android.net.Uri; import android.os.Binder; import android.os.Bundle; @@ -35,6 +36,8 @@ import android.os.Process; import android.os.RemoteException; import android.os.ResultReceiver; +import java.lang.ref.WeakReference; + /** * Handles incoming commands to {@link MediaSession.Callback}. * @hide @@ -42,16 +45,15 @@ import android.os.ResultReceiver; @SystemApi public final class SessionCallbackLink implements Parcelable { final Context mContext; - final CallbackStub mCallbackStub; final ISessionCallback mISessionCallback; /** * Constructor for stub (Callee) + * @hide */ - SessionCallbackLink(@NonNull Context context, @NonNull CallbackStub callbackStub) { + public SessionCallbackLink(@NonNull Context context) { mContext = context; - mCallbackStub = callbackStub; - mISessionCallback = new CallbackStubProxy(); + mISessionCallback = new CallbackStub(); } /** @@ -59,11 +61,19 @@ public final class SessionCallbackLink implements Parcelable { */ public SessionCallbackLink(IBinder binder) { mContext = null; - mCallbackStub = null; mISessionCallback = ISessionCallback.Stub.asInterface(binder); } /** + * Set {@link MediaSessionEngine} which will be used by {@link CallbackStub}. + */ + void setSessionEngine(@Nullable MediaSessionEngine sessionImpl) { + if (mISessionCallback instanceof CallbackStub) { + ((CallbackStub) mISessionCallback).mSessionImpl = new WeakReference<>(sessionImpl); + } + } + + /** * Notify session that a controller sends a command. * * @param packageName the package name of the controller @@ -540,139 +550,24 @@ public final class SessionCallbackLink implements Parcelable { } }; - /** - * Class for Stub implementation - */ - abstract static class CallbackStub { - /** Stub method for ISessionCallback.notifyCommand */ - public void onCommand(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, @NonNull String command, - @Nullable Bundle args, @Nullable ResultReceiver cb) { - } - - /** Stub method for ISessionCallback.notifyMediaButton */ - public void onMediaButton(@NonNull String packageName, int pid, int uid, - @NonNull Intent mediaButtonIntent, int sequenceNumber, - @Nullable ResultReceiver cb) { - } - - /** Stub method for ISessionCallback.notifyMediaButtonFromController */ - public void onMediaButtonFromController(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, @NonNull Intent mediaButtonIntent) { - } - - /** Stub method for ISessionCallback.notifyPrepare */ - public void onPrepare(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller) { - } - - /** Stub method for ISessionCallback.notifyPrepareFromMediaId */ - public void onPrepareFromMediaId(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, @NonNull String mediaId, - @Nullable Bundle extras) { - } - - /** Stub method for ISessionCallback.notifyPrepareFromSearch */ - public void onPrepareFromSearch(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, String query, @Nullable Bundle extras) { - } - - /** Stub method for ISessionCallback.notifyPrepareFromUri */ - public void onPrepareFromUri(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, @NonNull Uri uri, @Nullable Bundle extras) { - } - - /** Stub method for ISessionCallback.notifyPlay */ - public void onPlay(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller) { - } - - /** Stub method for ISessionCallback.notifyPlayFromMediaId */ - public void onPlayFromMediaId(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, @NonNull String mediaId, - @Nullable Bundle extras) { - } - - /** Stub method for ISessionCallback.notifyPlayFromSearch */ - public void onPlayFromSearch(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, String query, @Nullable Bundle extras) { - } - - /** Stub method for ISessionCallback.notifyPlayFromUri */ - public void onPlayFromUri(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, @NonNull Uri uri, @Nullable Bundle extras) { - } - - /** Stub method for ISessionCallback.notifySkipToTrack */ - public void onSkipToTrack(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, long id) { - } - - /** Stub method for ISessionCallback.notifyPause */ - public void onPause(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller) { - } - - /** Stub method for ISessionCallback.notifyStop */ - public void onStop(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller) { - } - - /** Stub method for ISessionCallback.notifyNext */ - public void onNext(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller) { - } - - /** Stub method for ISessionCallback.notifyPrevious */ - public void onPrevious(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller) { - } - - /** Stub method for ISessionCallback.notifyFastForward */ - public void onFastForward(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller) { - } - - /** Stub method for ISessionCallback.notifyRewind */ - public void onRewind(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller) { - } + private class CallbackStub extends ISessionCallback.Stub { + private WeakReference<MediaSessionEngine> mSessionImpl; - /** Stub method for ISessionCallback.notifySeekTo */ - public void onSeekTo(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, long pos) { + private RemoteUserInfo createRemoteUserInfo(String packageName, int pid, int uid) { + return new RemoteUserInfo(packageName, pid, uid); } - /** Stub method for ISessionCallback.notifyRate */ - public void onRate(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, @NonNull Rating rating) { - } - - /** Stub method for ISessionCallback.notifyCustomAction */ - public void onCustomAction(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, @NonNull String action, - @Nullable Bundle args) { - } - - /** Stub method for ISessionCallback.notifyAdjustVolume */ - public void onAdjustVolume(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, int direction) { - } - - /** Stub method for ISessionCallback.notifySetVolumeTo */ - public void onSetVolumeTo(@NonNull String packageName, int pid, int uid, - @NonNull ControllerCallbackLink caller, int value) { - } - } - - private class CallbackStubProxy extends ISessionCallback.Stub { @Override public void notifyCommand(String packageName, int pid, int uid, ControllerCallbackLink caller, String command, Bundle args, ResultReceiver cb) { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onCommand(packageName, pid, uid, caller, command, args, cb); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchCommand(createRemoteUserInfo(packageName, pid, uid), + command, args, cb); + } } finally { Binder.restoreCallingIdentity(token); } @@ -684,9 +579,15 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onMediaButton(packageName, pid, uid, mediaButtonIntent, - sequenceNumber, cb); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchMediaButton( + createRemoteUserInfo(packageName, pid, uid), mediaButtonIntent); + } } finally { + if (cb != null) { + cb.send(sequenceNumber, null); + } Binder.restoreCallingIdentity(token); } } @@ -697,8 +598,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onMediaButtonFromController(packageName, pid, uid, caller, - mediaButtonIntent); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchMediaButton(createRemoteUserInfo(packageName, pid, uid), + mediaButtonIntent); + } } finally { Binder.restoreCallingIdentity(token); } @@ -710,7 +614,10 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onPrepare(packageName, pid, uid, caller); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchPrepare(createRemoteUserInfo(packageName, pid, uid)); + } } finally { Binder.restoreCallingIdentity(token); } @@ -722,7 +629,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onPrepareFromMediaId(packageName, pid, uid, caller, mediaId, extras); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchPrepareFromMediaId( + createRemoteUserInfo(packageName, pid, uid), mediaId, extras); + } } finally { Binder.restoreCallingIdentity(token); } @@ -734,7 +645,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onPrepareFromSearch(packageName, pid, uid, caller, query, extras); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchPrepareFromSearch( + createRemoteUserInfo(packageName, pid, uid), query, extras); + } } finally { Binder.restoreCallingIdentity(token); } @@ -746,7 +661,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onPrepareFromUri(packageName, pid, uid, caller, uri, extras); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchPrepareFromUri( + createRemoteUserInfo(packageName, pid, uid), uri, extras); + } } finally { Binder.restoreCallingIdentity(token); } @@ -758,7 +677,10 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onPlay(packageName, pid, uid, caller); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchPlay(createRemoteUserInfo(packageName, pid, uid)); + } } finally { Binder.restoreCallingIdentity(token); } @@ -770,7 +692,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onPlayFromMediaId(packageName, pid, uid, caller, mediaId, extras); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchPlayFromMediaId( + createRemoteUserInfo(packageName, pid, uid), mediaId, extras); + } } finally { Binder.restoreCallingIdentity(token); } @@ -782,7 +708,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onPlayFromSearch(packageName, pid, uid, caller, query, extras); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchPlayFromSearch( + createRemoteUserInfo(packageName, pid, uid), query, extras); + } } finally { Binder.restoreCallingIdentity(token); } @@ -794,7 +724,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onPlayFromUri(packageName, pid, uid, caller, uri, extras); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchPlayFromUri( + createRemoteUserInfo(packageName, pid, uid), uri, extras); + } } finally { Binder.restoreCallingIdentity(token); } @@ -806,7 +740,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onSkipToTrack(packageName, pid, uid, caller, id); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchSkipToItem( + createRemoteUserInfo(packageName, pid, uid), id); + } } finally { Binder.restoreCallingIdentity(token); } @@ -818,7 +756,10 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onPause(packageName, pid, uid, caller); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchPause(createRemoteUserInfo(packageName, pid, uid)); + } } finally { Binder.restoreCallingIdentity(token); } @@ -830,7 +771,10 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onStop(packageName, pid, uid, caller); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchStop(createRemoteUserInfo(packageName, pid, uid)); + } } finally { Binder.restoreCallingIdentity(token); } @@ -842,7 +786,10 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onNext(packageName, pid, uid, caller); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchNext(createRemoteUserInfo(packageName, pid, uid)); + } } finally { Binder.restoreCallingIdentity(token); } @@ -854,7 +801,10 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onPrevious(packageName, pid, uid, caller); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchPrevious(createRemoteUserInfo(packageName, pid, uid)); + } } finally { Binder.restoreCallingIdentity(token); } @@ -866,7 +816,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onFastForward(packageName, pid, uid, caller); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchFastForward( + createRemoteUserInfo(packageName, pid, uid)); + } } finally { Binder.restoreCallingIdentity(token); } @@ -878,7 +832,10 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onRewind(packageName, pid, uid, caller); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchRewind(createRemoteUserInfo(packageName, pid, uid)); + } } finally { Binder.restoreCallingIdentity(token); } @@ -890,7 +847,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onSeekTo(packageName, pid, uid, caller, pos); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchSeekTo( + createRemoteUserInfo(packageName, pid, uid), pos); + } } finally { Binder.restoreCallingIdentity(token); } @@ -902,7 +863,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onRate(packageName, pid, uid, caller, rating); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchRate( + createRemoteUserInfo(packageName, pid, uid), rating); + } } finally { Binder.restoreCallingIdentity(token); } @@ -913,7 +878,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onCustomAction(packageName, pid, uid, caller, action, args); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchCustomAction( + createRemoteUserInfo(packageName, pid, uid), action, args); + } } finally { Binder.restoreCallingIdentity(token); } @@ -925,7 +894,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onAdjustVolume(packageName, pid, uid, caller, direction); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchAdjustVolume( + createRemoteUserInfo(packageName, pid, uid), direction); + } } finally { Binder.restoreCallingIdentity(token); } @@ -937,7 +910,11 @@ public final class SessionCallbackLink implements Parcelable { ensureMediaControlPermission(); final long token = Binder.clearCallingIdentity(); try { - mCallbackStub.onSetVolumeTo(packageName, pid, uid, caller, value); + MediaSessionEngine sessionImpl = mSessionImpl.get(); + if (sessionImpl != null) { + sessionImpl.dispatchSetVolumeTo( + createRemoteUserInfo(packageName, pid, uid), value); + } } finally { Binder.restoreCallingIdentity(token); } diff --git a/media/apex/java/android/media/session/SessionLink.aidl b/media/java/android/media/session/SessionLink.aidl index c3be23e8f6b7..c3be23e8f6b7 100644 --- a/media/apex/java/android/media/session/SessionLink.aidl +++ b/media/java/android/media/session/SessionLink.aidl diff --git a/media/apex/java/android/media/session/SessionLink.java b/media/java/android/media/session/SessionLink.java index 4ea762367010..4ea762367010 100644 --- a/media/apex/java/android/media/session/SessionLink.java +++ b/media/java/android/media/session/SessionLink.java diff --git a/media/apex/java/android/service/media/IMediaBrowserService.aidl b/media/java/android/service/media/IMediaBrowserService.aidl index 1c50ec7ac421..1c50ec7ac421 100644 --- a/media/apex/java/android/service/media/IMediaBrowserService.aidl +++ b/media/java/android/service/media/IMediaBrowserService.aidl diff --git a/media/apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl b/media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl index 507a8f72ea57..507a8f72ea57 100644 --- a/media/apex/java/android/service/media/IMediaBrowserServiceCallbacks.aidl +++ b/media/java/android/service/media/IMediaBrowserServiceCallbacks.aidl diff --git a/media/apex/java/android/service/media/MediaBrowserService.java b/media/java/android/service/media/MediaBrowserService.java index d9ef6ae40dfb..d9ef6ae40dfb 100644 --- a/media/apex/java/android/service/media/MediaBrowserService.java +++ b/media/java/android/service/media/MediaBrowserService.java diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp index 81fce8a8044b..866325c5ea9c 100644 --- a/media/jni/android_media_MediaDrm.cpp +++ b/media/jni/android_media_MediaDrm.cpp @@ -426,6 +426,9 @@ static bool throwExceptionAsNecessary( if (err == BAD_VALUE || err == ERROR_DRM_CANNOT_HANDLE) { jniThrowException(env, "java/lang/IllegalArgumentException", msg); return true; + } else if (err == ERROR_UNSUPPORTED) { + jniThrowException(env, "java/lang/UnsupportedOperationException", msg); + return true; } else if (err == ERROR_DRM_NOT_PROVISIONED) { jniThrowException(env, "android/media/NotProvisionedException", msg); return true; @@ -542,15 +545,15 @@ void JDrm::disconnect() { // static -bool JDrm::IsCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType, - DrmPlugin::SecurityLevel securityLevel) { +status_t JDrm::IsCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType, + DrmPlugin::SecurityLevel securityLevel, bool *isSupported) { sp<IDrm> drm = MakeDrm(); if (drm == NULL) { - return false; + return BAD_VALUE; } - return drm->isCryptoSchemeSupported(uuid, mimeType, securityLevel); + return drm->isCryptoSchemeSupported(uuid, mimeType, securityLevel, isSupported); } status_t JDrm::initCheck() const { @@ -977,7 +980,14 @@ static jboolean android_media_MediaDrm_isCryptoSchemeSupportedNative( } DrmPlugin::SecurityLevel securityLevel = jintToSecurityLevel(jSecurityLevel); - return JDrm::IsCryptoSchemeSupported(uuid.array(), mimeType, securityLevel); + bool isSupported; + status_t err = JDrm::IsCryptoSchemeSupported(uuid.array(), mimeType, + securityLevel, &isSupported); + + if (throwExceptionAsNecessary(env, err, "Failed to query crypto scheme support")) { + return false; + } + return isSupported; } static jbyteArray android_media_MediaDrm_openSession( diff --git a/media/jni/android_media_MediaDrm.h b/media/jni/android_media_MediaDrm.h index 93388612efcf..5ebac1d61648 100644 --- a/media/jni/android_media_MediaDrm.h +++ b/media/jni/android_media_MediaDrm.h @@ -37,9 +37,10 @@ public: }; struct JDrm : public BnDrmClient { - static bool IsCryptoSchemeSupported(const uint8_t uuid[16], - const String8 &mimeType, - DrmPlugin::SecurityLevel level); + static status_t IsCryptoSchemeSupported(const uint8_t uuid[16], + const String8 &mimeType, + DrmPlugin::SecurityLevel level, + bool *isSupported); JDrm(JNIEnv *env, jobject thiz, const uint8_t uuid[16], const String8 &appPackageName); diff --git a/native/webview/plat_support/draw_fn.h b/native/webview/plat_support/draw_fn.h index e31ce195214f..5b3e496be81a 100644 --- a/native/webview/plat_support/draw_fn.h +++ b/native/webview/plat_support/draw_fn.h @@ -84,7 +84,7 @@ struct AwDrawFn_InitVkParams { VkDevice device; VkQueue queue; uint32_t graphics_queue_index; - uint32_t instance_version; + uint32_t api_version; const char* const* enabled_instance_extension_names; uint32_t enabled_instance_extension_names_length; const char* const* enabled_device_extension_names; diff --git a/native/webview/plat_support/draw_functor.cpp b/native/webview/plat_support/draw_functor.cpp index afe103a25043..6deb47f09347 100644 --- a/native/webview/plat_support/draw_functor.cpp +++ b/native/webview/plat_support/draw_functor.cpp @@ -102,7 +102,7 @@ void initializeVk(int functor, void* data, .device = init_vk_params.device, .queue = init_vk_params.queue, .graphics_queue_index = init_vk_params.graphics_queue_index, - .instance_version = init_vk_params.instance_version, + .api_version = init_vk_params.api_version, .enabled_instance_extension_names = init_vk_params.enabled_instance_extension_names, .enabled_instance_extension_names_length = diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index 7eaf04bfb775..0a571c5c2736 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -60,7 +60,6 @@ import android.widget.TextView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import java.io.IOException; @@ -107,11 +106,11 @@ public class CaptivePortalLoginActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + mCaptivePortal = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL); logMetricsEvent(MetricsEvent.ACTION_CAPTIVE_PORTAL_LOGIN_ACTIVITY); mCm = ConnectivityManager.from(this); mNetwork = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_NETWORK); - mCaptivePortal = getIntent().getParcelableExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL); mUserAgent = getIntent().getStringExtra(ConnectivityManager.EXTRA_CAPTIVE_PORTAL_USER_AGENT); mUrl = getUrl(); @@ -637,7 +636,7 @@ public class CaptivePortalLoginActivity extends Activity { } private void logMetricsEvent(int event) { - MetricsLogger.action(this, event, getPackageName()); + mCaptivePortal.logEvent(event, getPackageName()); } private static final SparseArray<String> SSL_ERRORS = new SparseArray<>(); diff --git a/packages/CarSystemUI/res/values/integers_car.xml b/packages/CarSystemUI/res/values/integers_car.xml index 777283d6bf92..be2cb0d8d900 100644 --- a/packages/CarSystemUI/res/values/integers_car.xml +++ b/packages/CarSystemUI/res/values/integers_car.xml @@ -23,7 +23,7 @@ <!-- Number of milliseconds user can spend driving with the keyguard up. After that, we switch to Guest. --> <!-- If the number is negative, the feature is disabled. If it's zero, we switch to guest immediately as we start driving. --> - <integer name="driving_on_keyguard_timeout_ms">30000</integer> + <integer name="driving_on_keyguard_timeout_ms">-1</integer> <!--Percentage of the screen height, from the bottom, that a notification panel being partially closed at will result in it remaining open if released--> diff --git a/packages/ExtServices/Android.bp b/packages/ExtServices/Android.bp new file mode 100644 index 000000000000..77972fedfb0d --- /dev/null +++ b/packages/ExtServices/Android.bp @@ -0,0 +1,11 @@ +android_library { + name: "ExtServices-core", + srcs: [ + "src/**/*.java", + ], + resource_dirs: [ + "res", + ], + + manifest: "AndroidManifest.xml", +}
\ No newline at end of file diff --git a/packages/ExtServices/AndroidManifest.xml b/packages/ExtServices/AndroidManifest.xml index 010a810cd791..7fb51b9496b9 100644 --- a/packages/ExtServices/AndroidManifest.xml +++ b/packages/ExtServices/AndroidManifest.xml @@ -22,6 +22,7 @@ coreApp="true"> <uses-permission android:name="android.permission.PROVIDE_RESOLVER_RANKER_SERVICE" /> + <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" /> <application android:label="@string/app_name" android:defaultToDeviceProtectedStorage="true" diff --git a/packages/ExtServices/tests/Android.bp b/packages/ExtServices/tests/Android.bp new file mode 100644 index 000000000000..5de454836c2a --- /dev/null +++ b/packages/ExtServices/tests/Android.bp @@ -0,0 +1,26 @@ +android_test { + name: "ExtServicesUnitTests", + + // Include all test java files. + srcs: ["src/**/*.java"], + + // We only want this apk build for tests. + certificate: "platform", + + libs: [ + "android.test.runner", + "android.test.base", + ], + + static_libs: [ + "ExtServices-core", + "android-support-test", + "mockito-target-minus-junit4", + "espresso-core", + "truth-prebuilt", + "testables", + "testng", + ], + + platform_apis: true, +}
\ No newline at end of file diff --git a/packages/ExtServices/tests/Android.mk b/packages/ExtServices/tests/Android.mk deleted file mode 100644 index a57fa9458f08..000000000000 --- a/packages/ExtServices/tests/Android.mk +++ /dev/null @@ -1,26 +0,0 @@ -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -# We only want this apk build for tests. -LOCAL_MODULE_TAGS := tests -LOCAL_CERTIFICATE := platform - -LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base - -LOCAL_STATIC_JAVA_LIBRARIES := \ - android-support-test \ - mockito-target-minus-junit4 \ - espresso-core \ - truth-prebuilt \ - testables \ - testng - -# Include all test java files. -LOCAL_SRC_FILES := $(call all-java-files-under, src) - -LOCAL_PACKAGE_NAME := ExtServicesUnitTests -LOCAL_PRIVATE_PLATFORM_APIS := true - -LOCAL_INSTRUMENTATION_FOR := ExtServices - -include $(BUILD_PACKAGE) diff --git a/packages/ExtServices/tests/AndroidManifest.xml b/packages/ExtServices/tests/AndroidManifest.xml index ddf725b8cdfe..3cf152753e65 100644 --- a/packages/ExtServices/tests/AndroidManifest.xml +++ b/packages/ExtServices/tests/AndroidManifest.xml @@ -24,7 +24,7 @@ </application> <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner" - android:targetPackage="android.ext.services" + android:targetPackage="android.ext.services.tests.unit" android:label="ExtServices Test Cases"> </instrumentation> diff --git a/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java index 12908e619a3c..c59885e9f4d2 100644 --- a/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java +++ b/packages/ExtServices/tests/src/android/ext/services/notification/NotificationCategorizerTest.java @@ -180,7 +180,7 @@ public class NotificationCategorizerTest { assertFalse(nc.shouldSilence(NotificationCategorizer.CATEGORY_SYSTEM)); when(mSbn.getUid()).thenReturn(FIRST_APPLICATION_UID); - assertEquals(NotificationCategorizer.CATEGORY_EVERYTHING_ELSE, nc.getCategory(mEntry)); + assertEquals(NotificationCategorizer.CATEGORY_HIGH, nc.getCategory(mEntry)); } @Test diff --git a/packages/NetworkStack/Android.bp b/packages/NetworkStack/Android.bp index 9b0d896e483e..b0522f2a99a0 100644 --- a/packages/NetworkStack/Android.bp +++ b/packages/NetworkStack/Android.bp @@ -18,6 +18,7 @@ // system server on devices that run the stack there java_library { name: "NetworkStackLib", + sdk_version: "system_current", installable: true, srcs: [ "src/**/*.java", @@ -25,14 +26,15 @@ java_library { ":services-networkstack-shared-srcs", ], static_libs: [ - "services-netlink-lib", + "netd_aidl_interface-java", + "networkstack-aidl-interfaces-java", ] } // Updatable network stack packaged as an application android_app { name: "NetworkStack", - platform_apis: true, + sdk_version: "system_current", certificate: "platform", privileged: true, static_libs: [ diff --git a/packages/NetworkStack/src/android/net/apf/ApfFilter.java b/packages/NetworkStack/src/android/net/apf/ApfFilter.java index 08452bbbe433..4fa7d6462092 100644 --- a/packages/NetworkStack/src/android/net/apf/ApfFilter.java +++ b/packages/NetworkStack/src/android/net/apf/ApfFilter.java @@ -38,7 +38,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.net.LinkAddress; import android.net.LinkProperties; -import android.net.NetworkUtils; import android.net.apf.ApfGenerator.IllegalInstructionException; import android.net.apf.ApfGenerator.Register; import android.net.ip.IpClient.IpClientCallbacksWrapper; @@ -47,6 +46,8 @@ import android.net.metrics.ApfStats; import android.net.metrics.IpConnectivityLog; import android.net.metrics.RaEvent; import android.net.util.InterfaceParams; +import android.net.util.NetworkStackUtils; +import android.net.util.SocketUtils; import android.os.PowerManager; import android.os.SystemClock; import android.system.ErrnoException; @@ -60,8 +61,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.HexDump; import com.android.internal.util.IndentingPrintWriter; -import libcore.io.IoBridge; - import java.io.FileDescriptor; import java.io.IOException; import java.net.Inet4Address; @@ -200,10 +199,8 @@ public class ApfFilter { public void halt() { mStopped = true; - try { - // Interrupts the read() call the thread is blocked in. - IoBridge.closeAndSignalBlockedThreads(mSocket); - } catch (IOException ignored) {} + // Interrupts the read() call the thread is blocked in. + NetworkStackUtils.closeSocketQuietly(mSocket); } @Override @@ -470,8 +467,8 @@ public class ApfFilter { socket = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IPV6); SocketAddress addr = makePacketSocketAddress( (short) ETH_P_IPV6, mInterfaceParams.index); - Os.bind(socket, addr); - NetworkUtils.attachRaFilter(socket, mApfCapabilities.apfPacketFormat); + SocketUtils.bindSocket(socket, addr); + SocketUtils.attachRaFilter(socket, mApfCapabilities.apfPacketFormat); } catch(SocketException|ErrnoException e) { Log.e(TAG, "Error starting filter", e); return; diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java b/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java index 12eecc070a06..b0e8da9a7fb7 100644 --- a/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java +++ b/packages/NetworkStack/src/android/net/dhcp/DhcpClient.java @@ -28,6 +28,7 @@ import static android.net.dhcp.DhcpPacket.DHCP_SUBNET_MASK; import static android.net.dhcp.DhcpPacket.DHCP_VENDOR_INFO; import static android.net.dhcp.DhcpPacket.INADDR_ANY; import static android.net.dhcp.DhcpPacket.INADDR_BROADCAST; +import static android.net.util.NetworkStackUtils.closeSocketQuietly; import static android.net.util.SocketUtils.makePacketSocketAddress; import static android.system.OsConstants.AF_INET; import static android.system.OsConstants.AF_PACKET; @@ -44,7 +45,6 @@ import static com.android.server.util.NetworkStackConstants.IPV4_ADDR_ANY; import android.content.Context; import android.net.DhcpResults; -import android.net.NetworkUtils; import android.net.TrafficStats; import android.net.ip.IpClient; import android.net.metrics.DhcpClientEvent; @@ -66,8 +66,6 @@ import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.internal.util.WakeupMessage; -import libcore.io.IoBridge; - import java.io.FileDescriptor; import java.io.IOException; import java.net.Inet4Address; @@ -108,6 +106,12 @@ public class DhcpClient extends StateMachine { private static final boolean MSG_DBG = false; private static final boolean PACKET_DBG = false; + // Metrics events: must be kept in sync with server-side aggregation code. + /** Represents transitions from DhcpInitState to DhcpBoundState */ + private static final String EVENT_INITIAL_BOUND = "InitialBoundState"; + /** Represents transitions from and to DhcpBoundState via DhcpRenewingState */ + private static final String EVENT_RENEWING_BOUND = "RenewingBoundState"; + // Timers and timeouts. private static final int SECONDS = 1000; private static final int FIRST_TIMEOUT_MS = 2 * SECONDS; @@ -313,8 +317,8 @@ public class DhcpClient extends StateMachine { try { mPacketSock = Os.socket(AF_PACKET, SOCK_RAW, ETH_P_IP); SocketAddress addr = makePacketSocketAddress((short) ETH_P_IP, mIface.index); - Os.bind(mPacketSock, addr); - NetworkUtils.attachDhcpFilter(mPacketSock); + SocketUtils.bindSocket(mPacketSock, addr); + SocketUtils.attachDhcpFilter(mPacketSock); } catch(SocketException|ErrnoException e) { Log.e(TAG, "Error creating packet socket", e); return false; @@ -350,15 +354,9 @@ public class DhcpClient extends StateMachine { } } - private static void closeQuietly(FileDescriptor fd) { - try { - IoBridge.closeAndSignalBlockedThreads(fd); - } catch (IOException ignored) {} - } - private void closeSockets() { - closeQuietly(mUdpSock); - closeQuietly(mPacketSock); + closeSocketQuietly(mUdpSock); + closeSocketQuietly(mPacketSock); } class ReceiveThread extends Thread { @@ -414,7 +412,8 @@ public class DhcpClient extends StateMachine { try { if (encap == DhcpPacket.ENCAP_L2) { if (DBG) Log.d(TAG, "Broadcasting " + description); - Os.sendto(mPacketSock, buf.array(), 0, buf.limit(), 0, mInterfaceBroadcastAddr); + SocketUtils.sendTo( + mPacketSock, buf.array(), 0, buf.limit(), 0, mInterfaceBroadcastAddr); } else if (encap == DhcpPacket.ENCAP_BOOTP && to.equals(INADDR_BROADCAST)) { if (DBG) Log.d(TAG, "Broadcasting " + description); // We only send L3-encapped broadcasts in DhcpRebindingState, @@ -928,9 +927,9 @@ public class DhcpClient extends StateMachine { private void logTimeToBoundState() { long now = SystemClock.elapsedRealtime(); if (mLastBoundExitTime > mLastInitEnterTime) { - logState(DhcpClientEvent.RENEWING_BOUND, (int)(now - mLastBoundExitTime)); + logState(EVENT_RENEWING_BOUND, (int) (now - mLastBoundExitTime)); } else { - logState(DhcpClientEvent.INITIAL_BOUND, (int)(now - mLastInitEnterTime)); + logState(EVENT_INITIAL_BOUND, (int) (now - mLastInitEnterTime)); } } } @@ -1021,7 +1020,7 @@ public class DhcpClient extends StateMachine { // We need to broadcast and possibly reconnect the socket to a // completely different server. - closeQuietly(mUdpSock); + closeSocketQuietly(mUdpSock); if (!initUdpSocket()) { Log.e(TAG, "Failed to recreate UDP socket"); transitionTo(mDhcpInitState); diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java b/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java index eac8d2a3b410..96d1a287ef09 100644 --- a/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java +++ b/packages/NetworkStack/src/android/net/dhcp/DhcpPacketListener.java @@ -64,7 +64,7 @@ abstract class DhcpPacketListener extends FdEventsReader<DhcpPacketListener.Payl @Override protected int readPacket(@NonNull FileDescriptor fd, @NonNull Payload packetBuffer) throws Exception { - final InetSocketAddress addr = new InetSocketAddress(); + final InetSocketAddress addr = new InetSocketAddress(0); final int read = Os.recvfrom( fd, packetBuffer.mBytes, 0, packetBuffer.mBytes.length, 0 /* flags */, addr); diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java b/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java index beabd3eb3152..cd993e93998b 100644 --- a/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java +++ b/packages/NetworkStack/src/android/net/dhcp/DhcpServer.java @@ -28,6 +28,7 @@ import static android.net.shared.Inet4AddressUtils.getPrefixMaskAsInet4Address; import static android.system.OsConstants.AF_INET; import static android.system.OsConstants.IPPROTO_UDP; import static android.system.OsConstants.SOCK_DGRAM; +import static android.system.OsConstants.SOCK_NONBLOCK; import static android.system.OsConstants.SOL_SOCKET; import static android.system.OsConstants.SO_BROADCAST; import static android.system.OsConstants.SO_REUSEADDR; @@ -43,7 +44,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.net.INetworkStackStatusCallback; import android.net.MacAddress; -import android.net.NetworkUtils; import android.net.TrafficStats; import android.net.util.SharedLog; import android.net.util.SocketUtils; @@ -207,7 +207,7 @@ public class DhcpServer extends IDhcpServer.Stub { @Override public void addArpEntry(@NonNull Inet4Address ipv4Addr, @NonNull MacAddress ethAddr, @NonNull String ifname, @NonNull FileDescriptor fd) throws IOException { - NetworkUtils.addArpEntry(ipv4Addr, ethAddr, ifname, fd); + SocketUtils.addArpEntry(ipv4Addr, ethAddr, ifname, fd); } @Override @@ -630,7 +630,7 @@ public class DhcpServer extends IDhcpServer.Stub { // TODO: have and use an API to set a socket tag without going through the thread tag final int oldTag = TrafficStats.getAndSetThreadStatsTag(TAG_SYSTEM_DHCP_SERVER); try { - mSocket = Os.socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + mSocket = Os.socket(AF_INET, SOCK_DGRAM | SOCK_NONBLOCK, IPPROTO_UDP); SocketUtils.bindSocketToInterface(mSocket, mIfName); Os.setsockoptInt(mSocket, SOL_SOCKET, SO_REUSEADDR, 1); Os.setsockoptInt(mSocket, SOL_SOCKET, SO_BROADCAST, 1); diff --git a/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java b/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java index 31ce95b11ba9..3cd2aa40dfb2 100644 --- a/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java +++ b/packages/NetworkStack/src/android/net/dhcp/DhcpServingParams.java @@ -209,7 +209,7 @@ public class DhcpServingParams { * but it must always be set explicitly before building the {@link DhcpServingParams}. */ public Builder setDefaultRouters(@NonNull Inet4Address... defaultRouters) { - return setDefaultRouters(new ArraySet<>(Arrays.asList(defaultRouters))); + return setDefaultRouters(makeArraySet(defaultRouters)); } /** @@ -239,7 +239,7 @@ public class DhcpServingParams { * building the {@link DhcpServingParams}. */ public Builder setDnsServers(@NonNull Inet4Address... dnsServers) { - return setDnsServers(new ArraySet<>(Arrays.asList(dnsServers))); + return setDnsServers(makeArraySet(dnsServers)); } /** @@ -269,7 +269,7 @@ public class DhcpServingParams { * and do not need to be set here. */ public Builder setExcludedAddrs(@NonNull Inet4Address... excludedAddrs) { - return setExcludedAddrs(new ArraySet<>(Arrays.asList(excludedAddrs))); + return setExcludedAddrs(makeArraySet(excludedAddrs)); } /** @@ -368,4 +368,10 @@ public class DhcpServingParams { static IpPrefix makeIpPrefix(@NonNull LinkAddress addr) { return new IpPrefix(addr.getAddress(), addr.getPrefixLength()); } + + private static <T> ArraySet<T> makeArraySet(T[] elements) { + final ArraySet<T> set = new ArraySet<>(elements.length); + set.addAll(Arrays.asList(elements)); + return set; + } } diff --git a/packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java b/packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java index 385dd52e4576..649257ae3b5f 100644 --- a/packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java +++ b/packages/NetworkStack/src/android/net/ip/ConnectivityPacketTracker.java @@ -20,12 +20,13 @@ import static android.net.util.SocketUtils.makePacketSocketAddress; import static android.system.OsConstants.AF_PACKET; import static android.system.OsConstants.ARPHRD_ETHER; import static android.system.OsConstants.ETH_P_ALL; +import static android.system.OsConstants.SOCK_NONBLOCK; import static android.system.OsConstants.SOCK_RAW; -import android.net.NetworkUtils; import android.net.util.ConnectivityPacketSummary; import android.net.util.InterfaceParams; import android.net.util.PacketReader; +import android.net.util.SocketUtils; import android.os.Handler; import android.system.ErrnoException; import android.system.Os; @@ -33,7 +34,7 @@ import android.text.TextUtils; import android.util.LocalLog; import android.util.Log; -import libcore.util.HexEncoding; +import com.android.internal.util.HexDump; import java.io.FileDescriptor; import java.io.IOException; @@ -101,9 +102,10 @@ public class ConnectivityPacketTracker { protected FileDescriptor createFd() { FileDescriptor s = null; try { - s = Os.socket(AF_PACKET, SOCK_RAW, 0); - NetworkUtils.attachControlPacketFilter(s, ARPHRD_ETHER); - Os.bind(s, makePacketSocketAddress((short) ETH_P_ALL, mInterface.index)); + s = Os.socket(AF_PACKET, SOCK_RAW | SOCK_NONBLOCK, 0); + SocketUtils.attachControlPacketFilter(s, ARPHRD_ETHER); + SocketUtils.bindSocket( + s, makePacketSocketAddress((short) ETH_P_ALL, mInterface.index)); } catch (ErrnoException | IOException e) { logError("Failed to create packet tracking socket: ", e); closeFd(s); @@ -119,8 +121,7 @@ public class ConnectivityPacketTracker { if (summary == null) return; if (DBG) Log.d(mTag, summary); - addLogEntry(summary + - "\n[" + new String(HexEncoding.encode(recvbuf, 0, length)) + "]"); + addLogEntry(summary + "\n[" + HexDump.toHexString(recvbuf, 0, length) + "]"); } @Override diff --git a/packages/NetworkStack/src/android/net/ip/IpClient.java b/packages/NetworkStack/src/android/net/ip/IpClient.java index 4315d34ba447..12fe8c507db4 100644 --- a/packages/NetworkStack/src/android/net/ip/IpClient.java +++ b/packages/NetworkStack/src/android/net/ip/IpClient.java @@ -16,6 +16,7 @@ package android.net.ip; +import static android.net.RouteInfo.RTN_UNICAST; import static android.net.shared.IpConfigurationParcelableUtil.toStableParcelable; import static android.net.shared.LinkPropertiesParcelableUtil.fromStableParcelable; import static android.net.shared.LinkPropertiesParcelableUtil.toStableParcelable; @@ -36,7 +37,6 @@ import android.net.RouteInfo; import android.net.apf.ApfCapabilities; import android.net.apf.ApfFilter; import android.net.dhcp.DhcpClient; -import android.net.ip.IIpClientCallbacks; import android.net.metrics.IpConnectivityLog; import android.net.metrics.IpManagerEvent; import android.net.shared.InitialConfiguration; @@ -52,7 +52,6 @@ import android.util.LocalLog; import android.util.Log; import android.util.SparseArray; -import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IState; import com.android.internal.util.IndentingPrintWriter; @@ -992,7 +991,7 @@ public class IpClient extends StateMachine { // specified in the InitialConfiguration have been observed with Netlink. if (config.isProvisionedBy(newLp.getLinkAddresses(), null)) { for (IpPrefix prefix : config.directlyConnectedRoutes) { - newLp.addRoute(new RouteInfo(prefix, null, mInterfaceName)); + newLp.addRoute(new RouteInfo(prefix, null, mInterfaceName, RTN_UNICAST)); } } addAllReachableDnsServers(newLp, config.dnsServers); @@ -1093,7 +1092,7 @@ public class IpClient extends StateMachine { // If we have a StaticIpConfiguration attempt to apply it and // handle the result accordingly. if (mConfiguration.mStaticIpConfig != null) { - if (mInterfaceCtrl.setIPv4Address(mConfiguration.mStaticIpConfig.ipAddress)) { + if (mInterfaceCtrl.setIPv4Address(mConfiguration.mStaticIpConfig.getIpAddress())) { handleIPv4Success(new DhcpResults(mConfiguration.mStaticIpConfig)); } else { return false; @@ -1348,10 +1347,8 @@ public class IpClient extends StateMachine { apfConfig.apfCapabilities = mConfiguration.mApfCapabilities; apfConfig.multicastFilter = mMulticastFiltering; // Get the Configuration for ApfFilter from Context - apfConfig.ieee802_3Filter = - mContext.getResources().getBoolean(R.bool.config_apfDrop802_3Frames); - apfConfig.ethTypeBlackList = - mContext.getResources().getIntArray(R.array.config_apfEthTypeBlackList); + apfConfig.ieee802_3Filter = ApfCapabilities.getApfDrop8023Frames(mContext); + apfConfig.ethTypeBlackList = ApfCapabilities.getApfEthTypeBlackList(mContext); mApfFilter = ApfFilter.maybeCreate(mContext, apfConfig, mInterfaceParams, mCallback); // TODO: investigate the effects of any multicast filtering racing/interfering with the // rest of this IP configuration startup. diff --git a/packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java b/packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java index 2e6ff243a628..b29d61793a61 100644 --- a/packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java +++ b/packages/NetworkStack/src/android/net/ip/IpNeighborMonitor.java @@ -20,6 +20,10 @@ import static android.net.netlink.NetlinkConstants.RTM_DELNEIGH; import static android.net.netlink.NetlinkConstants.hexify; import static android.net.netlink.NetlinkConstants.stringForNlMsgType; import static android.net.util.SocketUtils.makeNetlinkSocketAddress; +import static android.system.OsConstants.AF_NETLINK; +import static android.system.OsConstants.NETLINK_ROUTE; +import static android.system.OsConstants.SOCK_DGRAM; +import static android.system.OsConstants.SOCK_NONBLOCK; import android.net.MacAddress; import android.net.netlink.NetlinkErrorMessage; @@ -27,8 +31,10 @@ import android.net.netlink.NetlinkMessage; import android.net.netlink.NetlinkSocket; import android.net.netlink.RtNetlinkNeighborMessage; import android.net.netlink.StructNdMsg; +import android.net.util.NetworkStackUtils; import android.net.util.PacketReader; import android.net.util.SharedLog; +import android.net.util.SocketUtils; import android.os.Handler; import android.os.SystemClock; import android.system.ErrnoException; @@ -36,8 +42,6 @@ import android.system.Os; import android.system.OsConstants; import android.util.Log; -import libcore.io.IoUtils; - import java.io.FileDescriptor; import java.net.InetAddress; import java.net.SocketAddress; @@ -77,7 +81,7 @@ public class IpNeighborMonitor extends PacketReader { 1, ip, StructNdMsg.NUD_PROBE, ifIndex, null); try { - NetlinkSocket.sendOneShotKernelMessage(OsConstants.NETLINK_ROUTE, msg); + NetlinkSocket.sendOneShotKernelMessage(NETLINK_ROUTE, msg); } catch (ErrnoException e) { Log.e(TAG, "Error " + msgSnippet + ": " + e); return -e.errno; @@ -145,8 +149,8 @@ public class IpNeighborMonitor extends PacketReader { FileDescriptor fd = null; try { - fd = NetlinkSocket.forProto(OsConstants.NETLINK_ROUTE); - Os.bind(fd, makeNetlinkSocketAddress(0, OsConstants.RTMGRP_NEIGH)); + fd = Os.socket(AF_NETLINK, SOCK_DGRAM | SOCK_NONBLOCK, NETLINK_ROUTE); + SocketUtils.bindSocket(fd, makeNetlinkSocketAddress(0, OsConstants.RTMGRP_NEIGH)); NetlinkSocket.connectToKernel(fd); if (VDBG) { @@ -155,7 +159,7 @@ public class IpNeighborMonitor extends PacketReader { } } catch (ErrnoException|SocketException e) { logError("Failed to create rtnetlink socket", e); - IoUtils.closeQuietly(fd); + NetworkStackUtils.closeSocketQuietly(fd); return null; } diff --git a/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java b/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java index 6dcf0c0d1626..98123a5c7261 100644 --- a/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java +++ b/packages/NetworkStack/src/android/net/util/NetworkStackUtils.java @@ -16,6 +16,9 @@ package android.net.util; +import java.io.FileDescriptor; +import java.io.IOException; + /** * Collection of utilities for the network stack. */ @@ -27,4 +30,14 @@ public class NetworkStackUtils { public static <T> boolean isEmpty(T[] array) { return array == null || array.length == 0; } + + /** + * Close a socket, ignoring any exception while closing. + */ + public static void closeSocketQuietly(FileDescriptor fd) { + try { + SocketUtils.closeSocket(fd); + } catch (IOException ignored) { + } + } } diff --git a/packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java b/packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java index 4f55779f473b..6fb4b0d79a64 100644 --- a/packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java +++ b/packages/NetworkStack/src/com/android/server/NetworkObserverRegistry.java @@ -15,6 +15,8 @@ */ package com.android.server; +import static android.net.RouteInfo.RTN_UNICAST; + import android.annotation.NonNull; import android.net.INetd; import android.net.INetdUnsolicitedEventListener; @@ -169,7 +171,7 @@ public class NetworkObserverRegistry extends INetdUnsolicitedEventListener.Stub public void onRouteChanged(boolean updated, String route, String gateway, String ifName) { final RouteInfo processRoute = new RouteInfo(new IpPrefix(route), ("".equals(gateway)) ? null : InetAddresses.parseNumericAddress(gateway), - ifName); + ifName, RTN_UNICAST); if (updated) { invokeForAllObservers(o -> o.onRouteUpdated(processRoute)); } else { diff --git a/packages/NetworkStack/src/com/android/server/NetworkStackService.java b/packages/NetworkStack/src/com/android/server/NetworkStackService.java index 7405c471808a..cedcb84e9d08 100644 --- a/packages/NetworkStack/src/com/android/server/NetworkStackService.java +++ b/packages/NetworkStack/src/com/android/server/NetworkStackService.java @@ -19,6 +19,7 @@ package com.android.server; import static android.net.dhcp.IDhcpServer.STATUS_INVALID_ARGUMENT; import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS; import static android.net.dhcp.IDhcpServer.STATUS_UNKNOWN_ERROR; +import static android.net.shared.NetworkParcelableUtil.fromStableParcelable; import static com.android.server.util.PermissionUtil.checkDumpPermission; import static com.android.server.util.PermissionUtil.checkNetworkStackCallingPermission; @@ -34,7 +35,7 @@ import android.net.INetworkMonitor; import android.net.INetworkMonitorCallbacks; import android.net.INetworkStackConnector; import android.net.Network; -import android.net.NetworkRequest; +import android.net.NetworkParcelable; import android.net.PrivateDnsConfigParcel; import android.net.dhcp.DhcpServer; import android.net.dhcp.DhcpServingParams; @@ -150,13 +151,12 @@ public class NetworkStackService extends Service { } @Override - public void makeNetworkMonitor(int netId, String name, INetworkMonitorCallbacks cb) + public void makeNetworkMonitor( + NetworkParcelable network, String name, INetworkMonitorCallbacks cb) throws RemoteException { - final Network network = new Network(netId, false /* privateDnsBypass */); - final NetworkRequest defaultRequest = mCm.getDefaultRequest(); - final SharedLog log = addValidationLogs(network, name); - final NetworkMonitor nm = new NetworkMonitor( - mContext, cb, network, defaultRequest, log); + final Network parsedNetwork = fromStableParcelable(network); + final SharedLog log = addValidationLogs(parsedNetwork, name); + final NetworkMonitor nm = new NetworkMonitor(mContext, cb, parsedNetwork, log); cb.onNetworkMonitorCreated(new NetworkMonitorImpl(nm)); } diff --git a/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java b/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java index 96eaa505389d..b34efc46f3b4 100644 --- a/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java +++ b/packages/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java @@ -47,7 +47,6 @@ import android.net.INetworkMonitorCallbacks; import android.net.LinkProperties; import android.net.Network; import android.net.NetworkCapabilities; -import android.net.NetworkRequest; import android.net.ProxyInfo; import android.net.TrafficStats; import android.net.Uri; @@ -310,14 +309,14 @@ public class NetworkMonitor extends StateMachine { private long mLastProbeTime; public NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network, - NetworkRequest defaultRequest, SharedLog validationLog) { - this(context, cb, network, defaultRequest, new IpConnectivityLog(), validationLog, + SharedLog validationLog) { + this(context, cb, network, new IpConnectivityLog(), validationLog, Dependencies.DEFAULT); } @VisibleForTesting protected NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network, - NetworkRequest defaultRequest, IpConnectivityLog logger, SharedLog validationLogs, + IpConnectivityLog logger, SharedLog validationLogs, Dependencies deps) { // Add suffix indicating which NetworkMonitor we're talking about. super(TAG + "/" + network.toString()); @@ -369,8 +368,7 @@ public class NetworkMonitor extends StateMachine { // we can ever fetch them. // TODO: Delete ASAP. mLinkProperties = new LinkProperties(); - mNetworkCapabilities = new NetworkCapabilities(); - mNetworkCapabilities.clearAll(); + mNetworkCapabilities = new NetworkCapabilities(null); } /** @@ -689,6 +687,15 @@ public class NetworkMonitor extends StateMachine { } sendMessage(CMD_CAPTIVE_PORTAL_APP_FINISHED, response); } + + @Override + public void logEvent(int eventId, String packageName) + throws RemoteException { + mContext.enforceCallingPermission( + android.Manifest.permission.CONNECTIVITY_INTERNAL, + "CaptivePortal"); + mCallback.logCaptivePortalLoginEvent(eventId, packageName); + } })); final CaptivePortalProbeResult probeRes = mLastPortalProbeResult; intent.putExtra(EXTRA_CAPTIVE_PORTAL_URL, probeRes.detectUrl); diff --git a/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java b/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java index dced7435ee74..6e11c409e104 100644 --- a/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java +++ b/packages/NetworkStack/tests/src/android/net/util/PacketReaderTest.java @@ -17,7 +17,13 @@ package android.net.util; import static android.net.util.PacketReader.DEFAULT_RECV_BUF_SIZE; -import static android.system.OsConstants.*; +import static android.system.OsConstants.AF_INET6; +import static android.system.OsConstants.IPPROTO_UDP; +import static android.system.OsConstants.SOCK_DGRAM; +import static android.system.OsConstants.SOCK_NONBLOCK; +import static android.system.OsConstants.SOL_SOCKET; +import static android.system.OsConstants.SO_SNDTIMEO; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -31,10 +37,12 @@ import android.system.ErrnoException; import android.system.Os; import android.system.StructTimeval; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.UncheckedIOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.Inet6Address; @@ -45,13 +53,6 @@ import java.util.Arrays; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import org.junit.runner.RunWith; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import libcore.io.IoBridge; - /** * Tests for PacketReader. * @@ -80,7 +81,7 @@ public class PacketReaderTest { protected FileDescriptor createFd() { FileDescriptor s = null; try { - s = Os.socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); + s = Os.socket(AF_INET6, SOCK_DGRAM | SOCK_NONBLOCK, IPPROTO_UDP); Os.bind(s, LOOPBACK6, 0); mLocalSockName = (InetSocketAddress) Os.getsockname(s); Os.setsockoptTimeval(s, SOL_SOCKET, SO_SNDTIMEO, TIMEO); diff --git a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java index d31fa7732e66..d11bb64213c3 100644 --- a/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java +++ b/packages/NetworkStack/tests/src/com/android/server/connectivity/NetworkMonitorTest.java @@ -21,7 +21,6 @@ import static android.net.ConnectivityManager.EXTRA_CAPTIVE_PORTAL; import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_INVALID; import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_VALID; import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; -import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; @@ -51,7 +50,6 @@ import android.net.LinkProperties; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkInfo; -import android.net.NetworkRequest; import android.net.captiveportal.CaptivePortalProbeResult; import android.net.metrics.IpConnectivityLog; import android.net.util.SharedLog; @@ -103,7 +101,6 @@ public class NetworkMonitorTest { private @Mock NetworkMonitor.Dependencies mDependencies; private @Mock INetworkMonitorCallbacks mCallbacks; private @Spy Network mNetwork = new Network(TEST_NETID); - private NetworkRequest mRequest; private static final int TEST_NETID = 4242; @@ -178,10 +175,6 @@ public class NetworkMonitorTest { InetAddresses.parseNumericAddress("192.168.0.0") }).when(mNetwork).getAllByName(any()); - mRequest = new NetworkRequest.Builder() - .addCapability(NET_CAPABILITY_INTERNET) - .addCapability(NET_CAPABILITY_NOT_RESTRICTED) - .build(); // Default values. Individual tests can override these. when(mCm.getLinkProperties(any())).thenReturn(TEST_LINKPROPERTIES); when(mCm.getNetworkCapabilities(any())).thenReturn(METERED_CAPABILITIES); @@ -195,9 +188,9 @@ public class NetworkMonitorTest { private class WrappedNetworkMonitor extends NetworkMonitor { private long mProbeTime = 0; - WrappedNetworkMonitor(Context context, Network network, NetworkRequest defaultRequest, - IpConnectivityLog logger, Dependencies deps) { - super(context, mCallbacks, network, defaultRequest, logger, + WrappedNetworkMonitor(Context context, Network network, IpConnectivityLog logger, + Dependencies deps) { + super(context, mCallbacks, network, logger, new SharedLog("test_nm"), deps); } @@ -213,7 +206,7 @@ public class NetworkMonitorTest { private WrappedNetworkMonitor makeMeteredWrappedNetworkMonitor() { final WrappedNetworkMonitor nm = new WrappedNetworkMonitor( - mContext, mNetwork, mRequest, mLogger, mDependencies); + mContext, mNetwork, mLogger, mDependencies); when(mCm.getNetworkCapabilities(any())).thenReturn(METERED_CAPABILITIES); nm.start(); waitForIdle(nm.getHandler()); @@ -222,7 +215,7 @@ public class NetworkMonitorTest { private WrappedNetworkMonitor makeNotMeteredWrappedNetworkMonitor() { final WrappedNetworkMonitor nm = new WrappedNetworkMonitor( - mContext, mNetwork, mRequest, mLogger, mDependencies); + mContext, mNetwork, mLogger, mDependencies); when(mCm.getNetworkCapabilities(any())).thenReturn(NOT_METERED_CAPABILITIES); nm.start(); waitForIdle(nm.getHandler()); @@ -231,7 +224,7 @@ public class NetworkMonitorTest { private NetworkMonitor makeMonitor() { final NetworkMonitor nm = new NetworkMonitor( - mContext, mCallbacks, mNetwork, mRequest, mLogger, mValidationLogger, + mContext, mCallbacks, mNetwork, mLogger, mValidationLogger, mDependencies); nm.start(); waitForIdle(nm.getHandler()); diff --git a/packages/SettingsLib/ActionBarShadow/Android.bp b/packages/SettingsLib/ActionBarShadow/Android.bp new file mode 100644 index 000000000000..d2848564abea --- /dev/null +++ b/packages/SettingsLib/ActionBarShadow/Android.bp @@ -0,0 +1,14 @@ +android_library { + name: "SettingsLibActionBarShadow", + + srcs: ["src/**/*.java"], + + static_libs: [ + "androidx.annotation_annotation", + "androidx.lifecycle_lifecycle-runtime", + "androidx.recyclerview_recyclerview", + ], + + sdk_version: "system_current", + min_sdk_version: "21", +} diff --git a/packages/SettingsLib/ActionBarShadow/AndroidManifest.xml b/packages/SettingsLib/ActionBarShadow/AndroidManifest.xml new file mode 100644 index 000000000000..4b9f1ab8d6cc --- /dev/null +++ b/packages/SettingsLib/ActionBarShadow/AndroidManifest.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2018 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.settingslib.widget"> + + <uses-sdk android:minSdkVersion="21" /> + +</manifest> diff --git a/packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java b/packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java new file mode 100644 index 000000000000..68ba5fbd120f --- /dev/null +++ b/packages/SettingsLib/ActionBarShadow/src/com/android/settingslib/widget/ActionBarShadowController.java @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.widget; + +import static androidx.lifecycle.Lifecycle.Event.ON_START; +import static androidx.lifecycle.Lifecycle.Event.ON_STOP; + +import android.app.ActionBar; +import android.app.Activity; +import android.view.View; + +import androidx.annotation.VisibleForTesting; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleObserver; +import androidx.lifecycle.OnLifecycleEvent; +import androidx.recyclerview.widget.RecyclerView; + +/** + * UI controller that adds a shadow appear/disappear animation to action bar scroll. + */ +public class ActionBarShadowController implements LifecycleObserver { + + @VisibleForTesting + static final float ELEVATION_HIGH = 8; + @VisibleForTesting + static final float ELEVATION_LOW = 0; + + @VisibleForTesting + ScrollChangeWatcher mScrollChangeWatcher; + private RecyclerView mRecyclerView; + private boolean mIsScrollWatcherAttached; + + /** + * Wire up the animation to to an {@link Activity}. Shadow will be applied to activity's + * action bar. + */ + public static ActionBarShadowController attachToRecyclerView( + Activity activity, Lifecycle lifecycle, RecyclerView recyclerView) { + return new ActionBarShadowController(activity, lifecycle, recyclerView); + } + + /** + * Wire up the animation to to a {@link View}. Shadow will be applied to the view. + */ + public static ActionBarShadowController attachToRecyclerView( + View anchorView, Lifecycle lifecycle, RecyclerView recyclerView) { + return new ActionBarShadowController(anchorView, lifecycle, recyclerView); + } + + private ActionBarShadowController(Activity activity, Lifecycle lifecycle, + RecyclerView recyclerView) { + mScrollChangeWatcher = + new ActionBarShadowController.ScrollChangeWatcher(activity); + mRecyclerView = recyclerView; + attachScrollWatcher(); + lifecycle.addObserver(this); + } + + private ActionBarShadowController(View anchorView, Lifecycle lifecycle, + RecyclerView recyclerView) { + mScrollChangeWatcher = + new ActionBarShadowController.ScrollChangeWatcher(anchorView); + mRecyclerView = recyclerView; + attachScrollWatcher(); + lifecycle.addObserver(this); + } + + @OnLifecycleEvent(ON_START) + private void attachScrollWatcher() { + if (!mIsScrollWatcherAttached) { + mIsScrollWatcherAttached = true; + mRecyclerView.addOnScrollListener(mScrollChangeWatcher); + mScrollChangeWatcher.updateDropShadow(mRecyclerView); + } + } + + @OnLifecycleEvent(ON_STOP) + private void detachScrollWatcher() { + mRecyclerView.removeOnScrollListener(mScrollChangeWatcher); + mIsScrollWatcherAttached = false; + } + + /** + * Update the drop shadow as the scrollable entity is scrolled. + */ + final class ScrollChangeWatcher extends RecyclerView.OnScrollListener { + + private final Activity mActivity; + private final View mAnchorView; + + ScrollChangeWatcher(Activity activity) { + mActivity = activity; + mAnchorView = null; + } + + ScrollChangeWatcher(View anchorView) { + mAnchorView = anchorView; + mActivity = null; + } + + // RecyclerView scrolled. + @Override + public void onScrolled(RecyclerView view, int dx, int dy) { + updateDropShadow(view); + } + + public void updateDropShadow(View view) { + final boolean shouldShowShadow = view.canScrollVertically(-1); + if (mAnchorView != null) { + mAnchorView.setElevation(shouldShowShadow ? ELEVATION_HIGH : ELEVATION_LOW); + } else if (mActivity != null) { // activity can become null when running monkey + final ActionBar actionBar = mActivity.getActionBar(); + if (actionBar != null) { + actionBar.setElevation(shouldShowShadow ? ELEVATION_HIGH : ELEVATION_LOW); + } + } + } + } +} diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp index 2321790fa960..5a81f8bc6566 100644 --- a/packages/SettingsLib/Android.bp +++ b/packages/SettingsLib/Android.bp @@ -13,6 +13,7 @@ android_library { "SettingsLibHelpUtils", "SettingsLibRestrictedLockUtils", + "SettingsLibActionBarShadow", "SettingsLibAppPreference", "SettingsLibSearchWidget", "SettingsLibSettingsSpinner", diff --git a/packages/SettingsLib/OWNERS b/packages/SettingsLib/OWNERS index d188c65be883..d87908738b56 100644 --- a/packages/SettingsLib/OWNERS +++ b/packages/SettingsLib/OWNERS @@ -4,7 +4,7 @@ asargent@google.com dehboxturtle@google.com dhnishi@google.com dling@google.com -dsandler@google.com +dsandler@android.com evanlaird@google.com jackqdyulei@google.com jmonk@google.com diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index c8f8d737fb0e..191bd8fadaf8 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -99,12 +99,14 @@ <string name="connected_via_network_scorer_default">Automatically connected via network rating provider</string> <!-- Status message of Wi-Fi when it is connected by Passpoint configuration. [CHAR LIMIT=NONE] --> <string name="connected_via_passpoint">Connected via %1$s</string> + <!-- Status message of Wi-Fi when it is connected by a app (via suggestion or network request). [CHAR LIMIT=NONE] --> + <string name="connected_via_app">Connected via <xliff:g id="name" example="Wifi App">%1$s</xliff:g></string> <!-- Status message of Wi-Fi when it is connected by Passpoint configuration. [CHAR LIMIT=NONE] --> <string name="ssid_by_passpoint_provider"><xliff:g id="ssid" example="Cafe Wifi">%1$s</xliff:g> by <xliff:g id="passpointProvider" example="Passpoint Provider">%2$s</xliff:g></string> <!-- Status message of Wi-Fi when network has matching passpoint credentials. [CHAR LIMIT=NONE] --> <string name="available_via_passpoint">Available via %1$s</string> <!-- Status message of OSU Provider network when not connected. [CHAR LIMIT=NONE] --> - <string name="tap_to_set_up">Tap to set up</string> + <string name="tap_to_sign_up">Tap to sign up</string> <!-- Package name for Settings app--> <string name="settings_package" translatable="false">com.android.settings</string> <!-- Package name for Certinstaller app--> @@ -127,78 +129,16 @@ <!-- Status message of Wi-Fi when an available network is a carrier network. [CHAR LIMIT=NONE] --> <string name="available_via_carrier">Available via %1$s</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_AP_CONNECTION. [CHAR LIMIT=NONE] --> - <string name="osu_failure_ap_connection">Connection failed</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_URL_INVALID. [CHAR LIMIT=NONE] --> - <string name="osu_failure_server_url_invalid">Invalid OSU server URL</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_CONNECTION. [CHAR LIMIT=NONE] --> - <string name="osu_failure_server_connection">OSU server connection failed</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVER_VALIDATION. [CHAR LIMIT=NONE] --> - <string name="osu_failure_server_validation">OSU server validation failed</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION. [CHAR LIMIT=NONE] --> - <string name="osu_failure_service_provider_verification">Invalid OSU server certificate</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_PROVISIONING_ABORTED. [CHAR LIMIT=NONE] --> - <string name="osu_failure_provisioning_aborted">Provisioning aborted</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_PROVISIONING_NOT_AVAILABLE. [CHAR LIMIT=NONE] --> - <string name="osu_failure_provisioning_not_available">Provisioning not available</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_INVALID_SERVER_URL. [CHAR LIMIT=NONE] --> - <string name="osu_failure_invalid_server_url">Invalid OSU server URL</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_COMMAND_TYPE. [CHAR LIMIT=NONE] --> - <string name="osu_failure_unexpected_command_type">Unexpected command type</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE. [CHAR LIMIT=NONE] --> - <string name="osu_failure_unexpected_soap_message_type">Unexpected SOAP message type</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_SOAP_MESSAGE_EXCHANGE. [CHAR LIMIT=NONE] --> - <string name="osu_failure_soap_message_exchange">SOAP message exchange failed</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_START_REDIRECT_LISTENER. [CHAR LIMIT=NONE] --> - <string name="osu_failure_start_redirect_listener">Redirect listener failed to start</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER. [CHAR LIMIT=NONE] --> - <string name="osu_failure_timed_out_redirect_listener">Timed out waiting for redirect</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_OSU_ACTIVITY_FOUND. [CHAR LIMIT=NONE] --> - <string name="osu_failure_no_osu_activity_found">No OSU activity found</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS. [CHAR LIMIT=NONE] --> - <string name="osu_failure_unexpected_soap_message_status">Unexpected SOAP message status</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_PPS_MO. [CHAR LIMIT=NONE] --> - <string name="osu_failure_no_pps_mo">Failed to find PPS-MO</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] --> - <string name="osu_failure_no_aaa_server_trust_root_node">Failed to find trust root node for AAA server</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] --> - <string name="osu_failure_no_remediation_server_trust_root_node">Failed to find trust root node for remediation server</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE. [CHAR LIMIT=NONE] --> - <string name="osu_failure_no_policy_server_trust_root_node">Failed to find trust root node for policy server</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES. [CHAR LIMIT=NONE] --> - <string name="osu_failure_retrieve_trust_root_certificates">Failed to retrieve trust root certificates</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE. [CHAR LIMIT=NONE] --> - <string name="osu_failure_no_aaa_trust_root_certificate">Failed to find trust root certificate for AAA server</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION. [CHAR LIMIT=NONE] --> - <string name="osu_failure_add_passpoint_configuration">Failed to add PassPoint configuration</string> - <!-- Status message of OSU Provider on receiving OSU_FAILURE_OSU_PROVIDER_NOT_FOUND. [CHAR LIMIT=NONE] --> - <string name="osu_failure_osu_provider_not_found">Failed to find an OSU provider</string> - - <!-- Status message of OSU Provider on receiving OSU_STATUS_AP_CONNECTING. [CHAR LIMIT=NONE] --> - <string name="osu_status_ap_connecting">Connecting</string> - <!-- Status message of OSU Provider on receiving OSU_STATUS_AP_CONNECTED. [CHAR LIMIT=NONE] --> - <string name="osu_status_ap_connected">Connected</string> - <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_CONNECTING. [CHAR LIMIT=NONE] --> - <string name="osu_status_server_connecting">Connecting to OSU server</string> - <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_VALIDATED. [CHAR LIMIT=NONE] --> - <string name="osu_status_server_validated">OSU server validated</string> - <!-- Status message of OSU Provider on receiving OSU_STATUS_SERVER_CONNECTED. [CHAR LIMIT=NONE] --> - <string name="osu_status_server_connected">Connected to OSU server</string> - <!-- Status message of OSU Provider on receiving OSU_STATUS_INIT_SOAP_EXCHANGE. [CHAR LIMIT=NONE] --> - <string name="osu_status_init_soap_exchange">Initial SOAP exchange</string> - <!-- Status message of OSU Provider on receiving OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE. [CHAR LIMIT=NONE] --> - <string name="osu_status_waiting_for_redirect_response">Waiting for redirect response</string> - <!-- Status message of OSU Provider on receiving OSU_STATUS_REDIRECT_RESPONSE_RECEIVED. [CHAR LIMIT=NONE] --> - <string name="osu_status_redirect_response_received">Received redirect response</string> - <!-- Status message of OSU Provider on receiving OSU_STATUS_SECOND_SOAP_EXCHANGE. [CHAR LIMIT=NONE] --> - <string name="osu_status_second_soap_exchange">Second SOAP exchange</string> - <!-- Status message of OSU Provider on receiving OSU_STATUS_THIRD_SOAP_EXCHANGE. [CHAR LIMIT=NONE] --> - <string name="osu_status_third_soap_exchange">Third SOAP exchange</string> - <!-- Status message of OSU Provider on receiving OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS. [CHAR LIMIT=NONE] --> - <string name="osu_status_retrieving_trust_root_certs">Retrieving trust root certificates</string> - + <!-- Status message of OSU Provider upon initiating provisioning flow [CHAR LIMIT=NONE] --> + <string name="osu_opening_provider">Opening <xliff:g id="passpointProvider" example="Passpoint Provider">%1$s</xliff:g></string> + <!-- Status message of OSU Provider when connection fails [CHAR LIMIT=NONE] --> + <string name="osu_connect_failed">Couldn\u2019t connect</string> + <!-- Status message of OSU Provider after user completes provisioning flow [CHAR LIMIT=NONE] --> + <string name="osu_completing_sign_up">Completing sign-up\u2026</string> + <!-- Status message of OSU Provider when sign up could not be completed [CHAR LIMIT=NONE] --> + <string name="osu_sign_up_failed">Couldn\u2019t complete sign-up. Tap to try again.</string> <!-- Status message of OSU Provider on completing provisioning. [CHAR LIMIT=NONE] --> - <string name="osu_provisioning_complete">Provisioning complete</string> + <string name="osu_sign_up_complete">Sign-up complete. Connecting\u2026</string> <!-- Speed label for very slow network speed --> <string name="speed_label_very_slow">Very Slow</string> @@ -616,8 +556,6 @@ <string name="wifi_display_certification">Wireless display certification</string> <!-- Setting Checkbox title whether to enable WiFi Verbose Logging. [CHAR LIMIT=40] --> <string name="wifi_verbose_logging">Enable Wi\u2011Fi Verbose Logging</string> - <!-- Setting Checkbox title whether to enable connected MAC randomization --> - <string name="wifi_connected_mac_randomization">Connected MAC Randomization</string> <!-- Setting Checkbox title whether to always keep mobile data active. [CHAR LIMIT=80] --> <string name="mobile_data_always_on">Mobile data always active</string> <!-- Setting Checkbox title whether to enable hardware acceleration for tethering. [CHAR LIMIT=80] --> @@ -673,8 +611,6 @@ <string name="wifi_display_certification_summary">Show options for wireless display certification</string> <!-- Setting Checkbox summary whether to enable Wifi verbose Logging [CHAR LIMIT=80] --> <string name="wifi_verbose_logging_summary">Increase Wi\u2011Fi logging level, show per SSID RSSI in Wi\u2011Fi Picker</string> - <!-- Setting Checkbox title whether to enable connected MAC randomization --> - <string name="wifi_connected_mac_randomization_summary">Randomize MAC address when connecting to Wi\u2011Fi networks</string> <!-- Label indicating network has been manually marked as metered --> <string name="wifi_metered_label">Metered</string> <!-- Label indicating network has been manually marked as unmetered --> diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index 9b12a31dc149..ed8b48742f98 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -888,19 +888,19 @@ public class AccessPoint implements Comparable<AccessPoint> { if (isOsuProvider()) { if (mOsuProvisioningComplete) { - summary.append(mContext.getString(R.string.osu_provisioning_complete)); + summary.append(mContext.getString(R.string.osu_sign_up_complete)); } else if (mOsuFailure != null) { summary.append(mOsuFailure); } else if (mOsuStatus != null) { summary.append(mOsuStatus); } else { - summary.append(mContext.getString(R.string.tap_to_set_up)); + summary.append(mContext.getString(R.string.tap_to_sign_up)); } } else if (isActive()) { if (isPasspoint()) { // This is the active connection on passpoint summary.append(getSummary(mContext, ssid, getDetailedState(), - false, mConfig.providerFriendlyName)); + false, null, mConfig.providerFriendlyName)); } else if (mConfig != null && getDetailedState() == DetailedState.CONNECTED && mIsCarrierAp) { // This is the active connection on a carrier AP @@ -909,7 +909,8 @@ public class AccessPoint implements Comparable<AccessPoint> { } else { // This is the active connection on non-passpoint network summary.append(getSummary(mContext, getDetailedState(), - mInfo != null && mInfo.isEphemeral())); + mInfo != null && mInfo.isEphemeral(), + mInfo != null ? mInfo.getNetworkSuggestionOrSpecifierPackageName() : null)); } } else { // not active if (mConfig != null && mConfig.hasNoInternetAccess()) { @@ -1322,13 +1323,34 @@ public class AccessPoint implements Comparable<AccessPoint> { return mRssi != UNREACHABLE_RSSI; } + private static CharSequence getAppLabel(String packageName, PackageManager packageManager) { + CharSequence appLabel = ""; + ApplicationInfo appInfo = null; + try { + int userId = UserHandle.getUserId(UserHandle.USER_CURRENT); + appInfo = packageManager.getApplicationInfoAsUser(packageName, 0 /* flags */, userId); + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Failed to get app info", e); + return appLabel; + } + if (appInfo != null) { + appLabel = appInfo.loadLabel(packageManager); + } + return appLabel; + } + public static String getSummary(Context context, String ssid, DetailedState state, - boolean isEphemeral, String passpointProvider) { + boolean isEphemeral, String suggestionOrSpecifierPackageName, + String passpointProvider) { if (state == DetailedState.CONNECTED) { if (!TextUtils.isEmpty(passpointProvider)) { // Special case for connected + passpoint networks. String format = context.getString(R.string.ssid_by_passpoint_provider); return String.format(format, ssid, passpointProvider); + } else if (isEphemeral && !TextUtils.isEmpty(suggestionOrSpecifierPackageName)) { + CharSequence appLabel = + getAppLabel(suggestionOrSpecifierPackageName, context.getPackageManager()); + return context.getString(R.string.connected_via_app, appLabel); } else if (isEphemeral) { // Special case for connected + ephemeral networks. final NetworkScoreManager networkScoreManager = context.getSystemService( @@ -1379,13 +1401,17 @@ public class AccessPoint implements Comparable<AccessPoint> { return String.format(formats[index], ssid); } - public static String getSummary(Context context, DetailedState state, boolean isEphemeral) { - return getSummary(context, null, state, isEphemeral, null); + public static String getSummary(Context context, DetailedState state, boolean isEphemeral, + String suggestionOrSpecifierPackageName) { + return getSummary(context, null, state, isEphemeral, suggestionOrSpecifierPackageName, + null); } public static String getSummary(Context context, DetailedState state, boolean isEphemeral, - String passpointProvider) { - return getSummary(context, null, state, isEphemeral, passpointProvider); + String suggestionOrSpecifierPackageName, + String passpointProvider) { + return getSummary(context, null, state, false, suggestionOrSpecifierPackageName, + passpointProvider); } public static String convertToQuotedString(String string) { @@ -1528,91 +1554,12 @@ public class AccessPoint implements Comparable<AccessPoint> { * All methods are invoked on the Main Thread */ private class AccessPointProvisioningCallback extends ProvisioningCallback { - // TODO: Remove logs and implement summary changing logic for these provisioning callbacks. @Override @MainThread public void onProvisioningFailure(int status) { - switch (status) { - case OSU_FAILURE_AP_CONNECTION: - mOsuFailure = mContext.getString(R.string.osu_failure_ap_connection); - break; - case OSU_FAILURE_SERVER_URL_INVALID: - mOsuFailure = mContext.getString(R.string.osu_failure_server_url_invalid); - break; - case OSU_FAILURE_SERVER_CONNECTION: - mOsuFailure = mContext.getString(R.string.osu_failure_server_connection); - break; - case OSU_FAILURE_SERVER_VALIDATION: - mOsuFailure = mContext.getString(R.string.osu_failure_server_validation); - break; - case OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION: - mOsuFailure = mContext.getString( - R.string.osu_failure_service_provider_verification); - break; - case OSU_FAILURE_PROVISIONING_ABORTED: - mOsuFailure = mContext.getString(R.string.osu_failure_provisioning_aborted); - break; - case OSU_FAILURE_PROVISIONING_NOT_AVAILABLE: - mOsuFailure = mContext.getString( - R.string.osu_failure_provisioning_not_available); - break; - case OSU_FAILURE_INVALID_URL_FORMAT_FOR_OSU: - mOsuFailure = mContext.getString(R.string.osu_failure_invalid_server_url); - break; - case OSU_FAILURE_UNEXPECTED_COMMAND_TYPE: - mOsuFailure = mContext.getString(R.string.osu_failure_unexpected_command_type); - break; - case OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE: - mOsuFailure = mContext.getString( - R.string.osu_failure_unexpected_soap_message_type); - break; - case OSU_FAILURE_SOAP_MESSAGE_EXCHANGE: - mOsuFailure = mContext.getString(R.string.osu_failure_soap_message_exchange); - break; - case OSU_FAILURE_START_REDIRECT_LISTENER: - mOsuFailure = mContext.getString(R.string.osu_failure_start_redirect_listener); - break; - case OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER: - mOsuFailure = mContext.getString( - R.string.osu_failure_timed_out_redirect_listener); - break; - case OSU_FAILURE_NO_OSU_ACTIVITY_FOUND: - mOsuFailure = mContext.getString(R.string.osu_failure_no_osu_activity_found); - break; - case OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS: - mOsuFailure = mContext.getString( - R.string.osu_failure_unexpected_soap_message_status); - break; - case OSU_FAILURE_NO_PPS_MO: - mOsuFailure = mContext.getString( - R.string.osu_failure_no_pps_mo); - break; - case OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE: - mOsuFailure = mContext.getString( - R.string.osu_failure_no_aaa_server_trust_root_node); - break; - case OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE: - mOsuFailure = mContext.getString( - R.string.osu_failure_no_remediation_server_trust_root_node); - break; - case OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE: - mOsuFailure = mContext.getString( - R.string.osu_failure_no_policy_server_trust_root_node); - break; - case OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES: - mOsuFailure = mContext.getString( - R.string.osu_failure_retrieve_trust_root_certificates); - break; - case OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE: - mOsuFailure = mContext.getString( - R.string.osu_failure_no_aaa_trust_root_certificate); - break; - case OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION: - mOsuFailure = mContext.getString( - R.string.osu_failure_add_passpoint_configuration); - break; - case OSU_FAILURE_OSU_PROVIDER_NOT_FOUND: - mOsuFailure = mContext.getString(R.string.osu_failure_osu_provider_not_found); - break; + if (TextUtils.equals(mOsuStatus, mContext.getString(R.string.osu_completing_sign_up))) { + mOsuFailure = mContext.getString(R.string.osu_sign_up_failed); + } else { + mOsuFailure = mContext.getString(R.string.osu_connect_failed); } mOsuStatus = null; mOsuProvisioningComplete = false; @@ -1625,50 +1572,37 @@ public class AccessPoint implements Comparable<AccessPoint> { @Override @MainThread public void onProvisioningStatus(int status) { + String newStatus = null; switch (status) { case OSU_STATUS_AP_CONNECTING: - mOsuStatus = mContext.getString(R.string.osu_status_ap_connecting); - break; case OSU_STATUS_AP_CONNECTED: - mOsuStatus = mContext.getString(R.string.osu_status_ap_connected); - break; case OSU_STATUS_SERVER_CONNECTING: - mOsuStatus = mContext.getString(R.string.osu_status_server_connecting); - break; case OSU_STATUS_SERVER_VALIDATED: - mOsuStatus = mContext.getString(R.string.osu_status_server_validated); - break; case OSU_STATUS_SERVER_CONNECTED: - mOsuStatus = mContext.getString(R.string.osu_status_server_connected); - break; case OSU_STATUS_INIT_SOAP_EXCHANGE: - mOsuStatus = mContext.getString(R.string.osu_status_init_soap_exchange); - break; case OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE: - mOsuStatus = mContext.getString( - R.string.osu_status_waiting_for_redirect_response); + newStatus = String.format(mContext.getString(R.string.osu_opening_provider), + mOsuProvider.getFriendlyName()); break; case OSU_STATUS_REDIRECT_RESPONSE_RECEIVED: - mOsuStatus = mContext.getString(R.string.osu_status_redirect_response_received); - break; case OSU_STATUS_SECOND_SOAP_EXCHANGE: - mOsuStatus = mContext.getString(R.string.osu_status_second_soap_exchange); - break; case OSU_STATUS_THIRD_SOAP_EXCHANGE: - mOsuStatus = mContext.getString(R.string.osu_status_third_soap_exchange); - break; case OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS: - mOsuStatus = mContext.getString( - R.string.osu_status_retrieving_trust_root_certs); + newStatus = mContext.getString( + R.string.osu_completing_sign_up); break; } + boolean updated = !TextUtils.equals(mOsuStatus, newStatus); + mOsuStatus = newStatus; mOsuFailure = null; mOsuProvisioningComplete = false; - ThreadUtils.postOnMainThread(() -> { - if (mAccessPointListener != null) { - mAccessPointListener.onAccessPointChanged(AccessPoint.this); - } - }); + if (updated) { + ThreadUtils.postOnMainThread(() -> { + if (mAccessPointListener != null) { + mAccessPointListener.onAccessPointChanged(AccessPoint.this); + } + }); + } } @Override diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java index afea5d2078b0..17a73acb9bda 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/TestAccessPointBuilder.java @@ -72,9 +72,13 @@ public class TestAccessPointBuilder { public AccessPoint build() { Bundle bundle = new Bundle(); - WifiConfiguration wifiConfig = new WifiConfiguration(); - wifiConfig.networkId = mNetworkId; - wifiConfig.BSSID = mBssid; + WifiConfiguration wifiConfig = null; + // ephemeral networks don't have a WifiConfiguration object in AccessPoint representation. + if (mNetworkId != WifiConfiguration.INVALID_NETWORK_ID) { + wifiConfig = new WifiConfiguration(); + wifiConfig.networkId = mNetworkId; + wifiConfig.BSSID = mBssid; + } bundle.putString(AccessPoint.KEY_SSID, ssid); bundle.putParcelable(AccessPoint.KEY_CONFIG, wifiConfig); diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java index fc3034efc08b..5e3472b830a0 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java @@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.mock; @@ -26,6 +27,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.res.Resources; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.NetworkKey; @@ -483,6 +487,45 @@ public class AccessPointTest { } @Test + public void testSummaryString_showsConnectedViaSuggestionOrSpecifierApp() throws Exception { + final int rssi = -55; + final String appPackageName = "com.test.app"; + final CharSequence appLabel = "Test App"; + final String connectedViaAppResourceString = "Connected via "; + + WifiInfo wifiInfo = new WifiInfo(); + wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(TEST_SSID)); + wifiInfo.setEphemeral(true); + wifiInfo.setNetworkSuggestionOrSpecifierPackageName(appPackageName); + wifiInfo.setRssi(rssi); + + Context context = mock(Context.class); + Resources resources = mock(Resources.class); + PackageManager packageManager = mock(PackageManager.class); + ApplicationInfo applicationInfo = mock(ApplicationInfo.class); + when(context.getPackageManager()).thenReturn(packageManager); + when(context.getResources()).thenReturn(resources); + when(resources.getString(R.string.connected_via_app, appLabel)) + .thenReturn(connectedViaAppResourceString + appLabel.toString()); + when(packageManager.getApplicationInfoAsUser(eq(appPackageName), anyInt(), anyInt())) + .thenReturn(applicationInfo); + when(applicationInfo.loadLabel(packageManager)).thenReturn(appLabel); + + NetworkInfo networkInfo = + new NetworkInfo(ConnectivityManager.TYPE_WIFI, 0 /* subtype */, "WIFI", ""); + networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "", ""); + + AccessPoint ap = new TestAccessPointBuilder(context) + .setSsid(TEST_SSID) + .setNetworkInfo(networkInfo) + .setRssi(rssi) + .setSecurity(AccessPoint.SECURITY_NONE) + .setWifiInfo(wifiInfo) + .build(); + assertThat(ap.getSummary()).isEqualTo("Connected via Test App"); + } + + @Test public void testSetScanResultWithCarrierInfo() { String ssid = "ssid"; AccessPoint ap = new TestAccessPointBuilder(mContext).setSsid(ssid).build(); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionBarShadowControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionBarShadowControllerTest.java new file mode 100644 index 000000000000..a25b51298d3e --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/ActionBarShadowControllerTest.java @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.widget; + +import static androidx.lifecycle.Lifecycle.Event.ON_START; +import static androidx.lifecycle.Lifecycle.Event.ON_STOP; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.ActionBar; +import android.app.Activity; +import android.view.View; + +import androidx.lifecycle.LifecycleOwner; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.settingslib.core.lifecycle.Lifecycle; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class ActionBarShadowControllerTest { + + @Mock + private RecyclerView mRecyclerView; + @Mock + private Activity mActivity; + @Mock + private ActionBar mActionBar; + private Lifecycle mLifecycle; + private LifecycleOwner mLifecycleOwner; + private View mView; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mActivity.getActionBar()).thenReturn(mActionBar); + mView = new View(RuntimeEnvironment.application); + mLifecycleOwner = () -> mLifecycle; + mLifecycle = new Lifecycle(mLifecycleOwner); + } + + @Test + public void attachToRecyclerView_shouldAddScrollWatcherAndUpdateActionBar() { + when(mRecyclerView.canScrollVertically(-1)).thenReturn(false); + + ActionBarShadowController.attachToRecyclerView(mActivity, mLifecycle, mRecyclerView); + + verify(mActionBar).setElevation(ActionBarShadowController.ELEVATION_LOW); + } + + @Test + public void attachToRecyclerView_customViewAsActionBar_shouldUpdateElevationOnScroll() { + // Setup + mView.setElevation(50); + when(mRecyclerView.canScrollVertically(-1)).thenReturn(false); + final ActionBarShadowController controller = + ActionBarShadowController.attachToRecyclerView(mView, mLifecycle, mRecyclerView); + assertThat(mView.getElevation()).isEqualTo(ActionBarShadowController.ELEVATION_LOW); + + // Scroll + when(mRecyclerView.canScrollVertically(-1)).thenReturn(true); + controller.mScrollChangeWatcher.onScrolled(mRecyclerView, 10 /* dx */, 10 /* dy */); + assertThat(mView.getElevation()).isEqualTo(ActionBarShadowController.ELEVATION_HIGH); + } + + @Test + public void attachToRecyclerView_lifecycleChange_shouldAttachDetach() { + ActionBarShadowController.attachToRecyclerView(mActivity, mLifecycle, mRecyclerView); + + verify(mRecyclerView).addOnScrollListener(any()); + + mLifecycle.handleLifecycleEvent(ON_START); + mLifecycle.handleLifecycleEvent(ON_STOP); + verify(mRecyclerView).removeOnScrollListener(any()); + + mLifecycle.handleLifecycleEvent(ON_START); + verify(mRecyclerView, times(2)).addOnScrollListener(any()); + } + + @Test + public void onScrolled_nullAnchorViewAndActivity_shouldNotCrash() { + final Activity activity = null; + final ActionBarShadowController controller = + ActionBarShadowController.attachToRecyclerView(activity, mLifecycle, mRecyclerView); + + // Scroll + controller.mScrollChangeWatcher.onScrolled(mRecyclerView, 10 /* dx */, 10 /* dy */); + // no crash + } +} diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 3877c90fee23..6ca8261ac4f9 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -1511,9 +1511,6 @@ class SettingsProtoDumpUtil { Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED, GlobalSettingsProto.Wifi.VERBOSE_LOGGING_ENABLED); dumpSetting(s, p, - Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, - GlobalSettingsProto.Wifi.CONNECTED_MAC_RANDOMIZATION_ENABLED); - dumpSetting(s, p, Settings.Global.WIFI_MAX_DHCP_RETRY_COUNT, GlobalSettingsProto.Wifi.MAX_DHCP_RETRY_COUNT); dumpSetting(s, p, diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 445312168eba..23e5f0eea46d 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -4231,7 +4231,7 @@ public class SettingsProvider extends ContentProvider { String defLocationMode = Integer.toString( !TextUtils.isEmpty(locationProvidersAllowed.getValue()) - ? Secure.LOCATION_MODE_HIGH_ACCURACY + ? Secure.LOCATION_MODE_ON : Secure.LOCATION_MODE_OFF); secureSettings.insertSettingLocked( Secure.LOCATION_MODE, defLocationMode, diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index c3c3f25a9f03..c03268381367 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -145,6 +145,7 @@ <uses-permission android:name="android.permission.SET_TIME_ZONE" /> <uses-permission android:name="android.permission.DISABLE_HIDDEN_API_CHECKS" /> <uses-permission android:name="android.permission.MANAGE_ROLE_HOLDERS" /> + <uses-permission android:name="android.permission.STATUS_BAR_SERVICE" /> <!-- Permission needed to rename bugreport notifications (so they're not shown as Shell) --> <uses-permission android:name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME" /> <!-- Permission needed to hold a wakelock in dumpstate.cpp (drop_root_user()) --> diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 3453e798c7ae..815ae9ac225c 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -22,6 +22,11 @@ android:sharedUserId="android.uid.systemui" coreApp="true"> + <!-- Using OpenGL ES 2.0 --> + <uses-feature + android:glEsVersion="0x00020000" + android:required="true" /> + <!-- SysUI must be the one to define this permission; its name is referenced by the core OS. --> <permission android:name="android.permission.systemui.IDENTITY" @@ -593,11 +598,6 @@ android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden" android:process=":ui" android:visibleToInstantApps="true"> - <intent-filter> - <action android:name="android.intent.action.CHOOSER_UI" /> - <category android:name="android.intent.category.DEFAULT" /> - <category android:name="android.intent.category.VOICE" /> - </intent-filter> </activity> <!-- Doze with notifications, run in main sysui process for every user --> diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS index 2f6e32b2c6d2..e7e2c1aafa78 100644 --- a/packages/SystemUI/OWNERS +++ b/packages/SystemUI/OWNERS @@ -1,6 +1,6 @@ set noparent -dsandler@google.com +dsandler@android.com adamcohen@google.com asc@google.com diff --git a/packages/SystemUI/res-keyguard/values-af/strings.xml b/packages/SystemUI/res-keyguard/values-af/strings.xml index 4e2937ade812..55c822b76d25 100644 --- a/packages/SystemUI/res-keyguard/values-af/strings.xml +++ b/packages/SystemUI/res-keyguard/values-af/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Jy het <xliff:g id="_NUMBER_1">%d</xliff:g> pogings oor voordat die SIM permanent onbruikbaar word. Kontak die diensverskaffer vir besonderhede.</item> <item quantity="one">SIM is nou gedeaktiveer. Voer PUK-kode in om voort te gaan. Jy het <xliff:g id="_NUMBER_0">%d</xliff:g> poging oor voordat die SIM permanent onbruikbaar word. Kontak die diensverskaffer vir besonderhede.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-am/strings.xml b/packages/SystemUI/res-keyguard/values-am/strings.xml index b64e0cf7ce36..2632db4b4c15 100644 --- a/packages/SystemUI/res-keyguard/values-am/strings.xml +++ b/packages/SystemUI/res-keyguard/values-am/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">ሲም አሁን ተሰናክሏል። ለመቀጠል የPUK ኮድ ያስገቡ። ሲም እስከመጨረሻው መጠቀም የማይቻል ከመሆኑ በፊት <xliff:g id="_NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል። ዝርዝሮችን ለማግኘት የአገልግሎት አቅራቢን ያነጋግሩ።</item> <item quantity="other">ሲም አሁን ተሰናክሏል። ለመቀጠል የPUK ኮድ ያስገቡ። ሲም እስከመጨረሻው መጠቀም የማይቻል ከመሆኑ በፊት <xliff:g id="_NUMBER_1">%d</xliff:g> ሙከራዎች ይቀረዎታል። ዝርዝሮችን ለማግኘት የአገልግሎት አቅራቢን ያነጋግሩ።</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml index af958e54dd70..9149d7ef9459 100644 --- a/packages/SystemUI/res-keyguard/values-ar/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml @@ -182,4 +182,78 @@ <item quantity="other">تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك <xliff:g id="_NUMBER_1">%d</xliff:g> محاولة قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item> <item quantity="one">تم إيقاف شريحة SIM الآن. أدخل رمز PUK للمتابعة، وتتبقى لديك محاولة واحدة (<xliff:g id="_NUMBER_0">%d</xliff:g>) قبل أن تصبح شريحة SIM غير صالحة للاستخدام نهائيًا. ويمكنك الاتصال بمشغل شبكة الجوّال لمعرفة التفاصيل.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml index 258219abae5f..0a6b896f3df7 100644 --- a/packages/SystemUI/res-keyguard/values-as/strings.xml +++ b/packages/SystemUI/res-keyguard/values-as/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">ছিমখন অক্ষম হ’ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত <xliff:g id="_NUMBER_1">%d</xliff:g>টা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।</item> <item quantity="other">ছিমখন অক্ষম হ’ল। অব্যাহত ৰাখিবলৈ PUK দিয়ক। ছিমখন স্থায়ীভাৱে ব্যৱহাৰৰ অনুপযোগী হোৱাৰ পূৰ্বে আপোনাৰ হাতত <xliff:g id="_NUMBER_1">%d</xliff:g>টা প্ৰয়াস বাকী আছে। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-az/strings.xml b/packages/SystemUI/res-keyguard/values-az/strings.xml index 18671869fc29..8e6df65c9bae 100644 --- a/packages/SystemUI/res-keyguard/values-az/strings.xml +++ b/packages/SystemUI/res-keyguard/values-az/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə <xliff:g id="_NUMBER_1">%d</xliff:g> cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın.</item> <item quantity="one">SIM indi deaktivdir. Davam etmək üçün PUK kodunu daxil edin. SIM birdəfəlik yararsız olmadan öncə <xliff:g id="_NUMBER_0">%d</xliff:g> cəhdiniz qalır. Ətraflı məlumat üçün operatorla əlaqə saxlayın.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml index ef0e1ce2e9a1..ca32751a59ce 100644 --- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml @@ -158,4 +158,78 @@ <item quantity="few">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera.</item> <item quantity="other">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja pre nego što SIM postane trajno neupotrebljiv. Detaljne informacije potražite od mobilnog operatera.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml index 873a87bd56e2..20488697cc35 100644 --- a/packages/SystemUI/res-keyguard/values-be/strings.xml +++ b/packages/SystemUI/res-keyguard/values-be/strings.xml @@ -166,4 +166,78 @@ <item quantity="many">SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ <xliff:g id="_NUMBER_1">%d</xliff:g> спроб, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш.</item> <item quantity="other">SIM-карта заблакіравана. Каб працягнуць, увядзіце PUK-код. У вас ёсць яшчэ <xliff:g id="_NUMBER_1">%d</xliff:g> спробы, пасля чаго SIM-карта будзе заблакіравана назаўсёды. Звярніцеся да аператара, каб даведацца больш.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml index 3725a5eeed30..362fc51d3ff7 100644 --- a/packages/SystemUI/res-keyguard/values-bg/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остават ви <xliff:g id="_NUMBER_1">%d</xliff:g> опита, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности.</item> <item quantity="one">SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Остава ви <xliff:g id="_NUMBER_0">%d</xliff:g> опит, преди SIM картата да стане неизползваема завинаги. Свържете се с оператора за подробности.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml index ff925f8996c6..e3f0f6559cbf 100644 --- a/packages/SystemUI/res-keyguard/values-bn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">সিম অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোড লিখুন। আপনি আর <xliff:g id="_NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন, তারপরে এই সিমটি আর একেবারেই ব্যবহার করা যাবে না। বিশদে জানতে পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।</item> <item quantity="other">সিম অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোড লিখুন। আপনি আর <xliff:g id="_NUMBER_1">%d</xliff:g> বার চেষ্টা করতে পারবেন, তারপরে এই সিমটি আর একেবারেই ব্যবহার করা যাবে না। বিশদে জানতে পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml index 110680751347..042c11e2e1db 100644 --- a/packages/SystemUI/res-keyguard/values-bs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml @@ -158,4 +158,78 @@ <item quantity="few">SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Za više informacija kontaktirajte mobilnog operatera.</item> <item quantity="other">SIM kartica je onemogućena. Unesite PUK kôd da nastavite. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Za više informacija kontaktirajte mobilnog operatera.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml index 3a734b1c0281..f6ca03c68dae 100644 --- a/packages/SystemUI/res-keyguard/values-ca/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queden <xliff:g id="_NUMBER_1">%d</xliff:g> intents; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació.</item> <item quantity="one">La targeta SIM s\'ha desactivat. Introdueix el codi PUK per continuar. Et queda <xliff:g id="_NUMBER_0">%d</xliff:g> intent; si no l\'encertes, la SIM no es podrà tornar a fer servir. Contacta amb l\'operador de telefonia mòbil per obtenir-ne més informació.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-cs/strings.xml b/packages/SystemUI/res-keyguard/values-cs/strings.xml index 1bfc29463cab..f31342352760 100644 --- a/packages/SystemUI/res-keyguard/values-cs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-cs/strings.xml @@ -166,4 +166,78 @@ <item quantity="other">SIM karta je teď zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě <xliff:g id="_NUMBER_1">%d</xliff:g> pokusů, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor.</item> <item quantity="one">SIM karta je teď zablokována. Chcete-li pokračovat, zadejte kód PUK. Máte ještě <xliff:g id="_NUMBER_0">%d</xliff:g> pokus, poté bude SIM karta natrvalo zablokována. Podrobnosti vám poskytne operátor.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml index f4a3794f1cc6..acc91b6f5495 100644 --- a/packages/SystemUI/res-keyguard/values-da/strings.xml +++ b/packages/SystemUI/res-keyguard/values-da/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.</item> <item quantity="other">SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml index 83d7da5c9c54..b925ac69f725 100644 --- a/packages/SystemUI/res-keyguard/values-de/strings.xml +++ b/packages/SystemUI/res-keyguard/values-de/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch <xliff:g id="_NUMBER_1">%d</xliff:g> Versuche, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter.</item> <item quantity="one">Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Du hast noch <xliff:g id="_NUMBER_0">%d</xliff:g> Versuch, bevor die SIM-Karte endgültig gesperrt wird. Weitere Informationen erhältst du von deinem Mobilfunkanbieter.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml index 89b05ec57943..91afac65740f 100644 --- a/packages/SystemUI/res-keyguard/values-el/strings.xml +++ b/packages/SystemUI/res-keyguard/values-el/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένουν <xliff:g id="_NUMBER_1">%d</xliff:g> ακόμη προσπάθειες προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες.</item> <item quantity="one">Η κάρτα SIM απενεργοποιήθηκε. Καταχωρίστε τον κωδικό PUK, για να συνεχίσετε. Απομένει <xliff:g id="_NUMBER_0">%d</xliff:g> ακόμη προσπάθεια προτού να μην είναι πλέον δυνατή η χρήση της κάρτας SIM. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας για λεπτομέρειες.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml index 415e3de46a3f..12fae43f3afb 100644 --- a/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rAU/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item> <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml index 56a4bcc5e85b..fb587c35dca4 100644 --- a/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rCA/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item> <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml index 415e3de46a3f..12fae43f3afb 100644 --- a/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rGB/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item> <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml index 415e3de46a3f..12fae43f3afb 100644 --- a/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rIN/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact operator for details.</item> <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact operator for details.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml index f3b398d845fd..da98ea91b4a3 100644 --- a/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml +++ b/packages/SystemUI/res-keyguard/values-en-rXC/strings.xml @@ -150,4 +150,81 @@ <item quantity="other">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact carrier for details.</item> <item quantity="one">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_0">%d</xliff:g> remaining attempt before SIM becomes permanently unusable. Contact carrier for details.</item> </plurals> + <string name="type_clock_header" msgid="4786545441902447636">"It’s"</string> + <string-array name="type_clock_hours"> + <item msgid="3543074812389379830">"Twelve"</item> + <item msgid="7389464214252023751">"One"</item> + <item msgid="8803180377002008046">"Two"</item> + <item msgid="8614897059944644719">"Three"</item> + <item msgid="2293058674782619556">"Four"</item> + <item msgid="4815402358455041664">"Five"</item> + <item msgid="3325754778509665687">"Six"</item> + <item msgid="5805551341866280575">"Seven"</item> + <item msgid="203334816668238610">"Eight"</item> + <item msgid="4828052671464488923">"Nine"</item> + <item msgid="2233497913571137419">"Ten"</item> + <item msgid="5621554266768657830">"Eleven"</item> + </string-array> + <string-array name="type_clock_minutes"> + <item msgid="8322049385467207985">"O’Clock"</item> + <item msgid="8837126587669001578">"O’One"</item> + <item msgid="4294343372940455660">"O’Two"</item> + <item msgid="7129166637707421536">"O’Three"</item> + <item msgid="7579404865008788673">"O’Four"</item> + <item msgid="3873924689207380586">"O’Five"</item> + <item msgid="4849565597850069377">"O’Six"</item> + <item msgid="4404219424523572364">"O’Seven"</item> + <item msgid="8740481214764087329">"O’Eight"</item> + <item msgid="1713216865806811237">"O’Nine"</item> + <item msgid="3508406095411245038">"Ten"</item> + <item msgid="7161996337755311711">"Eleven"</item> + <item msgid="4044549963329624197">"Twelve"</item> + <item msgid="333373157917379088">"Thirteen"</item> + <item msgid="2631202907124819385">"Fourteen"</item> + <item msgid="6472396076858033453">"Fifteen"</item> + <item msgid="8656981856181581643">"Sixteen"</item> + <item msgid="7289026608562030619">"Seventeen"</item> + <item msgid="3881477602692646573">"Eighteen"</item> + <item msgid="3358129827772984226">"Nineteen"</item> + <item msgid="3308575407402865807">"Twenty"</item> + <item msgid="5346560955382229629">"Twenty\nOne"</item> + <item msgid="226750304761473436">"Twenty\nTwo"</item> + <item msgid="616811325336838734">"Twenty\nThree"</item> + <item msgid="616346116869053440">"Twenty\nFour"</item> + <item msgid="4642996410384042830">"Twenty\nFive"</item> + <item msgid="7506092849993571465">"Twenty\nSix"</item> + <item msgid="1915078191101042031">"Twenty\nSeven"</item> + <item msgid="4292378641900520252">"Twenty\nEight"</item> + <item msgid="5339513901773103696">"Twenty\nNine"</item> + <item msgid="3574673250891657607">"Thirty"</item> + <item msgid="5796923836589110940">"Thirty\nOne"</item> + <item msgid="5859323597571702052">"Thirty\nTwo"</item> + <item msgid="5133326723148876507">"Thirty\nThree"</item> + <item msgid="2693999494655663096">"Thirty\nFour"</item> + <item msgid="3316754944962836197">"Thirty\nFive"</item> + <item msgid="816891008836796723">"Thirty\nSix"</item> + <item msgid="9158890488666520078">"Thirty\nSeven"</item> + <item msgid="1894769703213894011">"Thirty\nEight"</item> + <item msgid="5638820345598572399">"Thirty\nNine"</item> + <item msgid="8838304023017895439">"Forty"</item> + <item msgid="1834742948932559597">"Forty\nOne"</item> + <item msgid="6573707308847773944">"Forty\nTwo"</item> + <item msgid="2450149950652678001">"Forty\nThree"</item> + <item msgid="2874667401318178036">"Forty\nFour"</item> + <item msgid="3391101532763048862">"Forty\nFive"</item> + <item msgid="1671489330863254362">"Forty\nSix"</item> + <item msgid="5916017359554531038">"Forty\nSeven"</item> + <item msgid="8205413177993059967">"Forty\nEight"</item> + <item msgid="6607867415142171302">"Forty\nNine"</item> + <item msgid="8358850748472089162">"Fifty"</item> + <item msgid="3551313125255080234">"Fifty\nOne"</item> + <item msgid="1559678130725716542">"Fifty\nTwo"</item> + <item msgid="431441994725492377">"Fifty\nThree"</item> + <item msgid="6345774640539623024">"Fifty\nFour"</item> + <item msgid="8018192990793931120">"Fifty\nFive"</item> + <item msgid="6187650843754604534">"Fifty\nSix"</item> + <item msgid="8727240174015993259">"Fifty\nSeven"</item> + <item msgid="848339003778952950">"Fifty\nEight"</item> + <item msgid="5798985802835423618">"Fifty\nNine"</item> + </string-array> </resources> diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index e56fa6b65245..72fc16ad5e00 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te quedan <xliff:g id="_NUMBER_1">%d</xliff:g> intentos más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles.</item> <item quantity="one">Se inhabilitó la SIM. Para continuar, ingresa el código PUK. Te queda <xliff:g id="_NUMBER_0">%d</xliff:g> intento más antes de que la SIM quede inutilizable permanentemente. Comunícate con tu proveedor para obtener más detalles.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-es/strings.xml b/packages/SystemUI/res-keyguard/values-es/strings.xml index 8a755b414d58..232c79b0aac8 100644 --- a/packages/SystemUI/res-keyguard/values-es/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te quedan <xliff:g id="_NUMBER_1">%d</xliff:g> intentos para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información.</item> <item quantity="one">La tarjeta SIM está inhabilitada. Introduce el código PUK para continuar. Te queda <xliff:g id="_NUMBER_0">%d</xliff:g> intento para que la tarjeta SIM quede inservible de forma permanente. Ponte en contacto con tu operador para obtener más información.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml index a19cc2325a8e..4eeebe3c731e 100644 --- a/packages/SystemUI/res-keyguard/values-et/strings.xml +++ b/packages/SystemUI/res-keyguard/values-et/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel <xliff:g id="_NUMBER_1">%d</xliff:g> katset enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt.</item> <item quantity="one">SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Teil on jäänud veel <xliff:g id="_NUMBER_0">%d</xliff:g> katse enne, kui SIM-kaart püsivalt lukustatakse. Lisateavet küsige operaatorilt.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-eu/strings.xml b/packages/SystemUI/res-keyguard/values-eu/strings.xml index b06310754d8a..bb913d1c8dc2 100644 --- a/packages/SystemUI/res-keyguard/values-eu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-eu/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. <xliff:g id="_NUMBER_1">%d</xliff:g> saiakera geratzen zaizkizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan.</item> <item quantity="one">Desgaitu egin da SIM txartela. Aurrera egiteko, idatzi PUK kodea. <xliff:g id="_NUMBER_0">%d</xliff:g> saiakera geratzen zaizu SIM txartela betiko erabilgaitz geratu aurretik. Xehetasunak lortzeko, jarri operadorearekin harremanetan.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml index db7923d67928..5568d94c057b 100644 --- a/packages/SystemUI/res-keyguard/values-fa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">سیمکارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. <xliff:g id="_NUMBER_1">%d</xliff:g> تلاش دیگر باقی مانده است و پس از آن سیمکارت برای همیشه غیرقابلاستفاده میشود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید.</item> <item quantity="other">سیمکارت اکنون غیرفعال است. برای ادامه دادن کد PUK را وارد کنید. <xliff:g id="_NUMBER_1">%d</xliff:g> تلاش دیگر باقی مانده است و پس از آن سیمکارت برای همیشه غیرقابلاستفاده میشود. برای اطلاع از جزئیات با شرکت مخابراتی تماس بگیرید.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fi/strings.xml b/packages/SystemUI/res-keyguard/values-fi/strings.xml index 2bd83148dcca..4f3304d6158c 100644 --- a/packages/SystemUI/res-keyguard/values-fi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fi/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on <xliff:g id="_NUMBER_1">%d</xliff:g> yritystä jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi.</item> <item quantity="one">SIM-kortti on nyt lukittu. Anna PUK-koodi, niin voit jatkaa. Sinulla on <xliff:g id="_NUMBER_0">%d</xliff:g> yritys jäljellä, ennen kuin SIM-kortti poistuu pysyvästi käytöstä. Pyydä lisätietoja operaattoriltasi.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml index 9b0e269a9e4d..348a3ff543e0 100644 --- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services.</item> <item quantity="other">La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index f0c7e92628c9..e986ceed9919 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur.</item> <item quantity="other">La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml index 756fc2733ec9..631ab6a28d28 100644 --- a/packages/SystemUI/res-keyguard/values-gl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">A SIM está desactivada. Introduce o código PUK para continuar. Quédanche <xliff:g id="_NUMBER_1">%d</xliff:g> intentos antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información.</item> <item quantity="one">A SIM está desactivada. Introduce o código PUK para continuar. Quédache <xliff:g id="_NUMBER_0">%d</xliff:g> intento antes de que a SIM quede inutilizable para sempre. Contacta co operador para obter información.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml index fb3a14bb7f6d..520f09876e6a 100644 --- a/packages/SystemUI/res-keyguard/values-gu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">સિમ હવે બંધ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. સિમ કાયમીરૂપે બિનઉપયોગી બની જાય એ પહેલાં તમારી પાસે <xliff:g id="_NUMBER_1">%d</xliff:g> પ્રયાસ બાકી છે. વિગતો માટે કૅરિઅરનો સંપર્ક કરો.</item> <item quantity="other">સિમ હવે બંધ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. સિમ કાયમીરૂપે બિનઉપયોગી બની જાય એ પહેલાં તમારી પાસે <xliff:g id="_NUMBER_1">%d</xliff:g> પ્રયાસો બાકી છે. વિગતો માટે કૅરિઅરનો સંપર્ક કરો.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml index 7bfc6350d292..9f189e876609 100644 --- a/packages/SystemUI/res-keyguard/values-hi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास <xliff:g id="_NUMBER_1">%d</xliff:g> मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</item> <item quantity="other">सिम बंद कर दिया गया है. जारी रखने के लिए PUK कोड डालें. आपके पास <xliff:g id="_NUMBER_1">%d</xliff:g> मौके बचे हैं, उसके बाद, सिम हमेशा के लिए काम करना बंद कर देगा. जानकारी के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml index 089c6c4dbd6a..5c84ecc55f90 100644 --- a/packages/SystemUI/res-keyguard/values-hr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml @@ -158,4 +158,78 @@ <item quantity="few">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera.</item> <item quantity="other">SIM je sada onemogućen. Unesite PUK kôd da biste nastavili. Imate još <xliff:g id="_NUMBER_1">%d</xliff:g> pokušaja prije nego što SIM kartica postane trajno neupotrebljiva. Više informacija zatražite od mobilnog operatera.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml index 49d84012b3e6..e4e9fa62cc6c 100644 --- a/packages/SystemUI/res-keyguard/values-hu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még <xliff:g id="_NUMBER_1">%d</xliff:g> próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz.</item> <item quantity="one">A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. Még <xliff:g id="_NUMBER_0">%d</xliff:g> próbálkozása van, mielőtt végleg használhatatlanná válik a SIM-kártya. További információért forduljon a szolgáltatóhoz.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-hy/strings.xml b/packages/SystemUI/res-keyguard/values-hy/strings.xml index 5198da6fd87f..c23782899d39 100644 --- a/packages/SystemUI/res-keyguard/values-hy/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hy/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է <xliff:g id="_NUMBER_1">%d</xliff:g> փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին:</item> <item quantity="other">SIM քարտն անջատված է: Շարունակելու համար մուտքագրեք PUK կոդը: Մնացել է <xliff:g id="_NUMBER_1">%d</xliff:g> փորձ, որից հետո SIM քարտն այլևս հնարավոր չի լինի օգտագործել: Մանրամասների համար դիմեք օպերատորին:</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml index 161287c5f159..ed412229021b 100644 --- a/packages/SystemUI/res-keyguard/values-in/strings.xml +++ b/packages/SystemUI/res-keyguard/values-in/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa <xliff:g id="_NUMBER_1">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya.</item> <item quantity="one">SIM kini dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Tersisa <xliff:g id="_NUMBER_0">%d</xliff:g> percobaan sebelum SIM tidak dapat digunakan secara permanen. Hubungi operator untuk mengetahui detailnya.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml index 9ed11887dd69..afaf6bbcb783 100644 --- a/packages/SystemUI/res-keyguard/values-is/strings.xml +++ b/packages/SystemUI/res-keyguard/values-is/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það er <xliff:g id="_NUMBER_1">%d</xliff:g> tilraun eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar.</item> <item quantity="other">SIM-kortið er nú óvirkt. Sláðu inn PUK-númer til að halda áfram. Það eru <xliff:g id="_NUMBER_1">%d</xliff:g> tilraunir eftir þar til SIM-kortið verður ónothæft til frambúðar. Hafðu samband við símafyrirtækið til að fá upplýsingar.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-it/strings.xml b/packages/SystemUI/res-keyguard/values-it/strings.xml index b5f85f6a7ad9..28a53a492fe3 100644 --- a/packages/SystemUI/res-keyguard/values-it/strings.xml +++ b/packages/SystemUI/res-keyguard/values-it/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora <xliff:g id="_NUMBER_1">%d</xliff:g> tentativi a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.</item> <item quantity="one">La scheda SIM è ora disattivata. Inserisci il codice PUK per continuare. Hai ancora <xliff:g id="_NUMBER_0">%d</xliff:g> tentativo a disposizione prima che la SIM diventi definitivamente inutilizzabile. Per informazioni dettagliate, contatta l\'operatore.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml index 09b3cfa1e9e3..dc9c7ed56359 100644 --- a/packages/SystemUI/res-keyguard/values-iw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml @@ -166,4 +166,78 @@ <item quantity="other">כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותרו לך <xliff:g id="_NUMBER_1">%d</xliff:g> ניסיונות נוספים לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.</item> <item quantity="one">כרטיס ה-SIM מושבת כעת. יש להזין קוד PUK כדי להמשיך. נותר לך <xliff:g id="_NUMBER_0">%d</xliff:g> ניסיון נוסף לפני שכרטיס ה-SIM ינעל לצמיתות. למידע נוסף, ניתן לפנות לספק שלך.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml index 08d4b9bd8b65..23e6d1540966 100644 --- a/packages/SystemUI/res-keyguard/values-ja/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと <xliff:g id="_NUMBER_1">%d</xliff:g> 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。</item> <item quantity="one">SIM が無効になりました。続行するには PUK コードを入力してください。入力できるのはあと <xliff:g id="_NUMBER_0">%d</xliff:g> 回です。この回数を超えると SIM は完全に使用できなくなります。詳しくは携帯通信会社にお問い合わせください。</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml index f966c33ee1df..788c77208ad8 100644 --- a/packages/SystemUI/res-keyguard/values-ka/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ <xliff:g id="_NUMBER_1">%d</xliff:g> მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს.</item> <item quantity="one">SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. თქვენ დაგრჩათ <xliff:g id="_NUMBER_0">%d</xliff:g> მცდელობა, სანამ SIM სამუდამოდ გამოუსადეგარი გახდება. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml index 530418f4a318..66c4e1eea380 100644 --- a/packages/SystemUI/res-keyguard/values-kk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. <xliff:g id="_NUMBER_1">%d</xliff:g> мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз.</item> <item quantity="one">SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. <xliff:g id="_NUMBER_0">%d</xliff:g> мүмкіндік қалды, одан кейін SIM картасы біржола құлыпталады. Толығырақ мәліметті оператордан алыңыз.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml index 7ab347d37796..dcd6ce777432 100644 --- a/packages/SystemUI/res-keyguard/values-km/strings.xml +++ b/packages/SystemUI/res-keyguard/values-km/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="_NUMBER_1">%d</xliff:g> ដងទៀតមុនពេលស៊ីមមិនអាចប្រើបានជាអចិន្ត្រៃយ៍។ ទាក់ទងទៅក្រុមហ៊ុនសេវាទូរសព្ទសម្រាប់ព័ត៌មានលម្អិត។</item> <item quantity="one">ឥឡូវនេះស៊ីមត្រូវបានបិទ។ សូមបញ្ចូលកូដ PUK ដើម្បីបន្ត។ អ្នកនៅសល់ការព្យាយាម <xliff:g id="_NUMBER_0">%d</xliff:g> ដងទៀតមុនពេលស៊ីមមិនអាចប្រើបានជាអចិន្ត្រៃយ៍។ ទាក់ទងទៅក្រុមហ៊ុនសេវាទូរសព្ទសម្រាប់ព័ត៌មានលម្អិត។</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml index ef92951b50e6..39fdf5558a27 100644 --- a/packages/SystemUI/res-keyguard/values-kn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">ಸಿಮ್ ಅನ್ನು ಈಗ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುವ ಮುನ್ನ ನಿಮ್ಮಲ್ಲಿ <xliff:g id="_NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ.</item> <item quantity="other">ಸಿಮ್ ಅನ್ನು ಈಗ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಮುಂದುವರಿಸಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ಸಿಮ್ ಶಾಶ್ವತವಾಗಿ ನಿಷ್ಪ್ರಯೋಜಕವಾಗುವ ಮುನ್ನ ನಿಮ್ಮಲ್ಲಿ <xliff:g id="_NUMBER_1">%d</xliff:g> ಪ್ರಯತ್ನಗಳು ಬಾಕಿ ಉಳಿದಿವೆ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml index 8a65c9521cd1..c20a9ddcff42 100644 --- a/packages/SystemUI/res-keyguard/values-ko/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. <xliff:g id="_NUMBER_1">%d</xliff:g>번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요.</item> <item quantity="one">SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. <xliff:g id="_NUMBER_0">%d</xliff:g>번 더 실패하면 SIM을 완전히 사용할 수 없게 됩니다. 자세한 내용은 이동통신사에 문의하세요.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index a7d5d45ed916..941684388593 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгарына <xliff:g id="_NUMBER_1">%d</xliff:g> аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз.</item> <item quantity="one">SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. SIM-картанын биротоло жарактан чыгаарына <xliff:g id="_NUMBER_0">%d</xliff:g> аракет калды. Чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml index 9f3de8b0bc5d..c00f2f0a125e 100644 --- a/packages/SystemUI/res-keyguard/values-lo/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="_NUMBER_1">%d</xliff:g> ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ.</item> <item quantity="one">ຕອນນີ້ປິດການນຳໃຊ້ SIM ແລ້ວ. ໃສ່ລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ທ່ານສາມາດລອງໄດ້ອີກ <xliff:g id="_NUMBER_0">%d</xliff:g> ເທື່ອກ່ອນທີ່ SIM ຈະບໍ່ສາມາດໃຊ້ໄດ້ຖາວອນ. ກະລຸນາຕິດຕໍ່ຜູ້ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml index bdebf6738f51..71e04f2b6db7 100644 --- a/packages/SystemUI/res-keyguard/values-lt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml @@ -166,4 +166,78 @@ <item quantity="many">SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko <xliff:g id="_NUMBER_1">%d</xliff:g> bandymo. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi.</item> <item quantity="other">SIM kortelė dabar yra išjungta. Jei norite tęsti, įveskite PUK kodą. Jums liko <xliff:g id="_NUMBER_1">%d</xliff:g> bandymų. Paskui visiškai nebegalėsite naudoti SIM kortelės. Jei reikia išsamios informacijos, susisiekite su operatoriumi.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml index c68761d467bc..4bdaa664e683 100644 --- a/packages/SystemUI/res-keyguard/values-lv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml @@ -158,4 +158,78 @@ <item quantity="one">SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl <xliff:g id="_NUMBER_1">%d</xliff:g> reizi. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru.</item> <item quantity="other">SIM karte tagad ir atspējota. Ievadiet PUK kodu, lai turpinātu. Varat mēģināt vēl <xliff:g id="_NUMBER_1">%d</xliff:g> reizes. Kļūdas gadījumā SIM karti vairs nevarēs izmantot. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-mk/strings.xml b/packages/SystemUI/res-keyguard/values-mk/strings.xml index 0ace83ff0ff6..b963d325d6ac 100644 --- a/packages/SystemUI/res-keyguard/values-mk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mk/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостанува уште <xliff:g id="_NUMBER_1">%d</xliff:g> обид пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали.</item> <item quantity="other">SIM-картичката сега е оневозможена. Внесете PUK-код за да продолжите. Ви преостануваат уште <xliff:g id="_NUMBER_1">%d</xliff:g> обиди пред SIM-картичката да стане трајно неупотреблива. Контактирајте го операторот за детали.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml index 779a532985f5..0af354f2bf42 100644 --- a/packages/SystemUI/res-keyguard/values-ml/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി <xliff:g id="_NUMBER_1">%d</xliff:g> ശ്രമങ്ങൾ കൂടി ശേഷിക്കുന്നു. വിശദാംശങ്ങൾക്ക് കാരിയറുമായി ബന്ധപ്പെടുക.</item> <item quantity="one">സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. സിം ശാശ്വതമായി ഉപയോഗശൂന്യമാകുന്നതിന് മുമ്പായി <xliff:g id="_NUMBER_0">%d</xliff:g> ശ്രമം കൂടി ശേഷിക്കുന്നു. വിശദാംശങ്ങൾക്ക് കാരിയറുമായി ബന്ധപ്പെടുക.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml index 189d40746354..9e16c6d92d56 100644 --- a/packages/SystemUI/res-keyguard/values-mn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл <xliff:g id="_NUMBER_1">%d</xliff:g> оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу.</item> <item quantity="one">SIM-г идэвхгүй болголоо. Үргэлжлүүлэхийн тулд PUK кодыг оруулна уу. Таны SIM бүрмөсөн хүчингүй болох хүртэл <xliff:g id="_NUMBER_0">%d</xliff:g> оролдлого үлдлээ. Дэлгэрэнгүй мэдээлэл авахын тулд оператор компанитайгаа холбогдоно уу.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml index d4122525c70b..b27b299ac3c9 100644 --- a/packages/SystemUI/res-keyguard/values-mr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहे. तपशीलांसाठी वाहकाशी संपर्क साधा.</item> <item quantity="other">सिम आता बंद केलेले आहे. सुरू ठेवण्यासाठी PUK कोड टाका. सिम कायमचे बंद होण्याआधी तुमच्याकडे <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयत्न शिल्लक आहेत. तपशीलांसाठी वाहकाशी संपर्क साधा.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml index 9e10298f156f..c16f43359155 100644 --- a/packages/SystemUI/res-keyguard/values-ms/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal <xliff:g id="_NUMBER_1">%d</xliff:g> percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran.</item> <item quantity="one">Kini SIM dilumpuhkan. Masukkan kod PUK untuk meneruskan. Tinggal <xliff:g id="_NUMBER_0">%d</xliff:g> percubaan sebelum SIM tidak boleh digunakan secara kekal. Hubungi pembawa untuk mendapatkan butiran.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-my/strings.xml b/packages/SystemUI/res-keyguard/values-my/strings.xml index 87fca07a55c3..0d011af266ca 100644 --- a/packages/SystemUI/res-keyguard/values-my/strings.xml +++ b/packages/SystemUI/res-keyguard/values-my/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် PUK ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ် အပြီးပိတ်မသွားမီ သင့်တွင် <xliff:g id="_NUMBER_1">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့် ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။</item> <item quantity="one">ဆင်းမ်ကဒ်သည် ယခု ပိတ်သွားပါပြီ။ ရှေ့ဆက်ရန် PUK ကုဒ်ကို ထည့်ပါ။ ဆင်းမ်ကဒ် အပြီးပိတ်မသွားမီ သင့်တွင် <xliff:g id="_NUMBER_0">%d</xliff:g> ကြိမ် စမ်းသပ်ခွင့် ကျန်ပါသေးသည်။ အသေးစိတ်အချက်များအတွက် ဝန်ဆောင်မှုပေးသူကို ဆက်သွယ်ပါ။</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml index 977784ca4e6b..dc544890cbd2 100644 --- a/packages/SystemUI/res-keyguard/values-nb/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har <xliff:g id="_NUMBER_1">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer.</item> <item quantity="one">SIM-kortet er deaktivert nå. Skriv inn PUK-koden for å fortsette. Du har <xliff:g id="_NUMBER_0">%d</xliff:g> forsøk igjen før SIM-kortet blir permanent ubrukelig. Kontakt operatøren for å få vite mer.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml index c21faead879d..be39c3266f42 100644 --- a/packages/SystemUI/res-keyguard/values-ne/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्टि गर्नुहोस्। तपाईंसँग <xliff:g id="_NUMBER_1">%d</xliff:g> प्रयासहरू बाँकी छन्, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।</item> <item quantity="one">SIM लाई असक्षम पारिएको छ। जारी राख्न PUK कोड प्रविष्टि गर्नुहोस्। तपाईंसँग <xliff:g id="_NUMBER_0">%d</xliff:g> प्रयास बाँकी छ, त्यसपछि SIM सदाका लागि प्रयोग गर्न नमिल्ने हुन्छ। विवरणहरूका लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml index f80749fbba93..5c911bea561f 100644 --- a/packages/SystemUI/res-keyguard/values-nl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_1">%d</xliff:g> pogingen over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item> <item quantity="one">De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Je hebt nog <xliff:g id="_NUMBER_0">%d</xliff:g> poging over voordat de simkaart definitief onbruikbaar wordt. Neem contact op met je provider voor meer informatie.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-or/strings.xml b/packages/SystemUI/res-keyguard/values-or/strings.xml index eff493b23c79..58242e6c9782 100644 --- a/packages/SystemUI/res-keyguard/values-or/strings.xml +++ b/packages/SystemUI/res-keyguard/values-or/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍ ଲେଖନ୍ତୁ। ଆଉ <xliff:g id="_NUMBER_1">%d</xliff:g> ଥର ଭୁଲ କୋଡ୍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item> <item quantity="one">SIM କାର୍ଡକୁ ବର୍ତ୍ତମାନ ଅକ୍ଷମ କରିଦିଆଯାଇଛି। ଜାରି ରଖିବାକୁ PUK କୋଡ୍ ଲେଖନ୍ତୁ। ଆଉ <xliff:g id="_NUMBER_0">%d</xliff:g> ଥର ଭୁଲ କୋଡ୍ ଲେଖିବା ପରେ SIM କାର୍ଡ ସ୍ଥାୟୀ ଭାବେ ଅନୁପଯୋଗୀ ହୋଇଯିବ। ବିବରଣୀ ପାଇଁ କେରିଅର୍ର ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index 08245dcf665e..a435c79cd467 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="_NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ ਬਾਕੀ ਹੈ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</item> <item quantity="other">ਸਿਮ ਹੁਣ ਬੰਦ ਹੋ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਸਿਮ ਦੇ ਪੱਕੇ ਤੌਰ \'ਤੇ ਬੇਕਾਰ ਹੋ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੇ ਕੋਲ <xliff:g id="_NUMBER_1">%d</xliff:g> ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index 49792e20fe3e..51c7ac898025 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -166,4 +166,78 @@ <item quantity="other">Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze <xliff:g id="_NUMBER_1">%d</xliff:g> próby, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem.</item> <item quantity="one">Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Masz jeszcze <xliff:g id="_NUMBER_0">%d</xliff:g> próbę, zanim karta SIM zostanie trwale zablokowana. Aby uzyskać szczegółowe informacje, skontaktuj się z operatorem.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml index 90f46cefa304..6698bf952434 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rBR/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item> <item quantity="other">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index 321b8989bbdd..118f05ff8835 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.</item> <item quantity="one">O SIM encontra-se desativado. Introduza o código PUK para continuar. Tem mais <xliff:g id="_NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar permanentemente inutilizável. Contacte o operador para obter mais detalhes.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-pt/strings.xml b/packages/SystemUI/res-keyguard/values-pt/strings.xml index 90f46cefa304..6698bf952434 100644 --- a/packages/SystemUI/res-keyguard/values-pt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativa restante antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item> <item quantity="other">O chip agora está desativado. Informe o código PUK para continuar. Você tem <xliff:g id="_NUMBER_1">%d</xliff:g> tentativas restantes antes de o chip se tornar permanentemente inutilizável. Entre em contato com a operadora para saber mais detalhes.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ro/strings.xml b/packages/SystemUI/res-keyguard/values-ro/strings.xml index 083adbdcd0fb..915a47bc7915 100644 --- a/packages/SystemUI/res-keyguard/values-ro/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ro/strings.xml @@ -158,4 +158,78 @@ <item quantity="other">Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-au mai rămas <xliff:g id="_NUMBER_1">%d</xliff:g> de încercări până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii.</item> <item quantity="one">Cardul SIM este dezactivat acum. Introduceți codul PUK pentru a continua. V-a mai rămas <xliff:g id="_NUMBER_0">%d</xliff:g> încercare până când cardul SIM va deveni inutilizabil definitiv. Contactați operatorul pentru detalii.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ru/strings.xml b/packages/SystemUI/res-keyguard/values-ru/strings.xml index e5b1d0e75803..d036e0d14c0a 100644 --- a/packages/SystemUI/res-keyguard/values-ru/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ru/strings.xml @@ -166,4 +166,78 @@ <item quantity="many">SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось <xliff:g id="_NUMBER_1">%d</xliff:g> попыток. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи.</item> <item quantity="other">SIM-карта отключена. Чтобы продолжить, введите PUK-код. Осталось <xliff:g id="_NUMBER_1">%d</xliff:g> попытки. После этого SIM-карта будет заблокирована навсегда. За подробной информацией обратитесь к оператору связи.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-si/strings.xml b/packages/SystemUI/res-keyguard/values-si/strings.xml index 1955edd4cc89..7073526aedd9 100644 --- a/packages/SystemUI/res-keyguard/values-si/strings.xml +++ b/packages/SystemUI/res-keyguard/values-si/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් <xliff:g id="_NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න.</item> <item quantity="other">SIM දැන් අබල කර ඇත. දිගටම කරගෙන යාමට PUK කේතය ඇතුළු කරන්න. SIM ස්ථිරවම භාවිත කළ නොහැකි බවට පත් වීමට පෙර ඔබ සතුව උත්සාහයන් <xliff:g id="_NUMBER_1">%d</xliff:g>ක් ඉතිරිව ඇත. විස්තර සඳහා වාහක සම්බන්ධ කර ගන්න.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml index f9f39e5001d7..9f0501cc5f47 100644 --- a/packages/SystemUI/res-keyguard/values-sk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml @@ -166,4 +166,78 @@ <item quantity="other">SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám <xliff:g id="_NUMBER_1">%d</xliff:g> pokusov, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor.</item> <item quantity="one">SIM karta je deaktivovaná. Pokračujte zadaním kódu PUK. Zostáva vám <xliff:g id="_NUMBER_0">%d</xliff:g> pokus, potom sa SIM karta natrvalo zablokuje. Podrobnosti vám poskytne operátor.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml index 2a4417c9306b..afc6ee1b8683 100644 --- a/packages/SystemUI/res-keyguard/values-sl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml @@ -166,4 +166,78 @@ <item quantity="few">Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še <xliff:g id="_NUMBER_1">%d</xliff:g> poskuse. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja.</item> <item quantity="other">Kartica SIM je zdaj onemogočena. Če želite nadaljevati, vnesite kodo PUK. Na voljo imate še <xliff:g id="_NUMBER_1">%d</xliff:g> poskusov. Potem bo kartica SIM postala trajno neuporabna. Za podrobnosti se obrnite na operaterja.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml index 4057e03a0515..d8e68d797277 100644 --- a/packages/SystemUI/res-keyguard/values-sq/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të kanë mbetur edhe <xliff:g id="_NUMBER_1">%d</xliff:g> përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje.</item> <item quantity="one">Karta SIM tani është çaktivizuar. Fut kodin PUK për të vazhduar. Të ka mbetur edhe <xliff:g id="_NUMBER_0">%d</xliff:g> përpjekje përpara se karta SIM të bëhet përgjithmonë e papërdorshme. Kontakto me operatorin për detaje.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml index 16c1bde93b5d..c576493c2da3 100644 --- a/packages/SystemUI/res-keyguard/values-sr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml @@ -158,4 +158,78 @@ <item quantity="few">SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још <xliff:g id="_NUMBER_1">%d</xliff:g> покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера.</item> <item quantity="other">SIM је сада онемогућен. Унесите PUK кôд да бисте наставили. Имате још <xliff:g id="_NUMBER_1">%d</xliff:g> покушаја пре него што SIM постане трајно неупотребљив. Детаљне информације потражите од мобилног оператера.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml index 8e75aa2d01c6..dfa570b01e56 100644 --- a/packages/SystemUI/res-keyguard/values-sv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. <xliff:g id="_NUMBER_1">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information.</item> <item quantity="one">SIM-kortet är inaktiverat. Ange PUK-koden om du vill fortsätta. <xliff:g id="_NUMBER_0">%d</xliff:g> försök återstår innan SIM-kortet blir obrukbart. Kontakta operatören för mer information.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sw/strings.xml b/packages/SystemUI/res-keyguard/values-sw/strings.xml index e5277b2ec1ac..00334be2ae26 100644 --- a/packages/SystemUI/res-keyguard/values-sw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sw/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na majaribio <xliff:g id="_NUMBER_1">%d</xliff:g> kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo.</item> <item quantity="one">Sasa SIM imefungwa. Weka msimbo wa PUK ili uendelee. Umesalia na jaribio <xliff:g id="_NUMBER_0">%d</xliff:g> kabla ya SIM kuacha kufanya kazi kabisa. Wasiliana na mtoa huduma kwa maelezo.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml index f5fb35737d9d..d97864317a62 100644 --- a/packages/SystemUI/res-keyguard/values-ta/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் <xliff:g id="_NUMBER_1">%d</xliff:g> முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</item> <item quantity="one">சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர்வதற்கு, PUK குறியீட்டை உள்ளிடவும். நீங்கள் <xliff:g id="_NUMBER_0">%d</xliff:g> முறை மட்டுமே முயற்சிக்க முடியும். அதன்பிறகு சிம் நிரந்தரமாக முடக்கப்படும். விவரங்களுக்கு, மொபைல் நிறுவனத்தைத் தொடர்புகொள்ளவும்.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index 1e0817752c1f..8a8df342ab60 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు <xliff:g id="_NUMBER_1">%d</xliff:g> ప్రయత్నాలు మిగిలి ఉన్నాయి. వివరాల కోసం కారియర్ను సంప్రదించండి.</item> <item quantity="one">SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు <xliff:g id="_NUMBER_0">%d</xliff:g> ప్రయత్నం మిగిలి ఉంది వివరాల కోసం కారియర్ను సంప్రదించండి.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml index bde50f3f3a46..a8577a7a44ef 100644 --- a/packages/SystemUI/res-keyguard/values-th/strings.xml +++ b/packages/SystemUI/res-keyguard/values-th/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก <xliff:g id="_NUMBER_1">%d</xliff:g> ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ</item> <item quantity="one">ซิมถูกปิดใช้งานในขณะนี้ โปรดป้อนรหัส PUK เพื่อทำต่อ คุณพยายามได้อีก <xliff:g id="_NUMBER_0">%d</xliff:g> ครั้งก่อนที่ซิมจะไม่สามารถใช้งานได้อย่างถาวร โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml index 71a7537fe0fd..b3609d1277d5 100644 --- a/packages/SystemUI/res-keyguard/values-tl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang <xliff:g id="_NUMBER_1">%d</xliff:g> natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye.</item> <item quantity="other">Naka-disable na ang SIM. Ilagay ang PUK code upang magpatuloy. Mayroon kang <xliff:g id="_NUMBER_1">%d</xliff:g> na natitirang pagsubok bago tuluyang hindi magamit ang SIM. Makipag-ugnayan sa carrier para sa mga detalye.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml index fbbf63e5108c..018e271a6086 100644 --- a/packages/SystemUI/res-keyguard/values-tr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce <xliff:g id="_NUMBER_1">%d</xliff:g> deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun.</item> <item quantity="one">SIM artık devre dışı. Devam etmek için PUK kodunu girin. SIM kalıcı olarak kullanım dışı kalmadan önce <xliff:g id="_NUMBER_0">%d</xliff:g> deneme hakkınız kaldı. Ayrıntılı bilgi için operatörünüzle iletişim kurun.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml index feab22fc6716..92ca57bb0810 100644 --- a/packages/SystemUI/res-keyguard/values-uk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml @@ -166,4 +166,78 @@ <item quantity="many">SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося <xliff:g id="_NUMBER_1">%d</xliff:g> спроб. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора.</item> <item quantity="other">SIM-карту заблоковано. Щоб продовжити, введіть PUK-код. Залишилося <xliff:g id="_NUMBER_1">%d</xliff:g> спроби. Після цього SIM-карту буде назавжди заблоковано. Щоб дізнатися більше, зверніться до свого оператора.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml index 928fcbdbd008..ace9f796162b 100644 --- a/packages/SystemUI/res-keyguard/values-ur/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ SIM کے مستقل طور پر ناقابل استعمال ہونے سے پہلے آپ کے پاس <xliff:g id="_NUMBER_1">%d</xliff:g> کوششیں بچی ہیں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔</item> <item quantity="one">SIM اب غیر فعال ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ SIM کے مستقل طور پر ناقابل استعمال ہونے سے پہلے آپ کے پاس <xliff:g id="_NUMBER_0">%d</xliff:g> کوشش بچی ہے۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml index faa7d504cf50..1766d1188275 100644 --- a/packages/SystemUI/res-keyguard/values-uz/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml @@ -152,4 +152,78 @@ <item quantity="other">SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana <xliff:g id="_NUMBER_1">%d</xliff:g> marta xato qilsangiz, SIM kartangiz butunlay qulflanadi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling.</item> <item quantity="one">SIM karta faolsizlantirildi. Davom etish uchun PUK kodni kiriting. Yana <xliff:g id="_NUMBER_0">%d</xliff:g> marta xato qilsangiz, SIM kartangiz butunlay qulflanadi. Batafsil axborot olish uchun tarmoq operatoriga murojaat qiling.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml index 6b0651397b12..eb6e536ef52a 100644 --- a/packages/SystemUI/res-keyguard/values-vi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn <xliff:g id="_NUMBER_1">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết.</item> <item quantity="one">SIM hiện đã bị tắt. Hãy nhập mã PUK để tiếp tục. Bạn còn <xliff:g id="_NUMBER_0">%d</xliff:g> lần thử trước khi SIM vĩnh viễn không thể sử dụng được. Hãy liên hệ với nhà cung cấp dịch vụ để biết chi tiết.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml index 44f06a64bf1d..5fafe2f3c290 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 <xliff:g id="_NUMBER_1">%d</xliff:g> 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。</item> <item quantity="one">SIM 卡现已停用,请输入 PUK 码继续使用。您还可以尝试 <xliff:g id="_NUMBER_0">%d</xliff:g> 次。如果仍不正确,该 SIM 卡将永远无法使用。有关详情,请联系您的运营商。</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml index 364f126b591b..0181ed3b1614 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 <xliff:g id="_NUMBER_1">%d</xliff:g> 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。</item> <item quantity="one">SIM 卡已停用。請輸入 PUK 碼以繼續進行。您還可以再試 <xliff:g id="_NUMBER_0">%d</xliff:g> 次。如果仍然輸入錯誤,SIM 卡將永久無法使用。詳情請與流動網絡供應商聯絡。</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml index f687397bcf5d..126304f675ac 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml @@ -150,4 +150,78 @@ <item quantity="other">SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 <xliff:g id="_NUMBER_1">%d</xliff:g> 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。</item> <item quantity="one">SIM 卡現在已遭停用。請輸入 PUK 碼以繼續進行。你還可以再試 <xliff:g id="_NUMBER_0">%d</xliff:g> 次,如果仍然失敗,SIM 卡將永久無法使用。詳情請與電信業者聯絡。</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values-zu/strings.xml b/packages/SystemUI/res-keyguard/values-zu/strings.xml index 66904eb0c3cc..6a62d52dd3a4 100644 --- a/packages/SystemUI/res-keyguard/values-zu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zu/strings.xml @@ -150,4 +150,78 @@ <item quantity="one">I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-<xliff:g id="_NUMBER_1">%d</xliff:g> esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane.</item> <item quantity="other">I-SIM manje ikhutshaziwe. Faka ikhodi ye-PUK ukuze uqhubeke. Unemizamo engu-<xliff:g id="_NUMBER_1">%d</xliff:g> esele ngaphambi kokuthi i-SIM ingasebenziseki unaphakade. Xhumana nenkampani yenethiwekhi ngemininingwane.</item> </plurals> + <!-- no translation found for type_clock_header (4786545441902447636) --> + <skip /> + <!-- no translation found for type_clock_hours:0 (3543074812389379830) --> + <!-- no translation found for type_clock_hours:1 (7389464214252023751) --> + <!-- no translation found for type_clock_hours:2 (8803180377002008046) --> + <!-- no translation found for type_clock_hours:3 (8614897059944644719) --> + <!-- no translation found for type_clock_hours:4 (2293058674782619556) --> + <!-- no translation found for type_clock_hours:5 (4815402358455041664) --> + <!-- no translation found for type_clock_hours:6 (3325754778509665687) --> + <!-- no translation found for type_clock_hours:7 (5805551341866280575) --> + <!-- no translation found for type_clock_hours:8 (203334816668238610) --> + <!-- no translation found for type_clock_hours:9 (4828052671464488923) --> + <!-- no translation found for type_clock_hours:10 (2233497913571137419) --> + <!-- no translation found for type_clock_hours:11 (5621554266768657830) --> + <!-- no translation found for type_clock_minutes:0 (8322049385467207985) --> + <!-- no translation found for type_clock_minutes:1 (8837126587669001578) --> + <!-- no translation found for type_clock_minutes:2 (4294343372940455660) --> + <!-- no translation found for type_clock_minutes:3 (7129166637707421536) --> + <!-- no translation found for type_clock_minutes:4 (7579404865008788673) --> + <!-- no translation found for type_clock_minutes:5 (3873924689207380586) --> + <!-- no translation found for type_clock_minutes:6 (4849565597850069377) --> + <!-- no translation found for type_clock_minutes:7 (4404219424523572364) --> + <!-- no translation found for type_clock_minutes:8 (8740481214764087329) --> + <!-- no translation found for type_clock_minutes:9 (1713216865806811237) --> + <!-- no translation found for type_clock_minutes:10 (3508406095411245038) --> + <!-- no translation found for type_clock_minutes:11 (7161996337755311711) --> + <!-- no translation found for type_clock_minutes:12 (4044549963329624197) --> + <!-- no translation found for type_clock_minutes:13 (333373157917379088) --> + <!-- no translation found for type_clock_minutes:14 (2631202907124819385) --> + <!-- no translation found for type_clock_minutes:15 (6472396076858033453) --> + <!-- no translation found for type_clock_minutes:16 (8656981856181581643) --> + <!-- no translation found for type_clock_minutes:17 (7289026608562030619) --> + <!-- no translation found for type_clock_minutes:18 (3881477602692646573) --> + <!-- no translation found for type_clock_minutes:19 (3358129827772984226) --> + <!-- no translation found for type_clock_minutes:20 (3308575407402865807) --> + <!-- no translation found for type_clock_minutes:21 (5346560955382229629) --> + <!-- no translation found for type_clock_minutes:22 (226750304761473436) --> + <!-- no translation found for type_clock_minutes:23 (616811325336838734) --> + <!-- no translation found for type_clock_minutes:24 (616346116869053440) --> + <!-- no translation found for type_clock_minutes:25 (4642996410384042830) --> + <!-- no translation found for type_clock_minutes:26 (7506092849993571465) --> + <!-- no translation found for type_clock_minutes:27 (1915078191101042031) --> + <!-- no translation found for type_clock_minutes:28 (4292378641900520252) --> + <!-- no translation found for type_clock_minutes:29 (5339513901773103696) --> + <!-- no translation found for type_clock_minutes:30 (3574673250891657607) --> + <!-- no translation found for type_clock_minutes:31 (5796923836589110940) --> + <!-- no translation found for type_clock_minutes:32 (5859323597571702052) --> + <!-- no translation found for type_clock_minutes:33 (5133326723148876507) --> + <!-- no translation found for type_clock_minutes:34 (2693999494655663096) --> + <!-- no translation found for type_clock_minutes:35 (3316754944962836197) --> + <!-- no translation found for type_clock_minutes:36 (816891008836796723) --> + <!-- no translation found for type_clock_minutes:37 (9158890488666520078) --> + <!-- no translation found for type_clock_minutes:38 (1894769703213894011) --> + <!-- no translation found for type_clock_minutes:39 (5638820345598572399) --> + <!-- no translation found for type_clock_minutes:40 (8838304023017895439) --> + <!-- no translation found for type_clock_minutes:41 (1834742948932559597) --> + <!-- no translation found for type_clock_minutes:42 (6573707308847773944) --> + <!-- no translation found for type_clock_minutes:43 (2450149950652678001) --> + <!-- no translation found for type_clock_minutes:44 (2874667401318178036) --> + <!-- no translation found for type_clock_minutes:45 (3391101532763048862) --> + <!-- no translation found for type_clock_minutes:46 (1671489330863254362) --> + <!-- no translation found for type_clock_minutes:47 (5916017359554531038) --> + <!-- no translation found for type_clock_minutes:48 (8205413177993059967) --> + <!-- no translation found for type_clock_minutes:49 (6607867415142171302) --> + <!-- no translation found for type_clock_minutes:50 (8358850748472089162) --> + <!-- no translation found for type_clock_minutes:51 (3551313125255080234) --> + <!-- no translation found for type_clock_minutes:52 (1559678130725716542) --> + <!-- no translation found for type_clock_minutes:53 (431441994725492377) --> + <!-- no translation found for type_clock_minutes:54 (6345774640539623024) --> + <!-- no translation found for type_clock_minutes:55 (8018192990793931120) --> + <!-- no translation found for type_clock_minutes:56 (6187650843754604534) --> + <!-- no translation found for type_clock_minutes:57 (8727240174015993259) --> + <!-- no translation found for type_clock_minutes:58 (848339003778952950) --> + <!-- no translation found for type_clock_minutes:59 (5798985802835423618) --> </resources> diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml index 7432f9cde639..41acf82a4567 100644 --- a/packages/SystemUI/res-keyguard/values/strings.xml +++ b/packages/SystemUI/res-keyguard/values/strings.xml @@ -405,7 +405,7 @@ number">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. <!-- Header for typographic clock face. [CHAR LIMIT=8] --> <string name="type_clock_header">It\u2019s</string> - <!-- Hour displayed in words on the typographic clock face. [CHAR LIMIT=8] --> + <!-- Hour displayed in words on the typographic clock face. [CHAR LIMIT=12] --> <string-array name="type_clock_hours"> <item>Twelve</item> <item>One</item> @@ -421,7 +421,7 @@ number">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. <item>Eleven</item> </string-array> - <!-- Minutes displayed in words on the typographic clock face. [CHAR LIMIT=16] --> + <!-- Minutes displayed in words on the typographic clock face. [CHAR LIMIT=20] --> <string-array name="type_clock_minutes"> <item>O\u2019Clock</item> <item>O\u2019One</item> diff --git a/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl new file mode 100644 index 000000000000..11d73a93ad04 --- /dev/null +++ b/packages/SystemUI/res/raw/image_wallpaper_fragment_shader.glsl @@ -0,0 +1,33 @@ +precision mediump float; + +uniform sampler2D uTexture; +uniform float uCenterReveal; +uniform float uReveal; +uniform float uAod2Opacity; +uniform int uAodMode; +varying vec2 vTextureCoordinates; + +vec3 luminosity(vec3 color) { + float lum = 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b; + return vec3(lum); +} + +vec4 transform(vec3 diffuse) { + // TODO: Add well comments here, tracking on b/123615467. + vec3 lum = luminosity(diffuse); + diffuse = mix(diffuse, lum, smoothstep(0., uCenterReveal, uReveal)); + float val = mix(uReveal, uCenterReveal, step(uCenterReveal, uReveal)); + diffuse = smoothstep(val, 1.0, diffuse); + diffuse *= uAod2Opacity * (1. - smoothstep(uCenterReveal, 1., uReveal)); + return vec4(diffuse.r, diffuse.g, diffuse.b, 1.); +} + +void main() { + vec4 fragColor = texture2D(uTexture, vTextureCoordinates); + // TODO: Remove the branch logic here, tracking on b/123615467. + if (uAodMode != 0) { + gl_FragColor = transform(fragColor.rgb); + } else { + gl_FragColor = fragColor; + } +}
\ No newline at end of file diff --git a/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl b/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl new file mode 100644 index 000000000000..4393e2bb0ebf --- /dev/null +++ b/packages/SystemUI/res/raw/image_wallpaper_vertex_shader.glsl @@ -0,0 +1,8 @@ +attribute vec4 aPosition; +attribute vec2 aTextureCoordinates; +varying vec2 vTextureCoordinates; + +void main() { + vTextureCoordinates = aTextureCoordinates; + gl_Position = aPosition; +}
\ 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 de2a9502146a..31e450b71d11 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Laat USB-ontfouting toe?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Die rekenaar se RSA-sleutel-vingerafdruk is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Laat altyd toe van hierdie rekenaar af"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-ontfouting word nie toegelaat nie"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Die gebruiker wat tans by hierdie toestel aangemeld is, kan nie USB-ontfouting aanskakel nie. Skakel na die primêre gebruiker toe oor om hierdie kenmerk te gebruik."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoem om skerm te vul"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Strek om skerm te vul"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Skermkiekie"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Kanselleer"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Hulpboodskapgebied"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bevestig"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Probeer weer"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Raak die vingerafdruksensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukikoon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Soek tans vir jou …"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Oudio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Kopstuk"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Invoer"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Gehoortoestelle"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Skakel tans aan …"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Helderheid"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Outo-draai"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Jy maak hierdie kennisgewings gewoonlik toe. \nMoet ons aanhou om hulle te wys?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Hou aan om hierdie kennisgewings te wys?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stop kennisgewings"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokkeer"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Hou aan wys"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimeer"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Wys sonder klank"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Bly stil"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Waarsku my"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Hou aan waarsku"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Hou aan om kennisgewings van hierdie program af te wys?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Hierdie kennisgewings kan nie afgeskakel word nie"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Instellings"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Het dit"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Stort SysUI-hoop"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> programme</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> program</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> gebruik tans jou <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Programme gebruik tans jou <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Kanselleer"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> programme gebruik jou <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> program gebruik jou <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Bekyk details"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Program wat jou <xliff:g id="TYPES_LIST">%s</xliff:g> gebruik"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Programme wat jou <xliff:g id="TYPES_LIST">%s</xliff:g> gebruik"</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 41546432759e..731acce851a6 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"የUSB ማረሚያ ይፈቀድ?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"የኮምፒውተሩ RSA ቁልፍ ጣት አሻራ ይሄ ነው፦\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"ሁልጊዜ ከዚህ ኮምፒውተር ፍቀድ"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"የዩኤስቢ እርማት አይፈቀድም"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"አሁን ወደዚህ መሣሪያ የገባው ተጠቃሚ የዩኤስቢ እርማትን ማብራት አይችልም። ይህን ባህሪ ለመጠቀም ወደ ዋና ተጠቃሚ ይቀይሩ።"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"ማያ እንዲሞላ አጉላ"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ማያ ለመሙለት ሳብ"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"ቅጽበታዊ ገጽ እይታ"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"ይቅር"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"የእገዛ መልዕክት አካባቢ"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"አረጋግጥ"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"እንደገና ይሞክሩ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"የጣት አሻራ ዳሳሹን ይንኩ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"የጣት አሻራ አዶ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"እርስዎን በመፈለግ ላይ…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ኦዲዮ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ማዳመጫ"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ግቤት"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"አጋዥ መስሚያዎች"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"በማብራት ላይ..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ብሩህነት"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"በራስ ሰር አሽከርክር"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"አብዛኛውን ጊዜ እነዚህን ማሳወቂያዎች ያሰናብቷቸዋል። \nመታየታቸው ይቀጥል??"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"እነዚህን ማሳወቂያዎች ማሳየት ይቀጥሉ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"ማሳወቂያዎችን አስቁም"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"አግድ"</string> <string name="inline_keep_button" msgid="6665940297019018232">"ማሳየትን ቀጥል"</string> <string name="inline_minimize_button" msgid="966233327974702195">"አሳንስ"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"በፀጥታ አሳይ"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ጸጥ እንዳለ ቆይ"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"አሳውቀኝ"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ማንቃቱን ቀጥል"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"ከዚህ መተግበሪያ ማሳወቂያዎችን ማሳየት ይቀጥል?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"እነዚህ ማሳወቂያዎች ሊጠፉ አይችሉም"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"በ<xliff:g id="APP_NAME">%1$s</xliff:g> በኩል"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"ቅንብሮች"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"ገባኝ"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI Heap አራግፍ"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> መተግበሪያዎች</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> መተግበሪያዎች</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> የእርስዎን <xliff:g id="TYPES_LIST">%2$s</xliff:g> እየተጠቀመ ነው።"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"መተግበሪያዎች የእርስዎን <xliff:g id="TYPES_LIST">%s</xliff:g> እየተጠቀሙ ነው።"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ይቅር"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> መተግበሪያዎች የእርስዎን <xliff:g id="TYPE_5">%2$s</xliff:g> እየተጠቀሙ ነው።</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> መተግበሪያዎች የእርስዎን <xliff:g id="TYPE_5">%2$s</xliff:g> እየተጠቀሙ ነው።</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ዝርዝሮችን አሳይ"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"የእርስዎን <xliff:g id="TYPES_LIST">%s</xliff:g> የሚጠቀሙ መተግበሪያዎች"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"የእርስዎን <xliff:g id="TYPES_LIST">%s</xliff:g> የሚጠቀሙ መተግበሪያዎች"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 579964d05b3a..3306388d93f6 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"هل تريد السماح بتصحيح أخطاء USB؟"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"الملف المرجعي الرئيسي لـ RSA في هذا الكمبيوتر هو:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"السماح دائمًا من هذا الكمبيوتر"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"لا يُسمح بتصحيح أخطاء USB"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"لا يمكن للمستخدم الذي يسجّل دخوله حاليًا إلى هذا الجهاز تشغيل تصحيح أخطاء USB. لاستخدام هذه الميزة، يمكنك التبديل إلى المستخدم الأساسي."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"تكبير/تصغير لملء الشاشة"</string> <string name="compat_mode_off" msgid="4434467572461327898">"توسيع بملء الشاشة"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"لقطة شاشة"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"إلغاء"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"منطقة رسالة المساعدة"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"تأكيد"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"إعادة المحاولة"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"المس جهاز استشعار بصمات الإصبع"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"رمز بصمة الإصبع"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"جارٍ البحث عن وجهك…"</string> @@ -300,8 +305,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"صوت"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"سماعة الرأس"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"الإدخال"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"سماعات الأذن الطبية"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"جارٍ التفعيل…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"السطوع"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"دوران تلقائي"</string> @@ -623,17 +627,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"أنت تتجاهل عادةً هذه الإشعارات. \nهل تريد الاستمرار في عرضها؟"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"هل تريد الاستمرار في تلقي هذه الإشعارات؟"</string> <string name="inline_stop_button" msgid="4172980096860941033">"إيقاف الإشعارات"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"حظر"</string> <string name="inline_keep_button" msgid="6665940297019018232">"الاستمرار في تلقّي الإشعارات"</string> <string name="inline_minimize_button" msgid="966233327974702195">"تصغير"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"عرض بدون تنبيه صوتي"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"متابعة عرض الإشعارات بدون صوت"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"إرسال تنبيه إليّ"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"متابعة إرسال التنبيهات"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"هل تريد الاستمرار في تلقي إشعارات من هذا التطبيق؟"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"يتعذَّر إيقاف هذه الإشعارات."</string> <string name="notification_delegate_header" msgid="9167022191405284627">"عبر <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -755,7 +755,7 @@ </string-array> <string name="menu_ime" msgid="4998010205321292416">"مفتاح تبديل لوحة المفاتيح"</string> <string name="save" msgid="2311877285724540644">"حفظ"</string> - <string name="reset" msgid="2448168080964209908">"إعادة تعيين"</string> + <string name="reset" msgid="2448168080964209908">"إعادة الضبط"</string> <string name="adjust_button_width" msgid="6138616087197632947">"ضبط عرض الزر"</string> <string name="clipboard" msgid="1313879395099896312">"الحافظة"</string> <string name="accessibility_key" msgid="5701989859305675896">"زر التنقل المخصص"</string> @@ -891,11 +891,26 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"الإعدادات"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"حسنًا"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"تفريغ ذاكرة SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="zero"><xliff:g id="NUM_APPS_2">%d</xliff:g> تطبيق</item> + <item quantity="two">تطبيقان (<xliff:g id="NUM_APPS_2">%d</xliff:g>)</item> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> تطبيقات</item> + <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> تطبيقًا</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> تطبيق</item> + <item quantity="one">تطبيق واحد (<xliff:g id="NUM_APPS_0">%d</xliff:g>)</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"التطبيق <xliff:g id="APP">%1$s</xliff:g> يستخدم <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"تستخدم التطبيقات <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"إلغاء"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="zero">هناك <xliff:g id="NUM_APPS_4">%1$d</xliff:g> تطبيق يستخدِم <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="two">هناك تطبيقان (<xliff:g id="NUM_APPS_4">%1$d</xliff:g>) يستخدِمان <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="few">هناك <xliff:g id="NUM_APPS_2">%1$d</xliff:g> تطبيقات تستخدِم <xliff:g id="TYPE_3">%2$s</xliff:g>.</item> + <item quantity="many">هناك <xliff:g id="NUM_APPS_4">%1$d</xliff:g> تطبيقًا يستخدِم <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other">هناك <xliff:g id="NUM_APPS_4">%1$d</xliff:g> تطبيق يستخدِم <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one">هناك تطبيق واحد (<xliff:g id="NUM_APPS_0">%1$d</xliff:g>) يستخدِم <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"عرض التفاصيل"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"التطبيق الذي يستخدِم <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"التطبيقات التي تستخدِم <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 811350492175..4a09194e6072 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"ইউএছবি ডিবাগিংৰ অনুমতি দিবনে?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"এয়া হৈছে কম্পিউটাৰটোৰ RSA কী ফিংগাৰপ্ৰিণ্ট:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"এই কম্পিউটাৰটোৰ পৰা সদায় অনুমতি দিয়ক"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ইউএছবি ডিবাগিঙৰ অনুমতি নাই"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"এই ডিভাইচটোত বর্তমান ছাইন ইন হৈ থকা ব্যৱহাৰকাৰীজনে ইউএছবি ডিবাগিং অন কৰিব নোৱাৰে। এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ হ\'লে মুখ্য ব্যৱহাৰকাৰী হিচাপে ছাইন ইন কৰক।"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"স্ক্ৰীণ পূর্ণ কৰিবলৈ জুম কৰক"</string> <string name="compat_mode_off" msgid="4434467572461327898">"স্ক্ৰীণ পূর্ণ কৰিবলৈ প্ৰসাৰিত কৰক"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"স্ক্ৰীণশ্বট"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"বাতিল কৰক"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"সহায় বাৰ্তাৰ ক্ষেত্ৰ"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"নিশ্চিত কৰক"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"আকৌ চেষ্টা কৰক"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ফিংগাৰপ্ৰিণ্ট আইকন"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"আপোনাৰ মুখমণ্ডল বিচাৰি আছে…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"অডিঅ’"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"হেডছেট"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ইনপুট"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"শ্ৰৱণ যন্ত্ৰ"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"অন কৰি থকা হৈছে…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"উজ্জ্বলতা"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"স্বয়ং-ঘূৰ্ণন"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"আপুনি সাধাৰণতে এই জাননীসমূহ অগ্ৰাহ্য কৰে। \nসেইবোৰ দেখুওৱাই থাকিব লাগিবনে?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"এই জাননীসমূহ দেখুওৱাই থাকিব লাগিবনে?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"জাননী বন্ধ কৰক"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"অৱৰোধ কৰক"</string> <string name="inline_keep_button" msgid="6665940297019018232">"দেখুওৱাই থাকক"</string> <string name="inline_minimize_button" msgid="966233327974702195">"সৰু কৰক"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"নিৰৱে দেখুৱাওক"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"নীৰৱ হৈ থাকক"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"মোক সতৰ্ক কৰি দিব"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"সতৰ্ক কৰি থাকক"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"এই এপটোৰ জাননী দেখুওৱাই থাকিব লাগিবনে?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"এই জাননীসমূহ বন্ধ কৰিব নোৱাৰি"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ জৰিয়তে"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"ছেটিংবোৰ"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"বুজি পালোঁ"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI হীপ ডাম্প কৰক"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g>টা এপ্</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g>টা এপ্</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>এ আপোনাৰ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ব্যৱহাৰ কৰি আছে।"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"এপ্লিকেশ্বনসমূহে আপোনাৰ <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যৱহাৰ কৰি আছে।"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"বাতিল কৰক"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>টা এপ্লিকেশ্বনে আপোনাৰ <xliff:g id="TYPE_5">%2$s</xliff:g> ব্যৱহাৰ কৰি আছে।</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>টা এপ্লিকেশ্বনে আপোনাৰ <xliff:g id="TYPE_5">%2$s</xliff:g> ব্যৱহাৰ কৰি আছে।</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"সবিশেষ চাওক"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"এপটোৱে আপোনাৰ <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যৱহাৰ কৰি আছে"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"এপসমূহে আপোনাৰ <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যৱহাৰ কৰি আছে"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 907e19d787d2..b8bace9470d7 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB sazlamaya icazə verilsin?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Kompüterin RSA barmaq izi: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Bu kompüterdən həmişə icazə verilsin"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debaq prosesinə icazə verilmir"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Hazırda bu cihaza daxil olmuş istifadəçi USB sazlama prosesini aktiv edə bilməz. Bu funksiyadan istifadə etmək üçün əsas istifadəçi hesaba daxil olmalıdır."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Ekranı doldurmaq üçün yaxınlaşdır"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Ekranı doldurmaq üçün uzat"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Skrinşot"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Ləğv et"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yardım mesajı bölməsi"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Təsdiq"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Yenidən cəhd edin"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Barmaq izi sensoruna klikləyin"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmaq izi ikonası"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Siz axtarılırsınız…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Qulaqlıq"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Giriş"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Eşitmə Aparatı"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Aktiv edilir..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Parlaqlıq"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Avtodönüş"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Adətən bu bildirişləri rədd edirsiniz. \nBildirişlər göstərilsin?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Bu bildirişlər göstərilməyə davam edilsin?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Bildirişləri dayandırın"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blok edin"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Göstərməyə davam edin"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Kiçildin"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Səssiz göstərin"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Səssiz göstərilsin"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Məni xəbərdar edin"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Xəbərdarlıq göndərməyə davam edin"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu tətbiqin bildirişləri göstərilməyə davam edilsin?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Bu bildirişlər deaktiv edilə bilməz"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> vasitəsilə"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Ayarlar"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Anladım"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> tətbiq</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> tətbiq</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="TYPES_LIST">%2$s</xliff:g> tətbiqlərindən istifadə edir."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Tətbiqlər <xliff:g id="TYPES_LIST">%s</xliff:g> istifadə edir."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Ləğv edin"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> tətbiq <xliff:g id="TYPE_5">%2$s</xliff:g> tətbiqindən istifadə edir.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> tətbiq <xliff:g id="TYPE_1">%2$s</xliff:g> tətbiqindən istifadə edir.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Detallara baxın"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> tətbiqindən istifadə edən tətbiq"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g> tətbiqindən istifadə edən tətbiqlər"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 8668c6baf9c8..eed9ce6883e2 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Želite li da dozvolite otklanjanje USB grešaka?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Digitalni otisak RSA ključa ovog računara je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Uvek dozvoli sa ovog računara"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje grešaka na USB-u nije dozvoljeno"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Korisnik koji je trenutno prijavljen na ovaj uređaj ne može da uključi otklanjanje grešaka na USB-u. Da biste koristili ovu funkciju, prebacite na primarnog korisnika."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zumiraj na celom ekranu"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Razvuci na ceo ekran"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Snimak ekrana"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Otkaži"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblast poruke za pomoć"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdi"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Probaj ponovo"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor za otisak prsta"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string> @@ -297,8 +302,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Slušalice"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Unos"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Slušni aparati"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Uključuje se..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Osvetljenost"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatska rotacija"</string> @@ -614,17 +618,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Obično odbacujete ova obaveštenja. \nŽelite li da se i dalje prikazuju?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Želite li da se ova obaveštenja i dalje prikazuju?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Prestani da prikazuješ obaveštenja"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokiraj"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Nastavi da prikazuješ"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Umanji"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Prikaži bez zvuka"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Ne uključuj zvuk"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Obavesti me"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Nastavi sa obaveštenjima"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite li da se obaveštenja iz ove aplikacije i dalje prikazuju?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ne možete da isključite ova obaveštenja"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"preko aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -876,11 +876,20 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Podešavanja"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Važi"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Izdvoji SysUI mem."</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacije</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> koristi <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacije koriste <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Otkaži"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija koristi dozvolu <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacije koriste dozvolu <xliff:g id="TYPE_3">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija koristi dozvolu <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Prikaži detalje"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacija koja koristi dozvole <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacije koje koriste dozvole <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 6a27dbb85d40..8bc87cda2f72 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Дазволіць адладку USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Адбiтак ключа RSA на гэтым камп\'ютары:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Заўсёды дазваляць з гэтага камп\'ютара"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Адладка USB не дапускаецца"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Карыстальнік, які зараз увайшоў у гэту прыладу, не можа ўключыць адладку USB. Каб выкарыстоўваць гэту функцыю, пераключыцеся на асноўнага карыстальніка."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Павял. на ўвесь экран"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Расцягн. на ўвесь экран"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Здымак экрана"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Скасаваць"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Поле даведачнага паведамлення"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Пацвердзіць"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Паўтарыць спробу"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Дакраніцеся да сканера адбіткаў пальцаў"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок адбіткаў пальцаў"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ідзе пошук вашага твару…"</string> @@ -300,8 +305,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Гук"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнітура"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Увод"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слыхавыя апараты"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Уключэнне…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Яркасць"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Аўтапаварот"</string> @@ -619,17 +623,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Звычайна вы адхіляеце гэтыя апавяшчэнні. \nПаказваць іх?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Працягваць паказваць гэтыя апавяшчэнні?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Спыніць апавяшчэнні"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Заблакіраваць"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Працягваць паказваць"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Згарнуць"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Паказваць бязгучна"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Не ўключаць гук"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Апавясціць мяне"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Апавяшчаць далей"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Працягваць паказваць апавяшчэнні гэтай праграмы?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Немагчыма адключыць гэтыя апавяшчэнні"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"праз праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string> @@ -883,11 +883,22 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Налады"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Зразумела"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Дамп кучы SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> праграма</item> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> праграмы</item> + <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> праграм</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> праграмы</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Праграма \"<xliff:g id="APP">%1$s</xliff:g>\" выкарыстоўвае: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Праграмы выкарыстоўваюць: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Скасаваць"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one">Функцыю \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" выкарыстоўвае <xliff:g id="NUM_APPS_4">%1$d</xliff:g> праграма.</item> + <item quantity="few">Функцыю \"<xliff:g id="TYPE_3">%2$s</xliff:g>\" выкарыстоўваюць <xliff:g id="NUM_APPS_2">%1$d</xliff:g> праграмы.</item> + <item quantity="many">Функцыю \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" выкарыстоўваюць <xliff:g id="NUM_APPS_4">%1$d</xliff:g> праграм.</item> + <item quantity="other">Функцыю \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" выкарыстоўваюць <xliff:g id="NUM_APPS_4">%1$d</xliff:g> праграмы.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Падрабязнасці"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Праграма, якая выкарыстоўвае: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Праграмы, якія выкарыстоўваюць: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index e9effcf90c9f..6311127629a1 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Да се разреши ли отстраняването на грешки през USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Отпечатъкът на RSA ключа на компютъра е:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Винаги да се разрешава от този компютър"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отстраняването на грешки през USB не е разрешено"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Потребителят, който понастоящем е влязъл в това устройство, не може да включи функцията за отстраняване на грешки през USB. За да я използвате, превключете към основния потребител."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Мащаб – запълва екрана"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Разпъване – запълва екрана"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Екранна снимка"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Отказ"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област за помощно съобщение"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потвърждаване"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Нов опит"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Докоснете сензора за отпечатъци"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатък"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Търсим ви…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Слушалки"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Вход"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слухови апарати"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Включва се..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Яркост"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматична ориентация"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Обикновено отхвърляте тези известия. \nИскате ли да продължат да се показват?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Тези известия да продължат ли да се показват?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Спиране на известията"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Блокиране"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Да продължат да се показват"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Намаляване"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Показване без звук"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Показване на известията без звук"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Сигнализиране"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Продължаване на сигнализирането"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Да продължат ли да се показват известията от това приложение?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Тези известия не могат да бъдат изключени"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"чрез <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Настройки"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Разбрах"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> прилож.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> прилож.</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> използва <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Някои приложения използват <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Отказ"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> приложения използват <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> приложение използва <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Преглед на подробностите"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Приложение, което използва <xliff:g id="TYPES_LIST">%s</xliff:g> ви"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Приложения, които използват <xliff:g id="TYPES_LIST">%s</xliff:g> ви"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 0724e379a464..58678bafecf4 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB ডিবাগিং মঞ্জুর করবেন?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"কম্পিউটারের RSA কী আঙ্গুলের ছাপ হল:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"এই কম্পিউটার থেকে সর্বদা অনুমতি দিন"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ডিবাগিং অনুমোদিত নয়"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ব্যবহারকারী এখন এই ডিভাইসে সাইন-ইন করেছেন তাই USB ডিবাগিং চালু করা যাবে না। এই বৈশিষ্ট্যটি ব্যবহার করতে, প্রাথমিক ব্যবহারকারীতে পাল্টে নিন।"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"স্ক্রীণ পূরণ করতে জুম করুন"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ফুল স্ক্রিন করুন"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"স্ক্রিনশট নিন"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"বাতিল করুন"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"সহায়তার মেসেজ দেখানোর জায়গা"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"কনফার্ম করুন"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"আবার চেষ্টা করুন"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"আঙ্গুলের ছাপের সেন্সর স্পর্শ করুন"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"আঙ্গুলের ছাপের আইকন"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"আপনার জন্য খোঁজা হচ্ছে…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"অডিও"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"হেডসেট"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ইনপুট"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"হিয়ারিং এড"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"চালু করা হচ্ছে…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"উজ্জ্বলতা"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"স্বতঃ ঘূর্ণায়মান"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"এই বিজ্ঞপ্তিগুলিকে আপনি সাধারণত বাতিল করেন। \nসেগুলি দেখতে চান?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"এই বিজ্ঞপ্তিগুলি পরেও দেখে যেতে চান?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"বিজ্ঞপ্তি বন্ধ করুন"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"ব্লক করুন"</string> <string name="inline_keep_button" msgid="6665940297019018232">"দেখতে থাকুন"</string> <string name="inline_minimize_button" msgid="966233327974702195">"ছোট করে দিন"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"নিঃশব্দে দেখুন"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"বিজ্ঞপ্তি মিউট করুন"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"আমাকে জানানো হোক"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"বিজ্ঞপ্তি পান"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"এই অ্যাপের বিজ্ঞপ্তি পরেও দেখে যেতে চান?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"এই বিজ্ঞপ্তিগুলি বন্ধ করা যাবে না"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>-এর মাধ্যমে"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"সেটিংস"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"বুঝেছি"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g>টি অ্যাপ</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g>টি অ্যাপ</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> আপনার <xliff:g id="TYPES_LIST">%2$s</xliff:g> ব্যবহার করছে।"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"অ্যাপ্লিকেশনগুলি আপনার <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যবহার করছে।"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"বাতিল করুন"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>টি অ্যাপ আপনার <xliff:g id="TYPE_5">%2$s</xliff:g> ব্যবহার করছে।</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>টি অ্যাপ আপনার <xliff:g id="TYPE_5">%2$s</xliff:g> ব্যবহার করছে।</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"বিবরণ দেখুন"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"অ্যাপ আপনার <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যবহার করছে"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"অ্যাপ আপনার <xliff:g id="TYPES_LIST">%s</xliff:g> ব্যবহার করছে"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 77429a0d074f..b2b2ee774f9e 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Omogućiti otklanjanje grešaka putem uređaja spojenog na USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"RSA otisak prsta za otključavanje računara je: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Uvijek dozvoli sa ovog računara"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje grešaka putem uređaja spojenog na USB nije dozvoljeno"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Korisnik koji je trenutno prijavljen na ovaj uređaj ne može uključiti opciju za otklanjanje grešaka koristeći USB. Da koristite tu funkciju, prebacite se na primarnog korisnika."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Uvećaj prikaz na ekran"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Razvuci prikaz na ekran"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Snimak ekrana"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Otkaži"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Prostor za poruku za pomoć"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdite"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Pokušaj ponovo"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor za otisak prsta"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona za otisak prsta"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string> @@ -297,8 +302,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvuk"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Slušalice"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Ulaz"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Slušni aparat"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Uključivanje…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Osvjetljenje"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatsko rotiranje"</string> @@ -616,17 +620,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Obično odbacujete ova obavještenja. \nNastaviti ih prikazivati?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Nastaviti prikazivanje ovih obavještenja?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Zaustavi obavještenja"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokiraj"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Nastavi prikazivanje"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimiziraj"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Prikaži bez zvuka"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Ostani u nečujnom načinu rada"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Upozori me"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Nastavi upozoravati"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Nastaviti prikazivanje obavještenja iz ove aplikacije?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ova obavještenja nije moguće isključiti"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"preko aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -878,11 +878,20 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Postavke"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Razumijem"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Izdvoji SysUI mem."</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacije</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> koristi <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacije koriste <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Otkaži"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija koristi <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacije koriste <xliff:g id="TYPE_3">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija koristi <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Prikaži detalje"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacija koristi odobrenja <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacije koriste odobrenja <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 4e8e83327106..45ad5709554d 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Vols permetre la depuració per USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"L\'empremta digital de la clau RSA de l\'equip és:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Dona sempre permís des d\'aquest equip"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"No es permet la depuració per USB"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'usuari que té iniciada la sessió al dispositiu en aquest moment no pot activar la depuració per USB. Per utilitzar aquesta funció, cal canviar a l\'usuari principal."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom per omplir pantalla"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Estira per omplir pant."</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Cancel·la"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Àrea de missatge d\'ajuda"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirma"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Torna-ho a provar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor d\'empremtes digitals"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona d\'empremta digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"S\'està cercant la teva cara…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Àudio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auriculars"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audiòfons"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"S\'està activant…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillantor"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Gira automàticament"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Normalment ignores aquestes notificacions. \nVols que es continuïn mostrant?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Vols continuar rebent aquestes notificacions?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Deixa d\'enviar notificacions"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Bloqueja"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continua rebent"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimitza"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostra de manera silenciosa"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continua silenciant"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Avisa\'m"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continua avisant-me"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Vols continuar rebent notificacions d\'aquesta aplicació?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Aquestes notificacions no es poden desactivar"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"mitjançant <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Configuració"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"D\'acord"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Aboca espai de SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplicacions</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplicació</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> està fent servir el següent: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Algunes aplicacions estan fent servir el següent: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel·la"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicacions estan fent servir: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicació està fent servir: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Mostra els detalls"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicació que fa servir: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicacions que fan servir: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 30bf1de14c57..3b3dc007c76a 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Povolit ladění přes USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Digitální otisk RSA počítače je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Vždy povolit z tohoto počítače"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ladění přes USB není povoleno"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Uživatel aktuálně přihlášený k tomuto zařízení nemůže zapnout ladění přes USB. Chcete-li tuto funkci použít, přepněte na primárního uživatele."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Přiblížit na celou obrazovku"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Na celou obrazovku"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Snímek obrazovky"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Zrušit"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblast pro zprávu nápovědy"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdit"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Zkusit znovu"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotkněte se snímače otisků prstů"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otisku prstu"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hledáme vás…"</string> @@ -298,8 +303,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvuk"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Sluchátka"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vstup"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Naslouchátka"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Zapínání…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Jas"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatické otáčení"</string> @@ -617,17 +621,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Tato oznámení obvykle odmítáte. \nChcete je nadále zobrazovat?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Mají se tato oznámení nadále zobrazovat?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Přestat zobrazovat oznámení"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokovat"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Nadále zobrazovat"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimalizovat"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Zobrazovat tiše"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Nadále bez zvuku"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Upozornit"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Dál upozorňovat"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Mají se oznámení z této aplikace nadále zobrazovat?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Tato oznámení nelze deaktivovat"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"prostřednictvím aplikace <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -881,11 +881,22 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Nastavení"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Rozumím"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Výpis haldy SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikace</item> + <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikace</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikací</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikace</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Aplikace <xliff:g id="APP">%1$s</xliff:g> využívá tato oprávnění: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikace využívají tato oprávnění: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Zrušit"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikace využívají tato oprávnění: <xliff:g id="TYPE_3">%2$s</xliff:g>.</item> + <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikace využívá tato oprávnění: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikací využívá tato oprávnění: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikace využívá tato oprávnění: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Zobrazit podrobnosti"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikace používající vaše údaje: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikace používající vaše údaje: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index ad4afcff2b6c..118204e64fdf 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Vil du tillade USB-fejlretning?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Fingeraftrykket for computerens RSA-nøgle er:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Tillad altid fra denne computer"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-fejlretning er ikke tilladt"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Den bruger, der i øjeblikket er logget ind på denne enhed, kan ikke aktivere USB-fejlretning. Skift til den primære bruger for at bruge denne funktion."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom til fuld skærm"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stræk til fuld skærm"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Annuller"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område med hjælpemeddelelse"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekræft"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Prøv igen"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sæt fingeren på fingeraftrykslæseren"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeraftryk"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Forsøger at finde dig…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Lyd"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Høreapparater"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Aktiverer…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Lysstyrke"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Roter automatisk"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Du afviser som regel disse notifikationer. \nVil du blive ved med at se dem?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Vil du fortsætte med at se disse notifikationer?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifikationer"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Bloker"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Fortsæt med at vise notifikationer"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimer"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Vis lydløst"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Fortsæt med lydløse notifikationer"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Underret mig"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Fortsæt med at underrette"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Vil du fortsætte med at se notifikationer fra denne app?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Disse notifikationer kan ikke deaktiveres"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Indstillinger"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Gem SysUI-heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> anvender enhedens <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apps anvender enhedens <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Luk"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> app anvender din/dit <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> apps anvender din/dit <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Se info"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App, der anvender din/dit <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps, der anvender din/dit <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 0be730abcd9d..d91e678c15c5 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB-Debugging zulassen?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Der Fingerabdruck des RSA-Schlüssels für diesen Computer lautet: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Von diesem Computer immer zulassen"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-Debugging nicht zulässig"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Der momentan auf diesem Gerät angemeldete Nutzer kann das USB-Debugging nicht aktivieren. Um diese Funktion verwenden zu können, wechsle zum primären Nutzer."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom auf Bildschirmgröße"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Auf Bildschirmgröße anpassen"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Abbrechen"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Bereich für die Hilfemeldung"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bestätigen"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Noch einmal versuchen"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Berühre den Fingerabdrucksensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerabdruck-Symbol"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Wir suchen nach dir…"</string> @@ -300,8 +305,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Eingabe"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hörhilfen"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Wird aktiviert…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Helligkeit"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatisch drehen"</string> @@ -615,17 +619,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Normalerweise schließt du diese Benachrichtigungen. \nSollen sie trotzdem weiter angezeigt werden?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Diese Benachrichtigungen weiterhin anzeigen?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Benachrichtigungen nicht mehr anzeigen"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blockieren"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Weiterhin anzeigen"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimieren"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Ohne Ton anzeigen"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Weiter lautlos bleiben"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Benachrichtigung an mich"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Weiterhin Benachrichtigungen senden"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Benachrichtigungen dieser App weiterhin anzeigen?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Diese Benachrichtigungen können nicht deaktiviert werden"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"über <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -875,11 +875,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Einstellungen"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> Apps</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> App</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> verwendet gerade Folgendes: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apps verwenden gerade Folgendes: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Abbrechen"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> Apps verwenden gerade: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> App verwendet gerade: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Details ansehen"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App, die <xliff:g id="TYPES_LIST">%s</xliff:g> verwendet"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps, die <xliff:g id="TYPES_LIST">%s</xliff:g> verwenden"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 7468b3a9bcce..52bcfce51482 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Να επιτρέπεται ο εντοπισμός σφαλμάτων USB;"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Το μοναδικό χαρακτηριστικό του κλειδιού RSA είναι:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Να επιτρέπεται πάντα από αυτόν τον υπολογιστή"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Δεν επιτρέπεται ο εντοπισμός σφαλμάτων USB"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Ο χρήστης που είναι συνδεδεμένος αυτήν τη στιγμή σε αυτήν τη συσκευή δεν μπορεί να ενεργοποιήσει τον εντοπισμό σφαλμάτων USB. Για να χρησιμοποιήσετε αυτήν τη λειτουργία, κάντε εναλλαγή στον κύριο χρήστη."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Ζουμ σε πλήρη οθόνη"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Προβoλή σε πλήρη οθ."</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Στιγμιότυπο οθόνης"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Ακύρωση"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Περιοχή μηνυμάτων βοήθειας"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Επιβεβαίωση"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Δοκιμάστε ξανά"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Αγγίξτε τον αισθητήρα δακτυλικών αποτυπωμάτων"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Αναζήτηση για εσάς…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Ήχος"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Ακουστικά"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Είσοδος"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Βοηθήματα ακρόασης"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Ενεργοποίηση…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Φωτεινότητα"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Αυτόματη περιστροφή"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Συνήθως απορρίπτετε αυτές τις ειδοποιήσεις. \nΝα εξακολουθήσουν να εμφανίζονται;"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Να συνεχίσουν να εμφανίζονται αυτές οι ειδοποιήσεις;"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Διακοπή ειδοποιήσεων"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Αποκλεισμός"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Συνέχιση εμφάνισης"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Ελαχιστοποίηση"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Εμφάνιση σιωπηλά"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Διατήρηση σε σίγαση"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Να ειδοποιούμαι"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Να συνεχιστούν οι ειδοποιήσεις"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Να συνεχίσουν να εμφανίζονται ειδοποιήσεις από αυτήν την εφαρμογή;"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Αδύνατη η απενεργοποίηση αυτών των ειδοποιήσεων"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"μέσω <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Ρυθμίσεις"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Το κατάλαβα"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Στιγμ. μνήμης SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> εφαρμογές</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> εφαρμογή</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Η εφαρμογή <xliff:g id="APP">%1$s</xliff:g> χρησιμοποιεί τις λειτουργίες <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Οι εφαρμογές χρησιμοποιούν τις λειτουργίες <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Ακύρωση"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> εφαρμογές χρησιμοποιούν το <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> εφαρμογή χρησιμοποιεί το <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Προβολή λεπτομ."</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Εφαρμογή που χρησιμοποιεί τις λειτουργίες <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Εφαρμογές που χρησιμοποιούν τις λειτουργίες <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 703bc403c817..70208fb4a8b5 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Cancel"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Try again"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hearing Aids"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Block"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Show silently"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stay silent"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alert me"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Keep alerting"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> is using your <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Applications are using your <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 31fd04a32c36..308440315fe9 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Cancel"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Try again"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hearing Aids"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Block"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Show silently"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stay silent"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alert me"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Keep alerting"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> is using your <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Applications are using your <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 703bc403c817..70208fb4a8b5 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Cancel"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Try again"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hearing Aids"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Block"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Show silently"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stay silent"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alert me"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Keep alerting"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> is using your <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Applications are using your <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 703bc403c817..70208fb4a8b5 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Cancel"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Help message area"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirm"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Try again"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Looking for you…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hearing Aids"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Turning on…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Auto-rotate"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"You usually dismiss these notifications. \nKeep showing them?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Keep showing these notifications?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stop notifications"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Block"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Keep showing"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimise"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Show silently"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stay silent"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alert me"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Keep alerting"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Keep showing notifications from this app?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"These notifications can\'t be turned off"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Settings"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> is using your <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Applications are using your <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index d53d61bbf7a4..0154c823c37c 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -57,8 +57,11 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Allow USB debugging?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"The computer\'s RSA key fingerprint is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Always allow from this computer"</string> + <string name="usb_debugging_allow" msgid="2272145052073254852">"Allow"</string> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB debugging not allowed"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string> + <string name="usb_contaminant_title" msgid="206854874263058490">"USB port disabled"</string> + <string name="usb_contaminant_message" msgid="2205845572186473860">"To protect your device from liquid or debris, the USB port is disabled and won’t detect any accessories.\n\nYou’ll be notified when it’s safe to use the USB port again."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom to fill screen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stretch to fill screen"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string> @@ -875,7 +878,7 @@ <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> application is using your <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> </plurals> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancel"</string> + <string name="ongoing_privacy_dialog_ok" msgid="3273300106348958308">"Got it"</string> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"View details"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps using your <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 761acf6407b4..4ee40060bed1 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"¿Permitir depuración por USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"La huella digital de tu clave RSA es:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Permitir siempre desde esta computadora"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"No tienes permitida la depuración por USB"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"El usuario al que accediste en este dispositivo no puede activar la depuración por USB. Para usar esta función, debes cambiar al usuario principal."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom para ocupar la pantalla"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Estirar p/ ocupar la pantalla"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensajes de ayuda"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Volver a intentarlo"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor de huellas digitales"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícono de huella digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Autenticando tu rostro…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auriculares"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audífonos"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activando…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillo"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotación automática"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Sueles descartar estas notificaciones. \n¿Quieres seguir recibiéndolas?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"¿Quieres seguir viendo estas notificaciones?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Detener notificaciones"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Seguir viendo"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar sin emitir sonido"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Silenciar notificaciones"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Avisarme"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Seguir recibiendo alertas"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"¿Quieres seguir viendo las notificaciones de esta app?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"No se pueden desactivar estas notificaciones"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"por medio de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Configuración"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Entendido"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Volcar pila de SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> está usando tu <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Hay aplicaciones que están usando tu <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicaciones están usando tu <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicación está usando tu <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalles"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Una app está usando tu <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps que están usando tu <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 0b3ba5da32b0..446b6ac5c955 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"¿Permitir depuración por USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"La huella digital de tu clave RSA es:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Permitir siempre desde este ordenador"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuración USB no permitida"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"El usuario con el que se ha iniciado sesión en este dispositivo no puede activar la depuración USB. Para utilizar esta función, inicia sesión con la cuenta de usuario principal."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom para ajustar"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Expandir para ajustar"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensaje de ayuda"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Reintentar"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor de huellas digitales"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icono de huella digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Buscando tu cara…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auriculares"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audífonos"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activando…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillo"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Girar automáticamente"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Normalmente ignoras estas notificaciones. \n¿Quieres seguir viéndolas?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"¿Quieres seguir viendo estas notificaciones?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Detener las notificaciones"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Seguir mostrando"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar en silencio"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Silenciar notificaciones"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Quiero recibir alertas"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Quiero seguir recibiendo alertas"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"¿Quieres seguir viendo las notificaciones de esta aplicación?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Estas notificaciones no se pueden desactivar"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"mediante <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Ajustes"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Entendido"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Volcar pila de SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> está usando tu <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Hay aplicaciones que usan tu <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicaciones están usando tu <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicación está usando tu <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalles"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicación que usa tu <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicaciones que usan tu <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index e3182912a07f..080f206c707e 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Kas luban USB silumise?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Arvuti RSA-võtme sõrmejälg:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Luba alati sellest arvutist"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-silumine pole lubatud"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Sellesse seadmesse praegu sisse logitud kasutaja ei saa USB-silumist sisse lülitada. Selle funktsiooni kasutamiseks vahetage peamisele kasutajale."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Suumi ekraani täitmiseks"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Venita ekraani täitmiseks"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Ekraanipilt"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Tühista"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Abisõnumi ala"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Kinnita"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Proovi uuesti"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Puudutage sõrmejäljeandurit"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sõrmejälje ikoon"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Otsitakse teid …"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Heli"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Peakomplekt"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Sisend"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Kuuldeaparaadid"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Sisselülitamine …"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Heledus"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automaatne pööramine"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Tavaliselt loobute nendest märguannetest. \nKas soovite neid jätkuvalt näidata?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Kas soovite nende märguannete kuvamist jätkata?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Peata märguanded"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokeeri"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Jätka kuvamist"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimeeri"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Kuva vaikselt"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Kuva helita"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Teavita mind"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Teavita ka edaspidi"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Kas jätkata selle rakenduse märguannete kuvamist?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Neid märguandeid ei saa välja lülitada"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"rakenduse <xliff:g id="APP_NAME">%1$s</xliff:g> kaudu"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Seaded"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Selge"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> rakendust</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> rakendus</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> kasutab järgmisi: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Rakendused kasutavad järgmisi: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Tühista"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> rakendust kasutavad üksust <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> rakendus kasutab üksust <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Kuva üksikasjad"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Rakendus, mis kasutab üksusi <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Rakendused, mis kasutavad üksusi <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 5b9f0cfcad40..8d62bcf32cdf 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB arazketa onartu?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Ordenagailuaren RSA gakoaren erreferentzia-gako digitala hau da:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Onartu beti ordenagailu honetatik"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ez da onartzen USB arazketa"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Gailu honetan saioa hasita duen erabiltzaileak ezin du aktibatu USB arazketa. Eginbide hori erabiltzeko, aldatu erabiltzaile nagusira."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Handiagotu pantaila betetzeko"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Luzatu pantaila betetzeko"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Pantaila-argazkia"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Utzi"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Laguntza-mezuaren eremua"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Berretsi"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Saiatu berriro"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sakatu hatz-marken sentsorea"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Hatz-markaren ikonoa"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Zure bila…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audioa"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Entzungailua"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Sarrera"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audiofonoak"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Aktibatzen…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Distira"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Biratze automatikoa"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Baztertu egin ohi dituzu jakinarazpen hauek. \nHaiek erakusten jarraitzea nahi duzu?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Jakinarazpenak erakusten jarraitzea nahi duzu?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Blokeatu jakinarazpenak"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokeatu"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Jarraitu erakusten"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimizatu"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Erakutsi soinurik egin gabepen"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Jarraitu isilik"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Bidali jakinarazpenak"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Jarraitu jakinarazpenak bidaltzen"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Aplikazio honen jakinarazpenak erakusten jarraitzea nahi duzu?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Jakinarazpen hauek ezin dira desaktibatu"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren bidez"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Ezarpenak"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ados"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikazio</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikazio</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="TYPES_LIST">%2$s</xliff:g> erabiltzen ari da."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikazio batzuk <xliff:g id="TYPES_LIST">%s</xliff:g> erabiltzen ari dira."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Utzi"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikazio ari dira <xliff:g id="TYPE_5">%2$s</xliff:g> erabiltzen.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikazio ari da <xliff:g id="TYPE_1">%2$s</xliff:g> erabiltzen.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ikusi datuak"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> erabiltzen ari den aplikazioa"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g> erabiltzen ari diren aplikazioak"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index e89f90629988..035c6f3e080a 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"اشکالزدایی USB مجاز است؟"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"اثر انگشت کلید RSA رایانه: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"همیشه از این رایانه انجام شود"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"اشکالزدایی USB مجاز نیست"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"کاربری که درحال حاضر در این دستگاه وارد سیستم شده است نمیتواند اشکالزدایی USB را روشن کند. برای استفاده از این قابلیت، به کاربر اصلی تغییر وضعیت دهید."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"بزرگنمایی برای پر کردن صفحه"</string> <string name="compat_mode_off" msgid="4434467572461327898">"گسترده کردن برای پر کردن صفحه"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"عکس صفحهنمایش"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"لغو"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"بخش پیام راهنما"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"تأیید"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"امتحان مجدد"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"حسگر اثر انگشت را لمس کنید"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"نماد اثر انگشت"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"درحال جستجوی شما…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"صوت"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"هدست"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ورودی"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"سمعک"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"روشن کردن…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"روشنایی"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"چرخش خودکار"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"معمولاً این اعلانها را رد میکنید. \nهمچنان نشان داده شود؟"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"نمایش این اعلانها ادامه یابد؟"</string> <string name="inline_stop_button" msgid="4172980096860941033">"توقف اعلانها"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"مسدود کردن"</string> <string name="inline_keep_button" msgid="6665940297019018232">"همچنان نشان داده شود"</string> <string name="inline_minimize_button" msgid="966233327974702195">"کوچک کردن"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"نمایش بهصورت بیصدا"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"بیصدا بماند"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"به من اطلاع داده شود"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"همچنان اطلاع داده شود"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"نمایش اعلان از این برنامه ادامه یابد؟"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"نمیتوان این اعلانها را خاموش کرد"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"ازطریق <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"تنظیمات"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"متوجه شدم"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> برنامه</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> برنامه</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> از <xliff:g id="TYPES_LIST">%2$s</xliff:g> شما استفاده میکند."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"برنامهها از <xliff:g id="TYPES_LIST">%s</xliff:g> شما استفاده میکنند."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"لغو"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> برنامه درحال استفاده از <xliff:g id="TYPE_5">%2$s</xliff:g> شما است.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> برنامه درحال استفاده از <xliff:g id="TYPE_5">%2$s</xliff:g> شما است.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"مشاهده جزئیات"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"برنامهای که از <xliff:g id="TYPES_LIST">%s</xliff:g> شما استفاده میکند"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"برنامههایی که از <xliff:g id="TYPES_LIST">%s</xliff:g> شما استفاده میکنند"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 931def7ee582..c2ccd993c4c1 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Sallitaanko USB-vianetsintä?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Tietokoneen RSA-avaintunnistetiedosto on:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Salli aina tällä tietokoneella"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-vianetsintää ei sallita"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Laitteelle tällä hetkellä kirjautunut käyttäjä ei voi ottaa USB-vianetsintää käyttöön. Vaihda käyttäjäksi ensisijainen käyttäjä, jotta voit käyttää tätä ominaisuutta."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoomaa koko näyttöön"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Venytä koko näyttöön"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Kuvakaappaus"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Peruuta"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Ohjeviestialue"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Vahvista"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Yritä uudelleen"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Kosketa sormenjälkitunnistinta"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sormenjälkikuvake"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Etsitään kasvoja…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Ääni"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Syöttölaite"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Kuulolaitteet"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Otetaan käyttöön…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Kirkkaus"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automaattinen kääntö"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Hylkäät yleensä nämä ilmoitukset. \nHaluatko, että niitä näytetään myös jatkossa?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Jatketaanko näiden ilmoitusten näyttämistä?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Lopeta ilmoitukset"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Estä"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Jatka näyttämistä"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Pienennä"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Näytä ilman ääntä"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Jatka äänettömyyttä"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Hälytä"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Jatka ilmoituksista hälyttämistä"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Jatketaanko ilmoitusten näyttämistä tästä sovelluksesta?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Näitä ilmoituksia ei voi poistaa käytöstä"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Asetukset"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Selvä"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Luo SysUI-keon vedos"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> sovellusta</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> sovellus</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> käyttää ominaisuuksia (<xliff:g id="TYPES_LIST">%2$s</xliff:g>)."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"<xliff:g id="TYPES_LIST">%s</xliff:g> ovat sovellusten käytössä."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Peruuta"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> on <xliff:g id="NUM_APPS_4">%1$d</xliff:g> sovelluksen käytössä.</item> + <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> on <xliff:g id="NUM_APPS_0">%1$d</xliff:g> sovelluksen käytössä.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Näytä tiedot"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Sovellus, jolla on <xliff:g id="TYPES_LIST">%s</xliff:g> ‑käyttöoikeus"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Sovellukset, joilla on <xliff:g id="TYPES_LIST">%s</xliff:g> ‑käyttöoikeus"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index d1412aafe076..98e64894c17d 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Autoriser le débogage USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Empreinte numérique de la clé RSA de l\'ordinateur : \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Toujours autoriser sur cet ordinateur"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Débogage USB non autorisé"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoomer pour remplir l\'écran"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Étirer pour remplir l\'écran"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Capture d\'écran"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Annuler"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zone de message d\'aide"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmer"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Réessayer"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touchez le capteur d\'empreintes digitales"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Recherche de votre visage…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Écouteurs"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrée"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Prothèses auditives"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activation en cours…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosité"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotation automatique"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Vous ignorez habituellement ces notifications. \nSouhaitez-vous continuer à les afficher?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Continuer à afficher ces notifications?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Arrêter les notifications"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Bloquer"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continuer à afficher"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Réduire"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Afficher en silence"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continuer d\'util. mode silencieux"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"M\'alerter"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuer d\'envoyer des alertes"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer à afficher les notifications de cette application?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ces notifications ne peuvent pas être désactivées"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Paramètres"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Capturer mémoire SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> application</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> applications</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> utilise votre <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Des applications utilisent votre <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Annuler"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> application utilise votre <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications utilisent votre <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Afficher détails"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Application qui utilise votre <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Applications qui utilisent votre <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 8ba575bcd3ca..1233bbee15a2 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Autoriser le débogage USB ?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Empreinte numérique de la clé RSA de l\'ordinateur : \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Toujours autoriser sur cet ordinateur"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Débogage USB non autorisé"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'utilisateur actuellement connecté sur cet appareil ne peut pas activer le débogage USB. Pour utiliser cette fonctionnalité, l\'utilisateur principal doit se connecter."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoomer pour remplir l\'écran"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Étirer pour remplir l\'écran"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Capture d\'écran"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Annuler"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zone de message d\'aide"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmer"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Réessayer"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Appuyez sur le lecteur d\'empreinte digitale"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Recherche de votre visage…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Casque"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrée"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Appareils auditifs"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activation…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosité"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotation automatique"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Vous ignorez généralement ces notifications. \nSouhaitez-vous continuer de les recevoir ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Continuer d\'afficher ces notifications ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Arrêter les notifications"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Bloquer"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continuer d\'afficher les notifications"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Réduire"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Affichage silencieux"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Notifications silencieuses"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"M\'avertir"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuer de m\'avertir"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuer d\'afficher les notifications de cette application ?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ces notifications ne peuvent pas être désactivées"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Paramètres"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Copier mémoire SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> application</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> applications</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> utilise votre <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Des applications utilisent votre <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Annuler"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> application utilise votre <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications utilisent votre <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Voir les détails"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Application utilisant votre/vos <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Applications utilisant votre/vos <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 2784567e3797..38554d1f1eea 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Permitir a depuración de erros de USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"A impresión dixital da clave de RSA do ordenador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Permitir sempre desde este ordenador"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Non se permite a depuración por USB"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O usuario coa sesión iniciada actualmente neste dispositivo non pode activar a depuración por USB. Para utilizar esta función, cambia ao usuario principal."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Ampliar ata ocupar todo"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Estirar ata ocupar todo"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de pantalla"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área de mensaxes de axuda"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tentar de novo"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca o sensor de impresión dixital"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona de impresión dixital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Buscándote…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auriculares"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Audiófonos"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Activando…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillo"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Xirar automaticamente"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Ignoras estas notificacións a miúdo. \nQueres seguir recibíndoas?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Queres seguir mostrando estas notificacións?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Deter notificacións"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando notificacións"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar en silencio"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Notificacións silenciosas"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Recibir notificacións"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar recibindo notificacións"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Queres seguir mostrando as notificacións desta aplicación?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Non se poden desactivar estas notificacións"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"mediante <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Configuración"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"De acordo"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Baleirar mont. SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplicacións</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplicación</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> está utilizando <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Hai aplicacións que están utilizando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicacións utilizan o teu dispositivo (<xliff:g id="TYPE_5">%2$s</xliff:g>).</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicación utiliza o teu dispositivo (<xliff:g id="TYPE_1">%2$s</xliff:g>).</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalles"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicación que utiliza o seguinte: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicacións que utilizan o seguinte: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index f17a7f611fd0..878d0b91967f 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB ડિબગિંગને મંજૂરી આપીએ?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"કમ્પ્યુટરની RSA મુખ્ય ફિંગરપ્રિંટ આ છે:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"હંમેશા આ કમ્પ્યુટરથી મંજૂરી આપો"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ડીબગિંગની મંજૂરી નથી"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"હાલમાં આ ઉપકરણમાં સાઇન ઇન થયેલ વપરાશકર્તા USB ડિબગીંગ ચાલુ કરી શકતા નથી. આ સુવિધાનો ઉપયોગ કરવા માટે પ્રાથમિક વપરાશકર્તા પર સ્વિચ કરો."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"સ્ક્રીન ભરવા માટે ઝૂમ કરો"</string> <string name="compat_mode_off" msgid="4434467572461327898">"સ્ક્રીન ભરવા માટે ખેંચો"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"સ્ક્રીનશૉટ"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"રદ કરો"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"સહાય સંદેશનું ક્ષેત્ર"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"કન્ફર્મ કરો"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ફરી પ્રયાસ કરો"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ફિંગરપ્રિન્ટના સેન્સરને સ્પર્શ કરો"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ફિંગરપ્રિન્ટનું આઇકન"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"તમારા માટે શોધી રહ્યાં છે..."</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ઑડિઓ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"હૅડસેટ"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ઇનપુટ"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"શ્રવણ યંત્રો"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ચાલુ કરી રહ્યાં છીએ…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"તેજ"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"આપમેળે ફેરવો"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"તમે સામાન્ય રીતે આ નોટીફિકેશનને છોડી દો છો. \nતેમને બતાવવાનું ચાલુ રાખીએ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"આ નોટિફિકેશન બતાવવાનું ચાલુ રાખીએ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"નોટિફિકેશન બંધ કરો"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"બ્લૉક કરો"</string> <string name="inline_keep_button" msgid="6665940297019018232">"બતાવવાનું ચાલુ રાખો"</string> <string name="inline_minimize_button" msgid="966233327974702195">"નાનું કરો"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"સાઇલન્ટલી બતાવો"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"સાઇલન્ટ મોડ ચાલુ રાખો"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"મને અલર્ટ બતાવો"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"અલર્ટ કરવાનું ચાલુ રાખો"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"આ ઍપમાંથી નોટિફિકેશન બતાવવાનું ચાલુ રાખીએ?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"આ નોટિફિકેશન બંધ કરી શકશો નહીં"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> મારફતે"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"સેટિંગ"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"સમજાઈ ગયું"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> ઍપ</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ઍપ</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ઍપ તમારા <xliff:g id="TYPES_LIST">%2$s</xliff:g>નો ઉપયોગ કરી રહી છે."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ઍપ્લિકેશન તમારા <xliff:g id="TYPES_LIST">%s</xliff:g>નો ઉપયોગ કરી રહી છે."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"રદ કરો"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ઍપ્લિકેશન તમારા <xliff:g id="TYPE_5">%2$s</xliff:g>નો ઉપયોગ કરી રહી છે.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ઍપ્લિકેશનો તમારા <xliff:g id="TYPE_5">%2$s</xliff:g>નો ઉપયોગ કરી રહી છે.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"વિગતો જુઓ"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"અૅપ તમારા <xliff:g id="TYPES_LIST">%s</xliff:g>નો ઉપયોગ કરી રહી છે"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"અૅપ તમારા <xliff:g id="TYPES_LIST">%s</xliff:g>નો ઉપયોગ કરી રહી છે"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 1c6991049b1f..96c6f6ea6d3f 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB डीबगिंग करने दें?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"कंप्यूटर का RSA कुंजी फ़िंगरप्रिंट है:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"इस कंप्यूटर से हमेशा अनुमति दें"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB डीबगिंग की अनुमति नहीं है"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"अभी इस डिवाइस में जिस उपयोगकर्ता ने साइन इन किया है, वो USB डीबगिंग चालू नहीं कर सकता. इस सुविधा का इस्तेमाल करने के लिए, प्राथमिक उपयोगकर्ता में बदलें."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"स्क्रीन भरने के लिए ज़ूम करें"</string> <string name="compat_mode_off" msgid="4434467572461327898">"स्क्रीन भरने के लिए खींचें"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रीनशॉट"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"रद्द करें"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"सहायता का मैसेज दिखाने की जगह"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"पुष्टि करें"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"फिर से कोशिश करें"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फ़िंगरप्रिंट सेंसर को छुएं"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फ़िंगरप्रिंट आइकॉन"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"आपको पहचान रहा है…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ऑडियो"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"हेडसेट"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"इनपुट"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"सुनने में मददगार डिवाइस"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ब्लूटूथ चालू हो रहा है…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"स्क्रीन की रोशनी"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"स्वत: घुमाएं"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"अाप अक्सर इन सूचनाओं को खारिज कर देते हैं. \nआगे भी इन्हें देखना जारी रखना चाहते हैं?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ये सूचनाएं दिखाना जारी रखें?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"सूचनाएं दिखाना बंद करें"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"ब्लॉक करें"</string> <string name="inline_keep_button" msgid="6665940297019018232">"दिखाना जारी रखें"</string> <string name="inline_minimize_button" msgid="966233327974702195">"सूचनाएं छोटी करें"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"बिना आवाज़ के दिखाएं"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"साइलेंट मोड में सूचनाएं पाएं"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"मुझे सूचना दें"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"सूचना देना जारी रखें"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"इस ऐप्लिकेशन से जुड़ी सूचनाएं दिखाना जारी रखें?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"ये सूचनाएं दिखाया जाना बंद नहीं किया जा सकता"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> के ज़रिए"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"सेटिंग"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"ठीक है"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> ऐप्लिकेशन</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ऐप्लिकेशन</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> आपकी <xliff:g id="TYPES_LIST">%2$s</xliff:g> का इस्तेमाल कर रहा है."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ऐप्लिकेशन आपकी <xliff:g id="TYPES_LIST">%s</xliff:g> का इस्तेमाल कर रहे हैं."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"रद्द करें"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ऐप्लिकेशन आपके <xliff:g id="TYPE_5">%2$s</xliff:g> का इस्तेमाल कर रहे हैं.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ऐप्लिकेशन आपके <xliff:g id="TYPE_5">%2$s</xliff:g> का इस्तेमाल कर रहे हैं.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"विवरण देखें"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> का इस्तेमाल कर रहा ऐप्लिकेशन"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"आपके <xliff:g id="TYPES_LIST">%s</xliff:g> का इस्तेमाल कर रहे ऐप्लिकेशन"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 8f3a11b63ec9..17e1cc3a1193 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Omogućiti otklanjanje pogrešaka putem USB-a?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Otisak prsta RSA ključa računala je: \n <xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Uvijek dopusti s ovog računala"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje pogrešaka putem USB-a nije dopušteno"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Korisnik koji je trenutačno prijavljen na ovaj uređaj ne može uključiti otklanjanje pogrešaka putem USB-a. Da biste upotrebljavali tu značajku, prijeđite na primarnog korisnika."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zumiraj i ispuni zaslon"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Rastegni i ispuni zaslon"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Snimka zaslona"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Odustani"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Područje poruke za pomoć"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdi"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Pokušaj ponovo"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dodirnite senzor otiska prsta"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Tražimo vas…"</string> @@ -297,8 +302,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Slušalice"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Unos"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Slušni aparati"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Uključivanje…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Svjetlina"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatsko izmjenjivanje"</string> @@ -614,17 +618,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Obično odbacujete te obavijesti. \nŽelite li da se nastave prikazivati?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Želite li da se obavijesti nastave prikazivati?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Zaustavi obavijesti"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokiraj"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Nastavi prikazivati"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimiziraj"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Prikaži tiho"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Nastavi tiho"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Obavijesti me"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Nastavi obavještavati"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite li da se obavijesti te aplikacije nastave prikazivati?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Te se obavijesti ne mogu isključiti"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"putem aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -876,11 +876,20 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Postavke"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Shvaćam"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Izdvoji mem. SysUI-a"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacije</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> upotrebljava <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacije upotrebljavaju <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Odustani"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija upotrebljava <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacije upotrebljavaju <xliff:g id="TYPE_3">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija upotrebljava <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Prikaži detalje"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacije koje upotrebljavaju <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacije koje upotrebljavaju <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 49d923a2247a..6e142005168f 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Engedélyezi az USB hibakeresést?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"A számítógép RSA kulcs ujjlenyomata:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Mindig engedélyezze erről a számítógépről"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Az USB hibakeresése nem engedélyezett"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Az eszközre jelenleg bejelentkezett felhasználó nem engedélyezheti az USB-hibakeresést. A funkció használatához váltson az elsődleges felhasználóra."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Nagyítás a kitöltéshez"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Nyújtás kitöltéshez"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Képernyőkép"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Mégse"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Súgószöveg területe"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Megerősítés"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Újrapróbálkozás"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Érintse meg az ujjlenyomat-érzékelőt"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ujjlenyomat ikonja"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Keresem az Ön arcát…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Hang"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Bevitel"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hallókészülékek"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Bekapcsolás…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Fényerő"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatikus elforgatás"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Általában elveti ezeket az értesítéseket.\nSzeretné, hogy továbbra is megjelenjenek?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Továbbra is megjelenjenek ezek az értesítések?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Értesítések letiltása"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Tiltás"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Megjelenítés továbbra is"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Kis méret"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Megjelenítés hang nélkül"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Néma megjelenítés"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Értesítsen"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Értesítések folytatása"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Továbbra is megjelenjenek az alkalmazás értesítései?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ezeket az értesítéseket nem lehet kikapcsolni"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"a(z) <xliff:g id="APP_NAME">%1$s</xliff:g> alkalmazás használatával"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Beállítások"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Értem"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI-memória-kiírás"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> alkalmazás</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> alkalmazás</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"A(z) <xliff:g id="APP">%1$s</xliff:g> használja a következőket: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Több alkalmazás használja a következőket: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Mégse"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> alkalmazás használja a következőt: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> alkalmazás használja a következőt: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Részletek"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"A következőket használó alkalmazás: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"A következőt használó alkalmazások: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index dc592c526597..37512e67ebd7 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Թույլատրե՞լ USB-ի կարգաբերումը:"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Համակարգչի RSA-ի բանալի մատնահետքն է`\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Միշտ թույլատրել այս համակարգչից"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB վրիպազերծումը արգելված է"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Ընթացիկ հաշվի օգտատերը չի կարող միացնել USB վրիպազերծումը: Այս գործառույթը միացնելու համար մուտք գործեք հիմնական օգտատիրոջ հաշվով:"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Խոշորացնել` էկրանը լցնելու համար"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Ձգել` էկրանը լցնելու համար"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Սքրինշոթ"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Չեղարկել"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Օգնության հաղորդագրության դաշտ"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Հաստատել"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Նորից փորձել"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Հպեք մատնահետքերի սկաներին"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Մատնահետքի պատկերակ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Դեմքի ճանաչում…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Աուդիո"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Ականջակալ"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Մուտքագրում"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Լսողական ապարատ"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Միացում…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Պայծառություն"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Ինքնապտտում"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Դուք սովորաբար փակում եք այս ծանուցումները: \nՇարունակե՞լ ցուցադրել դրանք:"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Ցուցադրե՞լ այս ծանուցումները։"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Չցուցադրել ծանուցումներ"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Արգելափակել"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Ցուցադրել"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Ծալել"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Ցույց տալ անձայն"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Չմիացնել ձայնը"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Ծանուցել ինձ"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Ծանուցել"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Ցուցադրե՞լ ծանուցումներ այս հավելվածից։"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Այս ծանուցումները հնարավոր չէ անջատել"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածի միջոցով"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Կարգավորումներ"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Եղավ"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> հավելված</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> հավելված</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> հավելվածն օգտագործում է ձեր <xliff:g id="TYPES_LIST">%2$s</xliff:g>:"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Հավելվածներն օգտագործում են ձեր <xliff:g id="TYPES_LIST">%s</xliff:g>:"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Չեղարկել"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one">Ձեր սարքում <xliff:g id="NUM_APPS_4">%1$d</xliff:g> հավելված օգտագործում է <xliff:g id="TYPE_5">%2$s</xliff:g>։</item> + <item quantity="other">Ձեր սարքում <xliff:g id="NUM_APPS_4">%1$d</xliff:g> հավելված օգտագործում է <xliff:g id="TYPE_5">%2$s</xliff:g>:</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Մանրամասն"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Հավելված, որն օգտագործում է <xliff:g id="TYPES_LIST">%s</xliff:g> ձեր սարքում"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Հավելվածներ, որոնք օգտագործում են <xliff:g id="TYPES_LIST">%s</xliff:g> ձեր սարքում"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 1b43e658b418..9d49bdca1819 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Izinkan debugging USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Sidik jari kunci RSA komputer adalah:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Selalu izinkan dari komputer ini"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Debug USB tidak diizinkan"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Pengguna yang sedang login ke perangkat ini tidak dapat mengaktifkan proses debug USB. Beralihlah ke pengguna utama untuk menggunakan fitur ini."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Perbesar utk mengisi layar"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Rentangkn utk mngisi layar"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Batal"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Area pesan bantuan"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Konfirmasi"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Coba lagi"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sentuh sensor sidik jari"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon sidik jari"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Mencari wajah Anda…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Masukan"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Alat Bantu Dengar"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Mengaktifkan…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Kecerahan"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotasi otomatis"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Anda biasanya menutup notifikasi ini. \nTerus tampilkan?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Terus tampilkan notifikasi ini?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Hentikan notifikasi"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokir"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Terus tampilkan"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Perkecil"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Tampilkan tanpa suara"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Tetap nonaktif"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Beri tahu saya"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Terus beri tahu"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Terus tampilkan notifikasi dari aplikasi ini?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Notifikasi ini tidak dapat dinonaktifkan"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"melalui <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Setelan"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Hapus Heap SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikasi</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikasi</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> menggunakan <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikasi menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Batal"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikasi menggunakan <xliff:g id="TYPE_5">%2$s</xliff:g> Anda.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikasi menggunakan <xliff:g id="TYPE_1">%2$s</xliff:g> Anda.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Lihat detail"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikasi yang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> Anda"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikasi yang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> Anda"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 36b557d83994..0cc367b5a814 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Leyfa USB-villuleit?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Fingrafar RSA-lykils tölvunnar er:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Leyfa alltaf úr þessari tölvu"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-villuleit ekki leyfð"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Notandinn sem er skráður inn í þetta tæki núna getur ekki kveikt á USB-villuleit. Til þess að nota þennan eiginleika skaltu skipta yfir í aðalnotandann."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Fylla skjá með aðdrætti"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Teygja yfir allan skjáinn"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Skjámynd"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Hætta við"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Svæði hjálparskilaboða"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Staðfesta"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Reyna aftur"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Snertu fingrafaralesarann"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingrafaratákn"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Leitar að þér ..."</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Hljóð"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Höfuðtól"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Inntak"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Heyrnartæki"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Kveikir…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Birtustig"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Sjálfvirkur snúningur"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Þú hunsar yfirleitt þessar tilkynningar. \nViltu halda áfram að fá þær?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Sýna áfram þessar tilkynningar?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stöðva tilkynningar"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Loka á"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Sýna áfram"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minnka"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Sýna án hljóðs"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Áfram hljóðlaust"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Láta mig vita"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Halda áfram að gera viðvart"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Sýna áfram tilkynningar frá þessu forriti?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ekki er hægt að slökkva á þessum tilkynningum"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"með <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Stillingar"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ég skil"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Vista SysUI-gögn"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> forrit</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> forrit</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> er að nota <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Forrit eru að nota <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Hætta við"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> forrit er að nota <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> forrit eru að nota <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Sjá nánar"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Forrit sem nota <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Forrit sem nota <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 21c259a7588e..27998bf92fde 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Consentire debug USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Fingerprint della chiave RSA del computer: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Consenti sempre da questo computer"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Debug USB non consentito"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"L\'utente che ha eseguito l\'accesso a questo dispositivo non può attivare il debug USB. Per utilizzare questa funzione, passa all\'utente principale."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom per riempire schermo"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Estendi per riemp. schermo"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Annulla"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Area dei messaggi di assistenza"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confermo"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Riprova"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Tocca il sensore di impronte digitali"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona dell\'impronta digitale"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"In attesa del volto…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Auricolare"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Ingresso"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Apparecchi acustici"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Attivazione…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosità"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotazione automatica"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"In genere ignori queste notifiche. \nVuoi continuare a riceverle?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Continuare a ricevere queste notifiche?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Interrompi la ricezione di notifiche"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blocca"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continua a mostrare"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Riduci a icona"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostra silenziosamente"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continua con notifiche silenziose"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Avvisami"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continua ad avvisare"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuare a ricevere notifiche da questa app?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Queste notifiche non possono essere disattivate"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"tramite <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Impostazioni"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Esegui dump heap SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"L\'app <xliff:g id="APP">%1$s</xliff:g> sta usando <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Le app stanno usando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Annulla"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applicazioni stanno utilizzando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> applicazione sta utilizzando <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Vedi dettagli"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App che usa <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"App che utilizzano <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index d43551d214a8..71cf575718e5 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"האם לאפשר ניפוי באגים ב-USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"טביעת האצבע של מפתח ה-RSA של המחשב היא:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"אפשר תמיד ממחשב זה"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"לא ניתן לבצע ניפוי באגים ב-USB"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"למשתמש המחובר לחשבון במכשיר הזה אין אפשרות להפעיל ניפוי באגים ב-USB. כדי להשתמש בתכונה הזו יש לעבור אל המשתמש הראשי."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"הגדל תצוגה כדי למלא את המסך"</string> <string name="compat_mode_off" msgid="4434467572461327898">"מתח כדי למלא את המסך"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"צילום מסך"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"ביטול"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"אזור הודעת עזרה"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"אישור"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ניסיון נוסף"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"יש לגעת בחיישן טביעות האצבע"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"סמל טביעת אצבע"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"מחפש אותך…"</string> @@ -298,8 +303,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"אודיו"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"אוזניות"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"קלט"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"מכשירי שמיעה"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ההפעלה מתבצעת…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"בהירות"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"סיבוב אוטומטי"</string> @@ -617,17 +621,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"הודעות אלה בדרך כלל נדחות על ידיך. \nלהמשיך להציג אותן?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"שנמשיך להציג לך את ההודעות האלה?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"לא, אל תמשיכו"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"חסימה"</string> <string name="inline_keep_button" msgid="6665940297019018232">"כן, המשיכו"</string> <string name="inline_minimize_button" msgid="966233327974702195">"מזעור"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"הצגה ללא צליל"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"בשקט"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"אבקש התראה"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"המשך שליחת התראות"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"שנמשיך להציג לך הודעות מהאפליקציה הזאת?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"לא ניתן לכבות את ההודעות האלה"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"באמצעות <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -881,11 +881,22 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"הגדרות"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"הבנתי"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"ערימת Dump SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="two"><xliff:g id="NUM_APPS_2">%d</xliff:g> אפליקציות</item> + <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> אפליקציות</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> אפליקציות</item> + <item quantity="one">אפליקציה אחת (<xliff:g id="NUM_APPS_0">%d</xliff:g>)</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> משתמשת ב<xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"אפליקציות משתמשות ב<xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ביטול"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="two"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> אפליקציות משתמשות ב<xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> אפליקציות משתמשות ב<xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> אפליקציות משתמשות ב<xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one">אפליקציה אחת (<xliff:g id="NUM_APPS_0">%1$d</xliff:g>) משתמשת ב<xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"הצגת פרטים"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"האפליקציה משתמשת ב<xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"אפליקציות משתמשות ב<xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index ff88a0db6555..2430500e2a0a 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USBデバッグを許可しますか?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"このパソコンのRSAキーのフィンガープリント:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"このパソコンからのUSBデバッグを常に許可する"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USBデバッグは許可されていません"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"この端末に現在ログインしているユーザーでは、USB デバッグを ON にすることはできません。この機能を使用するには、メインユーザーに切り替えてください。"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"画面サイズに合わせて拡大"</string> <string name="compat_mode_off" msgid="4434467572461327898">"画面サイズに合わせて拡大"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"スクリーンショット"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"キャンセル"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ヘルプ メッセージ領域"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"再試行"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"指紋認証センサーをタップしてください"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋アイコン"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"顔を認証しています…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"オーディオ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ヘッドセット"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"入力"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"補聴器"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ON にしています…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"画面の明るさ"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"自動回転"</string> @@ -595,7 +599,7 @@ <string name="enable_bluetooth_title" msgid="5027037706500635269">"BluetoothをONにしますか?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"タブレットでキーボードに接続するには、最初にBluetoothをONにする必要があります。"</string> <string name="enable_bluetooth_confirmation_ok" msgid="6258074250948309715">"ONにする"</string> - <string name="show_silently" msgid="6841966539811264192">"通知をマナーモードで表示する"</string> + <string name="show_silently" msgid="6841966539811264192">"通知をポップアップで知らせる"</string> <string name="block" msgid="2734508760962682611">"通知をすべてブロックする"</string> <string name="do_not_silence" msgid="6878060322594892441">"音声で知らせる"</string> <string name="do_not_silence_block" msgid="4070647971382232311">"音声で知らせる / ブロックしない"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"通常、この通知はスワイプして非表示にしています。\n今後も表示しますか?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"この通知を今後も表示しますか?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"通知を表示しない"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"ブロック"</string> <string name="inline_keep_button" msgid="6665940297019018232">"今後も表示する"</string> <string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string> - <string name="inline_silent_button_silent" msgid="4411510650503783646">"サイレント モードで表示"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_silent" msgid="4411510650503783646">"ポップアップで知らせる"</string> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"音なしで通知"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"アラートを設定"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"今後もアラートを受け取る"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"このアプリからの通知を今後も表示しますか?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"この通知を OFF にすることはできません"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> 経由"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"設定"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ヒープのダンプ"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g>個のアプリ</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g>個のアプリ</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>は<xliff:g id="TYPES_LIST">%2$s</xliff:g>を使用しています。"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"アプリは<xliff:g id="TYPES_LIST">%s</xliff:g>を使用しています。"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"キャンセル"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> 個のアプリが <xliff:g id="TYPE_5">%2$s</xliff:g> を使用しています。</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> 個のアプリが <xliff:g id="TYPE_1">%2$s</xliff:g> を使用しています。</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"詳細を表示"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g>を使用しているアプリ"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g>を使用しているアプリ"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index e1ee20eb12ba..40f13039f4c5 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"გააქტიურდეს USB გამართვა?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"კომპიუტერის RSA გასაღების თითის ანაბეჭდია:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"ყოველთვის დართე ნება ამ კომპიუტერიდან."</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ხარვეზების გამართვა ნებადართული არაა"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ამ მოწყობილობაზე ამჟამად შესულ მომხმარებელს არ შეუძლია USB ხარვეზების გამართვის ფუნქციის ჩართვა. ამ ფუნქციის გამოსაყენებლად, მიუერთდით მთავარ მომხმარებელს."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"მასშტაბი შეცვალეთ ეკრანის შესავსებად."</string> <string name="compat_mode_off" msgid="4434467572461327898">"გაწიეთ ეკრანის შესავსებად."</string> <string name="global_action_screenshot" msgid="8329831278085426283">"ეკრანის ანაბეჭდი"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"გაუქმება"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"დამხმარე შეტყობინების არე"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"დადასტურება"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ხელახლა ცდა"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"შეეხეთ თითის ანაბეჭდის სენსორს"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"თითის ანაბეჭდის ხატულა"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"მიმდინარეობს თქვენი ძიება…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"აუდიო"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ყურსაცვამი"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"შეყვანა"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"სმენის მოწყობილობები"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ირთვება…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"სიკაშკაშე"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ავტოროტაცია"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"როგორც წესი, თქვენ ასეთ შეტყობინებებს ხურავთ. \nგსურთ მათი ჩვენების გაგრძელება?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"გაგრძელდეს ამ შეტყობინებათა ჩვენება?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"შეტყობინებების შეწყვეტა"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"დაბლოკვა"</string> <string name="inline_keep_button" msgid="6665940297019018232">"ჩვენების გაგრძელება"</string> <string name="inline_minimize_button" msgid="966233327974702195">"ჩაკეცვა"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"უხმოდ ჩვენება"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"კვლავ ჩუმად ჩვენება"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"გაფრთხილების მიღება"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"გაფრთხილების გაგრძელება"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"გაგრძელდეს შეტყობინებათა ჩვენება ამ აპიდან?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"ამ შეტყობინებათა გამორთვა ვერ მოხერხდება"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>-დან"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"პარამეტრები"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"გასაგებია"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI გროვის გამოტანა"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> აპი</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> აპი</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>-ის მიერ გამოიყენება თქვენი <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"აპლიკაციების მიერ გამოიყენება თქვენი <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"გაუქმება"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other">თქვენი <xliff:g id="TYPE_5">%2$s</xliff:g> გამოიყენება <xliff:g id="NUM_APPS_4">%1$d</xliff:g> აპლიკაციის მიერ.</item> + <item quantity="one">თქვენი <xliff:g id="TYPE_1">%2$s</xliff:g> გამოიყენება <xliff:g id="NUM_APPS_0">%1$d</xliff:g> აპლიკაციის მიერ.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"დეტალების ნახვა"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"აპი, რომლის მიერაც გამოიყენება თქვენი <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"აპები, რომელთა მიერაც გამოიყენება თქვენი <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 41ef3e29888b..b00c560688ba 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB жөндеуге рұқсат берілсін бе?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Бұл компьютердің RSA перне саусақ таңбасы:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Осы компьютерден әрқашан рұқсат беру"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB жөндеу рұқсат етілмеген"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Бұл құрылғыға жаңа кірген пайдаланушы USB түзетуін іске қосылмайды. Бұл мүмкіндікті пайдалану үшін негізгі пайдаланушыға ауысыңыз."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Экранды толтыру үшін ұлғайту"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Экранды толтыру үшін созу"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Бас тарту"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Анықтама хабары аумағы"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Растау"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Қайталап көріңіз"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Саусақ ізін оқу сканерін түртіңіз"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Саусақ ізі белгішесі"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Бет ізделуде…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Aудио"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнитура"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Кіріс"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Есту аппараттары"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Қосылуда…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Жарықтығы"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматты түрде бұру"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Әдетте хабарландыруларды көрмейсіз. \nОлар көрсетілсін бе?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Хабарландырулар көрсетілсін бе?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Хабарландыруларға тыйым салу"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Бөгеу"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Көрсету"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Жасыру"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Дыбыссыз көрсету"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Хабарландырулар алғым келмейді"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Хабарландырулар алғым келеді"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Хабарландырулар келе берсін"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Осы қолданбаның хабарландырулары көрсетілсін бе?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Хабарландыруларды өшіру мүмкін емес"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> арқылы"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Параметрлер"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Түсінікті"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> қолданба</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> қолданба</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> қолданбасында <xliff:g id="TYPES_LIST">%2$s</xliff:g> пайдалануда."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Қолданбаларда <xliff:g id="TYPES_LIST">%s</xliff:g> пайдаланылуда."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Бас тарту"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> опциясын <xliff:g id="NUM_APPS_4">%1$d</xliff:g> қолданба пайдаланып жатыр.</item> + <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> опциясын <xliff:g id="NUM_APPS_0">%1$d</xliff:g> қолданба пайдаланып жатыр.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Мәліметті көру"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> пайдаланып жатқан қолданба"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g> пайдаланып жатқан қолданбалар"</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 5520cb001a23..a3c37a6282d0 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"អនុញ្ញាតការកែកំហុសតាម USB ឬ?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"ស្នាមម្រាមដៃ RSA របស់កុំព្យូទ័រគឺ៖ \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"អនុញ្ញាតជានិច្ចសម្រាប់កុំព្យូទ័រនេះ"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"មិនអនុញ្ញាតការកែកំហុសតាម USB ទេ"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"អ្នកប្រើដែលបច្ចុប្បន្នបានចូលគណនីនៅលើឧបករណ៍នេះមិនអាចបើកការកែកំហុស USB បានទេ។ ដើម្បីប្រើមុខងារនេះ សូមប្តូរទៅអ្នកប្រើចម្បង។"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"ពង្រីកដើម្បីឲ្យពេញអេក្រង់"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ទាញដើម្បីឲ្យពេញអេក្រង់"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"រូបថតអេក្រង់"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"បោះបង់"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"តំបន់សារជំនួយ"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"បញ្ជាក់"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ព្យាយាមម្ដងទៀត"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ប៉ះឧបករណ៍ចាប់ស្នាមម្រាមដៃ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"រូបតំណាងស្នាមម្រាមដៃ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"កំពុងស្វែងរកអ្នក…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"សំឡេង"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"កាស"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"បញ្ចូល"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ឧបករណ៍ជំនួយការស្ដាប់"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"កំពុងបើក..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ពន្លឺ"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"បង្វិលស្វ័យប្រវត្តិ"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"ជាធម្មតាអ្នកច្រានចោលការជូនដំណឹងទាំងនេះ។ \nបន្តបង្ហាញពួកវាទៀតដែរទេ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"បន្តបង្ហាញការជូនដំណឹងទាំងនេះ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"បញ្ឈប់ការជូនដំណឹង"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"ទប់ស្កាត់"</string> <string name="inline_keep_button" msgid="6665940297019018232">"បន្តបង្ហាញ"</string> <string name="inline_minimize_button" msgid="966233327974702195">"បង្រួម"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"បង្ហាញស្ងាត់ៗ"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"បន្តបិទសំឡេង"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"ជូនដំណឹងដល់ខ្ញុំ"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"បន្តជូនដំណឹង"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"បន្តបង្ហាញការជូនដំណឹងពីកម្មវិធីនេះ?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"មិនអាចបិទការជូនដំណឹងទាំងនេះបានទេ"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"តាមរយៈ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"ការកំណត់"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"យល់ហើយ"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"ចម្លង SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other">កម្មវិធី <xliff:g id="NUM_APPS_2">%d</xliff:g></item> + <item quantity="one">កម្មវិធី <xliff:g id="NUM_APPS_0">%d</xliff:g></item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> កំពុងប្រើ <xliff:g id="TYPES_LIST">%2$s</xliff:g> របស់អ្នក។"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"កម្មវិធីកំពុងប្រើ <xliff:g id="TYPES_LIST">%s</xliff:g> របស់អ្នក។"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"បោះបង់"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other">កម្មវិធី <xliff:g id="NUM_APPS_4">%1$d</xliff:g> កំពុងប្រើប្រាស់ <xliff:g id="TYPE_5">%2$s</xliff:g> របស់អ្នក។</item> + <item quantity="one">កម្មវិធី <xliff:g id="NUM_APPS_0">%1$d</xliff:g> កំពុងប្រើប្រាស់ <xliff:g id="TYPE_1">%2$s</xliff:g> របស់អ្នក។</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"មើលព័ត៌មានលម្អិត"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"កម្មវិធីកំពុងប្រើប្រាស់ <xliff:g id="TYPES_LIST">%s</xliff:g> របស់អ្នក"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"កម្មវិធីកំពុងប្រើប្រាស់ <xliff:g id="TYPES_LIST">%s</xliff:g> របស់អ្នក"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index f829c12771a0..8c553f505ca5 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸುವುದೇ?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"ಕಂಪ್ಯೂಟರ್ನ RSA ಕೀ ಫಿಂಗರ್ ಪ್ರಿಂಟ್ ಹೀಗಿದೆ :\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"ಈ ಕಂಪ್ಯೂಟರ್ನಿಂದ ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ಬಳಕೆದಾರರು ಪ್ರಸ್ತುತ ಈ ಸಾಧನಕ್ಕೆ ಸೈನ್ ಇನ್ ಮಾಡಿದ್ದಾರೆ USB ಡೀಬಗ್ ಮಾಡುವುದನ್ನು ಆನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು, ಪ್ರಾಥಮಿಕ ಬಳಕೆದಾರರಿಗೆ ಬದಲಾಯಿಸಿ."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"ಪರದೆ ತುಂಬಿಸಲು ಝೂಮ್ ಮಾಡು"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ಪರದೆ ತುಂಬಿಸಲು ವಿಸ್ತಾರಗೊಳಿಸು"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"ಸ್ಕ್ರೀನ್ಶಾಟ್"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"ರದ್ದುಮಾಡಿ"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ಸಹಾಯ ಸಂದೇಶ ಪ್ರದೇಶ"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ದೃಢೀಕರಿಸಿ"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ನಿಮಗಾಗಿ ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ಆಡಿಯೋ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ಹೆಡ್ಸೆಟ್"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ಇನ್ಪುಟ್"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ಶ್ರವಣ ಸಾಧನಗಳು"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ಆನ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ಪ್ರಕಾಶಮಾನ"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ಸ್ವಯಂ-ತಿರುಗುವಿಕೆ"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"ನೀವು ಸಾಮಾನ್ಯವಾಗಿ ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ವಜಾಗೊಳಿಸಿದ್ದೀರಿ. \nಅವುಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿಲ್ಲಿಸಿ"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"ನಿರ್ಬಂಧಿಸಿ"</string> <string name="inline_keep_button" msgid="6665940297019018232">"ತೋರಿಸುತ್ತಲಿರಿ"</string> <string name="inline_minimize_button" msgid="966233327974702195">"ಕಿರಿದುಗೊಳಿಸಿ"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"ಮೌನವಾಗಿ ತೋರಿಸಿ"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ಮೌನವಾಗಿರಿ"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"ನನ್ನನ್ನು ಎಚ್ಚರಿಸಿ"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ಎಚ್ಚರಿಸುತ್ತಿರಿ"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"ಈ ಅಪ್ಲಿಕೇಶನ್ನಿಂದ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸುತ್ತಲೇ ಇರಬೇಕೆ?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"ಈ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಮೂಲಕ"</string> @@ -734,7 +734,7 @@ <item msgid="586019486955594690">"ಬಲ-ಬಾಗುವಿಕೆ"</item> </string-array> <string name="menu_ime" msgid="4998010205321292416">"ಕೀಬೋರ್ಡ್ ಬದಲಾಯಿಸುವಿಕೆ"</string> - <string name="save" msgid="2311877285724540644">"ಉಳಿಸು"</string> + <string name="save" msgid="2311877285724540644">"ಉಳಿಸಿ"</string> <string name="reset" msgid="2448168080964209908">"ಮರುಹೊಂದಿಸು"</string> <string name="adjust_button_width" msgid="6138616087197632947">"ಬಟನ್ ಅಳತೆ ಹೊಂದಿಸು"</string> <string name="clipboard" msgid="1313879395099896312">"ಕ್ಲಿಪ್ಬೋರ್ಡ್"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"ಅರ್ಥವಾಯಿತು"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ಹೀಪ್ ಡಂಪ್ ಮಾಡಿ"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> ಆ್ಯಪ್ಗಳು</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ಆ್ಯಪ್ಗಳು</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"ನಿಮ್ಮ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ಅನ್ನು <xliff:g id="APP">%1$s</xliff:g> ಬಳಸುತ್ತಿದೆ."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ನಿಮ್ಮ <xliff:g id="TYPES_LIST">%s</xliff:g> ಅನ್ನು ಆ್ಯಪ್ಗಳು ಬಳಸುತ್ತಿವೆ."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ರದ್ದುಮಾಡಿ"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ಆ್ಯಪ್ಗಳು ನಿಮ್ಮ <xliff:g id="TYPE_5">%2$s</xliff:g> ಅನ್ನು ಬಳಸುತ್ತಿವೆ.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ಆ್ಯಪ್ಗಳು ನಿಮ್ಮ <xliff:g id="TYPE_5">%2$s</xliff:g> ಅನ್ನು ಬಳಸುತ್ತಿವೆ.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ವಿವರಗಳನ್ನು ನೋಡಿ"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ಆ್ಯಪ್ ನಿಮ್ಮ <xliff:g id="TYPES_LIST">%s</xliff:g> ಅನ್ನು ಬಳಸುತ್ತಿದೆ"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ಆ್ಯಪ್ಗಳು ನಿಮ್ಮ <xliff:g id="TYPES_LIST">%s</xliff:g> ಅನ್ನು ಬಳಸುತ್ತಿವೆ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index f5168fba251a..559357f3ddd8 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB 디버깅을 허용하시겠습니까?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"컴퓨터 RSA 키 지문:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"이 컴퓨터에서 항상 허용"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB 디버깅이 허용되지 않음"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"현재 이 기기에 로그인한 사용자는 USB 디버깅을 사용 설정할 수 없습니다. 이 기능을 사용하려면 기본 사용자로 전환하세요."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"전체화면 모드로 확대"</string> <string name="compat_mode_off" msgid="4434467572461327898">"전체화면 모드로 확대"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"스크린샷"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"취소"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"도움말 메시지 영역"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"확인"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"다시 시도하세요."</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"지문 센서를 터치하세요."</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"지문 아이콘"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"찾는 중..."</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"오디오"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"헤드셋"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"입력"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"보청기"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"켜는 중..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"밝기"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"자동 회전"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"보통 이 알림을 닫았습니다. \n알림을 계속 표시하시겠습니까?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"이 알림을 계속 표시하시겠습니까?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"알림 중지"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"차단"</string> <string name="inline_keep_button" msgid="6665940297019018232">"계속 표시하기"</string> <string name="inline_minimize_button" msgid="966233327974702195">"최소화"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"소리 없이 표시"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"계속 무음으로 알림"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"내게 알림"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"계속 알림"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"이 앱의 알림을 계속 표시하시겠습니까?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"이 알림은 끌 수 없습니다"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"제공: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"설정"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"확인"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other">앱 <xliff:g id="NUM_APPS_2">%d</xliff:g>개</item> + <item quantity="one">앱 <xliff:g id="NUM_APPS_0">%d</xliff:g>개</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>이(가) <xliff:g id="TYPES_LIST">%2$s</xliff:g>을(를) 사용 중입니다."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"애플리케이션이 <xliff:g id="TYPES_LIST">%s</xliff:g>을(를) 사용 중입니다."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"취소"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other">애플리케이션 <xliff:g id="NUM_APPS_4">%1$d</xliff:g>개가 <xliff:g id="TYPE_5">%2$s</xliff:g>을(를) 사용하고 있습니다.</item> + <item quantity="one">애플리케이션 <xliff:g id="NUM_APPS_0">%1$d</xliff:g>개가 <xliff:g id="TYPE_1">%2$s</xliff:g>을(를) 사용하고 있습니다.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"세부정보 보기"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g>을(를) 사용 중인 앱"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g>을(를) 사용 중인 앱"</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 9558c3a52d14..5725d161c4f0 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB аркылуу жөндөөгө уруксат берилсинби?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Компүтердин RSA ачкычынын контролдук суммасы:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Бул компүтерден дайыма уруксат берилсин"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB мүчүлүштүктөрүн оңдоого уруксат жок"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Учурда бул аккаунтта USB аркылуу мүчүлүштүктөрдү оңдоо функциясын иштетүүгө болбойт. Негизги колдонуучунун аккаунтуна кириңиз."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Экрнд тлтр ү. чен өлч өзг"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Экранды толтуруу ү-н чоюу"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Жокко чыгаруу"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Жардам билдирүүсү"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Ырастоо"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Кайталоо"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Манжа изинин сенсорун басыңыз"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Манжа изинин сүрөтчөсү"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Жүзүңүз изделүүдө…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнитура"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Киргизүү"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Угуу аппараттары"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Күйгүзүлүүдө…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Жарыктыгы"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматтык бурулуу"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Адатта мындай эскертмелерди өткөрүп жибересиз. \nАлар көрсөтүлө берсинби?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Бул эскертмелер көрсөтүлө берсинби?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Эскертмелерди токтотуу"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Бөгөттөө"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Көрсөтүлө берсин"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Кичирейтүү"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Үнсүз көрсөтүү"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Үнү чыкпасын"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Мага кабар берилсин"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Кабар бериле берсин"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Бул колдонмонун эскертмелери көрсөтүлө берсинби?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Бул эскертмелерди өчүрүүгө болбойт"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> аркылуу"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Жөндөөлөр"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Түшүндүм"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> колдонмо</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> колдонмо</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> төмөнкүлөрдү колдонуп жатат: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Колдонмолор төмөнкүлөрдү пайдаланып жатышат: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Жок"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> <xliff:g id="NUM_APPS_4">%1$d</xliff:g> колдонмо аркылуу пайдаланылууда.</item> + <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> <xliff:g id="NUM_APPS_0">%1$d</xliff:g> колдонмо аркылуу пайдаланылууда.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Кеңири маалымат"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> программаларын пайдаланып жаткан колдонмо"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"<xliff:g id="TYPES_LIST">%s</xliff:g> программаларын пайдаланып жаткан колдонмолор"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index a4ffffb4ea30..4472fc5d8f72 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"ອະນຸຍາດການດີບັ໊ກຜ່ານ USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"ລາຍນິ້ມື RSA ຂອງຄອມພິວເຕີແມ່ນ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"ອະນຸຍາດຈາກຄອມພິວເຕີນີ້ຕະຫຼອດ"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ບໍ່ອະນຸຍາດໃຫ້ມີການແກ້ໄຂບັນຫາ USB"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ຜູ້ໃຊ້ທີ່ກຳລັງເຂົ້າສູ່ລະບົບອຸປະກອນຢູ່ໃນຕອນນີ້ບໍ່ສາມາດເປີດໃຊ້ການດີບັກ USB ໄດ້. ເພື່ອໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ສະຫຼັບໄປໃຊ້ຜູ້ໃຊ້ຫຼັກ."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"ຊູມໃຫ້ເຕັມໜ້າຈໍ"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ປັບໃຫ້ເຕັມໜ້າຈໍ"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"ພາບໜ້າຈໍ"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"ຍົກເລີກ"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ຊ່ວຍພື້ນທີ່ຂໍ້ຄວາມ"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ຢືນຢັນ"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ລອງໃໝ່"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ໄອຄອນລາຍນິ້ວມື"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ກຳລັງຊອກຫາທ່ານ…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ສຽງ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ຊຸດຫູຟັງ"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ການປ້ອນຂໍ້ມູນ"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ເຄື່ອງຊ່ວຍຟັງ"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ກຳລັງເປີດ..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ຄວາມສະຫວ່າງ"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ໝຸນອັດຕະໂນມັດ"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"ໂດຍປົກກະຕິທ່ານປິດການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄວ້. \nສືບຕໍ່ສະແດງພວກມັນບໍ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ສະແດງການແຈ້ງເຕືອນເຫຼົ່ານີ້ຕໍ່ໄປບໍ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"ຢຸດການແຈ້ງເຕືອນ"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"ບລັອກ"</string> <string name="inline_keep_button" msgid="6665940297019018232">"ສະແດງຕໍ່ໄປ"</string> <string name="inline_minimize_button" msgid="966233327974702195">"ຫຍໍ້"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"ສະແດງແບບງຽບໆ"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ສືບຕໍ່ມິດງຽບ"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"ແຈ້ງເຕືອນຂ້ອຍ"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ສືບຕໍ່ແຈ້ງເຕືອນ"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"ສະແດງການແຈ້ງເຕືອນຈາກແອັບນີ້ຕໍ່ໄປບໍ?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"ບໍ່ສາມາດປິດການແຈ້ງເຕືອນເຫຼົ່ານີ້ໄດ້"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"ຜ່ານ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"ການຕັ້ງຄ່າ"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"ເຂົ້າໃຈແລ້ວ"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ແອັບ</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ແອັບ</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງໃຊ້ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ຂອງທ່ານ."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ແອັບພລິເຄຊັນກຳລັງໃຊ້ <xliff:g id="TYPES_LIST">%s</xliff:g> ຂອງທ່ານ."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ຍົກເລີກ"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ແອັບພລິເຄຊັນກຳລັງໃຊ້ <xliff:g id="TYPE_5">%2$s</xliff:g> ຂອງທ່ານຢູ່.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ແອັບພລິເຄຊັນກຳລັງໃຊ້ <xliff:g id="TYPE_1">%2$s</xliff:g> ຂອງທ່ານຢູ່.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ເບິ່ງລາຍລະອຽດ"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ແອັບກຳລັງໃຊ້ <xliff:g id="TYPES_LIST">%s</xliff:g> ຂອງທ່ານ"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ແອັບກຳລັງໃຊ້ <xliff:g id="TYPES_LIST">%s</xliff:g> ຂອງທ່ານ"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 5786fb0dda94..a99df693b3c9 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Leisti USB derinimą?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Šio kompiuterio RSA rakto piršto antspaudas yra:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Visada leisti iš šio kompiuterio"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB derinimas neleidžiamas"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Šiuo metu prie įrenginio prisijungęs naudotojas negali įjungti USB derinimo. Kad galėtumėte naudoti šią funkciją, perjunkite į pagrindinį naudotoją."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Keisti mast., kad atit. ekr."</string> <string name="compat_mode_off" msgid="4434467572461327898">"Ištempti, kad atit. ekr."</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Ekrano kopija"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Atšaukti"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Pagalbos pranešimo sritis"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Patvirtinkite"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Bandyti dar kartą"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Palieskite piršto antspaudo jutiklį"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Piršto antspaudo piktograma"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ieškoma jūsų…"</string> @@ -298,8 +303,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Garsas"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Virtualiosios realybės įrenginys"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Įvestis"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Klausos aparatai"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Įjungiama…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Šviesumas"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatinis pasukimas"</string> @@ -617,17 +621,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Paprastai šių pranešimų atsisakote. \nToliau juos rodyti?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Toliau rodyti šiuos pranešimus?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Sustabdyti pranešimus"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokuoti"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Toliau rodyti"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Sumažinti"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Rodyti tyliai"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Neskambėti"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Įspėti mane"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Toliau įspėti"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Toliau rodyti iš šios programos gautus pranešimus?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Šių pranešimų negalima išjungti"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"naudojant „<xliff:g id="APP_NAME">%1$s</xliff:g>“"</string> @@ -881,11 +881,22 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Nustatymai"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Supratau"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Pat. „SysUI“ krūvą"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> programa</item> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> programos</item> + <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> programos</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> programų</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Programa „<xliff:g id="APP">%1$s</xliff:g>“ naudoja: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Programos naudoja: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Atšaukti"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> programa naudoja jūsų <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> programos naudoja jūsų <xliff:g id="TYPE_3">%2$s</xliff:g>.</item> + <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> programos naudoja jūsų <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> programų naudoja jūsų <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Žr. išsam. inf."</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Programa, kuri naudoja: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Programos, kurios naudoja: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index cebd91cb49fc..250920d10e30 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Vai atļaut USB atkļūdošanu?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Datora RSA atslēgas ciparfails: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Vienmēr atļaut no šī datora"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB atkļūdošana nav atļauta"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Lietotājs, kurš pašlaik ir pierakstījies šajā ierīcē, nevar iespējot USB atkļūdošanu. Lai izmantotu šo funkciju, pārslēdzieties uz galveno lietotāju."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Tālumm., lai aizp. ekr."</string> <string name="compat_mode_off" msgid="4434467572461327898">"Stiepiet, lai aizp. ekr."</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Ekrānuzņēmums"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Atcelt"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Palīdzības ziņojuma apgabals"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Apstiprināt"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Mēģināt vēlreiz"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Pieskarieties pirksta nospieduma sensoram"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pirksta nospieduma ikona"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Notiek jūsu sejas meklēšana…"</string> @@ -297,8 +302,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Austiņas"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Ievade"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Dzirdes aparāti"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Notiek ieslēgšana…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Spilgtums"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automātiska pagriešana"</string> @@ -614,17 +618,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Parasti jūs noraidāt šādus paziņojumus. \nVai turpināt tos rādīt?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Vai turpināt rādīt šos paziņojumus?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Apturēt paziņojumu rādīšanu"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Bloķēt"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Turpināt rādīt"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimizēt"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Rādīt bez skaņas signāla"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Neslēgt skaļumu"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Brīdināt mani"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Turpināt paziņošanu"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Vai turpināt rādīt paziņojumus no šīs lietotnes?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Šos paziņojumus nevar izslēgt."</string> <string name="notification_delegate_header" msgid="9167022191405284627">"lietotnē <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -876,11 +876,20 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Iestatījumi"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Labi"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="zero"><xliff:g id="NUM_APPS_2">%d</xliff:g> lietotņu</item> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> lietotne</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> lietotnes</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Lietotne <xliff:g id="APP">%1$s</xliff:g> izmanto funkcijas <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Lietojumprogrammas izmanto šādas funkcijas: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Atcelt"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="zero"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> lietojumprogrammās tiek izmantots: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> lietojumprogrammā tiek izmantots: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> lietojumprogrammās tiek izmantots: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Skatīt detalizētu informāciju"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Lietotne, kurā tiek izmantots: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Lietotnes, kurās tiek izmantots: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index df1bdbb664f2..49a7655c6085 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Овозможи отстранување грешки на USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Клучниот отпечаток на RSA на компјутерот е:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Секогаш дозволувај од овој компјутер"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отстранувањето грешки на USB не е дозволено"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Корисникот што моментално е најавен на уредов не може да вклучи отстранување грешки на USB. За да ја користите функцијава, префрлете се на примарниот корисник."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Зумирај да се исполни екранот"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Растегни да се исполни екранот"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Слика од екранот"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Откажи"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област за пораки за помош"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потврди"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Обиди се повторно"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Допрете го сензорот за отпечатоци"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатоци"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ве бараме вас…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Слушалки"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Влез"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слушни помагала"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Се вклучува…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Осветленост"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматско ротирање"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Обично ги отфрлате известувањава. \nДа продолжат да се прикажуваат?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Дали да продолжат да се прикажуваат известувањава?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Запри ги известувањата"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Блокирај"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Продолжи да ги прикажуваш"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Минимизирај"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Прикажи тивко"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Продолжи со безгласно прикажување"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Предупреди ме"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Продолжи да ме предупредуваш"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Дали да продолжат да се прикажуваат известувања од апликацијава?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Известувањава не може да се исклучат"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"преку <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Поставки"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Сфатив"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Извади SysUI-слика"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> апликација</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> апликации</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> користи <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Апликациите користат <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Откажи"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="TYPE_5">%2$s</xliff:g> се користи од <xliff:g id="NUM_APPS_4">%1$d</xliff:g> апликација.</item> + <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> се користи од <xliff:g id="NUM_APPS_4">%1$d</xliff:g> апликации.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Прикажи ги деталите"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Апликации што ја користат вашата <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Апликации што ја користат вашата <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index 5800e0ee1eae..ba939747f361 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB ഡീബഗ്ഗിംഗ് അനുവദിക്കണോ?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"ഈ കമ്പ്യൂട്ടറിന്റെ RSA കീ ഫിംഗർപ്രിന്റ് ഇതാണ്:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"ഈ കമ്പ്യൂട്ടറിൽ നിന്ന് എല്ലായ്പ്പോഴും അനുവദിക്കുക"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ഡീബഗ്ഗിംഗ് അനുവദനീയമല്ല"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ഉപകരണത്തിൽ ഇപ്പോൾ സൈൻ ഇൻ ചെയ്തിരിക്കുന്ന ഉപയോക്താവിന് USB ഡീബഗ്ഗിംഗ് ഓണാക്കാനാകില്ല. ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ പ്രാഥമിക ഉപയോക്താവിലേക്ക് മാറുക."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"സ്ക്രീനിൽ ഉൾക്കൊള്ളിക്കാൻ സൂം ചെയ്യുക"</string> <string name="compat_mode_off" msgid="4434467572461327898">"സ്ക്രീനിൽ ഉൾക്കൊള്ളിക്കാൻ വലിച്ചുനീട്ടുക"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"സ്ക്രീൻഷോട്ട്"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"റദ്ദാക്കുക"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"സഹായ സന്ദേശ ഏരിയ"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"സ്ഥിരീകരിക്കുക"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"വീണ്ടും ശ്രമിക്കുക"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"വിരലടയാള സെൻസർ സ്പർശിക്കുക"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"വിരലടയാള ഐക്കൺ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"നിങ്ങൾക്കായി തിരയുന്നു…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ഓഡിയോ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ഹെഡ്സെറ്റ്"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ഇൻപുട്ട്"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ശ്രവണ സഹായികൾ"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ഓണാക്കുന്നു…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"തെളിച്ചം"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"സ്ക്രീൻ സ്വമേധയാ തിരിയുക"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"സാധാരണയായി നിങ്ങൾ ഈ അറിയിപ്പുകൾ നിരാകരിക്കുന്നു. \nഅവ തുടർന്നും കാണിക്കണോ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ഈ അറിയിപ്പുകൾ തുടർന്നും കാണിക്കണോ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"അറിയിപ്പുകൾ നിർത്തുക"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"ബ്ലോക്ക് ചെയ്യുക"</string> <string name="inline_keep_button" msgid="6665940297019018232">"തുടർന്നും കാണിക്കുക"</string> <string name="inline_minimize_button" msgid="966233327974702195">"ചെറുതാക്കുക"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"നിശബ്ദമായി കാണിക്കുക"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"നിശബ്ദമായ നിലയിൽ തുടരുക"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"എനിക്ക് അലേർട്ട് നൽകുക"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"മുന്നറിയിപ്പ് നൽകുന്നത് തുടരുക"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"ഈ ആപ്പിൽ നിന്നുള്ള അറിയിപ്പുകൾ തുടർന്നും കാണിക്കണോ?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"ഈ അറിയിപ്പുകൾ ഓഫാക്കാനാവില്ല"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> വഴി"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"ക്രമീകരണം"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"മനസ്സിലായി"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ഹീപ്പ് ഡമ്പ് ചെയ്യുക"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ആപ്പുകൾ</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ആപ്പ്</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> നിങ്ങളുടെ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ഉപയോഗിക്കുന്നു."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ആപ്പുകൾ നിങ്ങളുടെ <xliff:g id="TYPES_LIST">%s</xliff:g> ഉപയോഗിക്കുന്നു."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"റദ്ദാക്കുക"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ആപ്പുകൾ നിങ്ങളുടെ <xliff:g id="TYPE_5">%2$s</xliff:g> ഉപയോഗിക്കുന്നു.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ആപ്പ് നിങ്ങളുടെ <xliff:g id="TYPE_1">%2$s</xliff:g> ഉപയോഗിക്കുന്നു.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"വിശദാംശങ്ങൾ കാണുക"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"നിങ്ങളുടെ <xliff:g id="TYPES_LIST">%s</xliff:g> ഉപയോഗിക്കുന്ന ആപ്പ്"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"നിങ്ങളുടെ <xliff:g id="TYPES_LIST">%s</xliff:g> ഉപയോഗിക്കുന്ന ആപ്പുകൾ"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index e96865ee24f2..e19cb2b881b2 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB дебаг хийхийг зөвшөөрөх үү?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Компьютерийн RSA түлхүүрийн хурууны хээ :\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Энэ компьютерээс орохыг байнга зөвшөөрөх"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB алдаа засалт хийх боломжгүй"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Энэ төхөөрөмжид нэвтэрсэн хэрэглэгч USB дебаг хийх онцлогийг асаах боломжгүй байна. Энэ онцлогийг ашиглахын тулд үндсэн хэрэглэгч рүү сэлгэнэ үү."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Дэлгэц дүүргэх бол өсгөнө үү"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Дэлгэц дүүргэх бол татна уу"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Дэлгэцийн зураг дарах"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Цуцлах"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Тусламжийн зурвасын хэсэг"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Баталгаажуулах"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Дахин оролдох"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Хурууны хээ мэдрэгчид хүрэх"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Хурууны хээний дүрс тэмдэг"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Таныг хайж байна…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Чихэвч"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Оролт"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Сонсголын төхөөрөмж"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Асааж байна…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Тодрол"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматаар эргэх"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Та эдгээр мэдэгдлийг ихэвчлэн хаадаг. \nЭдгээрийг харуулсан хэвээр байх уу?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Эдгээр мэдэгдлийг харуулсан хэвээр байх уу?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Мэдэгдлийг зогсоох"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Блоклох"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Харуулсан хэвээр байх"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Багасгах"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Дуугүй харуулах"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Чимээгүй хэвээр харуулах"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Надад сануулах"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Үргэлжлүүлэн сануулах"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Энэ аппаас мэдэгдэл харуулсан хэвээр байх уу?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Эдгээр мэдэгдлийг унтраах боломжгүй"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g>-р"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Тохиргоо"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ойлголоо"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> апп</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> апп</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> таны <xliff:g id="TYPES_LIST">%2$s</xliff:g>-г ашиглаж байна."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Аппууд таны <xliff:g id="TYPES_LIST">%s</xliff:g>-г ашиглаж байна."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Болих"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other">Таны <xliff:g id="TYPE_5">%2$s</xliff:g>-г <xliff:g id="NUM_APPS_4">%1$d</xliff:g> апп ашиглаж байна.</item> + <item quantity="one">Таны <xliff:g id="TYPE_1">%2$s</xliff:g>-г <xliff:g id="NUM_APPS_0">%1$d</xliff:g> апп ашиглаж байна.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Дэлгэрэнгүй үзэх"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Апп таны <xliff:g id="TYPES_LIST">%s</xliff:g>-г ашиглаж байна"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Аппууд таны <xliff:g id="TYPES_LIST">%s</xliff:g>-г ашиглаж байна"</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 6022a9c2546b..71e0e3c22d68 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB डीबग करण्यास अनुमती द्यायची?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"संगणकाची RSA की फिंगरप्रिंट ही आहे:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"या संगणकावरून नेहमी अनुमती द्या"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB डीबग करण्यास अनुमती नाही"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"सध्या या डीव्हाइसमध्ये साइन इन केलेला वापरकर्ता USB डीबग करणे चालू करू शकत नाही. हे वैशिष्ट्य वापरण्यासाठी, प्राथमिक वापरकर्त्यावर स्विच करा."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"स्क्रीन भरण्यासाठी झूम करा"</string> <string name="compat_mode_off" msgid="4434467572461327898">"स्क्रीन भरण्यासाठी ताणा"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रीनशॉट"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"रद्द करा"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"मदत मेसेज परिसर"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"खात्री करा"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"पुन्हा प्रयत्न करा"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फिंगरप्रिंट सेन्सरला स्पर्श करा"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिंट आयकन"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"तुमच्यासाठी शोधत आहे…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ऑडिओ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"हेडसेट"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"इनपुट"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"श्रवण यंत्रे"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"सुरू करत आहे…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"चमक"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ऑटो-रोटेट"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"तुम्ही या सूचना सामान्यतः डिसमिस करता. \nते दाखवत राहायचे?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"या सूचना दाखवणे सुरू ठेवायचे?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"सूचना थांबवा"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"ब्लॉक करा"</string> <string name="inline_keep_button" msgid="6665940297019018232">"दाखवणे सुरू ठेवा"</string> <string name="inline_minimize_button" msgid="966233327974702195">"लहान करा"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"शांतपणे दर्शवा"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"सायलंट रहा"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"मला अॅलर्ट करा"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"सूचना देत रहा"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"या अॅपकडील सूचना दाखवणे सुरू ठेवायचे?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"या सूचना बंद करता येत नाहीत"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> मार्गे"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"सेटिंग्ज"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"समजले"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI हीप डंप करा"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> अॅप</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> अॅप्स</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> तुमचे <xliff:g id="TYPES_LIST">%2$s</xliff:g> वापरत आहे."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"अॅप्लिकेशन्स तुमचे <xliff:g id="TYPES_LIST">%s</xliff:g> वापरत आहे."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"रद्द करा"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> अॅप्लिकेशन तुमचे <xliff:g id="TYPE_5">%2$s</xliff:g> वापरत आहे.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> अॅप्लिकेशन तुमचे <xliff:g id="TYPE_5">%2$s</xliff:g> वापरत आहेत.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"तपशील पाहा"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"अॅप तुमचे <xliff:g id="TYPES_LIST">%s</xliff:g> वापरत आहे"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"अॅप्स तुमचे <xliff:g id="TYPES_LIST">%s</xliff:g> वापरत आहेत"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 1a9eb1c3a849..1b7cc7cf5f2f 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Benarkan penyahpepijatan USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Cap jari kekunci RSA komputer ialah:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Sentiasa benarkan komputer ini"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Penyahpepijatan USB tidak dibenarkan"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Pengguna yang log masuk ke peranti ini pada masa ini tidak boleh menghidupkan penyahpepijatan USB. Untuk menggunakan ciri ini, tukar kepada pengguna utama."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zum untuk memenuhi skrin"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Regang utk memenuhi skrin"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Tangkapan skrin"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Batal"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Bahagian mesej bantuan"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Sahkan"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Cuba lagi"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Sentuh penderia cap jari"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon cap jari"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Mencari anda…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Set Kepala"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Alat Bantu Dengar"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Menghidupkan…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Kecerahan"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Autoputar"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Biasanya anda mengetepikan pemberitahuan ini. \nTerus tunjukkan pemberitahuan?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Terus tunjukkan pemberitahuan ini?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Hentikan pemberitahuan"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Sekat"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Terus tunjukkan"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimumkan"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Tunjukkan secara senyap"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Kekal senyap"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Maklumi saya"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Teruskan memberikan makluman"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Terus tunjukkan pemberitahuan daripada apl ini?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Pemberitahuan ini tidak boleh dimatikan"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"melalui <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Tetapan"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Longgok Tmbunn SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apl</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> apl</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> sedang menggunakan <xliff:g id="TYPES_LIST">%2$s</xliff:g> anda."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikasi sedang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> anda."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Batal"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikasi sedang menggunakan <xliff:g id="TYPE_5">%2$s</xliff:g> anda.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikasi sedang menggunakan <xliff:g id="TYPE_1">%2$s</xliff:g> anda.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Lihat butiran"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Apl yang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> anda"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apl yang menggunakan <xliff:g id="TYPES_LIST">%s</xliff:g> anda"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index dbfa01ecce38..b5cd82e43054 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB အမှားရှာဖွေပြင်ဆင်ခြင်း ခွင့်ပြုပါမည်လား?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"ဒီကွန်ပျူတာရဲ့ RSA key fingerprint ကတော့:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g> ဖြစ်ပါသည်"</string> <string name="usb_debugging_always" msgid="303335496705863070">"ဒီကွန်ပျူတာမှ အမြဲခွင့်ပြုရန်"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB အမှားပြင်ဆင်ခြင်း ခွင့်မပြုပါ"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ဤစက်ပစ္စည်းသို့ လက်ရှိဝင်ရောက်ထားသည့် အသုံးပြုသူသည် USB အမှားပြင်ဆင်ခြင်းကို ဖွင့်၍မရပါ။ ဤဝန်ဆောင်မှုကို အသုံးပြုရန် အဓိကအသုံးပြုသူအဖြစ်သို့ ပြောင်းပါ။"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"ဇူးမ်အပြည့်ဆွဲခြင်း"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ဖန်သားပြင်အပြည့်ဆန့်ခြင်း"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"ဖန်သားပြင်ဓာတ်ပုံ"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"မလုပ်တော့"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"အကူအညီမက်ဆေ့ဂျ် နေရာ"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"အတည်ပြုပါ"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ထပ်စမ်းကြည့်ရန်"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"လက်ဗွေအာရုံခံကိရိယာကို တို့ပါ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"လက်ဗွေ သင်္ကေတ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"သင့်ကို ရှာဖွေနေသည်…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"အသံ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"မိုက်ခွက်ပါနားကြပ်"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"အဝင်"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"နားကြားကိရိယာ"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ဖွင့်နေသည်…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"အလင်းတောက်ပမှု"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"အော်တို-လည်"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"သင်သည် အများအားဖြင့် ဤအကြောင်းကြားချက်များကို ပယ်လေ့ရှိပါသည်။ \n၎င်းတို့ကို ဆက်လက်ပြသလိုပါသလား။"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ဤအကြောင်းကြားချက်များကို ဆက်ပြလိုပါသလား။"</string> <string name="inline_stop_button" msgid="4172980096860941033">"အကြောင်းကြားချက်များကို ရပ်ရန်"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"ပိတ်ထားရန်"</string> <string name="inline_keep_button" msgid="6665940297019018232">"ဆက်ပြရန်"</string> <string name="inline_minimize_button" msgid="966233327974702195">"ချုံ့ရန်"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"တိတ်တဆိတ် ပြရန်"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ဆက်လက် အသံတိတ်ရန်"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"ကျွန်ုပ်ကို သတိပေးရန်"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ဆက်လက် သတိပေးရန်"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"ဤအက်ပ်ထံမှ အကြောင်းကြားချက်များကို ဆက်ပြလိုပါသလား။"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"ဤအကြောင်းကြားချက်များကို ပိတ်၍မရပါ"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> မှတစ်ဆင့်"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"ဆက်တင်များ"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"ရပါပြီ"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other">အက်ပ် <xliff:g id="NUM_APPS_2">%d</xliff:g> ခု</item> + <item quantity="one">အက်ပ် <xliff:g id="NUM_APPS_0">%d</xliff:g> ခု</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> က သင်၏ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ကို အသုံးပြုနေသည်။"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"အပလီကေးရှင်းများက သင်၏ <xliff:g id="TYPES_LIST">%s</xliff:g> ကို အသုံးပြုနေသည်။"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"မလုပ်တော့"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other">အပလီကေးရှင်း <xliff:g id="NUM_APPS_4">%1$d</xliff:g> ခုက သင်၏ <xliff:g id="TYPE_5">%2$s</xliff:g> ကို အသုံးပြုနေသည်။</item> + <item quantity="one">အပလီကေးရှင်း <xliff:g id="NUM_APPS_0">%1$d</xliff:g> ခုက သင်၏ <xliff:g id="TYPE_1">%2$s</xliff:g> ကို အသုံးပြုနေသည်။</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"အသေးစိတ်ကြည့်ပါ"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"သင့် <xliff:g id="TYPES_LIST">%s</xliff:g> ကို အသုံးပြုနေသော အက်ပ်"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"သင့် <xliff:g id="TYPES_LIST">%s</xliff:g> ကို အသုံးပြုနေသော အက်ပ်များ"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index e79068436839..83a1ad940ef9 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Vil du tillate USB-feilsøking?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Datamaskinens nøkkelfingeravtrykk for RSA er:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Tillat alltid fra denne datamaskinen"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-feilsøking er ikke tillatt"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Brukeren som for øyeblikket er logget på denne enheten, kan ikke slå på USB-feilsøking. For å bruke denne funksjonen, bytt til hovedbrukeren."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom for å fylle skjermen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Strekk for å fylle skjerm"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Skjermdump"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Avbryt"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område for hjelpemelding"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekreft"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Prøv på nytt"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Trykk på fingeravtrykkssensoren"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeravtrykk"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Ser etter deg …"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Lyd"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Hodetelefoner"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Innenhet"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Høreapparater"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Slår på …"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Lysstyrke"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotér automatisk"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Du avviser vanligvis disse varslene. \nVil du fortsette å vise dem?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Vil du fortsette å vise disse varslene?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stopp varsler"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokkér"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Fortsett å vise"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimer"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Vis uten lyd"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Forbli lydløs"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Varsle meg"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Fortsett å varsle"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Vil du fortsette å vise varsler fra denne appen?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Du kan ikke slå av disse varslene"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Innstillinger"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Greit"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI-heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apper</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> bruker <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apper bruker <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Avbryt"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> apper bruker <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> app bruker <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Se detaljer"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App som bruker <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apper som bruker <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 9b4441fa27b1..8ebb22ea5dcd 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB डिबग गर्नको लागि अनुमति दिने हो?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"कम्प्युटरको RSA कुञ्जी औंलाछाप:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"यो कम्प्युटरबाट सधैँ अनुमति दिनुहोस्"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB डिबग गर्न अनुमति छैन"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"हाल यस यन्त्रमा साइन इन हुनुभएको प्रयोगकर्ताले USB डिबग सक्रिय गर्न सक्नुहुन्न। यो सुविधाको प्रयोग गर्न प्राथमिक प्रयोगकर्तामा बदल्नुहोस्।"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"स्क्रिन भर्न जुम गर्नुहोस्"</string> <string name="compat_mode_off" msgid="4434467572461327898">"स्क्रिन भर्न तन्काउनुहोस्"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"स्क्रिनसट"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"रद्द गर्नुहोस्"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"मद्दतसम्बन्धी सन्देशको क्षेत्र"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"पुष्टि गर्नुहोस्"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"फेरि प्रयास गर्नुहोस्"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"फिंगरप्रिन्ट सेन्सरमा छुनुहोस्"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिन्ट जनाउने आइकन"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"तपाईंलाई खोज्दै…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"अडियो"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"हेडसेट"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"इनपुट"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"श्रवण यन्त्रहरू"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"सक्रिय गर्दै…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"चमक"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"स्वतःघुम्ने"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"तपाईं सामान्यतया यी सूचनाहरूलाई खारेज गर्ने गर्नुहुन्छ। \nतिनलाई देखाइरहने हो?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"यी सूचनाहरू देखाउने क्रम जारी राख्ने हो?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"सूचनाहरू देखाउन छाड्नुहोस्"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"रोक लगाउनुहोस्"</string> <string name="inline_keep_button" msgid="6665940297019018232">"देखाउने क्रम जारी राख्नुहोस्"</string> <string name="inline_minimize_button" msgid="966233327974702195">"सानो बनाउनुहोस्"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"मौन रूपमा देखाउने"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"मौन रहनुहोस्"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"मलाई सतर्क गराउनुहोस्"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"सर्तक गराइरहनुहोस्"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"यो अनुप्रयोगका सूचनाहरू देखाउने क्रम जारी राख्ने हो?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"यी सूचनाहरूलाई निष्क्रिय पार्न सकिँदैन"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> मार्फत"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"सेटिङहरू"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"बुझेँ"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> अनुप्रयोगहरू</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> अनुप्रयोग</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ले तपाईंको <xliff:g id="TYPES_LIST">%2$s</xliff:g> प्रयोग गर्दै छ।"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"अनुप्रयोगहरूले तपाईंको <xliff:g id="TYPES_LIST">%s</xliff:g> प्रयोग गर्दै छन्।"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"रद्द गर्नु…"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> अनुप्रयोगहरूले तपाईंको <xliff:g id="TYPE_5">%2$s</xliff:g> प्रयोग गरिरहेका छन्।</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> अनुप्रयोगले तपाईंको <xliff:g id="TYPE_1">%2$s</xliff:g> प्रयोग गरिरहेको छ।</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"विवरणहरू हेर्नुहोस्"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"तपाईंको <xliff:g id="TYPES_LIST">%s</xliff:g> प्रयोग गरिरहेका अनुप्रयोग"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"तपाईंको <xliff:g id="TYPES_LIST">%s</xliff:g> प्रयोग गरिरहेका अनुप्रयोगहरू"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index e570789da554..f28e20659633 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB-foutopsporing toestaan?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"De vingerafdruk voor de RSA-sleutel van de computer is:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Altijd toestaan vanaf deze computer"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-foutopsporing niet toegestaan"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"De gebruiker die momenteel is ingelogd op dit apparaat, kan USB-foutopsporing niet inschakelen. Als je deze functie wilt gebruiken, schakel je naar de primaire gebruiker."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom om scherm te vullen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Rek uit v. schermvulling"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Annuleren"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Gebied voor Help-berichten"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bevestigen"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Opnieuw proberen"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Raak de vingerafdruksensor aan"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukpictogram"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Jouw gezicht zoeken…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Invoer"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Gehoorapparaten"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Inschakelen..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Helderheid"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatisch draaien"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Meestal sluit je deze meldingen. \nWil je ze blijven weergeven?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Deze meldingen blijven weergeven?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Meldingen stoppen"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokkeren"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Blijven weergeven"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimaliseren"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Zonder geluid weergeven"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Stil blijven"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Mij waarschuwen"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Blijven waarschuwen"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Meldingen van deze app blijven weergeven?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Deze meldingen kunnen niet worden uitgeschakeld"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Instellingen"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> gebruikt je <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Apps gebruiken je <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Annuleren"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> apps gebruiken je <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> app gebruikt je <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Details weergeven"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App die je <xliff:g id="TYPES_LIST">%s</xliff:g> gebruikt"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps die je <xliff:g id="TYPES_LIST">%s</xliff:g> gebruiken"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index dd260b1fedbb..07cd18fe1c18 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB ଡିବଗିଙ୍ଗ କରିବେ?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"କମ୍ପ୍ୟୁଟର୍ର RSA କୀ\' ଆଙ୍ଗୁଠି ଚିହ୍ନ ହେଉଛି:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"ସବୁବେଳେ ଏହି କମ୍ପ୍ୟୁଟର୍ରୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USBରେ ଡିବଗ୍ କରାଯାଇପାରିବ ନାହିଁ"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ସମ୍ପ୍ରତି ସାଇନ୍-ଇନ୍ କରିଥିବା ୟୁଜର୍ ଜଣକ ଏହି ଡିଭାଇସରେ USB ଡିବଗିଙ୍ଗ ଅନ୍ କରିପାରିବେ ନାହିଁ। ଏହି ବୈଶିଷ୍ଟ୍ୟ ବ୍ୟବହାର କରିବାକୁ, ପ୍ରାଥମିକ ୟୁଜର୍ରେ ସାଇନ୍-ଇନ୍ କରନ୍ତୁ।"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"ସ୍କ୍ରୀନ ଭରିବା ପାଇଁ ଜୁମ୍ କରନ୍ତୁ"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ସ୍କ୍ରୀନ୍କୁ ଭରିବା ପାଇଁ ଟାଣନ୍ତୁ"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"ସ୍କ୍ରୀନଶଟ୍"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ସାହାଯ୍ୟ ମେସେଜ୍ କ୍ଷେତ୍ର"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ନିଶ୍ଚିତ କରନ୍ତୁ"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ସେନସର୍କୁ ଛୁଅଁନ୍ତୁ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ଆଙ୍ଗୁଠି ଚିହ୍ନ ଆଇକନ୍"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ଆପଣଙ୍କୁ ଚିହ୍ନଟ କରୁଛି…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ଅଡିଓ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ହେଡସେଟ୍"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ଇନପୁଟ୍"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ଶ୍ରବଣ ଯନ୍ତ୍ର"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ଅନ୍ ହେଉଛି…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ଉଜ୍ଜ୍ୱଳତା"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ସ୍ୱତଃ-ଘୂର୍ଣ୍ଣନ"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"ସାଧାରଣତଃ ଆପଣ ଏହି ବିଜ୍ଞପ୍ତିକୁ ଖାରଜ କରିଦିଅନ୍ତି। \n ସେଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"ବିଜ୍ଞପ୍ତିକୁ ଦେଖାଇବା ବନ୍ଦ କରନ୍ତୁ"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"ବ୍ଲକ୍ କରନ୍ତୁ"</string> <string name="inline_keep_button" msgid="6665940297019018232">"ଦେଖାଇବା ଜାରି ରଖନ୍ତୁ"</string> <string name="inline_minimize_button" msgid="966233327974702195">"ଛୋଟ କରନ୍ତୁ"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"ନିରବରେ ଦେଖାନ୍ତୁ"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ନୀରବ ରହନ୍ତୁ"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"ମୋତେ ଆଲର୍ଟ କରନ୍ତୁ"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ଆଲର୍ଟ କରିବା ଜାରି ରଖନ୍ତୁ"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"ଏହି ଆପ୍ରୁ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାଇବା ଜାରି ରଖିବେ?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"ଏହି ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ବନ୍ଦ କରିହେବ ନାହିଁ"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ମାଧ୍ୟମରେ"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"ସେଟିଙ୍ଗ"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"ବୁଝିଲି"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ହିପ୍ ଡମ୍ପ୍ କରନ୍ତୁ"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g>ଟି ଆପ୍ସ</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ଆପ୍</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ଆପଣଙ୍କ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ବ୍ୟବହାର କରୁଛନ୍ତି।"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ଆପ୍ଲିକେସନ୍ଗୁଡିକ ଆପଣଙ୍କ <xliff:g id="TYPES_LIST">%s</xliff:g> ବ୍ୟବହାର କରୁଛନ୍ତି।"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ବାତିଲ୍"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g>ଟି ଆପ୍ଲିକେସନ୍ ଆପଣଙ୍କର <xliff:g id="TYPE_5">%2$s</xliff:g> ବ୍ୟବହାର କରୁଛନ୍ତି।</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g>ଟି ଆପ୍ଲିକେସନ୍ ଆପଣଙ୍କର <xliff:g id="TYPE_1">%2$s</xliff:g>ବ୍ୟବହାର କରୁଛନ୍ତି।</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ବିବରଣୀ ଦେଖନ୍ତୁ"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ଆପ୍ ଆପଣଙ୍କ <xliff:g id="TYPES_LIST">%s</xliff:g> ବ୍ୟବହାର କରୁଛି"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ଆପ୍ସ ଆପଣଙ୍କ <xliff:g id="TYPES_LIST">%s</xliff:g> ବ୍ୟବହାର କରୁଛନ୍ତି"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index e36fea21f937..2b2a124a857e 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"ਕੀ USB ਡੀਬਗਿੰਗ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"ਕੰਪਿਊਟਰ ਦਾ RSA ਕੁੰਜੀ ਫਿੰਗਰਪ੍ਰਿੰਟ \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"ਹਮੇਸ਼ਾਂ ਇਸ ਕੰਪਿਊਟਰ ਤੋਂ ਆਗਿਆ ਦਿਓ"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ਡਿਬੱਗਿੰਗ ਦੀ ਆਗਿਆ ਨਹੀਂ"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"The user currently signed in to this device can\'t turn on USB debugging. To use this feature, switch to the primary user."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਜ਼ੂਮ ਕਰੋ"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ਸਕ੍ਰੀਨ ਭਰਨ ਲਈ ਸਟ੍ਰੈਚ ਕਰੋ"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"ਰੱਦ ਕਰੋ"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"ਮਦਦ ਸੁਨੇਹਾ ਖੇਤਰ"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ਪੁਸ਼ਟੀ ਕਰੋ"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਪ੍ਰਤੀਕ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ਤੁਹਾਡੀ ਪਛਾਣ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ਆਡੀਓ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ਹੈੱਡਸੈੱਟ"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ਇਨਪੁੱਟ"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ਸੁਣਨ ਦੇ ਸਾਧਨ"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ਚਮਕ"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ਆਟੋ-ਰੋਟੇਟ"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"ਤੁਸੀਂ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਆਮ ਤੌਰ \'ਤੇ ਖਾਰਜ ਕਰਦੇ ਹੋ। \nਕੀ ਇਹਨਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ਕੀ ਇਨ੍ਹਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"ਬਲਾਕ ਕਰੋ"</string> <string name="inline_keep_button" msgid="6665940297019018232">"ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖੋ"</string> <string name="inline_minimize_button" msgid="966233327974702195">"ਛੋਟਾ ਕਰੋ"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"ਚੁੱਪ-ਚਪੀਤੇ ਦਿਖਾਓ"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ਚੁੱਪ ਰਹੋ"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"ਮੈਨੂੰ ਸੁਚੇਤ ਕਰੋ"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ਸੁਚੇਤ ਰਖੋ"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"ਕੀ ਇਸ ਐਪ ਤੋਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਦਿਖਾਉਣਾ ਜਾਰੀ ਰੱਖਣਾ ਹੈ?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"ਇਨ੍ਹਾਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਰਾਹੀਂ"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"ਸੈਟਿੰਗਾਂ"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"ਸਮਝ ਲਿਆ"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI ਹੀਪ ਡੰਪ ਕਰੋ"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> ਐਪ</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ਐਪਾਂ</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ਤੁਹਾਡੇ <xliff:g id="TYPES_LIST">%2$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ਐਪਲੀਕੇਸ਼ਨਾਂ ਤੁਹਾਡੇ <xliff:g id="TYPES_LIST">%s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀਆਂ ਹਨ।"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ਰੱਦ ਕਰੋ"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ਐਪਲੀਕੇਸ਼ਨ ਤੁਹਾਡੇ <xliff:g id="TYPE_5">%2$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ।</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ਐਪਲੀਕੇਸ਼ਨਾਂ ਤੁਹਾਡੇ <xliff:g id="TYPE_5">%2$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀਆਂ ਹਨ।</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ਵੇਰਵੇ ਦੇਖੋ"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ਤੁਹਾਡੇ <xliff:g id="TYPES_LIST">%s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਐਪ"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ਤੁਹਾਡੇ <xliff:g id="TYPES_LIST">%s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀਆਂ ਐਪਾਂ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index ed2902fa848e..b5b6da462103 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Zezwalać na debugowanie USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Odcisk cyfrowy klucza RSA komputera to:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Zawsze zezwalaj z tego komputera"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Debugowanie USB jest niedozwolone"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Użytkownik obecnie zalogowany na tym urządzeniu nie może włączyć debugowania USB. Aby użyć tej funkcji, przełącz się na użytkownika głównego."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Powiększ, aby wypełnić ekran"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Rozciągnij, aby wypełnić ekran"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Zrzut ekranu"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Anuluj"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Obszar komunikatu pomocy"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potwierdź"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Spróbuj jeszcze raz"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotknij czytnika linii papilarnych"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odcisku palca"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Szukam Cię…"</string> @@ -298,8 +303,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Dźwięk"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Zestaw słuchawkowy"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Wejście"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparaty słuchowe"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Włączam…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Jasność"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Autoobracanie"</string> @@ -617,17 +621,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Zwykle odrzucasz te powiadomienia. \nNadal je pokazywać?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Nadal pokazywać te powiadomienia?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Zablokuj powiadomienia"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Zablokuj"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Pokazuj nadal"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimalizuj"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Pokazuj dyskretnie"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Zachowaj wyciszenie"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Powiadom mnie"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Powiadamiaj dalej"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Nadal pokazywać powiadomienia z tej aplikacji?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Tych powiadomień nie można wyłączyć"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"przez aplikację <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -881,11 +881,22 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Ustawienia"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Zrzut stosu SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacje</item> + <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacji</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacji</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikacja</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Aplikacja <xliff:g id="APP">%1$s</xliff:g> używa: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacje używają: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Anuluj"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacje używają: <xliff:g id="TYPE_3">%2$s</xliff:g>.</item> + <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacji używa: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacji używa: <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikacja używa: <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Wyświetl szczegóły"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacje, które używają: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacje, które używają: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index ac6991774daa..bc734035513a 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Permitir a depuração USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"A impressão digital da chave RSA deste computador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Sempre permitir a partir deste computador"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuração USB não permitida"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom p/ preencher a tela"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Ampliar p/ preencher tela"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de tela"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tentar novamente"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressão digital"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Procurando você…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Áudio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Fone de ouvido"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparelhos auditivos"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Ativando…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Girar automaticamente"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Geralmente você dispensa essas notificações. \nQuer que elas continuem a ser exibidas?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Continuar mostrando essas notificações?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Bloquear notificações"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar silenciosamente"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continuar sem som"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Receber alerta"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar alertando"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuar mostrando notificações desse app?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Não é possível desativar essas notificações"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"pelo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Configurações"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ok"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Despejar pilha SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"O app <xliff:g id="APP">%1$s</xliff:g> está usando <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplicativos estão usando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicativo está usando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicativos estão usando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalhes"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App usando <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps usando <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index c1858fc938e6..d7ae1615e702 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Permitir depuração USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"A impressão digital da chave RSA do computador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Permitir sempre a partir deste computador"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuração USB não permitida"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O utilizador com sessão iniciada atualmente neste dispositivo não pode ativar a depuração USB. Para utilizar esta funcionalidade, mude para o utilizador principal."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom para preencher o ecrã"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Esticar p. caber em ec. int."</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de ecrã"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tentar novamente"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressões digitais."</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"À sua procura…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Áudio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Ausc. c/ mic. integ."</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparelhos auditivos"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"A ativar..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotação automática"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Normalmente, ignora estas notificações. \nPretende continuar a mostrá-las?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Pretende continuar a ver estas notificações?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Parar notificações"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continuar a mostrar"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar silenciosamente"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continuar sem som"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alertar-me"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar a alertar"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Pretende continuar a ver notificações desta aplicação?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Não é possível desativar estas notificações."</string> <string name="notification_delegate_header" msgid="9167022191405284627">"através da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Definições"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Compreendi"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Cp ár. di. da. SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplic.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplicação</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"A aplicação <xliff:g id="APP">%1$s</xliff:g> está a utilizar o(a) <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"As aplicações estão a utilizar o(a) <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicações estão a utilizar o(a) <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicação está a utilizar o(a) <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalhes"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicações que utilizam o(a) <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicações que utilizam o(a) <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index ac6991774daa..bc734035513a 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Permitir a depuração USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"A impressão digital da chave RSA deste computador é:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Sempre permitir a partir deste computador"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Depuração USB não permitida"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"O usuário conectado a este dispositivo não pode ativar a depuração USB. Para usar esse recurso, mude para o usuário principal \"NAME\"."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom p/ preencher a tela"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Ampliar p/ preencher tela"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Captura de tela"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Área da mensagem de ajuda"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmar"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tentar novamente"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toque no sensor de impressão digital"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Procurando você…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Áudio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Fone de ouvido"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrada"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparelhos auditivos"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Ativando…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Girar automaticamente"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Geralmente você dispensa essas notificações. \nQuer que elas continuem a ser exibidas?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Continuar mostrando essas notificações?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Bloquear notificações"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Bloquear"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimizar"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Mostrar silenciosamente"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Continuar sem som"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Receber alerta"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Continuar alertando"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Continuar mostrando notificações desse app?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Não é possível desativar essas notificações"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"pelo <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Configurações"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ok"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Despejar pilha SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"O app <xliff:g id="APP">%1$s</xliff:g> está usando <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplicativos estão usando <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Cancelar"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicativo está usando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplicativos estão usando <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ver detalhes"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App usando <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Apps usando <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index c393bdeb9d23..268a40650d27 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Permiteți remedierea erorilor prin USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Amprenta digitală din cheia RSA a computerului este:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Permiteți întotdeauna de pe acest computer"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Remedierea erorilor prin USB nu este permisă"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul principal."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zoom pt. a umple ecranul"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Înt. pt. a umple ecranul"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Captură de ecran"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Anulați"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zona mesajelor de ajutor"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Confirmați"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Încercați din nou"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Atingeți senzorul de amprente"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pictograma amprentă"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Vă căutăm…"</string> @@ -297,8 +302,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Căști"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Intrare"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparate auditive"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Se activează..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminozitate"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotire automată"</string> @@ -614,17 +618,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"De regulă respingeți aceste notificări. \nDoriți să fie afișate în continuare?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Doriți să continuați afișarea acestor notificări?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Opriți notificările"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blocați"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Continuați afișarea"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimizați"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Afișați fără sunet"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Păstrați modul silențios"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alertează-mă"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Păstrați alerta"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Doriți să continuați afișarea notificărilor de la această aplicație?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Aceste notificări nu pot fi dezactivate"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"prin <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -876,11 +876,20 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Setări"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Date SysUI memorie"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplicații</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> de aplicații</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplicație</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> folosește <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplicațiile folosesc <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Anulați"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplicații folosesc <xliff:g id="TYPE_3">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> de aplicații folosesc <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplicație folosește <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Afișați detaliile"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplicație care folosește <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplicații care folosesc <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index e643c8f026f8..bbea69433300 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Отладка по USB"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Цифровой отпечаток ключа RSA:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Всегда разрешать отладку с этого компьютера"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отладка по USB запрещена"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"В этом аккаунте нельзя включить отладку по USB. Перейдите в аккаунт основного пользователя."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Подогнать по размерам экрана"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Растянуть на весь экран"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Скриншот"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Отмена"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Справочное сообщение"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Подтвердить"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Повторить попытку"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Прикоснитесь к сканеру отпечатков пальцев."</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок отпечатка пальца"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Поиск лица…"</string> @@ -298,8 +303,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудиоустройство"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнитура"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Устройство ввода"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слуховые аппараты"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Включение…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Яркость"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоповорот"</string> @@ -617,17 +621,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Обычно вы скрываете эти уведомления.\nПоказывать их?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Показывать эти уведомления?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Отключить уведомления"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Заблокировать"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Показывать"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Свернуть"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Без звука"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Не включать звук"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Оповещать меня"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Присылать уведомления"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Показывать уведомления от этого приложения?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Эти уведомления нельзя отключить."</string> <string name="notification_delegate_header" msgid="9167022191405284627">"через приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\""</string> @@ -881,11 +881,22 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Открыть настройки"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"ОК"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Передача SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> прил.</item> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> прил.</item> + <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> прил.</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> прил.</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"В приложении \"<xliff:g id="APP">%1$s</xliff:g>\" используется <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"В приложениях используется <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Отмена"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one">Функцию \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" использует <xliff:g id="NUM_APPS_4">%1$d</xliff:g> приложение.</item> + <item quantity="few">Функцию \"<xliff:g id="TYPE_3">%2$s</xliff:g>\" используют <xliff:g id="NUM_APPS_2">%1$d</xliff:g> приложения.</item> + <item quantity="many">Функцию \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" используют <xliff:g id="NUM_APPS_4">%1$d</xliff:g> приложений.</item> + <item quantity="other">Функцию \"<xliff:g id="TYPE_5">%2$s</xliff:g>\" используют <xliff:g id="NUM_APPS_4">%1$d</xliff:g> приложения.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Подробнее"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Приложение, в котором используются операции <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Приложения, в которых используются операции <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index cb22f3d431a2..aaaa7038abf2 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB නිදොස්කරණයට අවසර දෙනවද?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"මෙම පරිගණකයේ RSA යතුරු ඇඟිලි සටහන වන්නේ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"සැම විටම මෙම පරිගණකයෙන් ඉඩ ලබා දෙන්න"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB නිදොස්කරණය වෙත අවසර නැහැ"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"දැනට මෙම උපාංගයට පුරා ඇති පරිශීලකයාට USB නිදොස්කරණය ක්රියාත්මක කළ නොහැක. මෙම විශේෂාංගය භාවිතා කිරීම සඳහා, මූලික පරිශීලකයා වෙත මාරු වෙන්න."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"තිරය පිරවීමට විශාලනය කරන්න"</string> <string name="compat_mode_off" msgid="4434467572461327898">"තිරය පිරවීමට අදින්න"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"තිර රුව"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"අවලංගු කරන්න"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"උදවු පණිවිඩ ප්රදේශය"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"තහවුරු කරන්න"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"නැවත උත්සාහ කරන්න"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරන්න"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ඇඟිලි සලකුණු නිරූපකය"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"ඔබව සොයමින්…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ශ්රව්ය"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"හෙඩ්සෙටය"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ආදානය"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"ශ්රවණාධාරක"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ක්රියාත්මක කරමින්…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"දීප්තිය"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ස්වයංක්රීය කරකැවීම"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"ඔබ සාමාන්යයෙන් මෙවැනි දැනුම්දීම් ඉවත දමයි. \nඒවා දිගටම පෙන්වන්නද?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"මෙම දැනුම්දීම් පෙන්වමින් තබන්නද?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"දැනුම්දීම් නවත්වන්න"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"අවහිර කරන්න"</string> <string name="inline_keep_button" msgid="6665940297019018232">"පෙන්වමින් තබන්න"</string> <string name="inline_minimize_button" msgid="966233327974702195">"කුඩා කරන්න"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"නිහඬව පෙන්වන්න"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"නිහඬව සිටින්න"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"මට අඟවන්න"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"අඟවමින් සිටින්න"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"මෙම යෙදුම වෙතින් දැනුම්දීම් පෙන්වමින් තබන්නද?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"මෙම දැනුම්දීම් ක්රියාවිරහිත කළ නොහැකිය"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> හරහා"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"සැකසීම්"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"තේරුණා"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one">යෙදුම් <xliff:g id="NUM_APPS_2">%d</xliff:g>ක්</item> + <item quantity="other">යෙදුම් <xliff:g id="NUM_APPS_2">%d</xliff:g>ක්</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ඔබේ <xliff:g id="TYPES_LIST">%2$s</xliff:g> භාවිත කරමින් සිටී."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"යෙදුම් ඔබේ <xliff:g id="TYPES_LIST">%s</xliff:g> භාවිත කරමින් සිටී."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"අවලංගු කරන්න"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one">යෙදුම් <xliff:g id="NUM_APPS_4">%1$d</xliff:g>ක් ඔබේ <xliff:g id="TYPE_5">%2$s</xliff:g> භාවිත කරමින් සිටිති.</item> + <item quantity="other">යෙදුම් <xliff:g id="NUM_APPS_4">%1$d</xliff:g>ක් ඔබේ <xliff:g id="TYPE_5">%2$s</xliff:g> භාවිත කරමින් සිටිති.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"විස්තර බලන්න"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ඔබගේ <xliff:g id="TYPES_LIST">%s</xliff:g> භාවිත කරන යෙදුම්"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ඔබගේ <xliff:g id="TYPES_LIST">%s</xliff:g> භාවිත කරන යෙදුම්"</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index bcc444f39157..28b3d24a1671 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Povoliť ladenie USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Digitálny odtlačok RSA počítača je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Vždy povoliť z tohto počítača"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ladenie cez USB nie je povolené"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Používateľ, ktorý je práve prihlásený v tomto zariadení, nemôže zapnúť ladenie USB. Ak chcete použiť túto funkciu, prepnite na hlavného používateľa."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Priblížiť na celú obrazovku"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Na celú obrazovku"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Snímka obrazovky"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Zrušiť"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Oblasť správy pomocníka"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potvrdiť"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Skúsiť znova"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Klepnite na senzor odtlačkov prstov"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odtlačku prsta"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hľadáme vás…"</string> @@ -236,11 +241,11 @@ <string name="accessibility_quick_settings_close" msgid="3115847794692516306">"Zavrieť panel"</string> <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Dlhší čas"</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Kratší čas"</string> - <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Svietidlo je vypnuté."</string> - <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Svietidlo nie je k dispozícii."</string> - <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Svietidlo je zapnuté."</string> - <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Svietidlo je vypnuté."</string> - <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Svietidlo je zapnuté."</string> + <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"Baterka je vypnutá."</string> + <string name="accessibility_quick_settings_flashlight_unavailable" msgid="8012811023312280810">"Baterka nie je k dispozícii."</string> + <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"Baterka je zapnutá."</string> + <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"Baterka je vypnutá."</string> + <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"Baterka je zapnutá."</string> <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"Prevrátenie farieb je vypnuté."</string> <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"Prevrátenie farieb je zapnuté."</string> <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"Mobilný hotspot je vypnutý."</string> @@ -298,8 +303,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvuk"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Náhlavná súprava"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vstup"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Načúvacie pomôcky"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Zapína sa…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Jas"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatické otáčanie"</string> @@ -617,17 +621,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Tieto upozornenia zvyčajne odmietate. \nChcete ich naďalej zobrazovať?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Majú sa tieto upozornenia naďalej zobrazovať?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Prestať zobrazovať upozornenia"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokovať"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Naďalej zobrazovať"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimalizovať"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Zobraziť potichu"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Naďalej upozorňovať potichu"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Upozorniť ma"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Naďalej upozorňovať"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Majú sa upozornenia z tejto aplikácie naďalej zobrazovať?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Tieto upozornenia sa nedajú vypnúť"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"prostredníctvom aplikácie <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -881,11 +881,22 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Nastavenia"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Dobre"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Výpis haldy SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikácie</item> + <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> apps</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikácií</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikácia</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> používa zoznam <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikácie používajú zoznam <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Zrušiť"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="few"><xliff:g id="TYPE_3">%2$s</xliff:g> používajú <xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikácie</item> + <item quantity="many"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> applications are using your <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> používa <xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikácií</item> + <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> používa <xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikácia.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Podrobnosti"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikácia používajúca <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikácie používajúce <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 706e7002a749..b25a49d68a01 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Ali dovolite odpravljanje težav prek USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Računalnikov prstni odtis ključa RSA je:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Vedno dovoli iz tega računalnika"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Odpravljanje napak s povezavo USB ni dovoljeno"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Uporabnik, trenutno prijavljen v napravo, ne more vklopiti odpravljanja napak s povezavo USB. Če želite uporabljati to funkcijo, preklopite na primarnega uporabnika."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Povečava čez cel zaslon"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Raztegnitev čez zaslon"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Posnetek zaslona"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Prekliči"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Območje sporočila pomoči"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Potrdite"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Poskusi znova"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Dotaknite se tipala prstnih odtisov"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona prstnih odtisov"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Preverjanje vašega obraza …"</string> @@ -298,8 +303,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Zvok"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Slušalke z mikrofonom"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vhodna naprava"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Slušni pripomočki"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Vklapljanje …"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Svetlost"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Samodejno sukanje"</string> @@ -617,17 +621,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Ta obvestila običajno opustite. \nAli želite, da se še naprej prikazujejo?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Želite, da so ta obvestila še naprej prikazana?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Ustavi prikazovanje obvestil"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blokiraj"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Prikazuj še naprej"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimiraj"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Prikaži brez zvoka"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Še naprej prikazuj brez zvoka"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Opozori me"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Še naprej opozarjaj"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Želite, da so obvestila te aplikacije še naprej prikazana?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Teh obvestil ni mogoče izklopiti"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"prek aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -881,11 +881,22 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Nastavitve"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"V redu"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Izvoz kopice SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacija</item> + <item quantity="two"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikaciji</item> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> aplikacije</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacij</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> uporablja <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacije uporabljajo <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Prekliči"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacija uporablja <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="two"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikaciji uporabljata <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> aplikacije uporabljajo <xliff:g id="TYPE_3">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacij uporablja <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Podrobnosti"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacija, ki uporablja te funkcije: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacije, ki uporabljajo te funkcije: <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 66a577811bf5..1642e9987246 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Të lejohet korrigjimi i USB-së?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Shenja e gishtit të tastit \"RSA\" së kompjuterit është:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Lejo gjithmonë nga ky kompjuter"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Korrigjimi i USB-së nuk lejohet"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Përdoruesi i identifikuar aktualisht në këtë pajisje nuk mund ta aktivizojë korrigjimin e USB-së. Për ta përdorur këtë funksion, kalo te përdoruesi parësor."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zmadho për të mbushur ekranin"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Shtrije për të mbushur ekranin"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Pamja e ekranit"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Anulo"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Zona e mesazhit të ndihmës"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Konfirmo"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Provo përsëri"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Prek sensorin e gjurmës së gishtit"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona e gjurmës së gishtit"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Po të kërkojmë…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Kufje me mikrofon"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Hyrja"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Aparatet e dëgjimit"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Po aktivizohet…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ndriçimi"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rrotullim automatik"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Këto njoftime ti zakonisht i largon. \nDëshiron të vazhdosh t\'i shfaqësh ato?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Do të vazhdosh t\'i shfaqësh këto njoftime?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Ndalo njoftimet"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blloko"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Vazhdo të shfaqësh"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimizo"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Shfaq në heshtje"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Qëndro në heshtje"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Më sinjalizo"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Vazhdo të sinjalizosh"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Do të vazhdosh t\'i shfaqësh njoftimet nga ky aplikacion?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Këto njoftime nuk mund të çaktivizohen"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"nëpërmjet <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Cilësimet"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"E kuptova"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Hidh grumbullin SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> aplikacione</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> aplikacion</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> po përdor <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Aplikacionet po përdorin <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Anulo"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> aplikacione po përdorin <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> aplikacion po përdor <xliff:g id="TYPE_1">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Shiko detajet"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Aplikacionet që po përdorin <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Aplikacionet që po përdorin <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 1ff65d782fc0..dac91a87064e 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Желите ли да дозволите отклањање USB грешака?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Дигитални отисак RSA кључа овог рачунара је:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Увек дозволи са овог рачунара"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Отклањање грешака на USB-у није дозвољено"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Корисник који је тренутно пријављен на овај уређај не може да укључи отклањање грешака на USB-у. Да бисте користили ову функцију, пребаците на примарног корисника."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Зумирај на целом екрану"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Развуци на цео екран"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Снимак екрана"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Откажи"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Област поруке за помоћ"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Потврди"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Пробај поново"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Додирните сензор за отисак прста"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона отиска прста"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Тражимо вас…"</string> @@ -297,8 +302,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудио"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Слушалице"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Унос"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слушни апарати"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Укључује се..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Осветљеност"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Аутоматска ротација"</string> @@ -614,17 +618,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Обично одбацујете ова обавештења. \nЖелите ли да се и даље приказују?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Желите ли да се ова обавештења и даље приказују?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Престани да приказујеш обавештења"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Блокирај"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Настави да приказујеш"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Умањи"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Прикажи без звука"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Не укључуј звук"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Обавести ме"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Настави са обавештењима"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Желите ли да се обавештења из ове апликације и даље приказују?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Не можете да искључите ова обавештења"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"преко апликације <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -876,11 +876,20 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Подешавања"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Важи"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Издвоји SysUI мем."</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> апликација</item> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> апликације</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> апликација</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> користи <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Апликације користе <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Откажи"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> апликација користи дозволу <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="few"><xliff:g id="NUM_APPS_2">%1$d</xliff:g> апликације користе дозволу <xliff:g id="TYPE_3">%2$s</xliff:g>.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> апликација користи дозволу <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Прикажи детаље"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Апликација која користи дозволе <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Апликације које користе дозволе <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 3c8c3abef06a..ff0d0c0f24bb 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Ska USB-felsökning tillåtas?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Fingeravtrycket för datorns RSA-nyckel är:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Tillåt alltid på den här datorn"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB-felsökning är inte tillåtet"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Användaren som är inloggad på enheten för närvarande kan inte aktivera USB-felsökning. Byt till den primära användaren om du vill använda den här funktionen."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Zooma för att fylla skärm"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Dra för att fylla skärmen"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Skärmdump"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Avbryt"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Område för hjälpmeddelande"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Bekräfta"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Försök igen"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Tryck på fingeravtryckssensorn"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon för fingeravtryck"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Håller utkik efter dig …"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Ljud"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Ingång"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Hörapparater"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Aktiverar …"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ljusstyrka"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotera automatiskt"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Du brukar avvisa de här aviseringarna. \nVill du fortsätta att visa dem?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Vill du fortsätta visa de här aviseringarna?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Stoppa aviseringar"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Blockera"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Fortsätt visa"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Minimera"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Visa utan ljud"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Fortsätt visa utan ljud"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Meddela mig"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Fortsätt meddela"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Vill du fortsätta visa aviseringar för den här appen?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"De här aviseringarna kan inte inaktiveras"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"via <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Inställningar"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dumpa SysUI-heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> appar</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> app</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="TYPES_LIST">%2$s</xliff:g> används av <xliff:g id="APP">%1$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"<xliff:g id="TYPES_LIST">%s</xliff:g> används av appar."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Avbryt"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> används av <xliff:g id="NUM_APPS_4">%1$d</xliff:g> appar.</item> + <item quantity="one"><xliff:g id="TYPE_1">%2$s</xliff:g> används av <xliff:g id="NUM_APPS_0">%1$d</xliff:g> app.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Läs mer"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"En app använder din <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Appar använder dina <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 69b3be7ffbc4..dbb3a8d4e224 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Ruhusu utatuaji wa USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Alama ya kidole ya kitufe cha RSA ya kompyuta ni:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Ruhusu kutoka kwenye kompyuta hii kila wakati"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Utatuzi wa USB hauruhusiwi"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Mtumiaji aliyeingia katika akaunti kwa kutumia kifaa hiki kwa sasa hawezi kuwasha utatuzi wa USB. Ili utumie kipengele hiki, tumia akaunti ya mtumiaji wa msingi."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Kuza ili kujaza skrini"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Tanua ili kujaza skrini"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Picha ya skrini"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Ghairi"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Sehemu ya ujumbe wa usaidizi"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Thibitisha"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Jaribu tena"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Gusa kitambua alama ya kidole"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Aikoni ya alama ya kidole"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Inakutafuta…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Sauti"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Vifaa vya sauti"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Vifaa vya kuingiza sauti"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Visaidizi vya Kusikia"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Inawasha..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ung\'avu"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Zungusha kiotomatiki"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Wewe huondoa arifa hizi. \nUngependa kuzionyesha?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Ungependa kuendelea kuonyesha arifa hizi?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Acha kuonyesha arifa"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Zuia"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Endelea kuonyesha"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Punguza"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Ionyeshe bila kutoa sauti"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Isitoe sauti"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Niarifu"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Endelea kutoa arifa"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Ungependa kuendelea kuonyesha arifa kutoka programu hii?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Huwezi kuzima arifa hizi"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"kupitia <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Mipangilio"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Nimeelewa"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other">Programu <xliff:g id="NUM_APPS_2">%d</xliff:g></item> + <item quantity="one">Programu <xliff:g id="NUM_APPS_0">%d</xliff:g></item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> inatumia <xliff:g id="TYPES_LIST">%2$s</xliff:g> yako."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Programu zinatumia <xliff:g id="TYPES_LIST">%s</xliff:g> yako."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Ghairi"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other">Programu <xliff:g id="NUM_APPS_4">%1$d</xliff:g> zinatumia <xliff:g id="TYPE_5">%2$s</xliff:g> yako.</item> + <item quantity="one">Programu <xliff:g id="NUM_APPS_0">%1$d</xliff:g> inatumia <xliff:g id="TYPE_1">%2$s</xliff:g> yako.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Angalia maelezo"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Programu inayotumia <xliff:g id="TYPES_LIST">%s</xliff:g> yako"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Programu zinazotumia <xliff:g id="TYPES_LIST">%s</xliff:g> yako"</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index f75cc4dec1b6..0ef8bbf807d6 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB பிழைத்திருத்தத்தை அனுமதிக்கவா?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"பின்வருவது கணினியின் RSA விசை கைரேகையாகும்:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"இந்தக் கணினியிலிருந்து எப்போதும் அனுமதி"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB பிழைத்திருத்தம் அனுமதிக்கப்படவில்லை"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"தற்போது இந்தச் சாதனத்தில் உள்நுழைந்துள்ள பயனரால் USB பிழைத்திருத்தத்தை இயக்க முடியாது. இந்த அம்சத்தை இயக்க, முதன்மைப் பயனருக்கு மாறவும்."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"திரையை நிரப்ப அளவை மாற்று"</string> <string name="compat_mode_off" msgid="4434467572461327898">"திரையை நிரப்ப இழு"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"ஸ்கிரீன் ஷாட்"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"ரத்துசெய்"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"உதவிச் செய்திக்கான பகுதி"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"உறுதிப்படுத்துக"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"மீண்டும் முயல்க"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"கைரேகை உணர்வியைத் தொடவும்"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"கைரேகை ஐகான்"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"உங்கள் முகத்தைத் தேடுகிறது…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ஆடியோ"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ஹெட்செட்"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"உள்ளீடு"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"செவித்துணை கருவிகள்"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ஆன் செய்கிறது…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ஒளிர்வு"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"தானாகச் சுழற்று"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"வழக்கமாக, இந்த அறிவிப்புகளை நிராகரிக்கிறீர்கள். \nதொடர்ந்து இவற்றைக் காட்டலாமா?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"இந்த அறிவிப்புகளைத் தொடர்ந்து காட்டவா?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"அறிவிப்புகளை நிறுத்து"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"தடு"</string> <string name="inline_keep_button" msgid="6665940297019018232">"அறிவிப்புகளைத் தொடர்ந்து காட்டு"</string> <string name="inline_minimize_button" msgid="966233327974702195">"சிறிதாக்கு"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"ஒலிக்காமல் காட்டு"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"அறிவிப்புகளை ஒலியின்றிக் காட்டு"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"எனக்கு விழிப்பூட்டலை அனுப்பு"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"தொடர்ந்து விழிப்பூட்டு"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"இந்தப் பயன்பாட்டின் அறிவிப்புகளைத் தொடர்ந்து காட்டவா?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"இந்த அறிவிப்புகளை ஆஃப் செய்ய முடியாது"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> மூலமாக"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"அமைப்புகள்"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"சரி"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ஆப்ஸ்</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ஆப்ஸ்</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"உங்கள் <xliff:g id="TYPES_LIST">%2$s</xliff:g>ஐ <xliff:g id="APP">%1$s</xliff:g> ஆப்ஸ் பயன்படுத்துகிறது."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"உங்கள் <xliff:g id="TYPES_LIST">%s</xliff:g> ஆகியவற்றை ஆப்ஸ் பயன்படுத்துகின்றன."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ரத்துசெய்"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ஆப்ஸால் உங்கள் <xliff:g id="TYPE_5">%2$s</xliff:g> பயன்படுத்தப் படுகிறது.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ஆப்ஸால் உங்கள் <xliff:g id="TYPE_1">%2$s</xliff:g> பயன்படுத்தப் படுகிறது.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"விவரங்களைக் காட்டு"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"உங்கள் <xliff:g id="TYPES_LIST">%s</xliff:g> ஆகியவற்றைப் பயன்படுத்தும் ஆப்ஸ்"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"உங்கள் <xliff:g id="TYPES_LIST">%s</xliff:g> ஆகியவற்றைப் பயன்படுத்தும் ஆப்ஸ்"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 894263ebf5bb..4b05f0f0b77e 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB డీబగ్గింగ్ను అనుమతించాలా?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"ఇది కంప్యూటర్ యొక్క RSA కీ వేలిముద్ర:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"ఈ కంప్యూటర్ నుండి ఎల్లప్పుడూ అనుమతించు"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB డీబగ్గింగ్కి అనుమతి లేదు"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ఈ పరికరానికి ప్రస్తుతం సైన్ ఇన్ చేసిన వినియోగదారు USB డీబగ్గింగ్ ఆన్ చేయలేరు. ఈ ఫీచర్ ఉపయోగించడానికి, ప్రాథమిక వినియోగదారుకి మారాలి."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"స్క్రీన్కు నింపేలా జూమ్ చేయండి"</string> <string name="compat_mode_off" msgid="4434467572461327898">"స్క్రీన్కు నింపేలా విస్తరించండి"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"స్క్రీన్షాట్"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"రద్దు చేయి"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"సహాయ సందేశ ప్రాంతం"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"నిర్ధారించు"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"మళ్లీ ప్రయత్నించు"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"వేలిముద్ర సెన్సార్ను తాకండి"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"వేలిముద్ర చిహ్నం"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"మీ కోసం చూస్తోంది…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"ఆడియో"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"హెడ్సెట్"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ఇన్పుట్"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"వినికిడి పరికరాలు"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"ఆన్ చేస్తోంది…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ప్రకాశం"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"స్వయంచాలకంగా తిప్పడం"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"మీరు సాధారణంగా ఈ నోటిఫికేషన్లను విస్మరిస్తారు. \nవాటి ప్రదర్శనను కొనసాగించాలా?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"ఈ నోటిఫికేషన్లను చూపిస్తూ ఉండాలా?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"నోటిఫికేషన్లను ఆపివేయి"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"బ్లాక్ చేయి"</string> <string name="inline_keep_button" msgid="6665940297019018232">"చూపిస్తూనే ఉండు"</string> <string name="inline_minimize_button" msgid="966233327974702195">"కుదించు"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"నిశ్శబ్దంగా చూపండి"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"నిశబ్దంగా తెలియజేయి"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"నన్ను హెచ్చరించు"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"ఎప్పటికప్పుడు హెచ్చరించు"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"ఈ యాప్ నుండి నోటిఫికేషన్లను చూపిస్తూ ఉండాలా?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"ఈ నోటిఫికేషన్లను ఆఫ్ చేయలేరు"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ద్వారా"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"సెట్టింగ్లు"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"అర్థమైంది"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"డంప్ SysUI హీప్"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> యాప్లు</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> యాప్</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> మీ <xliff:g id="TYPES_LIST">%2$s</xliff:g>ని ఉపయోగిస్తోంది."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"అప్లికేషన్లు మీ <xliff:g id="TYPES_LIST">%s</xliff:g>ని ఉపయోగిస్తున్నాయి."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"రద్దు చేయండి"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> అప్లికేషన్లు మీ <xliff:g id="TYPE_5">%2$s</xliff:g>ని ఉపయోగిస్తున్నాయి.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> అప్లికేషన్ మీ <xliff:g id="TYPE_1">%2$s</xliff:g>ని ఉపయోగిస్తుంది.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"వివరాలను చూడండి"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"మీ <xliff:g id="TYPES_LIST">%s</xliff:g> ఉపయోగించే యాప్"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"మీ<xliff:g id="TYPES_LIST">%s</xliff:g> ఉపయోగిస్తున్న యాప్లు"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index ae581aca2325..707bcf9efd0c 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"อนุญาตให้แก้ไขข้อบกพร่อง USB หรือไม่"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"ลายนิ้วมือหลัก RSA ของคอมพิวเตอร์คือ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"อนุญาตจากคอมพิวเตอร์เครื่องนี้เสมอ"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ไม่อนุญาตให้แก้ไขข้อบกพร่องผ่าน USB"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"ผู้ใช้ที่ลงชื่อเข้าใช้อุปกรณ์อยู่ในขณะนี้ไม่สามารถเปิดการแก้ไขข้อบกพร่องผ่าน USB ได้ หากต้องการใช้ฟีเจอร์นี้ ให้เปลี่ยนไปเป็นผู้ใช้หลัก"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"ขยายจนเต็มหน้าจอ"</string> <string name="compat_mode_off" msgid="4434467572461327898">"ยืดจนเต็มหน้าจอ"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"ภาพหน้าจอ"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"ยกเลิก"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"พื้นที่ข้อความช่วยเหลือ"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"ยืนยัน"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"ลองอีกครั้ง"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"แตะเซ็นเซอร์ลายนิ้วมือ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ไอคอนลายนิ้วมือ"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"กำลังหาใบหน้าคุณ…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"เสียง"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ชุดหูฟัง"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"อินพุต"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"เครื่องช่วยการได้ยิน"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"กำลังเปิด..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ความสว่าง"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"หมุนอัตโนมัติ"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"โดยปกติแล้ว คุณจะปิดการแจ้งเตือนเหล่านี้ \nต้องการให้แสดงต่อไหม"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"แสดงการแจ้งเตือนเหล่านี้ต่อไปไหม"</string> <string name="inline_stop_button" msgid="4172980096860941033">"ปิดการแจ้งเตือน"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"บล็อก"</string> <string name="inline_keep_button" msgid="6665940297019018232">"แสดงต่อไป"</string> <string name="inline_minimize_button" msgid="966233327974702195">"ย่อเล็กสุด"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"แสดงโดยไม่ส่งเสียง"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"ปิดเสียงไว้"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"แจ้งเตือนฉัน"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"แจ้งเตือนต่อไป"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"แสดงการแจ้งเตือนจากแอปนี้ต่อไปไหม"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"ปิดการแจ้งเตือนเหล่านี้ไม่ได้"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"ผ่าน <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"การตั้งค่า"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"รับทราบ"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> แอป</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> แอป</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ใช้<xliff:g id="TYPES_LIST">%2$s</xliff:g>ของคุณอยู่"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"หลายแอปพลิเคชันใช้<xliff:g id="TYPES_LIST">%s</xliff:g>ของคุณอยู่"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"ยกเลิก"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other">มี <xliff:g id="NUM_APPS_4">%1$d</xliff:g> แอปพลิเคชันกำลังใช้<xliff:g id="TYPE_5">%2$s</xliff:g></item> + <item quantity="one">มี <xliff:g id="NUM_APPS_0">%1$d</xliff:g> แอปพลิเคชันกำลังใช้<xliff:g id="TYPE_1">%2$s</xliff:g></item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"ดูรายละเอียด"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"มีแอปกำลังใช้<xliff:g id="TYPES_LIST">%s</xliff:g>ของคุณ"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"มีหลายแอปกำลังใช้<xliff:g id="TYPES_LIST">%s</xliff:g>ของคุณ"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index ab20ff0780ea..1d9460ca98d3 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Payagan ang pag-debug ng USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Ang RSA key fingerprint ng computer ay:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Palaging payagan mula sa computer na ito"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Hindi pinapayagan ang pagde-debug sa pamamagitan ng USB"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Hindi mao-on ng user na kasalukuyang naka-sign in sa device na ito ang pag-debug ng USB. Upang magamit ang feature na ito, lumipat sa pangunahing user."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"I-zoom upang punan screen"</string> <string name="compat_mode_off" msgid="4434467572461327898">"I-stretch upang mapuno screen"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Screenshot"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Kanselahin"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Lugar ng mensahe ng tulong"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Kumpirmahin"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Subukang muli"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Pindutin ang fingerprint sensor"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icon ng fingerprint"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Hinahanap ka…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Input"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Mga Hearing Aid"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Ino-on…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Awtomatikong i-rotate"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Karaniwan mong dini-dismiss ang mga ganitong notification. \nPatuloy na ipakita ang mga ito?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Patuloy na ipakita ang mga notification na ito?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Ihinto ang mga notification"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"I-block"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Patuloy na ipakita"</string> <string name="inline_minimize_button" msgid="966233327974702195">"I-minimize"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Ipakita nang tahimik"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Manatiling naka-silent"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Alertuhan ako"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Patuloy na mag-alerto"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Patuloy na ipakita ang mga notification mula sa app na ito?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Hindi maaaring i-off ang mga notification na ito"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"sa pamamagitan ng <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Mga Setting"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Itapon SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> app</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> na app</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Ginagamit ng <xliff:g id="APP">%1$s</xliff:g> ang iyong <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Ginagamit ng mga application ang iyong <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Kanselahin"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one">Ginagamit ng <xliff:g id="NUM_APPS_4">%1$d</xliff:g> application ang iyong <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + <item quantity="other">Ginagamit ng <xliff:g id="NUM_APPS_4">%1$d</xliff:g> na application ang iyong <xliff:g id="TYPE_5">%2$s</xliff:g>.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Tingnan ang mga detalye"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"App na gumagamit ng iyong <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Mga app na gumagamit ng iyong <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 32201fb6054b..021772028d49 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB hata ayıklamasına izin verilsin mi?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Bilgisayarın RSA anahtarı parmak izi:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Bu bilgisayardan her zaman izin ver"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB hata ayıklama işlevine izin verilmiyor"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Bu cihazda geçerli olarak oturum açmış olan kullanıcı, USB hata ayıklama özelliğini açamaz. Bu özelliği kullanmak için birincil kullanıcıya geçin."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Yakınlaştır (ekranı kaplasın)"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Genişlet (ekran kapansın)"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Ekran görüntüsü"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"İptal"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yardım mesajı alanı"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Onaylayın"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Tekrar dene"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Parmak izi sensörüne dokunun"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Parmak izi simgesi"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Yüzünüz tanınmaya çalışılıyor…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Ses"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Mikrofonlu kulaklık"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Giriş"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"İşitme Cihazları"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Açılıyor…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Parlaklık"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Otomatik döndür"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Bu bildirimleri genellikle kapatıyorsunuz. \nBildirimler gösterilmeye devam edilsin mi?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Bu bildirimler gösterilmeye devam edilsin mi?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Bildirimleri durdur"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Engelle"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Göstermeye devam et"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Küçült"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Sessiz bir şekilde göster"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Sessiz uyarı göster"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Beni uyar"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Uyarıda bulunmaya devam et"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu uygulamadan gelen bildirimler gösterilmeye devam edilsin mi?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Bu bildirimler kapatılamaz"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> ile"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Ayarlar"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Anladım"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"SysUI Yığın Dökümü"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> uygulama</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> uygulama</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> şunları kullanıyor: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Uygulamalar şunları kullanıyor: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"İptal"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> uygulama, cihazınızın <xliff:g id="TYPE_5">%2$s</xliff:g> özelliğini kullanıyor.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> uygulama, cihazınızın <xliff:g id="TYPE_1">%2$s</xliff:g> özelliğini kullanıyor.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Ayrıntıları göster"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Uygulama cihazınızın <xliff:g id="TYPES_LIST">%s</xliff:g> özelliklerini kullanıyor"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Uygulamalar cihazınızın <xliff:g id="TYPES_LIST">%s</xliff:g> özelliklerini kullanıyor"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index a298c6a26589..69ed197aa265 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Дозволити налагодження USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Цифровий відбиток ключа RSA комп’ютера:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Завжди дозволяти з цього комп’ютера"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ви не можете вмикати налагодження USB"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Користувач поточного облікового запису не може вмикати налагодження USB. Щоб увімкнути цю функцію, увійдіть в обліковий запис основного користувача."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Масштабув. на весь екран"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Розтягнути на весь екран"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Знімок екрана"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Скасувати"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Область довідкового повідомлення"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Підтвердити"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Повторити спробу"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Торкніться сканера відбитків пальців"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок відбитка пальця"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Пошук обличчя…"</string> @@ -298,8 +303,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Аудіопристрій"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Гарнітура"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Джерело сигналу"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Слухові апарати"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Увімкнення…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Яскравість"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Автоматичне обертання"</string> @@ -617,17 +621,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Ви зазвичай закриваєте ці сповіщення. \nПоказувати їх?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Чи показувати ці сповіщення надалі?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Не показувати сповіщення"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Блокувати"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Показувати надалі"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Згорнути"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Показувати без звуку"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Без звуку"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Сповіщати мене"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Отримувати сповіщення"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Чи показувати сповіщення з цього додатка надалі?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Ці сповіщення не можна вимкнути"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"через додаток <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -881,11 +881,22 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Налаштування"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> додаток</item> + <item quantity="few"><xliff:g id="NUM_APPS_1">%d</xliff:g> додатки</item> + <item quantity="many"><xliff:g id="NUM_APPS_2">%d</xliff:g> додатків</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> додатка</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"Додаток <xliff:g id="APP">%1$s</xliff:g> використовує <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Додатки використовують <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Скасувати"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="TYPE_5">%2$s</xliff:g> працює в <xliff:g id="NUM_APPS_4">%1$d</xliff:g> додатку.</item> + <item quantity="few"><xliff:g id="TYPE_3">%2$s</xliff:g> працює в <xliff:g id="NUM_APPS_2">%1$d</xliff:g> додатках.</item> + <item quantity="many"><xliff:g id="TYPE_5">%2$s</xliff:g> працює в <xliff:g id="NUM_APPS_4">%1$d</xliff:g> додатках.</item> + <item quantity="other"><xliff:g id="TYPE_5">%2$s</xliff:g> працює в <xliff:g id="NUM_APPS_4">%1$d</xliff:g> додатка.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Докладніше"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Додаток, яким використовується <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Додатки, якими використовується <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index ee9da5e923d6..59e8946a30f1 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB ڈیبگ کرنے کی اجازت دیں؟"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"کمپیوٹر کے RSA کا کلیدی فنگر پرنٹ ہے:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"اس کمپیوٹر سے ہمیشہ اجازت دیں"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB ڈیبگ کرنے کی اجازت نہیں ہے"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"اس آلہ پر فی الحال سائن ان کردہ صارف USB ڈیبگنگ آن نہیں کر سکتا۔ اس خصوصیت کا استعمال کرنے کیلئے، ابتدائی صارف پر سوئچ کریں۔"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"پوری سکرین پر زوم کریں"</string> <string name="compat_mode_off" msgid="4434467572461327898">"پوری سکرین پر پھیلائیں"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"اسکرین شاٹ"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"منسوخ کریں"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"امدادی پیغام کا علاقہ"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"تصدیق کریں"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"دوبارہ کوشش کریں"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"فنگر پرنٹ سینسر پر ٹچ کریں"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"فنگر پرنٹ آئیکن"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"آپ کے لیے تلاش کیا جا رہا ہے…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"آڈیو"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ہیڈ سیٹ"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"ان پٹ"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"سماعتی آلات"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"آن ہو رہا ہے…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"چمکیلا پن"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"خود کار طور پر گھمائیں"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"آپ عام طور پر ان اطلاعات کو مسترد کرتے ہیں۔ \nان کو دکھاتے رہیں؟"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"یہ اطلاعات دکھانا جاری رکھیں؟"</string> <string name="inline_stop_button" msgid="4172980096860941033">"اطلاعات روک دیں"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"مسدود کریں"</string> <string name="inline_keep_button" msgid="6665940297019018232">"دکھانا جاری رکھیں"</string> <string name="inline_minimize_button" msgid="966233327974702195">"چھوٹا کریں"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"خاموشی سے دکھائیں"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"خاموش رہیں"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"مجھے متنبہ کریں"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"متنبہ کرنا جاری رکھیں"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"اس ایپ کی طرف سے اطلاعات دکھانا جاری رکھیں؟"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"ان اطلاعات کو آف نہیں کیا جا سکتا"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"بذریعہ <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"ترتیبات"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"سمجھ آ گئی"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ایپس</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ایپ</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> آپ کی <xliff:g id="TYPES_LIST">%2$s</xliff:g> کا استعمال کر رہی ہے۔"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"ایپلیکیشنز آپ کی <xliff:g id="TYPES_LIST">%s</xliff:g> کا استعمال کر رہی ہیں۔"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"منسوخ کریں"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ایپلیکیشنز آپ کی <xliff:g id="TYPE_5">%2$s</xliff:g> کا استعمال کر رہی ہیں۔</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ایپلیکیشن آپ کی <xliff:g id="TYPE_1">%2$s</xliff:g> کا استعمال کر رہی ہے۔</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"تفصیلات دیکھیں"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"ایپ آپ کی <xliff:g id="TYPES_LIST">%s</xliff:g> کا استعمال کر رہی ہیں"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"ایپس آپ کی <xliff:g id="TYPES_LIST">%s</xliff:g> کا استعمال کر رہی ہیں"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 488bfaed333c..85204afc1eeb 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"USB orqali nosozliklarni tuzatishga ruxsat berilsinmi?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Kompyuterning RSA tugmasi barmoq izlari:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Doimo ushbu kompyuterdan ruxsat berilsin"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USB orqali nosozliklarni tuzatishga ruxsat berilmagan"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Ayni paytda ushbu qurilmaga o‘z hisobi bilan kirgan foydalanuvchi USB orqali nosozliklarni tuzatish funksiyasini yoqa olmaydi. Bu funksiyadan foydalanish uchun asosiy foydalanuvchi profiliga o‘ting."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Ekranga moslashtirish"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Ekran hajmida cho‘zish"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Skrinshot"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Bekor qilish"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Yordam xabari"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"OK"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Qayta urinish"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Barmoq izi skaneriga tegining"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmoq izi belgisi"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Yuzingiz tekshirilmoqda…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Garnitura"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Kirish"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Eshitish apparatlari"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Yoqilmoqda…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Yorqinlik"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Avtomatik burilish"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Odatda bunday bildirishnomalarni yopasiz. \nUlar ochiq tursinmi?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Mazkur bildirishnomalar chiqaversinmi?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Chiqmasin"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Bloklash"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Ha"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Kichraytirish"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Ovozsiz"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Ovozsiz qolsin"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Ogohlantirish"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Signal berishda davom etilsin"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Bu ilovadan keladigan bildirishnomalar chiqaversinmi?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Bu bildirishnomalarni chiqmaydigan qilish imkonsiz"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"<xliff:g id="APP_NAME">%1$s</xliff:g> orqali"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Sozlamalar"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ta ilova</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ta ilova</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> ishlatmoqda: <xliff:g id="TYPES_LIST">%2$s</xliff:g>."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Ilovalarda ishlatilmoqda: <xliff:g id="TYPES_LIST">%s</xliff:g>."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Bekor qilish"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ta ilova <xliff:g id="TYPE_5">%2$s</xliff:g> ishlatmoqda.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ta ilova <xliff:g id="TYPE_1">%2$s</xliff:g> ishlatmoqda.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Tafsilotlar"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"<xliff:g id="TYPES_LIST">%s</xliff:g> ishlatayotgan ilova"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Ilovalar <xliff:g id="TYPES_LIST">%s</xliff:g> ishlatmoqda"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 125eb727b903..d2b1384c2b69 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Cho phép gỡ lỗi USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Tệp tham chiếu khóa RSA của máy tính là:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Luôn cho phép từ máy tính này"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Tính năng gỡ lỗi USB không được phép"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Người dùng hiện đã đăng nhập vào thiết bị này không thể bật tính năng gỡ lỗi USB. Để sử dụng tính năng này, hãy chuyển sang người dùng chính."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"T.phóng để lấp đầy m.hình"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Giãn ra để lấp đầy m.hình"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Chụp ảnh màn hình"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Hủy"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Vùng thông báo trợ giúp"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Xác nhận"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Thử lại"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Chạm vào cảm biến vân tay"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Biểu tượng vân tay"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Đang tìm kiếm bạn…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Âm thanh"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Tai nghe"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Thiết bị đầu vào"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Thiết bị trợ thính"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Đang bật…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Độ sáng"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Tự động xoay"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Bạn thường bỏ qua những thông báo này. \nTiếp tục hiển thị thông báo?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Tiếp tục hiển thị các thông báo này?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Dừng thông báo"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Chặn"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Tiếp tục hiển thị"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Thu nhỏ"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Hiển thị không phát âm báo"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Tiếp tục chế độ im lặng"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Cảnh báo cho tôi"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Tiếp tục cảnh báo"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Tiếp tục hiển thị các thông báo từ ứng dụng này?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Không thể tắt các thông báo này"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"thông qua <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Cài đặt"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"OK"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"Trích xuất bộ nhớ SysUI"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> ứng dụng</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> ứng dụng</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g> đang dùng <xliff:g id="TYPES_LIST">%2$s</xliff:g> của bạn."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Các ứng dụng đang dùng <xliff:g id="TYPES_LIST">%s</xliff:g> của bạn."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Hủy"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> ứng dụng đang dùng <xliff:g id="TYPE_5">%2$s</xliff:g> của bạn.</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> ứng dụng đang dùng <xliff:g id="TYPE_1">%2$s</xliff:g> của bạn.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Xem chi tiết"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Ứng dụng đang sử dụng <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Các ứng dụng đang sử dụng <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index d6fd3d8927f1..b1eff03a76eb 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"允许 USB 调试吗?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"这台计算机的 RSA 密钥指纹如下:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"一律允许使用这台计算机进行调试"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"不允许使用 USB 调试功能"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"目前已登录此设备的用户无法开启 USB 调试功能。要使用此功能,请切换为主要用户的帐号。"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"缩放以填满屏幕"</string> <string name="compat_mode_off" msgid="4434467572461327898">"拉伸以填满屏幕"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"屏幕截图"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"取消"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"帮助消息区域"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"确认"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"重试"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"请触摸指纹传感器"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指纹图标"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在查找中…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"音频"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"耳机"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"输入"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"助听器"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"正在开启…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"亮度"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"自动旋转屏幕"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"您通常会关闭这些通知。\n是否继续显示通知?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"要继续显示这些通知吗?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"停止通知"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"屏蔽"</string> <string name="inline_keep_button" msgid="6665940297019018232">"继续显示"</string> <string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"显示通知但不发出提示音"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"显示通知但不发出提示音"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"提醒我"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"继续提醒"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"要继续显示来自此应用的通知吗?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"无法关闭这些通知"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"通过<xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"设置"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"知道了"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"转储 SysUI 堆"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> 个应用</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> 个应用</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"<xliff:g id="APP">%1$s</xliff:g>正在使用您的<xliff:g id="TYPES_LIST">%2$s</xliff:g>。"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"有多个应用正在使用您的<xliff:g id="TYPES_LIST">%s</xliff:g>。"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"取消"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> 个应用正在使用您的<xliff:g id="TYPE_5">%2$s</xliff:g>。</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%1$d</xliff:g> 个应用正在使用您的<xliff:g id="TYPE_1">%2$s</xliff:g>。</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"查看详情"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"正在使用您的<xliff:g id="TYPES_LIST">%s</xliff:g>的应用"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"正在使用您的<xliff:g id="TYPES_LIST">%s</xliff:g>的应用"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 5c2a5d271071..64f4e218b78a 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"允許 USB 除錯嗎?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"這部電腦的 RSA 密鑰指紋如下:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"一律允許透過這部電腦進行"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"不允許 USB 偵錯"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"目前登入此裝置的使用者無法啟用 USB 偵錯功能。如要使用此功能,請切換至主要使用者。"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"放大為全螢幕"</string> <string name="compat_mode_off" msgid="4434467572461327898">"放大為全螢幕"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"擷取螢幕畫面"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"取消"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"說明訊息區域"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"請再試一次"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"請輕觸指紋感應器"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在搜尋您的臉孔…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"音訊"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"耳機"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"輸入"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"助聽器"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"正在開啟…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"亮度"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"自動旋轉"</string> @@ -307,7 +311,7 @@ <string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"直向"</string> <string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"橫向"</string> <string name="quick_settings_ime_label" msgid="7073463064369468429">"輸入法"</string> - <string name="quick_settings_location_label" msgid="5011327048748762257">"位置資訊"</string> + <string name="quick_settings_location_label" msgid="5011327048748762257">"定位"</string> <string name="quick_settings_location_off_label" msgid="7464544086507331459">"位置資訊已關閉"</string> <string name="quick_settings_media_device_label" msgid="1302906836372603762">"媒體裝置"</string> <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"您通常會關閉這些通知。\n要繼續顯示通知嗎?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"要繼續顯示這些通知嗎?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"停止通知"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"封鎖"</string> <string name="inline_keep_button" msgid="6665940297019018232">"繼續顯示"</string> <string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"顯示通知但不發出音效"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"保持靜音"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"提示我"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"繼續提示"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"要繼續顯示此應用程式的通知嗎?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"無法關閉這些通知"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"透過「<xliff:g id="APP_NAME">%1$s</xliff:g>」"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"設定"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"知道了"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"傾印 SysUI 記憶體快照"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> 個應用程式</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> 個應用程式</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"「<xliff:g id="APP">%1$s</xliff:g>」正在使用<xliff:g id="TYPES_LIST">%2$s</xliff:g>。"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"有多個應用程式正在使用<xliff:g id="TYPES_LIST">%s</xliff:g>。"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"取消"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other">有 <xliff:g id="NUM_APPS_4">%1$d</xliff:g> 個應用程式正在使用您的<xliff:g id="TYPE_5">%2$s</xliff:g>。</item> + <item quantity="one">有 <xliff:g id="NUM_APPS_0">%1$d</xliff:g> 個應用程式正在使用您的<xliff:g id="TYPE_1">%2$s</xliff:g>。</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"查看詳情"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"使用<xliff:g id="TYPES_LIST">%s</xliff:g>的應用程式"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"使用<xliff:g id="TYPES_LIST">%s</xliff:g>的應用程式"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index dbe24bb33bd6..bd1896a025ef 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"允許 USB 偵錯嗎?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"這台電腦的 RSA 金鑰指紋如下:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"一律允許透過這台電腦進行"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"無權使用 USB 偵錯功能"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"目前登入這個裝置的使用者無法啟用 USB 偵錯功能。如要使用這項功能,請切換到主要使用者。"</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"放大為全螢幕"</string> <string name="compat_mode_off" msgid="4434467572461327898">"放大為全螢幕"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"擷取螢幕畫面"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"取消"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"說明訊息區域"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"確認"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"再試一次"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"請輕觸指紋感應器"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"正在尋找你的臉孔…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"音訊"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"耳機"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"輸入"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"助聽器"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"開啟中…"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"亮度"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"自動旋轉"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"你通常會關閉這些通知。\n要繼續顯示通知嗎?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"要繼續顯示這些通知嗎?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"停止顯示通知"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"封鎖"</string> <string name="inline_keep_button" msgid="6665940297019018232">"繼續顯示"</string> <string name="inline_minimize_button" msgid="966233327974702195">"最小化"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"顯示通知但不發出音效"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"繼續顯示通知但不發出音效"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"顯示通知"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"繼續顯示通知"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"要繼續顯示這個應用程式的通知嗎?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"無法關閉這些通知"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"透過「<xliff:g id="APP_NAME">%1$s</xliff:g>」"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"設定"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"我知道了"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"傾印 SysUI 記憶體快照"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> 個應用程式</item> + <item quantity="one"><xliff:g id="NUM_APPS_0">%d</xliff:g> 個應用程式</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"「<xliff:g id="APP">%1$s</xliff:g>」正在使用<xliff:g id="TYPES_LIST">%2$s</xliff:g>。"</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"有多個應用程式正在使用<xliff:g id="TYPES_LIST">%s</xliff:g>。"</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"取消"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="other">有 <xliff:g id="NUM_APPS_4">%1$d</xliff:g> 個應用程式正在使用你的<xliff:g id="TYPE_5">%2$s</xliff:g>。</item> + <item quantity="one">有 <xliff:g id="NUM_APPS_0">%1$d</xliff:g> 個應用程式正在使用你的<xliff:g id="TYPE_1">%2$s</xliff:g>。</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"查看詳細資料"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"使用<xliff:g id="TYPES_LIST">%s</xliff:g>的應用程式"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"使用<xliff:g id="TYPES_LIST">%s</xliff:g>的應用程式"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 098ed0167c70..9f704209cec6 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -57,8 +57,14 @@ <string name="usb_debugging_title" msgid="4513918393387141949">"Vumela ukulungisa iphutha le-USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"Izigxivizo zeminwe zokhiye we-RSA wekhompyutha ngu:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Hlala uvumela njalo kusuka kule khompyutha"</string> + <!-- no translation found for usb_debugging_allow (2272145052073254852) --> + <skip /> <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Ukususa iphutha kwe-USB akuvunyelwe"</string> <string name="usb_debugging_secondary_user_message" msgid="6067122453571699801">"Umsebenzisi manje ongene ngemvume kule divayisi entsha akakwazi ukuvula ukulungisa amaphutha ku-USB. Ukuze usebenzise lesi sici, shintshela kumsebenzisi oyinhloko."</string> + <!-- no translation found for usb_contaminant_title (206854874263058490) --> + <skip /> + <!-- no translation found for usb_contaminant_message (2205845572186473860) --> + <skip /> <string name="compat_mode_on" msgid="6623839244840638213">"Sondeza ukugcwalisa isikrini"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Nweba ukugcwalisa isikrini"</string> <string name="global_action_screenshot" msgid="8329831278085426283">"Isithombe-skrini"</string> @@ -112,8 +118,7 @@ <string name="cancel" msgid="6442560571259935130">"Khansela"</string> <string name="accessibility_biometric_dialog_help_area" msgid="8953787076940186847">"Indawo yosizo lomlayezo"</string> <string name="biometric_dialog_confirm" msgid="6468457350041712674">"Qinisekisa"</string> - <!-- no translation found for biometric_dialog_try_again (1900185172633183201) --> - <skip /> + <string name="biometric_dialog_try_again" msgid="1900185172633183201">"Zama futhi"</string> <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Thinta inzwa yesigxivizo somunwe"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Isithonjana sezigxivizo zeminwe"</string> <string name="face_dialog_looking_for_face" msgid="7049276266074494689">"Kufunwa wena…"</string> @@ -296,8 +301,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Umsindo"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Ihedisethi"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Okokufaka"</string> - <!-- no translation found for quick_settings_bluetooth_secondary_label_hearing_aids (4930931771490695395) --> - <skip /> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="4930931771490695395">"Izinsiza zokuzwa"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="4551281899312150640">"Iyavula..."</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ukugqama"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Ukuphenduka okuzenzakalelayo"</string> @@ -611,17 +615,13 @@ <string name="inline_blocking_helper" msgid="3055064577771478591">"Uvamise ukucashisa lezi zaziso. \nQhubeka ulokhu uzibonisa?"</string> <string name="inline_keep_showing" msgid="8945102997083836858">"Qhubeka nokubonisa lezi zaziso?"</string> <string name="inline_stop_button" msgid="4172980096860941033">"Misa izaziso"</string> - <!-- no translation found for inline_block_button (8735843688021655065) --> - <skip /> + <string name="inline_block_button" msgid="8735843688021655065">"Vimba"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Qhubeka nokubonisa"</string> <string name="inline_minimize_button" msgid="966233327974702195">"Nciphisa"</string> <string name="inline_silent_button_silent" msgid="4411510650503783646">"Bonisa ngokuthulile"</string> - <!-- no translation found for inline_silent_button_stay_silent (6308371431217601009) --> - <skip /> - <!-- no translation found for inline_silent_button_alert (7961887853830826523) --> - <skip /> - <!-- no translation found for inline_silent_button_keep_alerting (327696842264359693) --> - <skip /> + <string name="inline_silent_button_stay_silent" msgid="6308371431217601009">"Hlala uthulile"</string> + <string name="inline_silent_button_alert" msgid="7961887853830826523">"Ngazise"</string> + <string name="inline_silent_button_keep_alerting" msgid="327696842264359693">"Qhubeka wazise"</string> <string name="inline_keep_showing_app" msgid="1723113469580031041">"Qhubeka nokubonisa izaziso kusuka kulolu hlelo lokusebenza?"</string> <string name="notification_unblockable_desc" msgid="1037434112919403708">"Lezi zaziso azikwazi ukuvalwa"</string> <string name="notification_delegate_header" msgid="9167022191405284627">"nge-<xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -871,11 +871,18 @@ <string name="open_saver_setting_action" msgid="8314624730997322529">"Izilungiselelo"</string> <string name="auto_saver_okay_action" msgid="2701221740227683650">"Ngiyezwa"</string> <string name="heap_dump_tile_name" msgid="9141031328971226374">"I-Dump SysUI Heap"</string> - <!-- no translation found for ongoing_privacy_chip_multiple_apps (1406406529558080714) --> + <plurals name="ongoing_privacy_chip_multiple_apps" formatted="false" msgid="1406406529558080714"> + <item quantity="one"><xliff:g id="NUM_APPS_2">%d</xliff:g> izinhlelo zokusebenza</item> + <item quantity="other"><xliff:g id="NUM_APPS_2">%d</xliff:g> izinhlelo zokusebenza</item> + </plurals> <string name="ongoing_privacy_chip_content_single_app" msgid="4479560741898690064">"I-<xliff:g id="APP">%1$s</xliff:g> isebenzisa i-<xliff:g id="TYPES_LIST">%2$s</xliff:g> yakho."</string> <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8640691753867990511">"Izinhlelo zokusebenza zisebenzisa i-<xliff:g id="TYPES_LIST">%s</xliff:g> yakho."</string> - <!-- no translation found for ongoing_privacy_chip_content_multiple_apps_single_op (4871926099254314088) --> - <string name="ongoing_privacy_dialog_cancel" msgid="5479124524931216790">"Khansela"</string> + <plurals name="ongoing_privacy_chip_content_multiple_apps_single_op" formatted="false" msgid="4871926099254314088"> + <item quantity="one"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> izinhlelo zokusebenza zisebenzisa i-<xliff:g id="TYPE_5">%2$s</xliff:g> yakho.</item> + <item quantity="other"><xliff:g id="NUM_APPS_4">%1$d</xliff:g> izinhlelo zokusebenza zisebenzisa i-<xliff:g id="TYPE_5">%2$s</xliff:g> yakho.</item> + </plurals> + <!-- no translation found for ongoing_privacy_dialog_ok (3273300106348958308) --> + <skip /> <string name="ongoing_privacy_dialog_open_settings" msgid="2074844974365194279">"Buka imininingwane"</string> <string name="ongoing_privacy_dialog_single_app_title" msgid="6019646962021696632">"Uhlelo lokusebenza olusebenzisa i-<xliff:g id="TYPES_LIST">%s</xliff:g> yakho"</string> <string name="ongoing_privacy_dialog_multiple_apps_title" msgid="8013356222977903365">"Izinhlelo zokusebenza ezisebenzisa i-<xliff:g id="TYPES_LIST">%s</xliff:g> yakho"</string> diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java index 2aecc24e83c0..50409421a68b 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java @@ -19,8 +19,11 @@ package com.android.systemui; import static android.view.Display.DEFAULT_DISPLAY; import android.app.WallpaperManager; +import android.content.BroadcastReceiver; import android.content.ComponentCallbacks2; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.RecordingCanvas; @@ -28,7 +31,9 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region.Op; import android.hardware.display.DisplayManager; +import android.opengl.GLSurfaceView; import android.os.AsyncTask; +import android.os.Build; import android.os.Handler; import android.os.Trace; import android.service.wallpaper.WallpaperService; @@ -39,6 +44,7 @@ import android.view.Surface; import android.view.SurfaceHolder; import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.glwallpaper.ImageWallpaperRenderer; import java.io.FileDescriptor; import java.io.IOException; @@ -51,12 +57,17 @@ import java.io.PrintWriter; public class ImageWallpaper extends WallpaperService { private static final String TAG = "ImageWallpaper"; private static final String GL_LOG_TAG = "ImageWallpaperGL"; + // TODO: Testing purpose, need to remove later, b/123616712. + private static final String SENSOR_EVENT_AWAKE = "systemui.test.event.awake"; + // TODO: Testing purpose, need to remove later, b/123616712. + private static final String SENSOR_EVENT_SLEEP = "systemui.test.event.sleep"; private static final boolean DEBUG = false; private static final String PROPERTY_KERNEL_QEMU = "ro.kernel.qemu"; private static final long DELAY_FORGET_WALLPAPER = 5000; private WallpaperManager mWallpaperManager; private DrawableEngine mEngine; + private GLEngine mGlEngine; @Override public void onCreate() { @@ -73,10 +84,112 @@ public class ImageWallpaper extends WallpaperService { @Override public Engine onCreateEngine() { - mEngine = new DrawableEngine(); - return mEngine; + mGlEngine = new GLEngine(this); + return mGlEngine; } + class GLEngine extends Engine { + private GLWallpaperSurfaceView mWallpaperSurfaceView; + + GLEngine(Context context) { + mWallpaperSurfaceView = new GLWallpaperSurfaceView(context); + mWallpaperSurfaceView.setRenderer( + new ImageWallpaperRenderer(context, mWallpaperSurfaceView)); + mWallpaperSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); + setOffsetNotificationsEnabled(true); + } + + @Override + public void onAmbientModeChanged(boolean inAmbientMode, long animationDuration) { + if (mWallpaperSurfaceView != null) { + mWallpaperSurfaceView.notifyAmbientModeChanged(inAmbientMode); + } + } + + @Override + public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, + float yOffsetStep, int xPixelOffset, int yPixelOffset) { + if (mWallpaperSurfaceView != null) { + mWallpaperSurfaceView.notifyOffsetsChanged(xOffset, yOffset); + } + } + + private class GLWallpaperSurfaceView extends GLSurfaceView implements ImageGLView { + private SensorEventListener mEventListener; + private WallpaperStatusListener mWallpaperChangedListener; + + // TODO: Testing purpose, need to remove later, b/123616712. + /** + * For testing only: adb shell am broadcast -a <INTENT> + */ + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent == null) { + return; + } + switch (intent.getAction()) { + case SENSOR_EVENT_AWAKE: + notifySensorEvents(true); + break; + case SENSOR_EVENT_SLEEP: + notifySensorEvents(false); + break; + } + } + }; + + GLWallpaperSurfaceView(Context context) { + super(context); + setEGLContextClientVersion(2); + // TODO: Testing purpose, need to remove later, b/123616712. + if (Build.IS_DEBUGGABLE) { + IntentFilter filter = new IntentFilter(); + filter.addAction(SENSOR_EVENT_AWAKE); + filter.addAction(SENSOR_EVENT_SLEEP); + registerReceiver(mReceiver, filter); + } + } + + @Override + public SurfaceHolder getHolder() { + return getSurfaceHolder(); + } + + @Override + public void setRenderer(Renderer renderer) { + super.setRenderer(renderer); + mEventListener = (SensorEventListener) renderer; + mWallpaperChangedListener = (WallpaperStatusListener) renderer; + } + + private void notifySensorEvents(boolean reach) { + if (mEventListener != null) { + mEventListener.onSensorEvent(reach); + } + } + + private void notifyAmbientModeChanged(boolean inAmbient) { + if (mWallpaperChangedListener != null) { + mWallpaperChangedListener.onAmbientModeChanged(inAmbient); + } + } + + private void notifyOffsetsChanged(float xOffset, float yOffset) { + if (mWallpaperChangedListener != null) { + mWallpaperChangedListener.onOffsetsChanged( + xOffset, yOffset, getHolder().getSurfaceFrame()); + } + } + + @Override + public void render() { + requestRender(); + } + } + } + + // TODO: Remove this engine, tracking on b/123617158. class DrawableEngine extends Engine { private final Runnable mUnloadWallpaperCallback = () -> { unloadWallpaper(false /* forgetSize */); @@ -564,4 +677,46 @@ public class ImageWallpaper extends WallpaperService { } } } + + /** + * A listener to trace sensor event. + */ + public interface SensorEventListener { + + /** + * Called back while sensor event comes. + * @param reach The status of sensor. + */ + void onSensorEvent(boolean reach); + } + + /** + * A listener to trace status of image wallpaper. + */ + public interface WallpaperStatusListener { + + /** + * Called back while ambient mode changes. + * @param inAmbientMode true if is in ambient mode, false otherwise. + */ + void onAmbientModeChanged(boolean inAmbientMode); + + /** + * Called back while wallpaper offsets. + * @param xOffset The offset portion along x. + * @param yOffset The offset portion along y. + */ + void onOffsetsChanged(float xOffset, float yOffset, Rect frame); + } + + /** + * An abstraction for view of GLRenderer. + */ + public interface ImageGLView { + + /** + * Ask the view to render. + */ + void render(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java index f66a57b6133c..9b3d7ed8f045 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java @@ -137,8 +137,10 @@ public class SystemUIFactory { } public NotificationIconAreaController createNotificationIconAreaController(Context context, - StatusBar statusBar, StatusBarStateController statusBarStateController) { - return new NotificationIconAreaController(context, statusBar, statusBarStateController); + StatusBar statusBar, StatusBarStateController statusBarStateController, + NotificationListener listener) { + return new NotificationIconAreaController(context, statusBar, statusBarStateController, + listener); } public KeyguardIndicationController createKeyguardIndicationController(Context context, diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index 83fd9708e26a..8731bd52e0dd 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -238,14 +238,14 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F */ public void setExpandedBubble(BubbleView bubbleToExpand) { mExpandedBubble = bubbleToExpand; - boolean prevExpanded = mIsExpanded; - mIsExpanded = true; - if (!prevExpanded) { + if (!mIsExpanded) { // If we weren't previously expanded we should animate open. animateExpansion(true /* expand */); } else { - // If we were expanded just update the views + // Otherwise just update the views + // TODO: probably animate / page to expanded one updateExpandedBubble(); + updatePointerPosition(); requestUpdate(); } mExpandedBubble.getEntry().setShowInShadeWhenBubble(false); @@ -387,7 +387,6 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F mIsExpanded = shouldExpand; updateExpandedBubble(); applyCurrentState(); - //requestUpdate(); mIsAnimating = true; @@ -400,7 +399,10 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F if (shouldExpand) { mBubbleContainer.setController(mExpandedAnimationController); mExpandedAnimationController.expandFromStack( - mStackAnimationController.getStackPosition(), updateAfter); + mStackAnimationController.getStackPosition(), () -> { + updatePointerPosition(); + updateAfter.run(); + }); } else { mBubbleContainer.cancelAllAnimations(); mExpandedAnimationController.collapseBackToStack( @@ -649,10 +651,7 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F } // Bubble with notification as expanded state doesn't need a header / title mExpandedViewContainer.setHeaderText(null); - } - float pointerPosition = mExpandedBubble.getPosition().x + (mExpandedBubble.getWidth() / 2); - mExpandedViewContainer.setPointerPosition((int) pointerPosition); } private void applyCurrentState() { @@ -690,6 +689,14 @@ public class BubbleStackView extends FrameLayout implements BubbleTouchHandler.F } } + private void updatePointerPosition() { + if (mExpandedBubble != null) { + float pointerPosition = mExpandedBubble.getPosition().x + + (mExpandedBubble.getWidth() / 2f); + mExpandedViewContainer.setPointerPosition((int) pointerPosition); + } + } + private void applyRowState(ExpandableNotificationRow view) { view.reset(); view.setHeadsUp(false); diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLProgram.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLProgram.java new file mode 100644 index 000000000000..d03b00bcfc85 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLProgram.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2019 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.glwallpaper; + +import static android.opengl.GLES20.GL_FRAGMENT_SHADER; +import static android.opengl.GLES20.GL_VERTEX_SHADER; +import static android.opengl.GLES20.glAttachShader; +import static android.opengl.GLES20.glCompileShader; +import static android.opengl.GLES20.glCreateProgram; +import static android.opengl.GLES20.glCreateShader; +import static android.opengl.GLES20.glGetAttribLocation; +import static android.opengl.GLES20.glGetUniformLocation; +import static android.opengl.GLES20.glLinkProgram; +import static android.opengl.GLES20.glShaderSource; +import static android.opengl.GLES20.glUseProgram; + +import android.content.Context; +import android.content.res.Resources; +import android.util.Log; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * This class takes charge of linking shader codes and then return a handle for OpenGL ES program. + */ +class ImageGLProgram { + private static final String TAG = ImageGLProgram.class.getSimpleName(); + + private Context mContext; + private int mProgramHandle; + + ImageGLProgram(Context context) { + mContext = context.getApplicationContext(); + } + + private int loadShaderProgram(int vertexId, int fragmentId) { + final String vertexSrc = getShaderResource(vertexId); + final String fragmentSrc = getShaderResource(fragmentId); + final int vertexHandle = getShaderHandle(GL_VERTEX_SHADER, vertexSrc); + final int fragmentHandle = getShaderHandle(GL_FRAGMENT_SHADER, fragmentSrc); + return getProgramHandle(vertexHandle, fragmentHandle); + } + + private String getShaderResource(int shaderId) { + Resources res = mContext.getResources(); + StringBuilder code = new StringBuilder(); + + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(res.openRawResource(shaderId)))) { + String nextLine; + while ((nextLine = reader.readLine()) != null) { + code.append(nextLine).append("\n"); + } + } catch (IOException | Resources.NotFoundException ex) { + Log.d(TAG, "Can not read the shader source", ex); + code = null; + } + + return code == null ? "" : code.toString(); + } + + private int getShaderHandle(int type, String src) { + final int shader = glCreateShader(type); + if (shader == 0) { + Log.d(TAG, "Create shader failed, type=" + type); + return 0; + } + glShaderSource(shader, src); + glCompileShader(shader); + return shader; + } + + private int getProgramHandle(int vertexHandle, int fragmentHandle) { + final int program = glCreateProgram(); + if (program == 0) { + Log.d(TAG, "Can not create OpenGL ES program"); + return 0; + } + + glAttachShader(program, vertexHandle); + glAttachShader(program, fragmentHandle); + glLinkProgram(program); + return program; + } + + boolean useGLProgram(int vertexResId, int fragmentResId) { + mProgramHandle = loadShaderProgram(vertexResId, fragmentResId); + glUseProgram(mProgramHandle); + return true; + } + + int getAttributeHandle(String name) { + return glGetAttribLocation(mProgramHandle, name); + } + + int getUniformHandle(String name) { + return glGetUniformLocation(mProgramHandle, name); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java new file mode 100644 index 000000000000..4e07872c9456 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageGLWallpaper.java @@ -0,0 +1,245 @@ +/* + * Copyright (C) 2019 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.glwallpaper; + +import static android.opengl.GLES20.GL_FLOAT; +import static android.opengl.GLES20.GL_LINEAR; +import static android.opengl.GLES20.GL_TEXTURE0; +import static android.opengl.GLES20.GL_TEXTURE_2D; +import static android.opengl.GLES20.GL_TEXTURE_MAG_FILTER; +import static android.opengl.GLES20.GL_TEXTURE_MIN_FILTER; +import static android.opengl.GLES20.GL_TRIANGLES; +import static android.opengl.GLES20.glActiveTexture; +import static android.opengl.GLES20.glBindTexture; +import static android.opengl.GLES20.glDrawArrays; +import static android.opengl.GLES20.glEnableVertexAttribArray; +import static android.opengl.GLES20.glGenTextures; +import static android.opengl.GLES20.glTexParameteri; +import static android.opengl.GLES20.glUniform1i; +import static android.opengl.GLES20.glVertexAttribPointer; + +import android.graphics.Bitmap; +import android.opengl.GLUtils; +import android.util.Log; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +/** + * This class takes charge of the geometry data like vertices and texture coordinates. + * It delivers these data to opengl runtime and triggers draw calls if necessary. + */ +class ImageGLWallpaper { + private static final String TAG = ImageGLWallpaper.class.getSimpleName(); + + static final String A_POSITION = "aPosition"; + static final String A_TEXTURE_COORDINATES = "aTextureCoordinates"; + static final String U_CENTER_REVEAL = "uCenterReveal"; + static final String U_REVEAL = "uReveal"; + static final String U_AOD2OPACITY = "uAod2Opacity"; + static final String U_TEXTURE = "uTexture"; + static final String U_AOD_MODE = "uAodMode"; + + private static final int HANDLE_UNDEFINED = -1; + private static final int POSITION_COMPONENT_COUNT = 2; + private static final int TEXTURE_COMPONENT_COUNT = 2; + private static final int BYTES_PER_FLOAT = 4; + + // Vertices to define the square with 2 triangles. + private static final float[] VERTICES = { + -1.0f, -1.0f, + +1.0f, -1.0f, + +1.0f, +1.0f, + +1.0f, +1.0f, + -1.0f, +1.0f, + -1.0f, -1.0f + }; + + // Texture coordinates that maps to vertices. + private static final float[] TEXTURES = { + 0f, 1f, + 1f, 1f, + 1f, 0f, + 1f, 0f, + 0f, 0f, + 0f, 1f + }; + + private final FloatBuffer mVertexBuffer; + private final FloatBuffer mTextureBuffer; + private final ImageGLProgram mProgram; + + private int mAttrPosition; + private int mAttrTextureCoordinates; + private int mUniAod2Opacity; + private int mUniAodMode; + private int mUniCenterReveal; + private int mUniReveal; + private int mUniTexture; + private int mTextureId; + + ImageGLWallpaper(ImageGLProgram program) { + mProgram = program; + + // Create an float array in opengles runtime (native) and put vertex data. + mVertexBuffer = ByteBuffer.allocateDirect(VERTICES.length * BYTES_PER_FLOAT) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + mVertexBuffer.put(VERTICES); + mVertexBuffer.position(0); + + // Create an float array in opengles runtime (native) and put texture data. + mTextureBuffer = ByteBuffer.allocateDirect(TEXTURES.length * BYTES_PER_FLOAT) + .order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + mTextureBuffer.put(TEXTURES); + mTextureBuffer.position(0); + } + + void setup() { + setupAttributes(); + setupUniforms(); + } + + private void setupAttributes() { + mAttrPosition = mProgram.getAttributeHandle(A_POSITION); + mVertexBuffer.position(0); + glVertexAttribPointer(mAttrPosition, POSITION_COMPONENT_COUNT, GL_FLOAT, + false, 0, mVertexBuffer); + glEnableVertexAttribArray(mAttrPosition); + + mAttrTextureCoordinates = mProgram.getAttributeHandle(A_TEXTURE_COORDINATES); + mTextureBuffer.position(0); + glVertexAttribPointer(mAttrTextureCoordinates, TEXTURE_COMPONENT_COUNT, GL_FLOAT, + false, 0, mTextureBuffer); + glEnableVertexAttribArray(mAttrTextureCoordinates); + } + + private void setupUniforms() { + mUniAod2Opacity = mProgram.getUniformHandle(U_AOD2OPACITY); + mUniAodMode = mProgram.getUniformHandle(U_AOD_MODE); + mUniCenterReveal = mProgram.getUniformHandle(U_CENTER_REVEAL); + mUniReveal = mProgram.getUniformHandle(U_REVEAL); + mUniTexture = mProgram.getUniformHandle(U_TEXTURE); + } + + int getHandle(String name) { + switch (name) { + case A_POSITION: + return mAttrPosition; + case A_TEXTURE_COORDINATES: + return mAttrTextureCoordinates; + case U_AOD2OPACITY: + return mUniAod2Opacity; + case U_AOD_MODE: + return mUniAodMode; + case U_CENTER_REVEAL: + return mUniCenterReveal; + case U_REVEAL: + return mUniReveal; + case U_TEXTURE: + return mUniTexture; + default: + return HANDLE_UNDEFINED; + } + } + + void draw() { + glDrawArrays(GL_TRIANGLES, 0, VERTICES.length / 2); + } + + void setupTexture(Bitmap bitmap) { + final int[] tids = new int[1]; + + if (bitmap == null) { + Log.w(TAG, "setupTexture: invalid bitmap"); + return; + } + + // Generate one texture object and store the id in tids[0]. + glGenTextures(1, tids, 0); + if (tids[0] == 0) { + Log.w(TAG, "setupTexture: glGenTextures() failed"); + return; + } + + // Bind a named texture to a texturing target. + glBindTexture(GL_TEXTURE_2D, tids[0]); + // Load the bitmap data and copy it over into the texture object that is currently bound. + GLUtils.texImage2D(GL_TEXTURE_2D, 0, bitmap, 0); + // Use bilinear texture filtering when minification. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + // Use bilinear texture filtering when magnification. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + mTextureId = tids[0]; + } + + void useTexture() { + // Set the active texture unit to texture unit 0. + glActiveTexture(GL_TEXTURE0); + // Bind the texture to this unit. + glBindTexture(GL_TEXTURE_2D, mTextureId); + // Let the texture sampler in fragment shader to read form this texture unit. + glUniform1i(mUniTexture, 0); + } + + void adjustTextureCoordinates(Bitmap bitmap, int surfaceWidth, int surfaceHeight, + float xOffset, float yOffset) { + if (bitmap == null) { + Log.d(TAG, "adjustTextureCoordinates: invalid bitmap"); + return; + } + + float ratioW = 1f; + float ratioH = 1f; + int bitmapWidth = bitmap.getWidth(); + int bitmapHeight = bitmap.getHeight(); + + boolean adjustWidth = bitmapWidth > surfaceWidth; + if (adjustWidth) { + ratioW = (float) surfaceWidth / bitmapWidth; + float referenceX = xOffset + ratioW > 1f ? 1f - ratioW : xOffset; + for (int i = 0; i < TEXTURES.length; i += 2) { + if (i == 2 || i == 4 || i == 6) { + TEXTURES[i] = Math.min(1f, referenceX + ratioW); + } else { + TEXTURES[i] = referenceX; + } + } + } + + boolean adjustHeight = bitmapHeight > surfaceHeight; + if (adjustHeight) { + ratioH = (float) surfaceHeight / bitmapHeight; + float referenceY = yOffset + ratioH > 1f ? 1f - ratioH : yOffset; + for (int i = 1; i < TEXTURES.length; i += 2) { + if (i == 1 || i == 3 || i == 11) { + TEXTURES[i] = Math.min(1f, referenceY + ratioH); + } else { + TEXTURES[i] = referenceY; + } + } + } + + if (adjustWidth || adjustHeight) { + mTextureBuffer.put(TEXTURES); + mTextureBuffer.position(0); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java new file mode 100644 index 000000000000..477e7d7ebf72 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageProcessHelper.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2019 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.glwallpaper; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorMatrix; +import android.graphics.ColorMatrixColorFilter; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.os.AsyncTask; +import android.os.Handler; +import android.os.Handler.Callback; +import android.os.Message; +import android.util.Log; + +/** + * A helper class that computes histogram and percentile 85 from a bitmap. + * Percentile 85 will be computed each time the user picks a new image wallpaper. + */ +class ImageProcessHelper { + private static final String TAG = ImageProcessHelper.class.getSimpleName(); + private static final float DEFAULT_PER85 = 0.8f; + private static final int MSG_UPDATE_PER85 = 1; + + /** + * This color matrix will be applied to each pixel to get luminance from rgb by below formula: + * Luminance = .2126f * r + .7152f * g + .0722f * b. + */ + private static final float[] LUMINOSITY_MATRIX = new float[] { + .2126f, .0000f, .0000f, .0000f, .0000f, + .0000f, .7152f, .0000f, .0000f, .0000f, + .0000f, .0000f, .0722f, .0000f, .0000f, + .0000f, .0000f, .0000f, 1.000f, .0000f + }; + + private final Handler mHandler = new Handler(new Callback() { + @Override + public boolean handleMessage(Message msg) { + switch (msg.what) { + case MSG_UPDATE_PER85: + mPer85 = (float) msg.obj; + return true; + default: + return false; + } + } + }); + + private float mPer85 = DEFAULT_PER85; + + void startComputingPercentile85(Bitmap bitmap) { + new Per85ComputeTask(mHandler).execute(bitmap); + } + + float getPercentile85() { + return mPer85; + } + + private static class Per85ComputeTask extends AsyncTask<Bitmap, Void, Float> { + private Handler mUpdateHandler; + + Per85ComputeTask(Handler handler) { + super(handler); + mUpdateHandler = handler; + } + + @Override + protected Float doInBackground(Bitmap... bitmaps) { + Bitmap bitmap = bitmaps[0]; + if (bitmap != null) { + int[] histogram = processHistogram(bitmap); + return computePercentile85(bitmap, histogram); + } + Log.e(TAG, "Per85ComputeTask: Can't get bitmap"); + return DEFAULT_PER85; + } + + @Override + protected void onPostExecute(Float result) { + Message msg = mUpdateHandler.obtainMessage(MSG_UPDATE_PER85, result); + mUpdateHandler.sendMessage(msg); + } + + private int[] processHistogram(Bitmap bitmap) { + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + + Bitmap target = Bitmap.createBitmap(width, height, bitmap.getConfig()); + Canvas canvas = new Canvas(target); + ColorMatrix cm = new ColorMatrix(LUMINOSITY_MATRIX); + Paint paint = new Paint(); + paint.setColorFilter(new ColorMatrixColorFilter(cm)); + canvas.drawBitmap(bitmap, new Matrix(), paint); + + // TODO: Fine tune the performance here, tracking on b/123615079. + int[] histogram = new int[256]; + for (int row = 0; row < height; row++) { + for (int col = 0; col < width; col++) { + int pixel = target.getPixel(col, row); + int y = Color.red(pixel) + Color.green(pixel) + Color.blue(pixel); + histogram[y]++; + } + } + + return histogram; + } + + private float computePercentile85(Bitmap bitmap, int[] histogram) { + float per85 = DEFAULT_PER85; + int pixelCount = bitmap.getWidth() * bitmap.getHeight(); + float[] acc = new float[256]; + for (int i = 0; i < acc.length; i++) { + acc[i] = (float) histogram[i] / pixelCount; + float prev = i == 0 ? 0f : acc[i - 1]; + float next = acc[i]; + float idx = (float) (i + 1) / 255; + float sum = prev + next; + if (prev < 0.85f && sum >= 0.85f) { + per85 = idx; + } + if (i > 0) { + acc[i] += acc[i - 1]; + } + } + return per85; + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java new file mode 100644 index 000000000000..787972c08e4a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageRevealHelper.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2019 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.glwallpaper; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; + +import com.android.systemui.Interpolators; + +/** + * Use ValueAnimator and appropriate interpolator to control the progress of reveal transition. + * The transition will happen while getting awake and quit events. + */ +class ImageRevealHelper { + private static final String TAG = ImageRevealHelper.class.getSimpleName(); + private static final float MAX_REVEAL = 0f; + private static final float MIN_REVEAL = 1f; + private static final int REVEAL_DURATION = 1000; + + private final ValueAnimator mAnimator; + private final RevealStateListener mRevealListener; + private float mReveal = MIN_REVEAL; + private boolean mAwake = false; + + ImageRevealHelper(RevealStateListener listener) { + mRevealListener = listener; + mAnimator = ValueAnimator.ofFloat(); + mAnimator.setDuration(REVEAL_DURATION); + mAnimator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); + mAnimator.addUpdateListener(animator -> { + mReveal = (float) animator.getAnimatedValue(); + if (mRevealListener != null) { + mRevealListener.onRevealStateChanged(); + } + }); + mAnimator.addListener(new AnimatorListenerAdapter() { + private boolean mIsCanceled; + + @Override + public void onAnimationCancel(Animator animation) { + mIsCanceled = true; + } + + @Override + public void onAnimationEnd(Animator animation) { + if (!mIsCanceled) { + mAwake = !mAwake; + } + mIsCanceled = false; + } + }); + } + + private void animate() { + mAnimator.cancel(); + mAnimator.setFloatValues(mReveal, !mAwake ? MIN_REVEAL : MAX_REVEAL); + mAnimator.start(); + } + + public float getReveal() { + return mReveal; + } + + public boolean isAwake() { + return mAwake; + } + + void updateAwake(boolean awake) { + mAwake = awake; + animate(); + } + + void sleep() { + mReveal = MIN_REVEAL; + mAwake = false; + } + + /** + * A listener to trace value changes of reveal. + */ + public interface RevealStateListener { + + /** + * Called back while reveal status changes. + */ + void onRevealStateChanged(); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java new file mode 100644 index 000000000000..8916b28f201a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/glwallpaper/ImageWallpaperRenderer.java @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2019 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.glwallpaper; + +import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT; +import static android.opengl.GLES20.glClear; +import static android.opengl.GLES20.glClearColor; +import static android.opengl.GLES20.glUniform1f; +import static android.opengl.GLES20.glUniform1i; +import static android.opengl.GLES20.glViewport; + +import android.app.WallpaperManager; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Rect; +import android.opengl.GLSurfaceView; +import android.util.Log; + +import com.android.systemui.ImageWallpaper; +import com.android.systemui.ImageWallpaper.ImageGLView; +import com.android.systemui.R; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +/** + * A GL renderer for image wallpaper. + */ +public class ImageWallpaperRenderer implements GLSurfaceView.Renderer, + ImageWallpaper.SensorEventListener, ImageWallpaper.WallpaperStatusListener, + ImageRevealHelper.RevealStateListener { + private static final String TAG = ImageWallpaperRenderer.class.getSimpleName(); + + private final WallpaperManager mWallpaperManager; + private final ImageGLProgram mProgram; + private final ImageGLWallpaper mWallpaper; + private final ImageProcessHelper mImageProcessHelper; + private final ImageRevealHelper mImageRevealHelper; + private final ImageGLView mGLView; + private boolean mIsInAmbientMode; + private float mXOffset = 0f; + private float mYOffset = 0f; + + public ImageWallpaperRenderer(Context context, ImageGLView glView) { + mWallpaperManager = context.getSystemService(WallpaperManager.class); + if (mWallpaperManager == null) { + Log.w(TAG, "WallpaperManager not available"); + } + + mProgram = new ImageGLProgram(context); + mWallpaper = new ImageGLWallpaper(mProgram); + mImageProcessHelper = new ImageProcessHelper(); + mImageRevealHelper = new ImageRevealHelper(this); + mGLView = glView; + + if (mWallpaperManager != null) { + // Compute per85 as transition threshold, this is an async work. + mImageProcessHelper.startComputingPercentile85(mWallpaperManager.getBitmap()); + } + } + + @Override + public void onSurfaceCreated(GL10 gl, EGLConfig config) { + glClearColor(0f, 0f, 0f, 1.0f); + mProgram.useGLProgram( + R.raw.image_wallpaper_vertex_shader, R.raw.image_wallpaper_fragment_shader); + mWallpaper.setup(); + mWallpaper.setupTexture(mWallpaperManager.getBitmap()); + } + + @Override + public void onSurfaceChanged(GL10 gl, int width, int height) { + glViewport(0, 0, width, height); + mWallpaper.adjustTextureCoordinates(mWallpaperManager.getBitmap(), + width, height, mXOffset, mYOffset); + } + + @Override + public void onDrawFrame(GL10 gl) { + float threshold = mImageProcessHelper.getPercentile85(); + float reveal = mImageRevealHelper.getReveal(); + + glClear(GL_COLOR_BUFFER_BIT); + + glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_AOD2OPACITY), .25f); + glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_CENTER_REVEAL), threshold); + glUniform1f(mWallpaper.getHandle(ImageGLWallpaper.U_REVEAL), reveal); + glUniform1i(mWallpaper.getHandle(ImageGLWallpaper.U_AOD_MODE), mIsInAmbientMode ? 1 : 0); + + mWallpaper.useTexture(); + mWallpaper.draw(); + } + + @Override + public void onSensorEvent(boolean awake) { + mImageRevealHelper.updateAwake(awake); + } + + @Override + public void onAmbientModeChanged(boolean inAmbientMode) { + mIsInAmbientMode = inAmbientMode; + if (inAmbientMode) { + mImageRevealHelper.sleep(); + } + requestRender(); + } + + @Override + public void onOffsetsChanged(float xOffset, float yOffset, Rect frame) { + if (frame == null || mWallpaperManager == null + || (xOffset == mXOffset && yOffset == mYOffset)) { + return; + } + + Bitmap bitmap = mWallpaperManager.getBitmap(); + if (bitmap == null) { + return; + } + + int width = frame.width(); + int height = frame.height(); + mXOffset = xOffset; + mYOffset = yOffset; + + mWallpaper.adjustTextureCoordinates(bitmap, width, height, mXOffset, mYOffset); + requestRender(); + } + + @Override + public void onRevealStateChanged() { + requestRender(); + } + + private void requestRender() { + if (mGLView != null) { + mGLView.render(); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java index 968bd283c4b1..60dceef23f7c 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAccessibilityInteractionConnection.java @@ -165,6 +165,11 @@ public class PipAccessibilityInteractionConnection } } + @Override + public void clearAccessibilityFocus() { + // We should not be here. + } + public static AccessibilityNodeInfo obtainRootAccessibilityNodeInfo() { AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); info.setSourceNodeId(AccessibilityNodeInfo.ROOT_NODE_ID, diff --git a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt index db5c244d95b2..e2688f13134c 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/OngoingPrivacyDialog.kt @@ -19,6 +19,7 @@ import android.app.Dialog import android.content.Context import android.content.DialogInterface import android.content.Intent +import android.content.pm.PackageManager import android.content.res.ColorStateList import android.os.UserHandle import android.util.IconDrawableFactory @@ -157,16 +158,21 @@ class OngoingPrivacyDialog constructor( } else { icons.visibility = View.GONE } - item.setOnClickListener(object : View.OnClickListener { - val intent = Intent(Intent.ACTION_REVIEW_APP_PERMISSION_USAGE) - .putExtra(Intent.EXTRA_PACKAGE_NAME, app.packageName) - .putExtra(Intent.EXTRA_USER, UserHandle.getUserHandleForUid(app.uid)) - override fun onClick(v: View?) { - Dependency.get(ActivityStarter::class.java) - .postStartActivityDismissingKeyguard(intent, 0) - dismissDialog?.invoke() - } - }) + try { + // Check if package exists + context.packageManager.getPackageInfo(app.packageName, 0) + item.setOnClickListener(object : View.OnClickListener { + val intent = Intent(Intent.ACTION_REVIEW_APP_PERMISSION_USAGE) + .putExtra(Intent.EXTRA_PACKAGE_NAME, app.packageName) + .putExtra(Intent.EXTRA_USER, UserHandle.getUserHandleForUid(app.uid)) + override fun onClick(v: View?) { + Dependency.get(ActivityStarter::class.java) + .postStartActivityDismissingKeyguard(intent, 0) + dismissDialog?.invoke() + } + }) + } catch (e: PackageManager.NameNotFoundException) {} + itemList.addView(item) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java index f3a46ce5778a..0583843d003b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationListener.java @@ -20,6 +20,8 @@ import static com.android.systemui.statusbar.RemoteInputController.processForRem import static com.android.systemui.statusbar.phone.StatusBar.DEBUG; import static com.android.systemui.statusbar.phone.StatusBar.ENABLE_CHILD_NOTIFICATIONS; +import android.annotation.SuppressLint; +import android.app.NotificationManager; import android.content.ComponentName; import android.content.Context; import android.os.RemoteException; @@ -32,10 +34,13 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.NotificationListenerWithPlugins; +import java.util.ArrayList; + /** * This class handles listening to notification updates and passing them along to * NotificationPresenter to be displayed to the user. */ +@SuppressLint("OverrideAbstract") public class NotificationListener extends NotificationListenerWithPlugins { private static final String TAG = "NotificationListener"; @@ -47,6 +52,7 @@ public class NotificationListener extends NotificationListenerWithPlugins { private final NotificationGroupManager mGroupManager = Dependency.get(NotificationGroupManager.class); + private final ArrayList<NotificationSettingsListener> mSettingsListeners = new ArrayList<>(); private final Context mContext; protected NotificationPresenter mPresenter; @@ -55,6 +61,10 @@ public class NotificationListener extends NotificationListenerWithPlugins { mContext = context; } + public void addNotificationSettingsListener(NotificationSettingsListener listener) { + mSettingsListeners.add(listener); + } + @Override public void onListenerConnected() { if (DEBUG) Log.d(TAG, "onListenerConnected"); @@ -70,6 +80,8 @@ public class NotificationListener extends NotificationListenerWithPlugins { mEntryManager.addNotification(sbn, currentRanking); } }); + NotificationManager noMan = mContext.getSystemService(NotificationManager.class); + onStatusBarIconsBehaviorChanged(noMan.shouldHideSilentStatusBarIcons()); } @Override @@ -133,6 +145,13 @@ public class NotificationListener extends NotificationListenerWithPlugins { } } + @Override + public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) { + for (NotificationSettingsListener listener : mSettingsListeners) { + listener.onStatusBarIconsBehaviorChanged(hideSilentStatusIcons); + } + } + public void setUpWithPresenter(NotificationPresenter presenter) { mPresenter = presenter; @@ -144,4 +163,10 @@ public class NotificationListener extends NotificationListenerWithPlugins { Log.e(TAG, "Unable to register notification listener", e); } } + + public interface NotificationSettingsListener { + + default void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) { } + + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index cb1384cacec8..aa221993cd82 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -25,7 +25,6 @@ import android.app.NotificationChannel; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; -import android.metrics.LogMaker; import android.net.Uri; import android.os.ServiceManager; import android.os.UserHandle; @@ -392,12 +391,6 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx return false; } - LogMaker logMaker = (row.getStatusBarNotification() == null) - ? new LogMaker(MetricsProto.MetricsEvent.ACTION_NOTE_CONTROLS) - : row.getStatusBarNotification().getLogMaker(); - mMetricsLogger.write(logMaker.setCategory(MetricsProto.MetricsEvent.ACTION_NOTE_CONTROLS) - .setType(MetricsProto.MetricsEvent.TYPE_ACTION)); - // ensure that it's laid but not visible until actually laid out guts.setVisibility(View.INVISIBLE); // Post to ensure the the guts are properly laid out. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java index 359bc6ec71d8..b6948fc4bd1f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationInfo.java @@ -126,18 +126,23 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private OnClickListener mOnKeepShowing = v -> { mExitReason = NotificationCounters.BLOCKING_HELPER_KEEP_SHOWING; closeControls(v); - mMetricsLogger.write(getLogMaker().setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER) - .setType(MetricsEvent.TYPE_ACTION) - .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_STAY_SILENT)); + if (mIsForBlockingHelper) { + mMetricsLogger.write(getLogMaker().setCategory( + MetricsEvent.NOTIFICATION_BLOCKING_HELPER) + .setType(MetricsEvent.TYPE_ACTION) + .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_STAY_SILENT)); + } }; private OnClickListener mOnToggleSilent = v -> { Runnable saveImportance = () -> { swapContent(ACTION_TOGGLE_SILENT, true /* animate */); - mMetricsLogger.write(getLogMaker() - .setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER) - .setType(MetricsEvent.TYPE_ACTION) - .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_ALERT_ME)); + if (mIsForBlockingHelper) { + mMetricsLogger.write(getLogMaker() + .setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER) + .setType(MetricsEvent.TYPE_ACTION) + .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_ALERT_ME)); + } }; if (mCheckSaveListener != null) { mCheckSaveListener.checkSave(saveImportance, mSbn); @@ -149,10 +154,12 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private OnClickListener mOnStopOrMinimizeNotifications = v -> { Runnable saveImportance = () -> { swapContent(ACTION_BLOCK, true /* animate */); - mMetricsLogger.write(getLogMaker() - .setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER) - .setType(MetricsEvent.TYPE_ACTION) - .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_BLOCKED)); + if (mIsForBlockingHelper) { + mMetricsLogger.write(getLogMaker() + .setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER) + .setType(MetricsEvent.TYPE_ACTION) + .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_BLOCKED)); + } }; if (mCheckSaveListener != null) { mCheckSaveListener.checkSave(saveImportance, mSbn); @@ -164,12 +171,16 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G private OnClickListener mOnUndo = v -> { // Reset exit counter that we'll log and record an undo event separately (not an exit event) mExitReason = NotificationCounters.BLOCKING_HELPER_DISMISSED; - logBlockingHelperCounter(NotificationCounters.BLOCKING_HELPER_UNDO); - mMetricsLogger.write(importanceChangeLogMaker().setType(MetricsEvent.TYPE_DISMISS)); + if (mIsForBlockingHelper) { + logBlockingHelperCounter(NotificationCounters.BLOCKING_HELPER_UNDO); + mMetricsLogger.write(getLogMaker().setCategory( + MetricsEvent.NOTIFICATION_BLOCKING_HELPER) + .setType(MetricsEvent.TYPE_DISMISS) + .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_UNDO)); + } else { + mMetricsLogger.write(importanceChangeLogMaker().setType(MetricsEvent.TYPE_DISMISS)); + } swapContent(ACTION_UNDO, true /* animate */); - mMetricsLogger.write(getLogMaker().setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER) - .setType(MetricsEvent.TYPE_DISMISS) - .setSubtype(MetricsEvent.BLOCKING_HELPER_CLICK_UNDO)); }; public NotificationInfo(Context context, AttributeSet attrs) { @@ -269,11 +280,11 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G bindPrompt(); bindButtons(); - mMetricsLogger.write(getLogMaker().setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER) - .setType(MetricsEvent.TYPE_OPEN) - .setSubtype(MetricsEvent.BLOCKING_HELPER_DISPLAY)); + mMetricsLogger.write(notificationControlsLogMaker()); } + + private void bindHeader() throws RemoteException { // Package name Drawable pkgicon = null; @@ -404,19 +415,6 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G } } - /** - * Returns an initialized LogMaker for logging importance changes. - * The caller may override the type (to DISMISS) before passing it to mMetricsLogger. - * @return new LogMaker - */ - private LogMaker importanceChangeLogMaker() { - Integer chosenImportance = - mChosenImportance != null ? mChosenImportance : mStartingChannelImportance; - return new LogMaker(MetricsEvent.ACTION_SAVE_IMPORTANCE) - .setType(MetricsEvent.TYPE_ACTION) - .setSubtype(chosenImportance - mStartingChannelImportance); - } - private boolean hasImportanceChanged() { return mSingleNotificationChannel != null && mChosenImportance != null @@ -616,8 +614,8 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G confirmation.setAlpha(1f); header.setVisibility(VISIBLE); header.setAlpha(1f); - mMetricsLogger.write(getLogMaker().setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER) - .setType(MetricsEvent.TYPE_CLOSE)); + + mMetricsLogger.write(notificationControlsLogMaker().setType(MetricsEvent.TYPE_CLOSE)); } @Override @@ -764,7 +762,39 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G } } + /** + * Returns a LogMaker with all available notification information. + * Caller should set category, type, and maybe subtype, before passing it to mMetricsLogger. + * @return LogMaker + */ private LogMaker getLogMaker() { - return mSbn.getLogMaker(); + // The constructor requires a category, so also do it in the other branch for consistency. + return mSbn == null ? new LogMaker(MetricsEvent.NOTIFICATION_BLOCKING_HELPER) + : mSbn.getLogMaker().setCategory(MetricsEvent.NOTIFICATION_BLOCKING_HELPER); + } + + /** + * Returns an initialized LogMaker for logging importance changes. + * The caller may override the type before passing it to mMetricsLogger. + * @return LogMaker + */ + private LogMaker importanceChangeLogMaker() { + Integer chosenImportance = + mChosenImportance != null ? mChosenImportance : mStartingChannelImportance; + return getLogMaker().setCategory(MetricsEvent.ACTION_SAVE_IMPORTANCE) + .setType(MetricsEvent.TYPE_ACTION) + .setSubtype(chosenImportance - mStartingChannelImportance); + } + + /** + * Returns an initialized LogMaker for logging open/close of the info display. + * The caller may override the type before passing it to mMetricsLogger. + * @return LogMaker + */ + private LogMaker notificationControlsLogMaker() { + return getLogMaker().setCategory(MetricsEvent.ACTION_NOTE_CONTROLS) + .setType(MetricsEvent.TYPE_OPEN) + .setSubtype(mIsForBlockingHelper ? MetricsEvent.BLOCKING_HELPER_DISPLAY + : MetricsEvent.BLOCKING_HELPER_UNKNOWN); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index e86996a81bcd..9e99fe9dac36 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -11,9 +11,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; -import androidx.annotation.NonNull; -import androidx.collection.ArrayMap; - +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.util.ContrastColorUtil; import com.android.internal.widget.ViewClippingUtil; @@ -21,6 +19,7 @@ import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; +import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.StatusBarStateController; @@ -28,11 +27,13 @@ import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; -import com.android.systemui.tuner.TunerService; import java.util.ArrayList; import java.util.function.Function; +import androidx.annotation.NonNull; +import androidx.collection.ArrayMap; + /** * A controller for the space in the status bar to the left of the system icons. This area is * normally reserved for notifications. @@ -46,18 +47,19 @@ public class NotificationIconAreaController implements DarkReceiver, private final NotificationEntryManager mEntryManager; private final Runnable mUpdateStatusBarIcons = this::updateStatusBarIcons; private final StatusBarStateController mStatusBarStateController; - private final TunerService.Tunable mTunable = new TunerService.Tunable() { - @Override - public void onTuningChanged(String key, String newValue) { - if (key.equals(LOW_PRIORITY)) { - mShowLowPriority = "1".equals(newValue) - || !NotificationUtils.useNewInterruptionModel(mContext); - if (mNotificationScrollLayout != null) { - updateStatusBarIcons(); + @VisibleForTesting + final NotificationListener.NotificationSettingsListener mSettingsListener = + new NotificationListener.NotificationSettingsListener() { + @Override + public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) { + if (NotificationUtils.useNewInterruptionModel(mContext)) { + mShowLowPriority = !hideSilentStatusIcons; + if (mNotificationScrollLayout != null) { + updateStatusBarIcons(); + } + } } - } - } - }; + }; private int mIconSize; private int mIconHPadding; @@ -71,7 +73,7 @@ public class NotificationIconAreaController implements DarkReceiver, private ViewGroup mNotificationScrollLayout; private Context mContext; private boolean mFullyDark; - private boolean mShowLowPriority; + private boolean mShowLowPriority = true; /** * Ratio representing being awake or in ambient mode, where 1 is dark and 0 awake. @@ -90,15 +92,15 @@ public class NotificationIconAreaController implements DarkReceiver, view -> view instanceof StatusBarWindowView; public NotificationIconAreaController(Context context, StatusBar statusBar, - StatusBarStateController statusBarStateController) { + StatusBarStateController statusBarStateController, + NotificationListener notificationListener) { mStatusBar = statusBar; mContrastColorUtil = ContrastColorUtil.getInstance(context); mContext = context; mEntryManager = Dependency.get(NotificationEntryManager.class); mStatusBarStateController = statusBarStateController; mStatusBarStateController.addCallback(this); - - Dependency.get(TunerService.class).addTunable(mTunable, LOW_PRIORITY); + notificationListener.addNotificationSettingsListener(mSettingsListener); initializeNotificationAreaViews(context); } @@ -243,6 +245,11 @@ public class NotificationIconAreaController implements DarkReceiver, true /* hideRepliedMessages */); } + @VisibleForTesting + boolean shouldShouldLowPriorityIcons() { + return mShowLowPriority; + } + /** * Updates the notification icons for a host layout. This will ensure that the notification * host layout will have the same icons like the ones in here. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 1470d0f44266..dd231821ef2b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -480,8 +480,7 @@ public class StatusBar extends SystemUI implements DemoMode, updateAodMaskVisibility(deviceSupportsAodWallpaper && aodImageWallpaperEnabled); // If WallpaperInfo is null, it must be ImageWallpaper. final boolean supportsAmbientMode = deviceSupportsAodWallpaper - && (info == null && aodImageWallpaperEnabled - || info != null && info.supportsAmbientMode()); + && (info == null || info.supportsAmbientMode()); mStatusBarWindowController.setWallpaperSupportsAmbientMode(supportsAmbientMode); mScrimController.setWallpaperSupportsAmbientMode(supportsAmbientMode); @@ -801,7 +800,8 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationLogger.setUpWithContainer(notifListContainer); mNotificationIconAreaController = SystemUIFactory.getInstance() - .createNotificationIconAreaController(context, this, mStatusBarStateController); + .createNotificationIconAreaController( + context, this, mStatusBarStateController, mNotificationListener); inflateShelf(); mNotificationIconAreaController.setupShelf(mNotificationShelf); diff --git a/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java b/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java index 52cabe278e2d..dd1d0ca06fa8 100644 --- a/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java +++ b/packages/SystemUI/src/com/android/systemui/wallpaper/AodMaskView.java @@ -156,6 +156,8 @@ public class AodMaskView extends ImageView implements StatusBarStateController.S private boolean checkIfNeedMask() { // We need mask for ImageWallpaper / LockScreen Wallpaper (Music album art). + // Because of conflicting with another wallpaper feature, + // we only support LockScreen wallpaper currently. return mWallpaperManager.getWallpaperInfo() == null || ScrimState.AOD.hasBackdrop(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java index c880172e775a..bcf5964bead5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationListenerTest.java @@ -17,10 +17,12 @@ package com.android.systemui.statusbar; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Notification; +import android.app.NotificationManager; import android.os.Handler; import android.os.UserHandle; import android.service.notification.NotificationListenerService; @@ -55,6 +57,7 @@ public class NotificationListenerTest extends SysuiTestCase { // Dependency mocks: @Mock private NotificationEntryManager mEntryManager; @Mock private NotificationRemoteInputManager mRemoteInputManager; + @Mock private NotificationManager mNotificationManager; private NotificationListener mListener; private StatusBarNotification mSbn; @@ -67,6 +70,7 @@ public class NotificationListenerTest extends SysuiTestCase { mRemoteInputManager); mDependency.injectTestDependency(Dependency.MAIN_HANDLER, new Handler(TestableLooper.get(this).getLooper())); + mContext.addMockSystemService(NotificationManager.class, mNotificationManager); when(mEntryManager.getNotificationData()).thenReturn(mNotificationData); @@ -106,4 +110,28 @@ public class NotificationListenerTest extends SysuiTestCase { // RankingMap may be modified by plugins. verify(mEntryManager).updateNotificationRanking(any()); } + + @Test + public void testOnConnectReadStatusBarSetting() { + NotificationListener.NotificationSettingsListener settingsListener = + mock(NotificationListener.NotificationSettingsListener.class); + mListener.addNotificationSettingsListener(settingsListener); + + when(mNotificationManager.shouldHideSilentStatusBarIcons()).thenReturn(true); + + mListener.onListenerConnected(); + + verify(settingsListener).onStatusBarIconsBehaviorChanged(true); + } + + @Test + public void testOnStatusBarIconsBehaviorChanged() { + NotificationListener.NotificationSettingsListener settingsListener = + mock(NotificationListener.NotificationSettingsListener.class); + mListener.addNotificationSettingsListener(settingsListener); + + mListener.onStatusBarIconsBehaviorChanged(true); + + verify(settingsListener).onStatusBarIconsBehaviorChanged(true); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java index fdc9e0c4d7e4..727e9af94146 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java @@ -45,7 +45,6 @@ import android.app.Notification; import android.app.NotificationChannel; import android.content.Intent; import android.content.pm.PackageManager; -import android.metrics.LogMaker; import android.os.Binder; import android.os.Handler; import android.provider.Settings; @@ -57,7 +56,6 @@ import android.util.ArraySet; import android.view.View; import com.android.internal.logging.MetricsLogger; -import com.android.internal.logging.nano.MetricsProto; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.statusbar.NotificationPresenter; @@ -220,34 +218,6 @@ public class NotificationGutsManagerTest extends SysuiTestCase { } @Test - public void testOpenGutsLogging() { - NotificationGutsManager gutsManager = spy(mGutsManager); - doReturn(true).when(gutsManager).bindGuts(any(), any()); - - NotificationGuts guts = spy(new NotificationGuts(mContext)); - doReturn(true).when(guts).post(any()); - - ExpandableNotificationRow realRow = createTestNotificationRow(); - NotificationMenuRowPlugin.MenuItem menuItem = createTestMenuItem(realRow); - - ExpandableNotificationRow row = spy(realRow); - when(row.getWindowToken()).thenReturn(new Binder()); - when(row.getGuts()).thenReturn(guts); - StatusBarNotification notification = spy(realRow.getStatusBarNotification()); - when(row.getStatusBarNotification()).thenReturn(notification); - - assertTrue(gutsManager.openGuts(row, 0, 0, menuItem)); - - ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class); - verify(notification).getLogMaker(); - verify(mMetricsLogger).write(logMakerCaptor.capture()); - assertEquals(MetricsProto.MetricsEvent.ACTION_NOTE_CONTROLS, - logMakerCaptor.getValue().getCategory()); - assertEquals(MetricsProto.MetricsEvent.TYPE_ACTION, - logMakerCaptor.getValue().getType()); - } - - @Test public void testAppOpsSettingsIntent_camera() { ArraySet<Integer> ops = new ArraySet<>(); ops.add(OP_CAMERA); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java index 554baaf1ab9e..2a64445f342a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationInfoTest.java @@ -83,7 +83,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; -import org.mockito.ArgumentMatcher; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -107,11 +106,16 @@ public class NotificationInfoTest extends SysuiTestCase { private NotificationChannel mDefaultNotificationChannel; private StatusBarNotification mSbn; - @Rule public MockitoRule mockito = MockitoJUnit.rule(); - @Mock private MetricsLogger mMetricsLogger; - @Mock private INotificationManager mMockINotificationManager; - @Mock private PackageManager mMockPackageManager; - @Mock private NotificationBlockingHelperManager mBlockingHelperManager; + @Rule + public MockitoRule mockito = MockitoJUnit.rule(); + @Mock + private MetricsLogger mMetricsLogger; + @Mock + private INotificationManager mMockINotificationManager; + @Mock + private PackageManager mMockPackageManager; + @Mock + private NotificationBlockingHelperManager mBlockingHelperManager; @Before public void setUp() throws Exception { @@ -172,44 +176,25 @@ public class NotificationInfoTest extends SysuiTestCase { PollingCheck.waitFor(1000, () -> VISIBLE == mNotificationInfo.findViewById(R.id.confirmation).getVisibility()); } + private void ensureNoUndoButton() { PollingCheck.waitFor(1000, () -> GONE == mNotificationInfo.findViewById(R.id.confirmation).getVisibility() && !mNotificationInfo.isAnimating()); } + private void waitForStopButton() { PollingCheck.waitFor(1000, () -> VISIBLE == mNotificationInfo.findViewById(R.id.prompt).getVisibility()); } - class ImportanceChangeLogMaker implements ArgumentMatcher<LogMaker> { - private static final int CATEGORY = MetricsProto.MetricsEvent.ACTION_SAVE_IMPORTANCE; - private int mType, mSubtype; - - ImportanceChangeLogMaker(int type, int subtype) { - mType = type; - mSubtype = subtype; - } - public boolean matches(LogMaker l) { - return (l.getCategory() == CATEGORY) - && (l.getType() == mType) - && (l.getSubtype() == mSubtype); - } - - public String toString() { - return String.format("LogMaker(%d, %d, %d)", CATEGORY, mType, mSubtype); - } - } - - private LogMaker importanceChangeLog(int type, int subtype) { - return argThat(new ImportanceChangeLogMaker(type, subtype)); - } - @Test public void testBindNotification_SetsTextApplicationName() throws Exception { when(mMockPackageManager.getApplicationLabel(any())).thenReturn("App Name"); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, - TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, + null, null, null, + true, false, IMPORTANCE_DEFAULT, true); final TextView textView = mNotificationInfo.findViewById(R.id.pkgname); assertTrue(textView.getText().toString().contains("App Name")); @@ -330,9 +315,9 @@ public class NotificationInfoTest extends SysuiTestCase { @Test public void testBindNotification_BlockButton() throws Exception { - mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, - TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, - IMPORTANCE_DEFAULT, true); + mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, + IMPORTANCE_DEFAULT, true); final View block = mNotificationInfo.findViewById(R.id.int_block); final View minimize = mNotificationInfo.findViewById(R.id.block_or_minimize); assertEquals(VISIBLE, block.getVisibility()); @@ -340,7 +325,7 @@ public class NotificationInfoTest extends SysuiTestCase { } @Test - public void testBindNotification_BlockButton_BlockHelper() throws Exception { + public void testBindNotification_BlockButton_BlockingHelper() throws Exception { mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, true /* isBlockingHelper */, false, IMPORTANCE_DEFAULT, true); @@ -498,13 +483,29 @@ public class NotificationInfoTest extends SysuiTestCase { } @Test - public void testLogBlockingHelperCounter_logGutsViewDisplayed() throws Exception { + public void testBindNotificationLogging_notBlockingHelper() throws Exception { mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, - TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, + null, null, null, + true, false, + IMPORTANCE_DEFAULT, true); + verify(mMetricsLogger).write(argThat(logMaker -> + logMaker.getCategory() == MetricsEvent.ACTION_NOTE_CONTROLS + && logMaker.getType() == MetricsEvent.TYPE_OPEN + && logMaker.getSubtype() == MetricsEvent.BLOCKING_HELPER_UNKNOWN + )); + } + + @Test + public void testBindNotificationLogging_BlockingHelper() throws Exception { + mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, + null, null, null, + false, true, + true, true, IMPORTANCE_DEFAULT, true); - mNotificationInfo.logBlockingHelperCounter("HowCanNotifsBeRealIfAppsArent"); verify(mMetricsLogger).write(argThat(logMaker -> - logMaker.getCategory() == MetricsEvent.NOTIFICATION_BLOCKING_HELPER + logMaker.getCategory() == MetricsEvent.ACTION_NOTE_CONTROLS && logMaker.getType() == MetricsEvent.TYPE_OPEN && logMaker.getSubtype() == MetricsEvent.BLOCKING_HELPER_DISPLAY )); @@ -513,8 +514,11 @@ public class NotificationInfoTest extends SysuiTestCase { @Test public void testLogBlockingHelperCounter_logsForBlockingHelper() throws Exception { mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, - TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, false, true, - true, true, IMPORTANCE_DEFAULT, true); + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, + null, null, null, + false, true, + true, true, + IMPORTANCE_DEFAULT, true); mNotificationInfo.logBlockingHelperCounter("HowCanNotifsBeRealIfAppsArent"); verify(mMetricsLogger).count(eq("HowCanNotifsBeRealIfAppsArent"), eq(1)); } @@ -680,7 +684,7 @@ public class NotificationInfoTest extends SysuiTestCase { mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */, 10 /* numUniqueChannelsInRow */, mSbn, null /* checkSaveListener */, - null /* onSettingsClick */, null /* onAppSettingsClick */ , + null /* onSettingsClick */, null /* onAppSettingsClick */, true, false /* isNonblockable */, IMPORTANCE_DEFAULT, false ); @@ -722,7 +726,7 @@ public class NotificationInfoTest extends SysuiTestCase { mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */, 10 /* numUniqueChannelsInRow */, mSbn, null /* checkSaveListener */, - null /* onSettingsClick */, null /* onAppSettingsClick */ , + null /* onSettingsClick */, null /* onAppSettingsClick */, true /* provisioned */, false /* isNonblockable */, true /* isForBlockingHelper */, true /* isUserSentimentNegative */, IMPORTANCE_DEFAULT, true); @@ -744,14 +748,14 @@ public class NotificationInfoTest extends SysuiTestCase { } @Test - public void testCloseControls_nonNullCheckSaveListenerDoesntDelayKeepShowing() + public void testCloseControls_nonNullCheckSaveListenerDoesntDelayKeepShowing_BlockingHelper() throws Exception { NotificationInfo.CheckSaveListener listener = mock(NotificationInfo.CheckSaveListener.class); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */, 10 /* numUniqueChannelsInRow */, mSbn, listener /* checkSaveListener */, - null /* onSettingsClick */, null /* onAppSettingsClick */ , true /* provisioned */, + null /* onSettingsClick */, null /* onAppSettingsClick */, true /* provisioned */, false /* isNonblockable */, true /* isForBlockingHelper */, true /* isUserSentimentNegative */, IMPORTANCE_DEFAULT, true); @@ -772,14 +776,14 @@ public class NotificationInfoTest extends SysuiTestCase { } @Test - public void testCloseControls_nonNullCheckSaveListenerDoesntDelayDismiss() + public void testCloseControls_nonNullCheckSaveListenerDoesntDelayDismiss_BlockingHelper() throws Exception { NotificationInfo.CheckSaveListener listener = mock(NotificationInfo.CheckSaveListener.class); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */, 10 /* numUniqueChannelsInRow */, mSbn, listener /* checkSaveListener */, - null /* onSettingsClick */, null /* onAppSettingsClick */ , + null /* onSettingsClick */, null /* onAppSettingsClick */, false /* isNonblockable */, true /* isForBlockingHelper */, true, true /* isUserSentimentNegative */, /* isNoisy */ IMPORTANCE_DEFAULT, true); @@ -791,7 +795,7 @@ public class NotificationInfoTest extends SysuiTestCase { } @Test - public void testCloseControls_checkSaveListenerDelaysStopNotifications() + public void testCloseControls_checkSaveListenerDelaysStopNotifications_BlockingHelper() throws Exception { NotificationInfo.CheckSaveListener listener = mock(NotificationInfo.CheckSaveListener.class); @@ -849,18 +853,25 @@ public class NotificationInfoTest extends SysuiTestCase { } @Test - public void testBlockChangedCallsUpdateNotificationChannel() throws Exception { + public void testBlockChangedCallsUpdateNotificationChannel_notBlockingHelper() + throws Exception { mNotificationChannel.setImportance(IMPORTANCE_LOW); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, - TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, + null, null, null, + true, false, IMPORTANCE_DEFAULT, false); mNotificationInfo.findViewById(R.id.int_block).performClick(); waitForUndoButton(); mNotificationInfo.handleCloseControls(true, false); - verify(mMetricsLogger).write(importanceChangeLog( - MetricsProto.MetricsEvent.TYPE_ACTION, IMPORTANCE_NONE - IMPORTANCE_LOW)); + ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class); + verify(mMetricsLogger, times(2)).write(logMakerCaptor.capture()); + assertEquals(MetricsProto.MetricsEvent.TYPE_ACTION, + logMakerCaptor.getValue().getType()); + assertEquals(IMPORTANCE_NONE - IMPORTANCE_LOW, + logMakerCaptor.getValue().getSubtype()); mTestableLooper.processAllMessages(); ArgumentCaptor<NotificationChannel> updated = @@ -896,8 +907,12 @@ public class NotificationInfoTest extends SysuiTestCase { waitForUndoButton(); mNotificationInfo.handleCloseControls(true, false); - verify(mMetricsLogger).write(importanceChangeLog( - MetricsProto.MetricsEvent.TYPE_ACTION, IMPORTANCE_NONE - IMPORTANCE_LOW)); + ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class); + verify(mMetricsLogger, times(3)).write(logMakerCaptor.capture()); + assertEquals(MetricsProto.MetricsEvent.TYPE_ACTION, + logMakerCaptor.getValue().getType()); + assertEquals(IMPORTANCE_NONE - IMPORTANCE_LOW, + logMakerCaptor.getValue().getSubtype()); mTestableLooper.processAllMessages(); ArgumentCaptor<NotificationChannel> updated = @@ -965,10 +980,12 @@ public class NotificationInfoTest extends SysuiTestCase { } @Test - public void testBlockUndoDoesNotBlockNotificationChannel() throws Exception { + public void testBlockUndoDoesNotBlockNotificationChannel_notBlockingHelper() throws Exception { mNotificationChannel.setImportance(IMPORTANCE_LOW); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, - TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, false, + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, + null, null, null, + true, false, IMPORTANCE_DEFAULT, false); mNotificationInfo.findViewById(R.id.int_block).performClick(); @@ -977,8 +994,15 @@ public class NotificationInfoTest extends SysuiTestCase { waitForStopButton(); // mNotificationInfo.handleCloseControls doesn't get called by this interaction. - verify(mMetricsLogger).write(importanceChangeLog( - MetricsProto.MetricsEvent.TYPE_DISMISS, IMPORTANCE_NONE - IMPORTANCE_LOW)); + ArgumentCaptor<LogMaker> logMakerCaptor = ArgumentCaptor.forClass(LogMaker.class); + verify(mMetricsLogger, times(2)).write(logMakerCaptor.capture()); + assertEquals(MetricsEvent.ACTION_SAVE_IMPORTANCE, + logMakerCaptor.getValue().getCategory()); + assertEquals(MetricsEvent.TYPE_DISMISS, + logMakerCaptor.getValue().getType()); + assertEquals(IMPORTANCE_NONE - IMPORTANCE_LOW, + logMakerCaptor.getValue().getSubtype()); + mTestableLooper.processAllMessages(); verify(mMockINotificationManager, never()).updateNotificationChannelForPackage( @@ -986,11 +1010,12 @@ public class NotificationInfoTest extends SysuiTestCase { } @Test - public void testMinUndoDoesNotMinNotificationChannel() throws Exception { + public void testMinUndoDoesNotMinNotificationChannel_notBlockingHelper() throws Exception { mNotificationChannel.setImportance(IMPORTANCE_LOW); mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager, - TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, null, null, null, true, true, - IMPORTANCE_DEFAULT, false); + TEST_PACKAGE_NAME, mNotificationChannel, 1, mSbn, + null, null, null, true, + true, IMPORTANCE_DEFAULT, false); mNotificationInfo.findViewById(R.id.minimize).performClick(); waitForUndoButton(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java new file mode 100644 index 000000000000..13145b830178 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.phone; + +import static android.provider.Settings.Secure.NOTIFICATION_NEW_INTERRUPTION_MODEL; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.provider.Settings; +import android.support.test.filters.SmallTest; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; + +import com.android.systemui.SysuiTestCase; +import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.NotificationListener; +import com.android.systemui.statusbar.StatusBarStateController; +import com.android.systemui.statusbar.phone.LightBarTransitionsController.DarkIntensityApplier; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper +public class NotificationIconAreaControllerTest extends SysuiTestCase { + + @Mock + private NotificationListener mListener; + @Mock + StatusBar mStatusBar; + @Mock + StatusBarStateController mStatusBarStateController; + private NotificationIconAreaController mController; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + + mController = new NotificationIconAreaController(mContext, mStatusBar, + mStatusBarStateController, mListener); + } + + @Test + public void testNotificationIcons_featureOff() { + Settings.Secure.putInt( + mContext.getContentResolver(), NOTIFICATION_NEW_INTERRUPTION_MODEL, 0); + assertTrue(mController.shouldShouldLowPriorityIcons()); + } + + @Test + public void testNotificationIcons_featureOn_settingHideIcons() { + Settings.Secure.putInt( + mContext.getContentResolver(), NOTIFICATION_NEW_INTERRUPTION_MODEL, 1); + mController.mSettingsListener.onStatusBarIconsBehaviorChanged(true); + + assertFalse(mController.shouldShouldLowPriorityIcons()); + } + + @Test + public void testNotificationIcons_featureOn_settingShowIcons() { + Settings.Secure.putInt( + mContext.getContentResolver(), NOTIFICATION_NEW_INTERRUPTION_MODEL, 1); + mController.mSettingsListener.onStatusBarIconsBehaviorChanged(false); + + assertTrue(mController.shouldShouldLowPriorityIcons()); + } +} diff --git a/packages/VpnDialogs/AndroidManifest.xml b/packages/VpnDialogs/AndroidManifest.xml index 8172e717850b..1d0b9b6d83db 100644 --- a/packages/VpnDialogs/AndroidManifest.xml +++ b/packages/VpnDialogs/AndroidManifest.xml @@ -20,6 +20,7 @@ package="com.android.vpndialogs"> <uses-permission android:name="android.permission.CONTROL_VPN" /> + <uses-permission android:name="android.permission.CONTROL_ALWAYS_ON_VPN" /> <uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" /> <application android:label="VpnDialogs" diff --git a/proto/src/metrics_constants/metrics_constants.proto b/proto/src/metrics_constants/metrics_constants.proto index 385931d24bee..aeb4261e10a5 100644 --- a/proto/src/metrics_constants/metrics_constants.proto +++ b/proto/src/metrics_constants/metrics_constants.proto @@ -6910,6 +6910,11 @@ message MetricsEvent { // CATEGORY: NOTIFICATION FIELD_NOTIFICATION_CATEGORY = 1641; + // OPEN: Settings > Settings > Network & internet > Click Mobile network to land on page with + // details for a SIM/eSIM mobile network > Click edit icon to bring up a rename dialog. + // OS: Q + MOBILE_NETWORK_RENAME_DIALOG = 1642; + // ---- End Q Constants, all Q constants go above this line ---- // Add new aosp constants above this line. // END OF AOSP CONSTANTS diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto index 84647a6040e0..b84736ba5c47 100644 --- a/proto/src/wifi.proto +++ b/proto/src/wifi.proto @@ -1775,6 +1775,21 @@ message WifiLinkLayerUsageStats { } message WifiUsabilityStatsEntry { + // Status codes for link probe status + enum LinkProbeStatus { + // Link probe status is unknown + PROBE_STATUS_UNKNOWN = 0; + + // Link probe is not triggered + PROBE_STATUS_NO_PROBE = 1; + + // Link probe is triggered and the result is success + PROBE_STATUS_SUCCESS = 2; + + // Link probe is triggered and the result is failure + PROBE_STATUS_FAILURE = 3; + } + // Absolute milliseconds from device boot when these stats were sampled optional int64 time_stamp_ms = 1; @@ -1847,6 +1862,18 @@ message WifiUsabilityStatsEntry { // Prediction horizon (in second) of Wifi usability score provided by external // system app optional int32 prediction_horizon_sec = 23; + + // The link probe status since last stats update + optional LinkProbeStatus probe_status_since_last_update = 24; + + // The elapsed time of the most recent link probe since last stats update; + optional int32 probe_elapsed_time_ms_since_last_update = 25; + + // The MCS rate of the most recent link probe since last stats update + optional int32 probe_mcs_rate_since_last_update = 26; + + // Rx link speed at the sample time in Mbps + optional int32 rx_link_speed_mbps = 27; } message WifiUsabilityStats { diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java index f4ac13074903..fc43882b4ffd 100644 --- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java @@ -348,8 +348,8 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } int getRelevantEventTypes() { - return (mUsesAccessibilityCache ? AccessibilityCache.CACHE_CRITICAL_EVENTS_MASK : 0) - | mEventTypes; + return (mUsesAccessibilityCache ? AccessibilityCache.CACHE_CRITICAL_EVENTS_MASK + : AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) | mEventTypes; } @Override diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index f88d5217ab2f..47cd917bf84e 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -3024,9 +3024,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } public void clearAccessibilityFocusNotLocked(int windowId) { - AccessibilityNodeInfo focus = getAccessibilityFocusNotLocked(windowId); - if (focus != null) { - focus.performAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS); + RemoteAccessibilityConnection connection; + synchronized (mLock) { + connection = getConnectionLocked(windowId); + if (connection == null) { + return; + } + } + try { + connection.getRemote().clearAccessibilityFocus(); + } catch (RemoteException re) { + if (DEBUG) { + Slog.e(LOG_TAG, "Error calling clearAccessibilityFocus()"); + } } } diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index 7d228f1ad5f2..8b2c1b95ecfd 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -1863,7 +1863,7 @@ public class UserBackupManagerService { // The agent was running with a stub Application object, so shut it down. // !!! We hardcode the confirmation UI's package name here rather than use a // manifest flag! TODO something less direct. - if (app.uid >= Process.FIRST_APPLICATION_UID + if (!UserHandle.isCore(app.uid) && !app.packageName.equals("com.android.backupconfirm")) { if (MORE_DEBUG) Slog.d(TAG, "Killing agent host process"); mActivityManager.killApplicationProcess(app.processName, app.uid); diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java index 7763d7b9adc0..324c2d974010 100644 --- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java +++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java @@ -45,9 +45,9 @@ import android.content.pm.PackageManagerInternal; import android.os.Bundle; import android.os.Message; import android.os.ParcelFileDescriptor; -import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; +import android.os.UserHandle; import android.util.EventLog; import android.util.Slog; @@ -1174,7 +1174,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { // b. the app does not state android:killAfterRestore="false" in its manifest final int appFlags = mCurrentPackage.applicationInfo.flags; final boolean killAfterRestore = - (mCurrentPackage.applicationInfo.uid >= Process.FIRST_APPLICATION_UID) + !UserHandle.isCore(mCurrentPackage.applicationInfo.uid) && ((mRestoreDescription.getDataType() == RestoreDescription.TYPE_FULL_STREAM) || ((appFlags & ApplicationInfo.FLAG_KILL_AFTER_RESTORE) != 0)); diff --git a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java index 2db89289e4fc..7ee304780530 100644 --- a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java +++ b/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java @@ -31,7 +31,6 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.Signature; import android.content.pm.SigningInfo; -import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; import android.util.Slog; @@ -72,7 +71,7 @@ public class AppBackupUtils { } // 2. they run as a system-level uid - if ((app.uid < Process.FIRST_APPLICATION_UID)) { + if (UserHandle.isCore(app.uid)) { // and the backup is happening for non-system user if (userId != UserHandle.USER_SYSTEM && !app.packageName.equals( PACKAGE_MANAGER_SENTINEL)) { diff --git a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java index cce5b3b4e238..97bde9c03440 100644 --- a/services/backup/java/com/android/server/backup/utils/RestoreUtils.java +++ b/services/backup/java/com/android/server/backup/utils/RestoreUtils.java @@ -34,7 +34,7 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.Signature; import android.os.Bundle; import android.os.IBinder; -import android.os.Process; +import android.os.UserHandle; import android.util.Slog; import com.android.internal.annotations.GuardedBy; @@ -162,7 +162,7 @@ public class RestoreUtils { if (AppBackupUtils.signaturesMatch(sigs, pkg, pmi)) { // If this is a system-uid app without a declared backup agent, // don't restore any of the file data. - if ((pkg.applicationInfo.uid < Process.FIRST_APPLICATION_UID) + if (UserHandle.isCore(pkg.applicationInfo.uid) && (pkg.applicationInfo.backupAgentName == null)) { Slog.w(TAG, "Installed app " + info.packageName + " has restricted uid and no agent"); diff --git a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java index f4b235a3f3e1..f3b80988fef3 100644 --- a/services/backup/java/com/android/server/backup/utils/TarBackupReader.java +++ b/services/backup/java/com/android/server/backup/utils/TarBackupReader.java @@ -53,7 +53,7 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.Signature; import android.os.Bundle; -import android.os.Process; +import android.os.UserHandle; import android.util.Slog; import com.android.server.backup.FileMetadata; @@ -404,8 +404,7 @@ public class TarBackupReader { if ((flags & ApplicationInfo.FLAG_ALLOW_BACKUP) != 0) { // Restore system-uid-space packages only if they have // defined a custom backup agent - if ((pkgInfo.applicationInfo.uid - >= Process.FIRST_APPLICATION_UID) + if (!UserHandle.isCore(pkgInfo.applicationInfo.uid) || (pkgInfo.applicationInfo.backupAgentName != null)) { // Verify signatures against any installed version; if they // don't match, then we fall though and ignore the data. The diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 1519c1785070..58263fce5119 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -40,6 +40,7 @@ import static android.net.NetworkPolicyManager.RULE_NONE; import static android.net.NetworkPolicyManager.uidRulesToString; import static android.net.NetworkStack.NETWORKSTACK_PACKAGE_NAME; import static android.net.shared.NetworkMonitorUtils.isValidationRequired; +import static android.net.shared.NetworkParcelableUtil.toStableParcelable; import static android.os.Process.INVALID_UID; import static android.system.OsConstants.IPPROTO_TCP; import static android.system.OsConstants.IPPROTO_UDP; @@ -78,6 +79,7 @@ import android.net.Network; import android.net.NetworkAgent; import android.net.NetworkCapabilities; import android.net.NetworkConfig; +import android.net.NetworkFactory; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; import android.net.NetworkMisc; @@ -98,10 +100,10 @@ import android.net.VpnService; import android.net.metrics.IpConnectivityLog; import android.net.metrics.NetworkEvent; import android.net.netlink.InetDiagMessage; -import android.net.shared.NetdService; import android.net.shared.NetworkMonitorUtils; import android.net.shared.PrivateDnsConfig; import android.net.util.MultinetworkPolicyTracker; +import android.net.util.NetdService; import android.os.Binder; import android.os.Build; import android.os.Bundle; @@ -144,6 +146,7 @@ import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.IBatteryStats; +import com.android.internal.logging.MetricsLogger; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnInfo; @@ -2683,6 +2686,11 @@ public class ConnectivityService extends IConnectivityManager.Stub EVENT_PROVISIONING_NOTIFICATION, PROVISIONING_NOTIFICATION_HIDE, mNai.network.netId)); } + + @Override + public void logCaptivePortalLoginEvent(int eventId, String packageName) { + new MetricsLogger().action(eventId, packageName); + } } private boolean networkRequiresValidation(NetworkAgentInfo nai) { @@ -2772,8 +2780,17 @@ public class ConnectivityService extends IConnectivityManager.Stub for (NetworkRequestInfo nri : mNetworkRequests.values()) { if (nri.request.isListen()) continue; NetworkAgentInfo nai = getNetworkForRequest(nri.request.requestId); - ac.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, - (nai != null ? nai.getCurrentScore() : 0), 0, nri.request); + final int score; + final int serial; + if (nai != null) { + score = nai.getCurrentScore(); + serial = nai.factorySerialNumber; + } else { + score = 0; + serial = NetworkFactory.SerialNumber.NONE; + } + ac.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, serial, + nri.request); } } else { loge("Error connecting NetworkFactory"); @@ -2870,7 +2887,7 @@ public class ConnectivityService extends IConnectivityManager.Stub NetworkAgentInfo currentNetwork = getNetworkForRequest(request.requestId); if (currentNetwork != null && currentNetwork.network.netId == nai.network.netId) { clearNetworkForRequest(request.requestId); - sendUpdatedScoreToFactories(request, 0); + sendUpdatedScoreToFactories(request, null); } } nai.clearLingerState(); @@ -2946,7 +2963,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } rematchAllNetworksAndRequests(null, 0); if (nri.request.isRequest() && getNetworkForRequest(nri.request.requestId) == null) { - sendUpdatedScoreToFactories(nri.request, 0); + sendUpdatedScoreToFactories(nri.request, null); } } @@ -4531,11 +4548,14 @@ public class ConnectivityService extends IConnectivityManager.Stub public final String name; public final Messenger messenger; public final AsyncChannel asyncChannel; + public final int factorySerialNumber; - public NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel) { + NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel, + int factorySerialNumber) { this.name = name; this.messenger = messenger; this.asyncChannel = asyncChannel; + this.factorySerialNumber = factorySerialNumber; } } @@ -4896,10 +4916,12 @@ public class ConnectivityService extends IConnectivityManager.Stub } @Override - public void registerNetworkFactory(Messenger messenger, String name) { + public int registerNetworkFactory(Messenger messenger, String name) { enforceConnectivityInternalPermission(); - NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel()); + NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel(), + NetworkFactory.SerialNumber.nextSerialNumber()); mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi)); + return nfi.factorySerialNumber; } private void handleRegisterNetworkFactory(NetworkFactoryInfo nfi) { @@ -4991,9 +5013,35 @@ public class ConnectivityService extends IConnectivityManager.Stub return nri.request.requestId == mDefaultRequest.requestId; } + // TODO : remove this method. It's a stopgap measure to help sheperding a number of dependent + // changes that would conflict throughout the automerger graph. Having this method temporarily + // helps with the process of going through with all these dependent changes across the entire + // tree. public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo, LinkProperties linkProperties, NetworkCapabilities networkCapabilities, int currentScore, NetworkMisc networkMisc) { + return registerNetworkAgent(messenger, networkInfo, linkProperties, networkCapabilities, + currentScore, networkMisc, NetworkFactory.SerialNumber.NONE); + } + + /** + * Register a new agent with ConnectivityService to handle a network. + * + * @param messenger a messenger for ConnectivityService to contact the agent asynchronously. + * @param networkInfo the initial info associated with this network. It can be updated later : + * see {@link #updateNetworkInfo}. + * @param linkProperties the initial link properties of this network. They can be updated + * later : see {@link #updateLinkProperties}. + * @param networkCapabilities the initial capabilites of this network. They can be updated + * later : see {@link #updateNetworkCapabilities}. + * @param currentScore the initial score of the network. See + * {@link NetworkAgentInfo#getCurrentScore}. + * @param networkMisc metadata about the network. This is never updated. + * @param factorySerialNumber the serial number of the factory owning this NetworkAgent. + */ + public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo, + LinkProperties linkProperties, NetworkCapabilities networkCapabilities, + int currentScore, NetworkMisc networkMisc, int factorySerialNumber) { enforceConnectivityInternalPermission(); LinkProperties lp = new LinkProperties(linkProperties); @@ -5003,7 +5051,8 @@ public class ConnectivityService extends IConnectivityManager.Stub final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities); final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(), new Network(reserveNetId()), new NetworkInfo(networkInfo), lp, nc, currentScore, - mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mNMS); + mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mNMS, + factorySerialNumber); // Make sure the network capabilities reflect what the agent info says. nai.networkCapabilities = mixInCapabilities(nai, nc); final String extraInfo = networkInfo.getExtraInfo(); @@ -5012,8 +5061,8 @@ public class ConnectivityService extends IConnectivityManager.Stub if (DBG) log("registerNetworkAgent " + nai); final long token = Binder.clearCallingIdentity(); try { - mContext.getSystemService(NetworkStack.class) - .makeNetworkMonitor(nai.network, name, new NetworkMonitorCallbacks(nai)); + mContext.getSystemService(NetworkStack.class).makeNetworkMonitor( + toStableParcelable(nai.network), name, new NetworkMonitorCallbacks(nai)); } finally { Binder.restoreCallingIdentity(token); } @@ -5419,17 +5468,23 @@ public class ConnectivityService extends IConnectivityManager.Stub NetworkRequest nr = nai.requestAt(i); // Don't send listening requests to factories. b/17393458 if (nr.isListen()) continue; - sendUpdatedScoreToFactories(nr, nai.getCurrentScore()); + sendUpdatedScoreToFactories(nr, nai); } } - private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) { + private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, NetworkAgentInfo nai) { + int score = 0; + int serial = 0; + if (nai != null) { + score = nai.getCurrentScore(); + serial = nai.factorySerialNumber; + } if (VDBG || DDBG){ log("sending new Min Network Score(" + score + "): " + networkRequest.toString()); } for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) { - nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, 0, - networkRequest); + nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, + serial, networkRequest); } } @@ -5705,7 +5760,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // TODO - this could get expensive if we have a lot of requests for this // network. Think about if there is a way to reduce this. Push // netid->request mapping to each factory? - sendUpdatedScoreToFactories(nri.request, score); + sendUpdatedScoreToFactories(nri.request, newNetwork); if (isDefaultRequest(nri)) { isNewDefault = true; oldDefaultNetwork = currentNetwork; @@ -5729,7 +5784,7 @@ public class ConnectivityService extends IConnectivityManager.Stub newNetwork.removeRequest(nri.request.requestId); if (currentNetwork == newNetwork) { clearNetworkForRequest(nri.request.requestId); - sendUpdatedScoreToFactories(nri.request, 0); + sendUpdatedScoreToFactories(nri.request, null); } else { Slog.wtf(TAG, "BUG: Removing request " + nri.request.requestId + " from " + newNetwork.name() + diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java index 371276fbd2ae..126bf6556538 100644 --- a/services/core/java/com/android/server/IpSecService.java +++ b/services/core/java/com/android/server/IpSecService.java @@ -44,7 +44,7 @@ import android.net.LinkAddress; import android.net.Network; import android.net.NetworkUtils; import android.net.TrafficStats; -import android.net.shared.NetdService; +import android.net.util.NetdService; import android.os.Binder; import android.os.IBinder; import android.os.ParcelFileDescriptor; diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index d2c6354e91b8..33c6dd24012a 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -405,6 +405,7 @@ public class LocationManagerService extends ILocationManager.Stub { // initialize in-memory settings values onBackgroundThrottleWhitelistChangedLocked(); + onIgnoreSettingsWhitelistChangedLocked(); } @GuardedBy("mLock") @@ -547,18 +548,17 @@ public class LocationManagerService extends ILocationManager.Stub { @GuardedBy("mLock") private void onBackgroundThrottleWhitelistChangedLocked() { + mBackgroundThrottlePackageWhitelist.clear(); + mBackgroundThrottlePackageWhitelist.addAll( + SystemConfig.getInstance().getAllowUnthrottledLocation()); + String setting = Settings.Global.getString( mContext.getContentResolver(), Settings.Global.LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST); - if (setting == null) { - setting = ""; + if (!TextUtils.isEmpty(setting)) { + mBackgroundThrottlePackageWhitelist.addAll(Arrays.asList(setting.split(","))); } - mBackgroundThrottlePackageWhitelist.clear(); - mBackgroundThrottlePackageWhitelist.addAll( - SystemConfig.getInstance().getAllowUnthrottledLocation()); - mBackgroundThrottlePackageWhitelist.addAll(Arrays.asList(setting.split(","))); - for (LocationProvider p : mProviders) { applyRequirementsLocked(p); } @@ -566,18 +566,17 @@ public class LocationManagerService extends ILocationManager.Stub { @GuardedBy("lock") private void onIgnoreSettingsWhitelistChangedLocked() { + mIgnoreSettingsPackageWhitelist.clear(); + mIgnoreSettingsPackageWhitelist.addAll( + SystemConfig.getInstance().getAllowIgnoreLocationSettings()); + String setting = Settings.Global.getString( mContext.getContentResolver(), Settings.Global.LOCATION_IGNORE_SETTINGS_PACKAGE_WHITELIST); - if (setting == null) { - setting = ""; + if (!TextUtils.isEmpty(setting)) { + mIgnoreSettingsPackageWhitelist.addAll(Arrays.asList(setting.split(","))); } - mIgnoreSettingsPackageWhitelist.clear(); - mIgnoreSettingsPackageWhitelist.addAll( - SystemConfig.getInstance().getAllowIgnoreLocationSettings()); - mIgnoreSettingsPackageWhitelist.addAll(Arrays.asList(setting.split(","))); - for (LocationProvider p : mProviders) { applyRequirementsLocked(p); } @@ -2200,7 +2199,7 @@ public class LocationManagerService extends ILocationManager.Stub { return false; } - if (mBackgroundThrottlePackageWhitelist.contains(record.mReceiver.mIdentity.mPackageName)) { + if (mIgnoreSettingsPackageWhitelist.contains(record.mReceiver.mIdentity.mPackageName)) { return true; } diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index b3997ef2b54f..f505b76178a4 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -62,7 +62,7 @@ import android.net.NetworkUtils; import android.net.RouteInfo; import android.net.TetherStatsParcel; import android.net.UidRange; -import android.net.shared.NetdService; +import android.net.util.NetdService; import android.os.BatteryStats; import android.os.Binder; import android.os.Handler; diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java index 84577f125f1d..4507193a5aff 100644 --- a/services/core/java/com/android/server/PackageWatchdog.java +++ b/services/core/java/com/android/server/PackageWatchdog.java @@ -21,6 +21,7 @@ import static java.lang.annotation.RetentionPolicy.SOURCE; import android.annotation.IntDef; import android.annotation.Nullable; import android.content.Context; +import android.content.pm.VersionedPackage; import android.os.Environment; import android.os.Handler; import android.os.Looper; @@ -230,7 +231,6 @@ public class PackageWatchdog { return null; } - // TODO(zezeozue:) Accept current versionCodes of failing packages? /** * Called when a process fails either due to a crash or ANR. * @@ -239,15 +239,16 @@ public class PackageWatchdog { * * <p>This method could be called frequently if there is a severe problem on the device. */ - public void onPackageFailure(String[] packages) { + public void onPackageFailure(List<VersionedPackage> packages) { mWorkerHandler.post(() -> { synchronized (mLock) { if (mAllObservers.isEmpty()) { return; } - for (int pIndex = 0; pIndex < packages.length; pIndex++) { - String packageToReport = packages[pIndex]; + for (int pIndex = 0; pIndex < packages.size(); pIndex++) { + String packageToReport = packages.get(pIndex).getPackageName(); + long packageVersionCode = packages.get(pIndex).getVersionCode(); // Observer that will receive failure for packageToReport PackageHealthObserver currentObserverToNotify = null; int currentObserverImpact = Integer.MAX_VALUE; @@ -258,7 +259,8 @@ public class PackageWatchdog { PackageHealthObserver registeredObserver = observer.mRegisteredObserver; if (registeredObserver != null && observer.onPackageFailure(packageToReport)) { - int impact = registeredObserver.onHealthCheckFailed(packageToReport); + int impact = registeredObserver.onHealthCheckFailed(packageToReport, + packageVersionCode); if (impact != PackageHealthObserverImpact.USER_IMPACT_NONE && impact < currentObserverImpact) { currentObserverToNotify = registeredObserver; @@ -269,7 +271,7 @@ public class PackageWatchdog { // Execute action with least user impact if (currentObserverToNotify != null) { - currentObserverToNotify.execute(packageToReport); + currentObserverToNotify.execute(packageToReport, packageVersionCode); } } } @@ -313,14 +315,14 @@ public class PackageWatchdog { * @return any one of {@link PackageHealthObserverImpact} to express the impact * to the user on {@link #execute} */ - @PackageHealthObserverImpact int onHealthCheckFailed(String packageName); + @PackageHealthObserverImpact int onHealthCheckFailed(String packageName, long versionCdoe); /** * Executes mitigation for {@link #onHealthCheckFailed}. * * @return {@code true} if action was executed successfully, {@code false} otherwise */ - boolean execute(String packageName); + boolean execute(String packageName, long versionCode); // TODO(zezeozue): Ensure uniqueness? /** diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index cecd55a325d3..f2329d3ebf8e 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -1541,10 +1541,6 @@ class StorageManagerService extends IStorageManager.Stub mCallbacks = new Callbacks(FgThread.get().getLooper()); mLockPatternUtils = new LockPatternUtils(mContext); - mPmInternal = LocalServices.getService(PackageManagerInternal.class); - mUmInternal = LocalServices.getService(UserManagerInternal.class); - mAmInternal = LocalServices.getService(ActivityManagerInternal.class); - HandlerThread hthread = new HandlerThread(TAG); hthread.start(); mHandler = new StorageManagerServiceHandler(hthread.getLooper()); @@ -1662,6 +1658,19 @@ class StorageManagerService extends IStorageManager.Stub } private void servicesReady() { + mPmInternal = LocalServices.getService(PackageManagerInternal.class); + mUmInternal = LocalServices.getService(UserManagerInternal.class); + mAmInternal = LocalServices.getService(ActivityManagerInternal.class); + + mIPackageManager = IPackageManager.Stub.asInterface( + ServiceManager.getService("package")); + mIAppOpsService = IAppOpsService.Stub.asInterface( + ServiceManager.getService(Context.APP_OPS_SERVICE)); + try { + mIAppOpsService.startWatchingMode(OP_REQUEST_INSTALL_PACKAGES, null, mAppOpsCallback); + } catch (RemoteException e) { + } + synchronized (mLock) { final boolean thisIsolatedStorage = StorageManager.hasIsolatedStorage(); if (mLastIsolatedStorage == thisIsolatedStorage) { @@ -1734,14 +1743,6 @@ class StorageManagerService extends IStorageManager.Stub .registerScreenObserver(this); mSystemReady = true; - mIPackageManager = IPackageManager.Stub.asInterface( - ServiceManager.getService("package")); - mIAppOpsService = IAppOpsService.Stub.asInterface( - ServiceManager.getService(Context.APP_OPS_SERVICE)); - try { - mIAppOpsService.startWatchingMode(OP_REQUEST_INSTALL_PACKAGES, null, mAppOpsCallback); - } catch (RemoteException e) { - } mHandler.obtainMessage(H_SYSTEM_READY).sendToTarget(); } diff --git a/services/core/java/com/android/server/ThreadPriorityBooster.java b/services/core/java/com/android/server/ThreadPriorityBooster.java index 53e8ce43fff8..f74a438509c2 100644 --- a/services/core/java/com/android/server/ThreadPriorityBooster.java +++ b/services/core/java/com/android/server/ThreadPriorityBooster.java @@ -43,9 +43,9 @@ public class ThreadPriorityBooster { public void boost() { final int tid = myTid(); - final int prevPriority = getThreadPriority(tid); final PriorityState state = mThreadState.get(); if (state.regionCounter == 0) { + final int prevPriority = getThreadPriority(tid); state.prevPriority = prevPriority; if (prevPriority > mBoostToPriority) { setThreadPriority(tid, mBoostToPriority); @@ -60,9 +60,11 @@ public class ThreadPriorityBooster { public void reset() { final PriorityState state = mThreadState.get(); state.regionCounter--; - final int currentPriority = getThreadPriority(myTid()); - if (state.regionCounter == 0 && state.prevPriority != currentPriority) { - setThreadPriority(myTid(), state.prevPriority); + if (state.regionCounter == 0) { + final int currentPriority = getThreadPriority(myTid()); + if (state.prevPriority != currentPriority) { + setThreadPriority(myTid(), state.prevPriority); + } } } @@ -77,9 +79,11 @@ public class ThreadPriorityBooster { mBoostToPriority = priority; final PriorityState state = mThreadState.get(); final int tid = myTid(); - final int prevPriority = getThreadPriority(tid); - if (state.regionCounter != 0 && prevPriority != priority) { - setThreadPriority(tid, priority); + if (state.regionCounter != 0) { + final int prevPriority = getThreadPriority(tid); + if (prevPriority != priority) { + setThreadPriority(tid, priority); + } } } diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index f6e698ff7839..9b9911a476ca 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -593,7 +593,7 @@ public class VibratorService extends IVibratorService.Stub Vibration vib = new Vibration(token, effect, usageHint, uid, opPkg, reason); if (mProcStatesCache.get(uid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND - && vib.isHapticFeedback()) { + && !vib.isNotification() && !vib.isRingtone()) { Slog.e(TAG, "Ignoring incoming vibration as process with uid = " + uid + " is background"); return; diff --git a/services/core/java/com/android/server/am/ActiveInstrumentation.java b/services/core/java/com/android/server/am/ActiveInstrumentation.java index 15de3def913a..9510f594785a 100644 --- a/services/core/java/com/android/server/am/ActiveInstrumentation.java +++ b/services/core/java/com/android/server/am/ActiveInstrumentation.java @@ -49,6 +49,9 @@ class ActiveInstrumentation { // Connection to use the UI introspection APIs. IUiAutomationConnection mUiAutomationConnection; + // Whether the caller holds START_ACTIVITIES_FROM_BACKGROUND permission + boolean mHasBackgroundActivityStartsPermission; + // As given to us Bundle mArguments; @@ -117,6 +120,8 @@ class ActiveInstrumentation { pw.print(prefix); pw.print("mUiAutomationConnection="); pw.println(mUiAutomationConnection); } + pw.print("mHasBackgroundActivityStartsPermission="); + pw.println(mHasBackgroundActivityStartsPermission); pw.print(prefix); pw.print("mArguments="); pw.println(mArguments); } diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 15d7efb5a74a..d95604e91ca3 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -3318,8 +3318,7 @@ public final class ActiveServices { } private boolean collectPackageServicesLocked(String packageName, Set<String> filterByClasses, - boolean evenPersistent, boolean doit, boolean killProcess, - ArrayMap<ComponentName, ServiceRecord> services) { + boolean evenPersistent, boolean doit, ArrayMap<ComponentName, ServiceRecord> services) { boolean didSomething = false; for (int i = services.size() - 1; i >= 0; i--) { ServiceRecord service = services.valueAt(i); @@ -3334,13 +3333,10 @@ public final class ActiveServices { } didSomething = true; Slog.i(TAG, " Force stopping service " + service); - if (service.app != null) { - service.app.removed = killProcess; - if (!service.app.isPersistent()) { - service.app.services.remove(service); - if (service.whitelistManager) { - updateWhitelistManagerLocked(service.app); - } + if (service.app != null && !service.app.isPersistent()) { + service.app.services.remove(service); + if (service.whitelistManager) { + updateWhitelistManagerLocked(service.app); } } service.setProcess(null); @@ -3355,7 +3351,7 @@ public final class ActiveServices { } boolean bringDownDisabledPackageServicesLocked(String packageName, Set<String> filterByClasses, - int userId, boolean evenPersistent, boolean killProcess, boolean doit) { + int userId, boolean evenPersistent, boolean doit) { boolean didSomething = false; if (mTmpCollectionResults != null) { @@ -3365,8 +3361,7 @@ public final class ActiveServices { if (userId == UserHandle.USER_ALL) { for (int i = mServiceMap.size() - 1; i >= 0; i--) { didSomething |= collectPackageServicesLocked(packageName, filterByClasses, - evenPersistent, doit, killProcess, - mServiceMap.valueAt(i).mServicesByInstanceName); + evenPersistent, doit, mServiceMap.valueAt(i).mServicesByInstanceName); if (!doit && didSomething) { return true; } @@ -3379,7 +3374,7 @@ public final class ActiveServices { if (smap != null) { ArrayMap<ComponentName, ServiceRecord> items = smap.mServicesByInstanceName; didSomething = collectPackageServicesLocked(packageName, filterByClasses, - evenPersistent, doit, killProcess, items); + evenPersistent, doit, items); } if (doit && filterByClasses == null) { forceStopPackageLocked(packageName, userId); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index ffed2e08b583..66e9eb3a33ba 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -22,6 +22,7 @@ import static android.Manifest.permission.FILTER_EVENTS; import static android.Manifest.permission.INTERACT_ACROSS_USERS; import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static android.Manifest.permission.REMOVE_TASKS; +import static android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND; import static android.app.ActivityManager.INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS; import static android.app.ActivityManager.INSTR_FLAG_MOUNT_EXTERNAL_STORAGE_FULL; import static android.app.ActivityManager.PROCESS_STATE_LAST_ACTIVITY; @@ -2217,7 +2218,7 @@ public class ActivityManagerService extends IActivityManager.Stub mConstants = hasHandlerThread ? new ActivityManagerConstants(this, mHandler) : null; final ActiveUids activeUids = new ActiveUids(this, false /* postChangesToAtm */); mProcessList.init(this, activeUids); - mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids); + mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids, new Object()); mIntentFirewall = hasHandlerThread ? new IntentFirewall(new IntentFirewallInterface(), mHandler) : null; @@ -2265,7 +2266,7 @@ public class ActivityManagerService extends IActivityManager.Stub mConstants = new ActivityManagerConstants(this, mHandler); final ActiveUids activeUids = new ActiveUids(this, true /* postChangesToAtm */); mProcessList.init(this, activeUids); - mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids); + mOomAdjuster = new OomAdjuster(this, mProcessList, activeUids, atm.getGlobalLock()); // Broadcast policy parameters final BroadcastConstants foreConstants = new BroadcastConstants( @@ -3091,7 +3092,7 @@ public class ActivityManagerService extends IActivityManager.Stub } else { UidRecord validateUid = mValidateUids.get(item.uid); if (validateUid == null) { - validateUid = new UidRecord(item.uid, mAtmInternal); + validateUid = new UidRecord(item.uid); mValidateUids.put(item.uid, validateUid); } if ((item.change & UidRecord.CHANGE_IDLE) != 0) { @@ -3891,7 +3892,7 @@ public class ActivityManagerService extends IActivityManager.Stub } synchronized (this) { mProcessList.killPackageProcessesLocked(packageName, appId, targetUserId, - ProcessList.SERVICE_ADJ, false, true, true, false, "kill background"); + ProcessList.SERVICE_ADJ, "kill background"); } } } finally { @@ -4252,7 +4253,7 @@ public class ActivityManagerService extends IActivityManager.Stub } private void cleanupDisabledPackageComponentsLocked( - String packageName, int userId, boolean killProcess, String[] changedClasses) { + String packageName, int userId, String[] changedClasses) { Set<String> disabledClasses = null; boolean packageDisabled = false; @@ -4315,7 +4316,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Clean-up disabled services. mServices.bringDownDisabledPackageServicesLocked( - packageName, disabledClasses, userId, false, killProcess, true); + packageName, disabledClasses, userId, false /* evenPersistent */, true /* doIt */); // Clean-up disabled providers. ArrayList<ContentProviderRecord> providers = new ArrayList<>(); @@ -4372,14 +4373,15 @@ public class ActivityManagerService extends IActivityManager.Stub } boolean didSomething = mProcessList.killPackageProcessesLocked(packageName, appId, userId, - ProcessList.INVALID_ADJ, callerWillRestart, true, doit, evenPersistent, + ProcessList.INVALID_ADJ, callerWillRestart, true /* allowRestart */, doit, + evenPersistent, true /* setRemoved */, packageName == null ? ("stop user " + userId) : ("stop " + packageName)); didSomething |= mAtmInternal.onForceStopPackage(packageName, doit, evenPersistent, userId); if (mServices.bringDownDisabledPackageServicesLocked( - packageName, null, userId, evenPersistent, true, doit)) { + packageName, null /* filterByClasses */, userId, evenPersistent, doit)) { if (!doit) { return true; } @@ -8336,9 +8338,10 @@ public class ActivityManagerService extends IActivityManager.Stub synchronized (this) { final long identity = Binder.clearCallingIdentity(); try { - mProcessList.killPackageProcessesLocked(null, appId, userId, - ProcessList.PERSISTENT_PROC_ADJ, false, true, true, true, - reason != null ? reason : "kill uid"); + mProcessList.killPackageProcessesLocked(null /* packageName */, appId, userId, + ProcessList.PERSISTENT_PROC_ADJ, false /* callerWillRestart */, + true /* callerWillRestart */, true /* doit */, true /* evenPersistent */, + false /* setRemoved */, reason != null ? reason : "kill uid"); } finally { Binder.restoreCallingIdentity(identity); } @@ -14573,10 +14576,9 @@ public class ActivityManagerService extends IActivityManager.Stub -1); mProcessList.killPackageProcessesLocked(ssp, UserHandle.getAppId(extraUid), - userId, ProcessList.INVALID_ADJ, - false, true, true, false, "change " + ssp); + userId, ProcessList.INVALID_ADJ, "change " + ssp); } - cleanupDisabledPackageComponentsLocked(ssp, userId, killProcess, + cleanupDisabledPackageComponentsLocked(ssp, userId, intent.getStringArrayExtra( Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST)); } @@ -15194,7 +15196,9 @@ public class ActivityManagerService extends IActivityManager.Stub IInstrumentationWatcher watcher, IUiAutomationConnection uiAutomationConnection, int userId, String abiOverride) { enforceNotIsolatedCaller("startInstrumentation"); - userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), + final int callingUid = Binder.getCallingUid(); + final int callingPid = Binder.getCallingPid(); + userId = mUserController.handleIncomingUser(callingPid, callingUid, userId, false, ALLOW_FULL_ONLY, "startInstrumentation", null); // Refuse possible leaked file descriptors if (arguments != null && arguments.hasFileDescriptors()) { @@ -15259,6 +15263,9 @@ public class ActivityManagerService extends IActivityManager.Stub activeInstr.mWatcher = watcher; activeInstr.mUiAutomationConnection = uiAutomationConnection; activeInstr.mResultClass = className; + activeInstr.mHasBackgroundActivityStartsPermission = checkPermission( + START_ACTIVITIES_FROM_BACKGROUND, callingPid, callingUid) + == PackageManager.PERMISSION_GRANTED; boolean disableHiddenApiChecks = ai.usesNonSdkApi() || (flags & INSTR_FLAG_DISABLE_HIDDEN_API_CHECKS) != 0; @@ -17232,10 +17239,8 @@ public class ActivityManagerService extends IActivityManager.Stub // We don't kill persistent processes. continue; } - if (app.removed) { - procs.add(app); - } else if (app.userId == userHandle && app.hasForegroundActivities()) { - app.removed = true; + if (app.removed + || (app.userId == userHandle && app.hasForegroundActivities())) { procs.add(app); } } @@ -18080,8 +18085,7 @@ public class ActivityManagerService extends IActivityManager.Stub try { synchronized(this) { mProcessList.killPackageProcessesLocked(packageName, UserHandle.getAppId(pkgUid), - userId, ProcessList.FOREGROUND_APP_ADJ, false, true, true, false, - "dep: " + packageName); + userId, ProcessList.FOREGROUND_APP_ADJ, "dep: " + packageName); } } finally { Binder.restoreCallingIdentity(callingId); diff --git a/services/core/java/com/android/server/am/AppCompactor.java b/services/core/java/com/android/server/am/AppCompactor.java index bb55ec3100c0..1118014dab96 100644 --- a/services/core/java/com/android/server/am/AppCompactor.java +++ b/services/core/java/com/android/server/am/AppCompactor.java @@ -19,6 +19,7 @@ package com.android.server.am; import static android.os.Process.THREAD_PRIORITY_FOREGROUND; import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_1; import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_2; +import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_STATSD_SAMPLE_RATE; import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_1; import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_2; import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_3; @@ -45,6 +46,7 @@ import com.android.server.ServiceThread; import java.io.FileOutputStream; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Random; public final class AppCompactor { @@ -65,6 +67,8 @@ public final class AppCompactor { @VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_2 = 10_000; @VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_3 = 500; @VisibleForTesting static final long DEFAULT_COMPACT_THROTTLE_4 = 10_000; + // The sampling rate to push app compaction events into statsd for upload. + @VisibleForTesting static final float DEFAULT_STATSD_SAMPLE_RATE = 0.1f; @VisibleForTesting interface PropertyChangedCallbackForTest { @@ -104,6 +108,8 @@ public final class AppCompactor { || KEY_COMPACT_THROTTLE_3.equals(name) || KEY_COMPACT_THROTTLE_4.equals(name)) { updateCompactionThrottles(); + } else if (KEY_COMPACT_STATSD_SAMPLE_RATE.equals(name)) { + updateStatsdSampleRate(); } } if (mTestCallback != null) { @@ -116,21 +122,25 @@ public final class AppCompactor { // Configured by phenotype. Updates from the server take effect immediately. @GuardedBy("mPhenotypeFlagLock") - @VisibleForTesting String mCompactActionSome = + @VisibleForTesting volatile String mCompactActionSome = compactActionIntToString(DEFAULT_COMPACT_ACTION_1); @GuardedBy("mPhenotypeFlagLock") - @VisibleForTesting String mCompactActionFull = + @VisibleForTesting volatile String mCompactActionFull = compactActionIntToString(DEFAULT_COMPACT_ACTION_2); @GuardedBy("mPhenotypeFlagLock") - @VisibleForTesting long mCompactThrottleSomeSome = DEFAULT_COMPACT_THROTTLE_1; + @VisibleForTesting volatile long mCompactThrottleSomeSome = DEFAULT_COMPACT_THROTTLE_1; @GuardedBy("mPhenotypeFlagLock") - @VisibleForTesting long mCompactThrottleSomeFull = DEFAULT_COMPACT_THROTTLE_2; + @VisibleForTesting volatile long mCompactThrottleSomeFull = DEFAULT_COMPACT_THROTTLE_2; @GuardedBy("mPhenotypeFlagLock") - @VisibleForTesting long mCompactThrottleFullSome = DEFAULT_COMPACT_THROTTLE_3; + @VisibleForTesting volatile long mCompactThrottleFullSome = DEFAULT_COMPACT_THROTTLE_3; @GuardedBy("mPhenotypeFlagLock") - @VisibleForTesting long mCompactThrottleFullFull = DEFAULT_COMPACT_THROTTLE_4; + @VisibleForTesting volatile long mCompactThrottleFullFull = DEFAULT_COMPACT_THROTTLE_4; @GuardedBy("mPhenotypeFlagLock") - private boolean mUseCompaction = DEFAULT_USE_COMPACTION; + private volatile boolean mUseCompaction = DEFAULT_USE_COMPACTION; + + private final Random mRandom = new Random(); + @GuardedBy("mPhenotypeFlagLock") + @VisibleForTesting volatile float mStatsdSampleRate = DEFAULT_STATSD_SAMPLE_RATE; // Handler on which compaction runs. private Handler mCompactionHandler; @@ -158,6 +168,7 @@ public final class AppCompactor { updateUseCompaction(); updateCompactionActions(); updateCompactionThrottles(); + updateStatsdSampleRate(); } } @@ -181,6 +192,7 @@ public final class AppCompactor { pw.println(" " + KEY_COMPACT_THROTTLE_2 + "=" + mCompactThrottleSomeFull); pw.println(" " + KEY_COMPACT_THROTTLE_3 + "=" + mCompactThrottleFullSome); pw.println(" " + KEY_COMPACT_THROTTLE_4 + "=" + mCompactThrottleFullFull); + pw.println(" " + KEY_COMPACT_STATSD_SAMPLE_RATE + "=" + mStatsdSampleRate); } } @@ -289,6 +301,19 @@ public final class AppCompactor { } } + @GuardedBy("mPhenotypeFlagLock") + private void updateStatsdSampleRate() { + String sampleRateFlag = DeviceConfig.getProperty(DeviceConfig.ActivityManager.NAMESPACE, + KEY_COMPACT_STATSD_SAMPLE_RATE); + try { + mStatsdSampleRate = TextUtils.isEmpty(sampleRateFlag) + ? DEFAULT_STATSD_SAMPLE_RATE : Float.parseFloat(sampleRateFlag); + } catch (NumberFormatException e) { + mStatsdSampleRate = DEFAULT_STATSD_SAMPLE_RATE; + } + mStatsdSampleRate = Math.min(1.0f, Math.max(0.0f, mStatsdSampleRate)); + } + @VisibleForTesting static String compactActionIntToString(int action) { switch(action) { @@ -385,11 +410,16 @@ public final class AppCompactor { rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3], rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time, lastCompactAction, lastCompactTime, msg.arg1, msg.arg2); - StatsLog.write(StatsLog.APP_COMPACTED, pid, name, pendingAction, - rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3], - rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time, - lastCompactAction, lastCompactTime, msg.arg1, - ActivityManager.processStateAmToProto(msg.arg2)); + // Note that as above not taking mPhenoTypeFlagLock here to avoid locking + // on every single compaction for a flag that will seldom change and the + // impact of reading the wrong value here is low. + if (mRandom.nextFloat() < mStatsdSampleRate) { + StatsLog.write(StatsLog.APP_COMPACTED, pid, name, pendingAction, + rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3], + rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time, + lastCompactAction, lastCompactTime, msg.arg1, + ActivityManager.processStateAmToProto(msg.arg2)); + } synchronized (mAm) { proc.lastCompactTime = end; proc.lastCompactAction = pendingAction; diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index a634b577f506..f153ab9cfa9e 100644 --- a/services/core/java/com/android/server/am/AppErrors.java +++ b/services/core/java/com/android/server/am/AppErrors.java @@ -34,6 +34,7 @@ import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; +import android.content.pm.VersionedPackage; import android.net.Uri; import android.os.Binder; import android.os.Message; @@ -60,6 +61,7 @@ import com.android.server.wm.WindowProcessController; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.Collections; +import java.util.List; /** * Controls error conditions in applications. @@ -411,7 +413,7 @@ class AppErrors { } else { // If a non-persistent app is stuck in crash loop, we want to inform // the package watchdog, maybe an update or experiment can be rolled back. - mPackageWatchdog.onPackageFailure(r.getPackageList()); + mPackageWatchdog.onPackageFailure(r.getPackageListWithVersionCode()); } } @@ -830,7 +832,7 @@ class AppErrors { void handleShowAnrUi(Message msg) { Dialog dialogToShow = null; - String[] packageList = null; + List<VersionedPackage> packageList = null; synchronized (mService) { AppNotRespondingDialog.Data data = (AppNotRespondingDialog.Data) msg.obj; final ProcessRecord proc = data.proc; @@ -839,7 +841,7 @@ class AppErrors { return; } if (!proc.isPersistent()) { - packageList = proc.getPackageList(); + packageList = proc.getPackageListWithVersionCode(); } if (proc.anrDialog != null) { Slog.e(TAG, "App already has anr dialog: " + proc); diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 64a36ef66f12..1fb11baab2e4 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -450,7 +450,7 @@ public final class BroadcastQueue { if (state == BroadcastRecord.IDLE) { Slog.w(TAG, "finishReceiver [" + mQueueName + "] called but state is IDLE"); } - if (r.allowBackgroundActivityStarts) { + if (r.allowBackgroundActivityStarts && r.curApp != null) { r.curApp.removeAllowBackgroundActivityStartsToken(r); } // If we're abandoning this broadcast before any receivers were actually spun up, diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 6e8646e476b3..4985c52ea118 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -127,8 +127,18 @@ public final class OomAdjuster { private final ActivityManagerService mService; private final ProcessList mProcessList; - OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids) { + /** + * Used to lock {@link #updateOomAdjImpl} for state consistency. It also reduces frequency lock + * and unlock when getting and setting value to {@link ProcessRecord#mWindowProcessController}. + * Note it is declared as Object type so the locked-region-code-injection won't wrap the + * unnecessary priority booster. + */ + private final Object mAtmGlobalLock; + + OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids, + Object atmGlobalLock) { mService = service; + mAtmGlobalLock = atmGlobalLock; mProcessList = processList; mActiveUids = activeUids; @@ -186,6 +196,13 @@ public final class OomAdjuster { @GuardedBy("mService") final void updateOomAdjLocked() { + synchronized (mAtmGlobalLock) { + updateOomAdjImpl(); + } + } + + @GuardedBy({"mService", "mAtmGlobalLock"}) + private void updateOomAdjImpl() { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "updateOomAdj"); mService.mOomAdjProfiler.oomAdjStarted(); final ProcessRecord TOP_APP = mService.getTopAppLocked(); @@ -534,6 +551,7 @@ public final class OomAdjuster { uidRec.setProcState = uidRec.getCurProcState(); uidRec.setWhitelist = uidRec.curWhitelist; uidRec.setIdle = uidRec.idle; + mService.mAtmInternal.onUidProcStateChanged(uidRec.uid, uidRec.setProcState); mService.enqueueUidChangeLocked(uidRec, -1, uidChange); mService.noteUidProcessState(uidRec.uid, uidRec.getCurProcState()); if (uidRec.foregroundServices) { diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index c2e77633510c..49c4bc486d2e 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -2043,25 +2043,25 @@ public final class ProcessList { // We don't kill persistent processes. continue; } - if (app.removed) { - procs.add(app); - } else if (app.setAdj >= ProcessList.CACHED_APP_MIN_ADJ) { - app.removed = true; + if (app.removed || app.setAdj >= ProcessList.CACHED_APP_MIN_ADJ) { procs.add(app); } } } + } - final int N = procs.size(); - for (int i = 0; i < N; i++) { - removeProcessLocked(procs.get(i), false, true, "kill all background"); - } + @GuardedBy("mService") + boolean killPackageProcessesLocked(String packageName, int appId, int userId, int minOomAdj, + String reason) { + return killPackageProcessesLocked(packageName, appId, userId, minOomAdj, + false /* callerWillRestart */, true /* allowRestart */, true /* doit */, + false /* evenPersistent */, false /* setRemoved */, reason); } @GuardedBy("mService") final boolean killPackageProcessesLocked(String packageName, int appId, int userId, int minOomAdj, boolean callerWillRestart, boolean allowRestart, - boolean doit, boolean evenPersistent, String reason) { + boolean doit, boolean evenPersistent, boolean setRemoved, String reason) { ArrayList<ProcessRecord> procs = new ArrayList<>(); // Remove all processes this package may have touched: all with the @@ -2119,7 +2119,9 @@ public final class ProcessList { if (!doit) { return true; } - app.removed = true; + if (setRemoved) { + app.removed = true; + } procs.add(app); } } @@ -2195,7 +2197,7 @@ public final class ProcessList { } UidRecord uidRec = mActiveUids.get(proc.uid); if (uidRec == null) { - uidRec = new UidRecord(proc.uid, mService.mAtmInternal); + uidRec = new UidRecord(proc.uid); // This is the first appearance of the uid, report it now! if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS, "Creating new process uid: " + uidRec); @@ -2353,11 +2355,8 @@ public final class ProcessList { final int NA = apps.size(); for (int ia = 0; ia < NA; ia++) { final ProcessRecord app = apps.valueAt(ia); - if (app.removed) { - procs.add(app); - } else if ((minTargetSdk < 0 || app.info.targetSdkVersion < minTargetSdk) - && (maxProcState < 0 || app.setProcState > maxProcState)) { - app.removed = true; + if (app.removed || ((minTargetSdk < 0 || app.info.targetSdkVersion < minTargetSdk) + && (maxProcState < 0 || app.setProcState > maxProcState))) { procs.add(app); } } diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 7e524631fcfe..6161f7d0a239 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -32,6 +32,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.ServiceInfo; +import android.content.pm.VersionedPackage; import android.content.res.CompatibilityInfo; import android.os.Binder; import android.os.Debug; @@ -66,6 +67,7 @@ import java.io.File; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; /** * Full information about a particular process that @@ -266,7 +268,9 @@ final class ProcessRecord implements WindowProcessListener { boolean forceCrashReport; // suppress normal auto-dismiss of crash dialog & report UI? private boolean mNotResponding; // does the app have a not responding dialog? Dialog anrDialog; // dialog being displayed due to app not resp. - boolean removed; // has app package been removed from device? + volatile boolean removed; // Whether this process should be killed and removed from process + // list. It is set when the package is force-stopped or the process + // has crashed too many times. private boolean mDebugging; // was app launched for debugging? boolean waitedForDebugger; // has process show wait for debugger dialog? Dialog waitDialog; // current wait for debugger dialog @@ -651,10 +655,6 @@ final class ProcessRecord implements WindowProcessListener { return mWindowProcessController.hasActivities(); } - void clearActivities() { - mWindowProcessController.clearActivities(); - } - boolean hasActivitiesOrRecentTasks() { return mWindowProcessController.hasActivitiesOrRecentTasks(); } @@ -663,10 +663,6 @@ final class ProcessRecord implements WindowProcessListener { return mWindowProcessController.hasRecentTasks(); } - void clearRecentTasks() { - mWindowProcessController.clearRecentTasks(); - } - /** * This method returns true if any of the activities within the process record are interesting * to the user. See HistoryRecord.isInterestingToUserLocked() @@ -972,6 +968,18 @@ final class ProcessRecord implements WindowProcessListener { return list; } + public List<VersionedPackage> getPackageListWithVersionCode() { + int size = pkgList.size(); + if (size == 0) { + return null; + } + List<VersionedPackage> list = new ArrayList<>(); + for (int i = 0; i < pkgList.size(); i++) { + list.add(new VersionedPackage(pkgList.keyAt(i), pkgList.valueAt(i).appVersion)); + } + return list; + } + WindowProcessController getWindowProcessController() { return mWindowProcessController; } @@ -1165,6 +1173,8 @@ final class ProcessRecord implements WindowProcessListener { void setActiveInstrumentation(ActiveInstrumentation instr) { mInstr = instr; mWindowProcessController.setInstrumenting(instr != null); + mWindowProcessController.setInstrumentingWithBackgroundActivityStartPrivileges(instr != null + && instr.mHasBackgroundActivityStartsPermission); } ActiveInstrumentation getActiveInstrumentation() { @@ -1236,10 +1246,8 @@ final class ProcessRecord implements WindowProcessListener { } @Override - public void setRemoved(boolean removed) { - synchronized (mService) { - this.removed = removed; - } + public boolean isRemoved() { + return removed; } /** diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java index 5c6090030f74..e731f345b704 100644 --- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java +++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java @@ -77,6 +77,7 @@ class SettingsToPropertiesMapper { // permission in the corresponding .te file your feature belongs to. @VisibleForTesting static final String[] sDeviceConfigScopes = new String[] { + DeviceConfig.ActivityManagerNativeBoot.NAMESPACE, DeviceConfig.NAMESPACE_INPUT_NATIVE_BOOT, DeviceConfig.NAMESPACE_NETD_NATIVE, DeviceConfig.RuntimeNative.NAMESPACE, diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java index 6cb1097c7ddf..22a7de74cc38 100644 --- a/services/core/java/com/android/server/am/UidRecord.java +++ b/services/core/java/com/android/server/am/UidRecord.java @@ -26,7 +26,6 @@ import android.util.proto.ProtoOutputStream; import android.util.proto.ProtoUtils; import com.android.internal.annotations.GuardedBy; -import com.android.server.wm.ActivityTaskManagerInternal; /** * Overall information about a uid that has actively running processes. @@ -43,7 +42,6 @@ public final class UidRecord { boolean idle; boolean setIdle; int numProcs; - final ActivityTaskManagerInternal mAtmInternal; /** * Sequence number associated with the {@link #mCurProcState}. This is incremented using @@ -117,10 +115,9 @@ public final class UidRecord { ChangeItem pendingChange; int lastReportedChange; - public UidRecord(int _uid, ActivityTaskManagerInternal atmInternal) { + public UidRecord(int _uid) { uid = _uid; idle = true; - mAtmInternal = atmInternal; reset(); } @@ -130,9 +127,6 @@ public final class UidRecord { public void setCurProcState(int curProcState) { mCurProcState = curProcState; - if (mAtmInternal != null) { - mAtmInternal.onUidProcStateChanged(uid, curProcState); - } } public void reset() { diff --git a/services/core/java/com/android/server/attention/AttentionManagerService.java b/services/core/java/com/android/server/attention/AttentionManagerService.java index 5b469fe2dc7a..2061b2681268 100644 --- a/services/core/java/com/android/server/attention/AttentionManagerService.java +++ b/services/core/java/com/android/server/attention/AttentionManagerService.java @@ -16,9 +16,9 @@ package com.android.server.attention; +import static android.provider.DeviceConfig.AttentionManagerService.COMPONENT_NAME; import static android.provider.DeviceConfig.AttentionManagerService.NAMESPACE; -import static android.provider.DeviceConfig.AttentionManagerService.PROPERTY_COMPONENT_NAME; -import static android.provider.DeviceConfig.AttentionManagerService.PROPERTY_SERVICE_ENABLED; +import static android.provider.DeviceConfig.AttentionManagerService.SERVICE_ENABLED; import android.Manifest; import android.annotation.Nullable; @@ -129,7 +129,7 @@ public class AttentionManagerService extends SystemService { } private boolean isServiceEnabled() { - final String enabled = DeviceConfig.getProperty(NAMESPACE, PROPERTY_SERVICE_ENABLED); + final String enabled = DeviceConfig.getProperty(NAMESPACE, SERVICE_ENABLED); return enabled == null ? DEFAULT_SERVICE_ENABLED : "true".equals(enabled); } @@ -279,7 +279,7 @@ public class AttentionManagerService extends SystemService { * system. */ private static ComponentName resolveAttentionService(Context context) { - final String flag = DeviceConfig.getProperty(NAMESPACE, PROPERTY_COMPONENT_NAME); + final String flag = DeviceConfig.getProperty(NAMESPACE, COMPONENT_NAME); final String componentNameString = flag != null ? flag : context.getString( R.string.config_defaultAttentionService); diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index d652f93ccf04..deaa9313fadd 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -600,7 +600,7 @@ import java.util.ArrayList; break; case MSG_IL_SET_A2DP_SINK_CONNECTION_STATE: mDeviceInventory.onSetA2dpSinkConnectionState( - (BtHelper.BluetoothA2dpDeviceInfo) msg.obj, msg.arg1, msg.arg2); + (BtHelper.BluetoothA2dpDeviceInfo) msg.obj, msg.arg1); break; case MSG_IL_SET_A2DP_SOURCE_CONNECTION_STATE: mDeviceInventory.onSetA2dpSourceConnectionState( diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index eb76e6e02edc..97649a741f62 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -147,18 +147,20 @@ public final class AudioDeviceInventory { } /*package*/ void onSetA2dpSinkConnectionState(@NonNull BtHelper.BluetoothA2dpDeviceInfo btInfo, - @AudioService.BtProfileConnectionState int state, int a2dpVolume) { + @AudioService.BtProfileConnectionState int state) { final BluetoothDevice btDevice = btInfo.getBtDevice(); + int a2dpVolume = btInfo.getVolume(); if (AudioService.DEBUG_DEVICES) { Log.d(TAG, "onSetA2dpSinkConnectionState btDevice=" + btDevice + " state=" - + state + " is dock=" + btDevice.isBluetoothDock()); + + state + " is dock=" + btDevice.isBluetoothDock() + " vol=" + a2dpVolume); } String address = btDevice.getAddress(); if (!BluetoothAdapter.checkBluetoothAddress(address)) { address = ""; } AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent( - "A2DP sink connected: device addr=" + address + " state=" + state)); + "A2DP sink connected: device addr=" + address + " state=" + state + + " vol=" + a2dpVolume)); final int a2dpCodec; synchronized (mDeviceBroker.mA2dpAvrcpLock) { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index df33bf249133..1723163a132d 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -392,12 +392,14 @@ public class AudioService extends IAudioService.Stub * e.g. user on homescreen, no app playing anything, presses hardware volume buttons, this * stream type is controlled. */ - protected static final int DEFAULT_VOL_STREAM_NO_PLAYBACK = AudioSystem.STREAM_MUSIC; + protected static final int DEFAULT_VOL_STREAM_NO_PLAYBACK = AudioSystem.STREAM_MUSIC; private final AudioSystem.ErrorCallback mAudioSystemCallback = new AudioSystem.ErrorCallback() { public void onError(int error) { switch (error) { case AudioSystem.AUDIO_STATUS_SERVER_DIED: + mRecordMonitor.clear(); + sendMsg(mAudioHandler, MSG_AUDIO_SERVER_DIED, SENDMSG_NOOP, 0, 0, null, 0); sendMsg(mAudioHandler, MSG_DISPATCH_AUDIO_SERVER_STATE, diff --git a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java index 9d6628cf0c40..b2c7ff3bfdf6 100644 --- a/services/core/java/com/android/server/audio/RecordingActivityMonitor.java +++ b/services/core/java/com/android/server/audio/RecordingActivityMonitor.java @@ -78,24 +78,27 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin updateSnapshot(event, uid, session, source, recordingInfo, portId, silenced, activeSource, clientEffects, effects); if (configsSystem != null){ - synchronized (mClients) { - // list of recording configurations for "public consumption". It is only computed if - // there are non-system recording activity listeners. - final List<AudioRecordingConfiguration> configsPublic = mHasPublicClients ? - anonymizeForPublicConsumption(configsSystem) : - new ArrayList<AudioRecordingConfiguration>(); - final Iterator<RecMonitorClient> clientIterator = mClients.iterator(); - while (clientIterator.hasNext()) { - final RecMonitorClient rmc = clientIterator.next(); - try { - if (rmc.mIsPrivileged) { - rmc.mDispatcherCb.dispatchRecordingConfigChange(configsSystem); - } else { - rmc.mDispatcherCb.dispatchRecordingConfigChange(configsPublic); - } - } catch (RemoteException e) { - Log.w(TAG, "Could not call dispatchRecordingConfigChange() on client", e); + dispatchCallbacks(configsSystem); + } + } + private void dispatchCallbacks(List<AudioRecordingConfiguration> configs) { + synchronized (mClients) { + // list of recording configurations for "public consumption". It is only computed if + // there are non-system recording activity listeners. + final List<AudioRecordingConfiguration> configsPublic = mHasPublicClients + ? anonymizeForPublicConsumption(configs) : + new ArrayList<AudioRecordingConfiguration>(); + final Iterator<RecMonitorClient> clientIterator = mClients.iterator(); + while (clientIterator.hasNext()) { + final RecMonitorClient rmc = clientIterator.next(); + try { + if (rmc.mIsPrivileged) { + rmc.mDispatcherCb.dispatchRecordingConfigChange(configs); + } else { + rmc.mDispatcherCb.dispatchRecordingConfigChange(configsPublic); } + } catch (RemoteException e) { + Log.w(TAG, "Could not call dispatchRecordingConfigChange() on client", e); } } } @@ -130,6 +133,13 @@ public final class RecordingActivityMonitor implements AudioSystem.AudioRecordin AudioSystem.setRecordingCallback(this); } + void clear() { + synchronized (mRecordConfigs) { + mRecordConfigs.clear(); + } + dispatchCallbacks(new ArrayList<AudioRecordingConfiguration>()); + } + void registerRecordingCallback(IRecordingConfigDispatcher rcdb, boolean isPrivileged) { if (rcdb == null) { return; diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index d0cff25dbf05..cd4ce2d142bb 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -235,6 +235,8 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { public final Messenger messenger; public final AsyncChannel asyncChannel; + public final int factorySerialNumber; + // Used by ConnectivityService to keep track of 464xlat. public Nat464Xlat clatd; @@ -252,7 +254,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info, LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler, NetworkMisc misc, ConnectivityService connService, INetd netd, - INetworkManagementService nms) { + INetworkManagementService nms, int factorySerialNumber) { this.messenger = messenger; asyncChannel = ac; network = net; @@ -266,6 +268,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { mContext = context; mHandler = handler; networkMisc = misc; + this.factorySerialNumber = factorySerialNumber; } /** diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 250884431440..7e95f10752bd 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -54,6 +54,7 @@ import android.net.LocalSocketAddress; import android.net.Network; import android.net.NetworkAgent; import android.net.NetworkCapabilities; +import android.net.NetworkFactory; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; import android.net.NetworkMisc; @@ -942,7 +943,8 @@ public class Vpn { try { mNetworkAgent = new NetworkAgent(mLooper, mContext, NETWORKTYPE /* logtag */, mNetworkInfo, mNetworkCapabilities, lp, - ConnectivityConstants.VPN_DEFAULT_SCORE, networkMisc) { + ConnectivityConstants.VPN_DEFAULT_SCORE, networkMisc, + NetworkFactory.SerialNumber.VPN) { @Override public void unwanted() { // We are user controlled, not driven by NetworkRequest. diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index b89768ac4b68..c9df86e83091 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -1241,27 +1241,59 @@ public final class DisplayManagerService extends SystemService { } } + @Nullable + private IBinder getDisplayToken(int displayId) { + synchronized (mSyncRoot) { + final LogicalDisplay display = mLogicalDisplays.get(displayId); + if (display != null) { + final DisplayDevice device = display.getPrimaryDisplayDeviceLocked(); + if (device != null) { + return device.getDisplayTokenLocked(); + } + } + } + + return null; + } + + private boolean screenshotInternal(int displayId, Surface outSurface) { + final IBinder token = getDisplayToken(displayId); + if (token == null) { + return false; + } + SurfaceControl.screenshot(token, outSurface); + return true; + } + @VisibleForTesting DisplayedContentSamplingAttributes getDisplayedContentSamplingAttributesInternal( int displayId) { - IBinder displayToken = SurfaceControl.getBuiltInDisplay(displayId); - return SurfaceControl.getDisplayedContentSamplingAttributes(displayToken); + final IBinder token = getDisplayToken(displayId); + if (token == null) { + return null; + } + return SurfaceControl.getDisplayedContentSamplingAttributes(token); } @VisibleForTesting boolean setDisplayedContentSamplingEnabledInternal( int displayId, boolean enable, int componentMask, int maxFrames) { - IBinder displayToken = SurfaceControl.getBuiltInDisplay(displayId); + final IBinder token = getDisplayToken(displayId); + if (token == null) { + return false; + } return SurfaceControl.setDisplayedContentSamplingEnabled( - displayToken, enable, componentMask, maxFrames); + token, enable, componentMask, maxFrames); } @VisibleForTesting DisplayedContentSample getDisplayedContentSampleInternal(int displayId, long maxFrames, long timestamp) { - IBinder displayToken = SurfaceControl.getBuiltInDisplay(displayId); - return SurfaceControl.getDisplayedContentSample( - displayToken, maxFrames, timestamp); + final IBinder token = getDisplayToken(displayId); + if (token == null) { + return null; + } + return SurfaceControl.getDisplayedContentSample(token, maxFrames, timestamp); } private void clearViewportsLocked() { @@ -2257,20 +2289,7 @@ public final class DisplayManagerService extends SystemService { @Override public boolean screenshot(int displayId, Surface outSurface) { - synchronized (mSyncRoot) { - final LogicalDisplay display = mLogicalDisplays.get(displayId); - if (display != null) { - final DisplayDevice device = display.getPrimaryDisplayDeviceLocked(); - if (device != null) { - final IBinder token = device.getDisplayTokenLocked(); - if (token != null) { - SurfaceControl.screenshot(token, outSurface); - return true; - } - } - } - } - return false; + return screenshotInternal(displayId, outSurface); } @Override diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index db3928ec5fde..2a8462bc03f7 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -592,6 +592,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } public BrightnessConfiguration getDefaultBrightnessConfiguration() { + if (mAutomaticBrightnessController == null) { + return null; + } return mAutomaticBrightnessController.getDefaultConfig(); } diff --git a/services/core/java/com/android/server/dreams/OWNERS b/services/core/java/com/android/server/dreams/OWNERS index 3c9bbf8797ea..426f002ad236 100644 --- a/services/core/java/com/android/server/dreams/OWNERS +++ b/services/core/java/com/android/server/dreams/OWNERS @@ -1,3 +1,3 @@ -dsandler@google.com +dsandler@android.com michaelwr@google.com roosa@google.com diff --git a/services/core/java/com/android/server/gpu/GpuService.java b/services/core/java/com/android/server/gpu/GpuService.java new file mode 100644 index 000000000000..a68ceed750ad --- /dev/null +++ b/services/core/java/com/android/server/gpu/GpuService.java @@ -0,0 +1,163 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.gpu; + +import static android.content.Intent.ACTION_PACKAGE_ADDED; +import static android.content.Intent.ACTION_PACKAGE_CHANGED; +import static android.content.Intent.ACTION_PACKAGE_REMOVED; + +import android.annotation.NonNull; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.os.SystemProperties; +import android.os.UserHandle; +import android.provider.Settings; +import android.util.Slog; + +import com.android.server.SystemService; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; + +/** + * Service to manage GPU related features. + * + * <p>GPU service is a core service that monitors, coordinates all GPU related features, + * as well as collect metrics about the GPU and GPU driver.</p> + */ +public class GpuService extends SystemService { + public static final String TAG = "GpuService"; + public static final boolean DEBUG = false; + + private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; + private static final String WHITELIST_FILENAME = "whitelist.txt"; + + private final Context mContext; + private final String mDriverPackageName; + private final PackageManager mPackageManager; + + public GpuService(Context context) { + super(context); + + mContext = context; + mDriverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER); + mPackageManager = context.getPackageManager(); + if (mDriverPackageName != null && !mDriverPackageName.isEmpty()) { + final IntentFilter packageFilter = new IntentFilter(); + packageFilter.addAction(ACTION_PACKAGE_ADDED); + packageFilter.addAction(ACTION_PACKAGE_CHANGED); + packageFilter.addAction(ACTION_PACKAGE_REMOVED); + packageFilter.addDataScheme("package"); + getContext().registerReceiverAsUser(new PackageReceiver(), UserHandle.ALL, + packageFilter, null, null); + } + } + + @Override + public void onStart() { + } + + @Override + public void onBootPhase(int phase) { + if (phase == PHASE_BOOT_COMPLETED) { + if (mDriverPackageName == null || mDriverPackageName.isEmpty()) { + return; + } + fetchGameDriverPackageProperties(); + } + } + + private final class PackageReceiver extends BroadcastReceiver { + @Override + public void onReceive(@NonNull final Context context, @NonNull final Intent intent) { + final Uri data = intent.getData(); + if (data == null && DEBUG) { + Slog.e(TAG, "Cannot handle package broadcast with null data"); + return; + } + final String packageName = data.getSchemeSpecificPart(); + if (!packageName.equals(mDriverPackageName)) { + return; + } + + final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); + + switch (intent.getAction()) { + case ACTION_PACKAGE_ADDED: + case ACTION_PACKAGE_CHANGED: + case ACTION_PACKAGE_REMOVED: + fetchGameDriverPackageProperties(); + break; + default: + // do nothing + break; + } + } + } + + private void fetchGameDriverPackageProperties() { + final ApplicationInfo driverInfo; + try { + driverInfo = mPackageManager.getApplicationInfo(mDriverPackageName, + PackageManager.MATCH_SYSTEM_ONLY); + } catch (PackageManager.NameNotFoundException e) { + if (DEBUG) { + Slog.e(TAG, "driver package '" + mDriverPackageName + "' not installed"); + } + return; + } + + // O drivers are restricted to the sphal linker namespace, so don't try to use + // packages unless they declare they're compatible with that restriction. + if (driverInfo.targetSdkVersion < Build.VERSION_CODES.O) { + if (DEBUG) { + Slog.w(TAG, "Driver package is not known to be compatible with O"); + } + return; + } + + try { + final Context driverContext = mContext.createPackageContext(mDriverPackageName, + Context.CONTEXT_RESTRICTED); + final BufferedReader reader = new BufferedReader( + new InputStreamReader(driverContext.getAssets().open(WHITELIST_FILENAME))); + final ArrayList<String> whitelistedPackageNames = new ArrayList<>(); + for (String packageName; (packageName = reader.readLine()) != null; ) { + whitelistedPackageNames.add(packageName); + } + Settings.Global.putString(mContext.getContentResolver(), + Settings.Global.GAME_DRIVER_WHITELIST, + String.join(",", whitelistedPackageNames)); + } catch (PackageManager.NameNotFoundException e) { + if (DEBUG) { + Slog.w(TAG, "driver package '" + mDriverPackageName + "' not installed"); + } + } catch (IOException e) { + if (DEBUG) { + Slog.w(TAG, "Failed to load whitelist driver package, abort."); + } + } + } +} diff --git a/services/core/java/com/android/server/incident/IncidentCompanionService.java b/services/core/java/com/android/server/incident/IncidentCompanionService.java index 3ebba0074a1c..6f2bfc3cd8d2 100644 --- a/services/core/java/com/android/server/incident/IncidentCompanionService.java +++ b/services/core/java/com/android/server/incident/IncidentCompanionService.java @@ -16,38 +16,18 @@ package com.android.server.incident; -import android.app.ActivityManager; -import android.app.AppOpsManager; -import android.content.ComponentName; import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.content.pm.UserInfo; -import android.net.Uri; import android.os.Binder; -import android.os.Handler; import android.os.IIncidentAuthListener; import android.os.IIncidentCompanion; -import android.os.IncidentManager; -import android.os.RemoteException; -import android.os.SystemClock; -import android.os.UserHandle; -import android.os.UserManager; -import android.util.Log; import com.android.internal.util.DumpUtils; import com.android.server.SystemService; import java.io.FileDescriptor; import java.io.PrintWriter; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; import java.util.List; -// TODO: User changes should deny everything that's pending. - /** * Helper service for incidentd and dumpstated to provide user feedback * and authorization for bug and inicdent reports to be taken. @@ -55,83 +35,26 @@ import java.util.List; public class IncidentCompanionService extends SystemService { static final String TAG = "IncidentCompanionService"; - private final Handler mHandler = new Handler(); - private final RequestQueue mRequestQueue = new RequestQueue(mHandler); - private final PackageManager mPackageManager; - private final AppOpsManager mAppOpsManager; - - // - // All fields below must be protected by mLock - // - private final Object mLock = new Object(); - private final ArrayList<PendingReportRec> mPending = new ArrayList(); - /** - * The next ID we'll use when we make a PendingReportRec. + * Tracker for reports pending approval. */ - private int mNextPendingId = 1; - - /** - * One for each authorization that's pending. - */ - private final class PendingReportRec { - public int id; - public String callingPackage; - public int flags; - public IIncidentAuthListener listener; - public long addedRealtime; - public long addedWalltime; - - /** - * Construct a PendingReportRec, with an auto-incremented id. - */ - PendingReportRec(String callingPackage, int flags, IIncidentAuthListener listener) { - this.id = mNextPendingId++; - this.callingPackage = callingPackage; - this.flags = flags; - this.listener = listener; - this.addedRealtime = SystemClock.elapsedRealtime(); - this.addedWalltime = System.currentTimeMillis(); - } - - /** - * Get the Uri that contains the flattened data. - */ - Uri getUri() { - return (new Uri.Builder()) - .scheme(IncidentManager.URI_SCHEME) - .authority(IncidentManager.URI_AUTHORITY) - .path(IncidentManager.URI_PATH) - .appendQueryParameter(IncidentManager.URI_PARAM_ID, Integer.toString(id)) - .appendQueryParameter(IncidentManager.URI_PARAM_CALLING_PACKAGE, callingPackage) - .appendQueryParameter(IncidentManager.URI_PARAM_FLAGS, Integer.toString(flags)) - .appendQueryParameter(IncidentManager.URI_PARAM_TIMESTAMP, - Long.toString(addedWalltime)) - .build(); - } - } + private PendingReports mPendingReports; /** * Implementation of the IIncidentCompanion binder interface. */ private final class BinderService extends IIncidentCompanion.Stub { /** - * ONEWAY binder call to initiate authorizing the report. The actual logic is posted - * to mRequestQueue, and may happen later. The security checks need to happen here. + * ONEWAY binder call to initiate authorizing the report. */ @Override - public void authorizeReport(int callingUid, final String callingPackage, final int flags, + public void authorizeReport(int callingUid, final String callingPackage, int flags, final IIncidentAuthListener listener) { enforceRequestAuthorizationPermission(); final long ident = Binder.clearCallingIdentity(); try { - // Starting the system server is complicated, and rather than try to - // have a complicated lifecycle that we share with dumpstated and incidentd, - // we will accept the request, and then display it whenever it becomes possible to. - mRequestQueue.enqueue(listener.asBinder(), true, () -> { - authorizeReportImpl(callingUid, callingPackage, flags, listener); - }); + mPendingReports.authorizeReport(callingUid, callingPackage, flags, listener); } finally { Binder.restoreCallingIdentity(ident); } @@ -152,9 +75,7 @@ public class IncidentCompanionService extends SystemService { // authorize/cancel pairs. final long ident = Binder.clearCallingIdentity(); try { - mRequestQueue.enqueue(listener.asBinder(), false, () -> { - cancelReportImpl(listener); - }); + mPendingReports.cancelAuthorization(listener); } finally { Binder.restoreCallingIdentity(ident); } @@ -167,19 +88,11 @@ public class IncidentCompanionService extends SystemService { @Override public List<String> getPendingReports() { enforceAuthorizePermission(); - - synchronized (mLock) { - final int size = mPending.size(); - final ArrayList<String> result = new ArrayList(size); - for (int i = 0; i < size; i++) { - result.add(mPending.get(i).getUri().toString()); - } - return result; - } + return mPendingReports.getPendingReports(); } /** - * ONEWAY binder call to mark a report as approved. + * SYNCHRONOUS binder call to mark a report as approved. */ @Override public void approveReport(String uri) { @@ -187,32 +100,14 @@ public class IncidentCompanionService extends SystemService { final long ident = Binder.clearCallingIdentity(); try { - final PendingReportRec rec; - synchronized (mLock) { - rec = findAndRemovePendingReportRecLocked(uri); - if (rec == null) { - Log.e(TAG, "confirmApproved: Couldn't find record for uri: " + uri); - return; - } - } - - // Re-do the broadcast, so whoever is listening knows the list changed, - // in case another one was added in the meantime. - sendBroadcast(); - - Log.i(TAG, "Approved report: " + uri); - try { - rec.listener.onReportApproved(); - } catch (RemoteException ex) { - Log.w(TAG, "Failed calling back for approval for: " + uri, ex); - } + mPendingReports.approveReport(uri); } finally { Binder.restoreCallingIdentity(ident); } } /** - * ONEWAY binder call to mark a report as NOT approved. + * SYNCHRONOUS binder call to mark a report as NOT approved. */ @Override public void denyReport(String uri) { @@ -220,25 +115,7 @@ public class IncidentCompanionService extends SystemService { final long ident = Binder.clearCallingIdentity(); try { - final PendingReportRec rec; - synchronized (mLock) { - rec = findAndRemovePendingReportRecLocked(uri); - if (rec == null) { - Log.e(TAG, "confirmDenied: Couldn't find record for uri: " + uri); - return; - } - } - - // Re-do the broadcast, so whoever is listening knows the list changed, - // in case another one was added in the meantime. - sendBroadcast(); - - Log.i(TAG, "Denied report: " + uri); - try { - rec.listener.onReportDenied(); - } catch (RemoteException ex) { - Log.w(TAG, "Failed calling back for denial for: " + uri, ex); - } + mPendingReports.denyReport(uri); } finally { Binder.restoreCallingIdentity(ident); } @@ -252,27 +129,22 @@ public class IncidentCompanionService extends SystemService { if (!DumpUtils.checkDumpPermission(getContext(), TAG, writer)) { return; } - if (args.length == 0) { - // Standard text dumpsys - final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - synchronized (mLock) { - final int size = mPending.size(); - writer.println("mPending: (" + size + ")"); - for (int i = 0; i < size; i++) { - final PendingReportRec entry = mPending.get(i); - writer.println(String.format(" %11d %s: %s", entry.addedRealtime, - df.format(new Date(entry.addedWalltime)), - entry.getUri().toString())); - } - } - } + mPendingReports.dump(fd, writer, args); } + /** + * Inside the binder interface class because we want to do all of the authorization + * here, before calling out to the helper objects. + */ private void enforceRequestAuthorizationPermission() { getContext().enforceCallingOrSelfPermission( android.Manifest.permission.REQUEST_INCIDENT_REPORT_APPROVAL, null); } + /** + * Inside the binder interface class because we want to do all of the authorization + * here, before calling out to the helper objects. + */ private void enforceAuthorizePermission() { getContext().enforceCallingOrSelfPermission( android.Manifest.permission.APPROVE_INCIDENT_REPORTS, null); @@ -285,8 +157,7 @@ public class IncidentCompanionService extends SystemService { */ public IncidentCompanionService(Context context) { super(context); - mPackageManager = context.getPackageManager(); - mAppOpsManager = context.getSystemService(AppOpsManager.class); + mPendingReports = new PendingReports(context); } /** @@ -307,239 +178,9 @@ public class IncidentCompanionService extends SystemService { super.onBootPhase(phase); switch (phase) { case SystemService.PHASE_BOOT_COMPLETED: - // Release the enqueued work. - mRequestQueue.start(); + mPendingReports.onBootCompleted(); break; } } - - /** - * Start the confirmation process. - */ - private void authorizeReportImpl(int callingUid, final String callingPackage, int flags, - final IIncidentAuthListener listener) { - // Enforce that the calling package pertains to the callingUid. - if (!isPackageInUid(callingUid, callingPackage)) { - Log.w(TAG, "Calling uid " + callingUid + " doesn't match package " - + callingPackage); - denyReportBeforeAddingRec(listener, callingPackage); - return; - } - - // Find the primary user of this device. - final int primaryUser = getAndValidateUser(); - if (primaryUser == UserHandle.USER_NULL) { - denyReportBeforeAddingRec(listener, callingPackage); - return; - } - - // Find the approver app (hint: it's PermissionController). - final ComponentName receiver = getApproverComponent(primaryUser); - if (receiver == null) { - // We couldn't find an approver... so deny the request here and now, before we - // do anything else. - denyReportBeforeAddingRec(listener, callingPackage); - return; - } - - // Save the record for when the PermissionController comes back to authorize it. - PendingReportRec rec = null; - synchronized (mLock) { - rec = new PendingReportRec(callingPackage, flags, listener); - mPending.add(rec); - } - - try { - listener.asBinder().linkToDeath(() -> { - Log.i(TAG, "Got death notification listener=" + listener); - cancelReportImpl(listener, receiver, primaryUser); - }, 0); - } catch (RemoteException ex) { - Log.e(TAG, "Remote died while trying to register death listener: " + rec.getUri()); - // First, remove from our list. - cancelReportImpl(listener, receiver, primaryUser); - } - - // Go tell Permission controller to start asking the user. - sendBroadcast(receiver, primaryUser); - } - - /** - * Cancel a pending report request (because of an explicit call to cancel) - */ - private void cancelReportImpl(IIncidentAuthListener listener) { - final int primaryUser = getAndValidateUser(); - final ComponentName receiver = getApproverComponent(primaryUser); - if (primaryUser != UserHandle.USER_NULL && receiver != null) { - cancelReportImpl(listener, receiver, primaryUser); - } - } - - /** - * Cancel a pending report request (either because of an explicit call to cancel - * by the calling app, or because of a binder death). - */ - private void cancelReportImpl(IIncidentAuthListener listener, ComponentName receiver, - int primaryUser) { - // First, remove from our list. - synchronized (mLock) { - removePendingReportRecLocked(listener); - } - // Second, call back to PermissionController to say it's canceled. - sendBroadcast(receiver, primaryUser); - } - - /** - * Send an extra copy of the broadcast, to tell them that the list has changed - * because of an addition or removal. This function is less aggressive than - * authorizeReportImpl in logging about failures, because this is for use in - * cleanup cases to keep the apps' list in sync with ours. - */ - private void sendBroadcast() { - final int primaryUser = getAndValidateUser(); - if (primaryUser == UserHandle.USER_NULL) { - return; - } - final ComponentName receiver = getApproverComponent(primaryUser); - if (receiver == null) { - return; - } - sendBroadcast(receiver, primaryUser); - } - - /** - * Send the confirmation broadcast. - */ - private void sendBroadcast(ComponentName receiver, int primaryUser) { - final Intent intent = new Intent(Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED); - intent.setComponent(receiver); - - // Send it to the primary user. - getContext().sendBroadcastAsUser(intent, UserHandle.getUserHandleForUid(primaryUser), - android.Manifest.permission.APPROVE_INCIDENT_REPORTS); - } - - /** - * Remove a PendingReportRec keyed by uri, and return it. - */ - private PendingReportRec findAndRemovePendingReportRecLocked(String uriString) { - final Uri uri = Uri.parse(uriString); - final int id; - try { - final String idStr = uri.getQueryParameter(IncidentManager.URI_PARAM_ID); - id = Integer.parseInt(idStr); - } catch (NumberFormatException ex) { - Log.w(TAG, "Can't parse id from: " + uriString); - return null; - } - final int size = mPending.size(); - for (int i = 0; i < size; i++) { - final PendingReportRec rec = mPending.get(i); - if (rec.id == id) { - mPending.remove(i); - return rec; - } - } - return null; - } - - /** - * Remove a PendingReportRec keyed by listener. - */ - private void removePendingReportRecLocked(IIncidentAuthListener listener) { - final int size = mPending.size(); - for (int i = 0; i < size; i++) { - final PendingReportRec rec = mPending.get(i); - if (rec.listener.asBinder() == listener.asBinder()) { - Log.i(TAG, " ...Removed PendingReportRec index=" + i + ": " + rec.getUri()); - mPending.remove(i); - } - } - } - - /** - * Just call listener.deny() (wrapping the RemoteException), without try to - * add it to the list. - */ - private void denyReportBeforeAddingRec(IIncidentAuthListener listener, String pkg) { - try { - listener.onReportDenied(); - } catch (RemoteException ex) { - Log.w(TAG, "Failed calling back for denial for " + pkg, ex); - } - } - - /** - * Check whether the current user is the primary user, and return the user id if they are. - * Returns UserHandle.USER_NULL if not valid. - */ - private int getAndValidateUser() { - // Current user - UserInfo currentUser; - try { - currentUser = ActivityManager.getService().getCurrentUser(); - } catch (RemoteException ex) { - // We're already inside the system process. - throw new RuntimeException(ex); - } - - // Primary user - final UserManager um = UserManager.get(getContext()); - final UserInfo primaryUser = um.getPrimaryUser(); - - // Check that we're using the right user. - if (currentUser == null) { - Log.w(TAG, "No current user. Nobody to approve the report." - + " The report will be denied."); - return UserHandle.USER_NULL; - } - if (primaryUser == null) { - Log.w(TAG, "No primary user. Nobody to approve the report." - + " The report will be denied."); - return UserHandle.USER_NULL; - } - if (primaryUser.id != currentUser.id) { - Log.w(TAG, "Only the primary user can approve bugreports, but they are not" - + " the current user. The report will be denied."); - return UserHandle.USER_NULL; - } - - return primaryUser.id; - } - - /** - * Return the ComponentName of the BroadcastReceiver that will approve reports. - * The system must have zero or one of these installed. We only look on the - * system partition. When the broadcast happens, the component will also need - * have the APPROVE_INCIDENT_REPORTS permission. - */ - private ComponentName getApproverComponent(int userId) { - // Find the one true BroadcastReceiver - final Intent intent = new Intent(Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED); - final List<ResolveInfo> matches = mPackageManager.queryBroadcastReceiversAsUser(intent, - PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DIRECT_BOOT_AWARE - | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId); - if (matches.size() == 1) { - return matches.get(0).getComponentInfo().getComponentName(); - } else { - Log.w(TAG, "Didn't find exactly one BroadcastReceiver to handle " - + Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED - + ". The report will be denied. size=" - + matches.size() + ": matches=" + matches); - return null; - } - } - - /** - * Return whether the package is one of the packages installed for the uid. - */ - private boolean isPackageInUid(int uid, String packageName) { - try { - mAppOpsManager.checkPackage(uid, packageName); - return true; - } catch (SecurityException ex) { - return false; - } - } } diff --git a/services/core/java/com/android/server/incident/PendingReports.java b/services/core/java/com/android/server/incident/PendingReports.java new file mode 100644 index 000000000000..519ed41670f6 --- /dev/null +++ b/services/core/java/com/android/server/incident/PendingReports.java @@ -0,0 +1,477 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.incident; + +import android.app.ActivityManager; +import android.app.AppOpsManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.pm.UserInfo; +import android.net.Uri; +import android.os.Handler; +import android.os.IIncidentAuthListener; +import android.os.IncidentManager; +import android.os.RemoteException; +import android.os.SystemClock; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.Log; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +// TODO: User changes should deny everything that's pending. + +/** + * Tracker for reports pending approval. + */ +class PendingReports { + static final String TAG = IncidentCompanionService.TAG; + + private final Handler mHandler = new Handler(); + private final RequestQueue mRequestQueue = new RequestQueue(mHandler); + private final Context mContext; + private final PackageManager mPackageManager; + private final AppOpsManager mAppOpsManager; + + // + // All fields below must be protected by mLock + // + private final Object mLock = new Object(); + private final ArrayList<PendingReportRec> mPending = new ArrayList(); + + /** + * The next ID we'll use when we make a PendingReportRec. + */ + private int mNextPendingId = 1; + + /** + * One for each authorization that's pending. + */ + private final class PendingReportRec { + public int id; + public String callingPackage; + public int flags; + public IIncidentAuthListener listener; + public long addedRealtime; + public long addedWalltime; + + /** + * Construct a PendingReportRec, with an auto-incremented id. + */ + PendingReportRec(String callingPackage, int flags, IIncidentAuthListener listener) { + this.id = mNextPendingId++; + this.callingPackage = callingPackage; + this.flags = flags; + this.listener = listener; + this.addedRealtime = SystemClock.elapsedRealtime(); + this.addedWalltime = System.currentTimeMillis(); + } + + /** + * Get the Uri that contains the flattened data. + */ + Uri getUri() { + return (new Uri.Builder()) + .scheme(IncidentManager.URI_SCHEME) + .authority(IncidentManager.URI_AUTHORITY) + .path(IncidentManager.URI_PATH) + .appendQueryParameter(IncidentManager.URI_PARAM_ID, Integer.toString(id)) + .appendQueryParameter(IncidentManager.URI_PARAM_CALLING_PACKAGE, callingPackage) + .appendQueryParameter(IncidentManager.URI_PARAM_FLAGS, Integer.toString(flags)) + .appendQueryParameter(IncidentManager.URI_PARAM_TIMESTAMP, + Long.toString(addedWalltime)) + .build(); + } + } + + /** + * Construct new PendingReports with the context. + */ + PendingReports(Context context) { + mContext = context; + mPackageManager = context.getPackageManager(); + mAppOpsManager = context.getSystemService(AppOpsManager.class); + } + + /** + * ONEWAY binder call to initiate authorizing the report. The actual logic is posted + * to mRequestQueue, and may happen later. + * <p> + * The security checks are handled by IncidentCompanionService. + */ + public void authorizeReport(int callingUid, final String callingPackage, final int flags, + final IIncidentAuthListener listener) { + // Starting the system server is complicated, and rather than try to + // have a complicated lifecycle that we share with dumpstated and incidentd, + // we will accept the request, and then display it whenever it becomes possible to. + mRequestQueue.enqueue(listener.asBinder(), true, () -> { + authorizeReportImpl(callingUid, callingPackage, flags, listener); + }); + } + + /** + * ONEWAY binder call to cancel the inbound authorization request. + * <p> + * This is a oneway call, and so is authorizeReport, so the + * caller's ordering is preserved. The other calls on this object are synchronous, so + * their ordering is not guaranteed with respect to these calls. So the implementation + * sends out extra broadcasts to allow for eventual consistency. + * <p> + * The security checks are handled by IncidentCompanionService. + */ + public void cancelAuthorization(final IIncidentAuthListener listener) { + mRequestQueue.enqueue(listener.asBinder(), false, () -> { + cancelReportImpl(listener); + }); + } + + /** + * SYNCHRONOUS binder call to get the list of reports that are pending confirmation + * by the user. + * <p> + * The security checks are handled by IncidentCompanionService. + */ + public List<String> getPendingReports() { + synchronized (mLock) { + final int size = mPending.size(); + final ArrayList<String> result = new ArrayList(size); + for (int i = 0; i < size; i++) { + result.add(mPending.get(i).getUri().toString()); + } + return result; + } + } + + /** + * SYNCHRONOUS binder call to mark a report as approved. + * <p> + * The security checks are handled by IncidentCompanionService. + */ + public void approveReport(String uri) { + final PendingReportRec rec; + synchronized (mLock) { + rec = findAndRemovePendingReportRecLocked(uri); + if (rec == null) { + Log.e(TAG, "confirmApproved: Couldn't find record for uri: " + uri); + return; + } + } + + // Re-do the broadcast, so whoever is listening knows the list changed, + // in case another one was added in the meantime. + sendBroadcast(); + + Log.i(TAG, "Approved report: " + uri); + try { + rec.listener.onReportApproved(); + } catch (RemoteException ex) { + Log.w(TAG, "Failed calling back for approval for: " + uri, ex); + } + } + + /** + * SYNCHRONOUS binder call to mark a report as NOT approved. + */ + public void denyReport(String uri) { + final PendingReportRec rec; + synchronized (mLock) { + rec = findAndRemovePendingReportRecLocked(uri); + if (rec == null) { + Log.e(TAG, "confirmDenied: Couldn't find record for uri: " + uri); + return; + } + } + + // Re-do the broadcast, so whoever is listening knows the list changed, + // in case another one was added in the meantime. + sendBroadcast(); + + Log.i(TAG, "Denied report: " + uri); + try { + rec.listener.onReportDenied(); + } catch (RemoteException ex) { + Log.w(TAG, "Failed calling back for denial for: " + uri, ex); + } + } + + /** + * Implementation of adb shell dumpsys debugreportcompanion. + */ + protected void dump(FileDescriptor fd, final PrintWriter writer, String[] args) { + if (args.length == 0) { + // Standard text dumpsys + final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + synchronized (mLock) { + final int size = mPending.size(); + writer.println("mPending: (" + size + ")"); + for (int i = 0; i < size; i++) { + final PendingReportRec entry = mPending.get(i); + writer.println(String.format(" %11d %s: %s", entry.addedRealtime, + df.format(new Date(entry.addedWalltime)), + entry.getUri().toString())); + } + } + } + } + + /** + * Handle the boot process... Starts everything running once the system is + * up enough for us to do UI. + */ + public void onBootCompleted() { + // Release the enqueued work. + mRequestQueue.start(); + } + + /** + * Start the confirmation process. + */ + private void authorizeReportImpl(int callingUid, final String callingPackage, int flags, + final IIncidentAuthListener listener) { + // Enforce that the calling package pertains to the callingUid. + if (!isPackageInUid(callingUid, callingPackage)) { + Log.w(TAG, "Calling uid " + callingUid + " doesn't match package " + + callingPackage); + denyReportBeforeAddingRec(listener, callingPackage); + return; + } + + // Find the primary user of this device. + final int primaryUser = getAndValidateUser(); + if (primaryUser == UserHandle.USER_NULL) { + denyReportBeforeAddingRec(listener, callingPackage); + return; + } + + // Find the approver app (hint: it's PermissionController). + final ComponentName receiver = getApproverComponent(primaryUser); + if (receiver == null) { + // We couldn't find an approver... so deny the request here and now, before we + // do anything else. + denyReportBeforeAddingRec(listener, callingPackage); + return; + } + + // Save the record for when the PermissionController comes back to authorize it. + PendingReportRec rec = null; + synchronized (mLock) { + rec = new PendingReportRec(callingPackage, flags, listener); + mPending.add(rec); + } + + try { + listener.asBinder().linkToDeath(() -> { + Log.i(TAG, "Got death notification listener=" + listener); + cancelReportImpl(listener, receiver, primaryUser); + }, 0); + } catch (RemoteException ex) { + Log.e(TAG, "Remote died while trying to register death listener: " + rec.getUri()); + // First, remove from our list. + cancelReportImpl(listener, receiver, primaryUser); + } + + // Go tell Permission controller to start asking the user. + sendBroadcast(receiver, primaryUser); + } + + /** + * Cancel a pending report request (because of an explicit call to cancel) + */ + private void cancelReportImpl(IIncidentAuthListener listener) { + final int primaryUser = getAndValidateUser(); + final ComponentName receiver = getApproverComponent(primaryUser); + if (primaryUser != UserHandle.USER_NULL && receiver != null) { + cancelReportImpl(listener, receiver, primaryUser); + } + } + + /** + * Cancel a pending report request (either because of an explicit call to cancel + * by the calling app, or because of a binder death). + */ + private void cancelReportImpl(IIncidentAuthListener listener, ComponentName receiver, + int primaryUser) { + // First, remove from our list. + synchronized (mLock) { + removePendingReportRecLocked(listener); + } + // Second, call back to PermissionController to say it's canceled. + sendBroadcast(receiver, primaryUser); + } + + /** + * Send an extra copy of the broadcast, to tell them that the list has changed + * because of an addition or removal. This function is less aggressive than + * authorizeReportImpl in logging about failures, because this is for use in + * cleanup cases to keep the apps' list in sync with ours. + */ + private void sendBroadcast() { + final int primaryUser = getAndValidateUser(); + if (primaryUser == UserHandle.USER_NULL) { + return; + } + final ComponentName receiver = getApproverComponent(primaryUser); + if (receiver == null) { + return; + } + sendBroadcast(receiver, primaryUser); + } + + /** + * Send the confirmation broadcast. + */ + private void sendBroadcast(ComponentName receiver, int primaryUser) { + final Intent intent = new Intent(Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED); + intent.setComponent(receiver); + + // Send it to the primary user. + mContext.sendBroadcastAsUser(intent, UserHandle.getUserHandleForUid(primaryUser), + android.Manifest.permission.APPROVE_INCIDENT_REPORTS); + } + + /** + * Remove a PendingReportRec keyed by uri, and return it. + */ + private PendingReportRec findAndRemovePendingReportRecLocked(String uriString) { + final Uri uri = Uri.parse(uriString); + final int id; + try { + final String idStr = uri.getQueryParameter(IncidentManager.URI_PARAM_ID); + id = Integer.parseInt(idStr); + } catch (NumberFormatException ex) { + Log.w(TAG, "Can't parse id from: " + uriString); + return null; + } + final int size = mPending.size(); + for (int i = 0; i < size; i++) { + final PendingReportRec rec = mPending.get(i); + if (rec.id == id) { + mPending.remove(i); + return rec; + } + } + return null; + } + + /** + * Remove a PendingReportRec keyed by listener. + */ + private void removePendingReportRecLocked(IIncidentAuthListener listener) { + final int size = mPending.size(); + for (int i = 0; i < size; i++) { + final PendingReportRec rec = mPending.get(i); + if (rec.listener.asBinder() == listener.asBinder()) { + Log.i(TAG, " ...Removed PendingReportRec index=" + i + ": " + rec.getUri()); + mPending.remove(i); + } + } + } + + /** + * Just call listener.deny() (wrapping the RemoteException), without try to + * add it to the list. + */ + private void denyReportBeforeAddingRec(IIncidentAuthListener listener, String pkg) { + try { + listener.onReportDenied(); + } catch (RemoteException ex) { + Log.w(TAG, "Failed calling back for denial for " + pkg, ex); + } + } + + /** + * Check whether the current user is the primary user, and return the user id if they are. + * Returns UserHandle.USER_NULL if not valid. + */ + private int getAndValidateUser() { + // Current user + UserInfo currentUser; + try { + currentUser = ActivityManager.getService().getCurrentUser(); + } catch (RemoteException ex) { + // We're already inside the system process. + throw new RuntimeException(ex); + } + + // Primary user + final UserManager um = UserManager.get(mContext); + final UserInfo primaryUser = um.getPrimaryUser(); + + // Check that we're using the right user. + if (currentUser == null) { + Log.w(TAG, "No current user. Nobody to approve the report." + + " The report will be denied."); + return UserHandle.USER_NULL; + } + if (primaryUser == null) { + Log.w(TAG, "No primary user. Nobody to approve the report." + + " The report will be denied."); + return UserHandle.USER_NULL; + } + if (primaryUser.id != currentUser.id) { + Log.w(TAG, "Only the primary user can approve bugreports, but they are not" + + " the current user. The report will be denied."); + return UserHandle.USER_NULL; + } + + return primaryUser.id; + } + + /** + * Return the ComponentName of the BroadcastReceiver that will approve reports. + * The system must have zero or one of these installed. We only look on the + * system partition. When the broadcast happens, the component will also need + * have the APPROVE_INCIDENT_REPORTS permission. + */ + private ComponentName getApproverComponent(int userId) { + // Find the one true BroadcastReceiver + final Intent intent = new Intent(Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED); + final List<ResolveInfo> matches = mPackageManager.queryBroadcastReceiversAsUser(intent, + PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId); + if (matches.size() == 1) { + return matches.get(0).getComponentInfo().getComponentName(); + } else { + Log.w(TAG, "Didn't find exactly one BroadcastReceiver to handle " + + Intent.ACTION_PENDING_INCIDENT_REPORTS_CHANGED + + ". The report will be denied. size=" + + matches.size() + ": matches=" + matches); + return null; + } + } + + /** + * Return whether the package is one of the packages installed for the uid. + */ + private boolean isPackageInUid(int uid, String packageName) { + try { + mAppOpsManager.checkPackage(uid, packageName); + return true; + } catch (SecurityException ex) { + return false; + } + } +} + diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 669ff2b7bad5..5e7ea05f799c 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -234,6 +234,7 @@ public class InputManagerService extends IInputManager.Stub private static native void nativeReloadPointerIcons(long ptr); private static native void nativeSetCustomPointerIcon(long ptr, PointerIcon icon); private static native void nativeSetPointerCapture(long ptr, boolean detached); + private static native boolean nativeCanDispatchToDisplay(long ptr, int deviceId, int displayId); // Input event injection constants defined in InputDispatcher.h. private static final int INPUT_EVENT_INJECTION_SUCCEEDED = 0; @@ -1890,6 +1891,16 @@ public class InputManagerService extends IInputManager.Stub return new String[0]; } + /** + * Gets if an input device could dispatch to the given display". + * @param deviceId The input device id. + * @param displayId The specific display id. + * @return True if the device could dispatch to the given display, false otherwise. + */ + public boolean canDispatchToDisplay(int deviceId, int displayId) { + return nativeCanDispatchToDisplay(mPtr, deviceId, displayId); + } + // Native callback. private int getKeyRepeatTimeout() { return ViewConfiguration.getKeyRepeatTimeout(); diff --git a/services/core/java/com/android/server/location/ActivityRecognitionProxy.java b/services/core/java/com/android/server/location/ActivityRecognitionProxy.java index 22fabb2cdd3e..80ab7903cef7 100644 --- a/services/core/java/com/android/server/location/ActivityRecognitionProxy.java +++ b/services/core/java/com/android/server/location/ActivityRecognitionProxy.java @@ -24,7 +24,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.util.Log; -import com.android.internal.os.BackgroundThread; +import com.android.server.FgThread; import com.android.server.ServiceWatcher; /** @@ -84,7 +84,7 @@ public class ActivityRecognitionProxy { overlaySwitchResId, defaultServicePackageNameResId, initialPackageNameResId, - BackgroundThread.getHandler()) { + FgThread.getHandler()) { @Override protected void onBind() { runOnBinder(ActivityRecognitionProxy.this::initializeService); diff --git a/services/core/java/com/android/server/location/GeocoderProxy.java b/services/core/java/com/android/server/location/GeocoderProxy.java index e6f0ed9d14b0..d9602b897303 100644 --- a/services/core/java/com/android/server/location/GeocoderProxy.java +++ b/services/core/java/com/android/server/location/GeocoderProxy.java @@ -21,7 +21,7 @@ import android.location.Address; import android.location.GeocoderParams; import android.location.IGeocodeProvider; -import com.android.internal.os.BackgroundThread; +import com.android.server.FgThread; import com.android.server.ServiceWatcher; import java.util.List; @@ -53,7 +53,7 @@ public class GeocoderProxy { int initialPackageNamesResId) { mServiceWatcher = new ServiceWatcher(context, TAG, SERVICE_ACTION, overlaySwitchResId, defaultServicePackageNameResId, initialPackageNamesResId, - BackgroundThread.getHandler()); + FgThread.getHandler()); } private boolean bind() { diff --git a/services/core/java/com/android/server/location/GeofenceProxy.java b/services/core/java/com/android/server/location/GeofenceProxy.java index 38c7d491f706..ce93661a8810 100644 --- a/services/core/java/com/android/server/location/GeofenceProxy.java +++ b/services/core/java/com/android/server/location/GeofenceProxy.java @@ -30,7 +30,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.util.Log; -import com.android.internal.os.BackgroundThread; +import com.android.server.FgThread; import com.android.server.ServiceWatcher; /** @@ -82,7 +82,7 @@ public final class GeofenceProxy { mContext = context; mServiceWatcher = new ServiceWatcher(context, TAG, SERVICE_ACTION, overlaySwitchResId, defaultServicePackageNameResId, initialPackageNamesResId, - BackgroundThread.getHandler()) { + FgThread.getHandler()) { @Override protected void onBind() { runOnBinder(mUpdateGeofenceHardware); diff --git a/services/core/java/com/android/server/location/LocationProviderProxy.java b/services/core/java/com/android/server/location/LocationProviderProxy.java index 6b5b1bebd20f..776beb50be62 100644 --- a/services/core/java/com/android/server/location/LocationProviderProxy.java +++ b/services/core/java/com/android/server/location/LocationProviderProxy.java @@ -31,8 +31,8 @@ import com.android.internal.location.ILocationProvider; import com.android.internal.location.ILocationProviderManager; import com.android.internal.location.ProviderProperties; import com.android.internal.location.ProviderRequest; -import com.android.internal.os.BackgroundThread; import com.android.internal.os.TransferPipe; +import com.android.server.FgThread; import com.android.server.LocationManagerService; import com.android.server.ServiceWatcher; @@ -105,7 +105,7 @@ public class LocationProviderProxy extends AbstractLocationProvider { mServiceWatcher = new ServiceWatcher(context, TAG, action, overlaySwitchResId, defaultServicePackageNameResId, initialPackageNamesResId, - BackgroundThread.getHandler()) { + FgThread.getHandler()) { @Override protected void onBind() { diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 467b192cef2a..ba187c0884b9 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -198,6 +198,7 @@ import com.android.internal.os.BackgroundThread; import com.android.internal.os.SomeArgs; import com.android.internal.statusbar.NotificationVisibility; import com.android.internal.util.ArrayUtils; +import com.android.internal.util.CollectionUtils; import com.android.internal.util.DumpUtils; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.Preconditions; @@ -2366,6 +2367,28 @@ public class NotificationManagerService extends SystemService { } @Override + public boolean shouldHideSilentStatusIcons(String callingPkg) { + checkCallerIsSameApp(callingPkg); + + if (isCallerSystemOrPhone() + || mListeners.isListenerPackage(callingPkg)) { + return mPreferencesHelper.shouldHideSilentStatusIcons(); + } else { + throw new SecurityException("Only available for notification listeners"); + } + } + + @Override + public void setHideSilentStatusIcons(boolean hide) { + checkCallerIsSystem(); + + mPreferencesHelper.setHideSilentStatusIcons(hide); + handleSavePolicyFile(); + + mListeners.onStatusBarIconsBehaviorChanged(hide); + } + + @Override public int getPackageImportance(String pkg) { checkCallerIsSystemOrSameApp(pkg); return mPreferencesHelper.getImportance(pkg, Binder.getCallingUid()); @@ -3633,6 +3656,22 @@ public class NotificationManagerService extends SystemService { } @Override + public ComponentName getAllowedNotificationAssistantForUser(int userId) { + checkCallerIsSystem(); + List<ComponentName> allowedComponents = mAssistants.getAllowedComponents(userId); + if (allowedComponents.size() > 1) { + throw new IllegalStateException( + "At most one NotificationAssistant: " + allowedComponents.size()); + } + return CollectionUtils.firstOrNull(allowedComponents); + } + + @Override + public ComponentName getAllowedNotificationAssistant() { + return getAllowedNotificationAssistantForUser(getCallingUserHandle().getIdentifier()); + } + + @Override public boolean isNotificationListenerAccessGranted(ComponentName listener) { Preconditions.checkNotNull(listener); checkCallerIsSystemOrSameApp(listener.getPackageName()); @@ -3700,8 +3739,15 @@ public class NotificationManagerService extends SystemService { @Override public void setNotificationAssistantAccessGrantedForUser(ComponentName assistant, int userId, boolean granted) throws RemoteException { - Preconditions.checkNotNull(assistant); checkCallerIsSystemOrShell(); + if (assistant == null) { + ComponentName allowedAssistant = CollectionUtils.firstOrNull( + mAssistants.getAllowedComponents(userId)); + if (allowedAssistant != null) { + setNotificationAssistantAccessGrantedForUser(allowedAssistant, userId, false); + } + return; + } final long identity = Binder.clearCallingIdentity(); try { if (mAllowedManagedServicePackages.test(assistant.getPackageName())) { @@ -7242,6 +7288,26 @@ public class NotificationManagerService extends SystemService { } } } + + @Override + protected void setPackageOrComponentEnabled(String pkgOrComponent, int userId, + boolean isPrimary, boolean enabled) { + // Ensures that only one component is enabled at a time + if (enabled) { + List<ComponentName> allowedComponents = getAllowedComponents(userId); + if (!allowedComponents.isEmpty()) { + ComponentName currentComponent = CollectionUtils.firstOrNull(allowedComponents); + if (currentComponent.flattenToString().equals(pkgOrComponent)) return; + try { + getBinderService().setNotificationAssistantAccessGrantedForUser( + currentComponent, userId, false); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + } + super.setPackageOrComponentEnabled(pkgOrComponent, userId, isPrimary, enabled); + } } public class NotificationListeners extends ManagedServices { @@ -7324,6 +7390,20 @@ public class NotificationManagerService extends SystemService { return mLightTrimListeners.contains(info) ? TRIM_LIGHT : TRIM_FULL; } + public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) { + for (final ManagedServiceInfo info : getServices()) { + mHandler.post(() -> { + final INotificationListener listener = (INotificationListener) info.service; + try { + listener.onStatusBarIconsBehaviorChanged(hideSilentStatusIcons); + } catch (RemoteException ex) { + Log.e(TAG, "unable to notify listener " + + "(hideSilentStatusIcons): " + listener, ex); + } + }); + } + } + /** * asynchronously notify all listeners about a new notification * diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index 3f0043cecc49..6ed4f5c03171 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -76,6 +76,7 @@ public class PreferencesHelper implements RankingConfig { private static final String TAG_CHANNEL = "channel"; private static final String TAG_GROUP = "channelGroup"; private static final String TAG_DELEGATE = "delegate"; + private static final String TAG_STATUS_ICONS = "status_icons"; private static final String ATT_VERSION = "version"; private static final String ATT_NAME = "name"; @@ -89,10 +90,13 @@ public class PreferencesHelper implements RankingConfig { private static final String ATT_APP_USER_LOCKED_FIELDS = "app_user_locked_fields"; private static final String ATT_ENABLED = "enabled"; private static final String ATT_USER_ALLOWED = "allowed"; + private static final String ATT_HIDE_SILENT = "hide_silent"; private static final int DEFAULT_PRIORITY = Notification.PRIORITY_DEFAULT; private static final int DEFAULT_VISIBILITY = NotificationManager.VISIBILITY_NO_OVERRIDE; private static final int DEFAULT_IMPORTANCE = NotificationManager.IMPORTANCE_UNSPECIFIED; + @VisibleForTesting + static final boolean DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS = false; private static final boolean DEFAULT_SHOW_BADGE = true; private static final boolean DEFAULT_ALLOW_BUBBLE = true; private static final boolean DEFAULT_OEM_LOCKED_IMPORTANCE = false; @@ -124,6 +128,7 @@ public class PreferencesHelper implements RankingConfig { private SparseBooleanArray mBadgingEnabled; private boolean mAreChannelsBypassingDnd; + private boolean mHideSilentStatusBarIcons; public PreferencesHelper(Context context, PackageManager pm, RankingHandler rankingHandler, ZenModeHelper zenHelper) { @@ -143,9 +148,8 @@ public class PreferencesHelper implements RankingConfig { String tag = parser.getName(); if (!TAG_RANKING.equals(tag)) return; synchronized (mPackagePreferences) { - // Clobber groups and channels with the xml, but don't delete other data that wasn't present - - // at the time of serialization. + // Clobber groups and channels with the xml, but don't delete other data that wasn't + // present at the time of serialization. mRestoredWithoutUids.clear(); while ((type = parser.next()) != XmlPullParser.END_DOCUMENT) { tag = parser.getName(); @@ -153,7 +157,10 @@ public class PreferencesHelper implements RankingConfig { return; } if (type == XmlPullParser.START_TAG) { - if (TAG_PACKAGE.equals(tag)) { + if (TAG_STATUS_ICONS.equals(tag)) { + mHideSilentStatusBarIcons = XmlUtils.readBooleanAttribute( + parser, ATT_HIDE_SILENT, DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS); + } else if (TAG_PACKAGE.equals(tag)) { int uid = XmlUtils.readIntAttribute(parser, ATT_UID, UNKNOWN_UID); String name = parser.getAttributeValue(null, ATT_NAME); if (!TextUtils.isEmpty(name)) { @@ -375,6 +382,11 @@ public class PreferencesHelper implements RankingConfig { public void writeXml(XmlSerializer out, boolean forBackup) throws IOException { out.startTag(null, TAG_RANKING); out.attribute(null, ATT_VERSION, Integer.toString(XML_VERSION)); + if (mHideSilentStatusBarIcons != DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS) { + out.startTag(null, TAG_STATUS_ICONS); + out.attribute(null, ATT_HIDE_SILENT, String.valueOf(mHideSilentStatusBarIcons)); + out.endTag(null, TAG_STATUS_ICONS); + } synchronized (mPackagePreferences) { final int N = mPackagePreferences.size(); @@ -781,6 +793,14 @@ public class PreferencesHelper implements RankingConfig { } } + public boolean shouldHideSilentStatusIcons() { + return mHideSilentStatusBarIcons; + } + + public void setHideSilentStatusIcons(boolean hide) { + mHideSilentStatusBarIcons = hide; + } + public void lockChannelsForOEM(String[] appOrChannelList) { if (appOrChannelList == null) { return; diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index c2ac27a5b737..62c4815a7de0 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -34,9 +34,11 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ILauncherApps; import android.content.pm.IOnAppsChangedListener; +import android.content.pm.IPackageInstallerCallback; import android.content.pm.LauncherApps; import android.content.pm.LauncherApps.ShortcutQuery; import android.content.pm.PackageInfo; +import android.content.pm.PackageInstaller.SessionInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.ParceledListSlice; @@ -56,6 +58,7 @@ import android.os.IInterface; import android.os.ParcelFileDescriptor; import android.os.RemoteCallbackList; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; import android.os.UserManagerInternal; @@ -153,6 +156,8 @@ public class LauncherAppsService extends SystemService { private final Object mVouchedSignaturesLocked = new Object(); + private PackageInstallerService mPackageInstallerService; + public LauncherAppsImpl(Context context) { mContext = context; mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE); @@ -204,8 +209,7 @@ public class LauncherAppsService extends SystemService { } /* - * @see android.content.pm.ILauncherApps#addOnAppsChangedListener( - * android.content.pm.IOnAppsChangedListener) + * @see android.content.pm.ILauncherApps#addOnAppsChangedListener */ @Override public void addOnAppsChangedListener(String callingPackage, IOnAppsChangedListener listener) @@ -228,8 +232,7 @@ public class LauncherAppsService extends SystemService { } /* - * @see android.content.pm.ILauncherApps#removeOnAppsChangedListener( - * android.content.pm.IOnAppsChangedListener) + * @see android.content.pm.ILauncherApps#removeOnAppsChangedListener */ @Override public void removeOnAppsChangedListener(IOnAppsChangedListener listener) @@ -246,6 +249,44 @@ public class LauncherAppsService extends SystemService { } /** + * @see android.content.pm.ILauncherApps#registerPackageInstallerCallback + */ + @Override + public void registerPackageInstallerCallback(String callingPackage, + IPackageInstallerCallback callback) { + verifyCallingPackage(callingPackage); + UserHandle callingIdUserHandle = new UserHandle(getCallingUserId()); + getPackageInstallerService().registerCallback(callback, eventUserId -> + isEnabledProfileOf(callingIdUserHandle, + new UserHandle(eventUserId), "shouldReceiveEvent")); + } + + @Override + public ParceledListSlice<SessionInfo> getAllSessions(String callingPackage) { + verifyCallingPackage(callingPackage); + List<SessionInfo> sessionInfos = new ArrayList<>(); + int[] userIds = mUm.getEnabledProfileIds(getCallingUserId()); + long token = Binder.clearCallingIdentity(); + try { + for (int userId : userIds) { + sessionInfos.addAll(getPackageInstallerService().getAllSessions(userId) + .getList()); + } + } finally { + Binder.restoreCallingIdentity(token); + } + return new ParceledListSlice<>(sessionInfos); + } + + private PackageInstallerService getPackageInstallerService() { + if (mPackageInstallerService == null) { + mPackageInstallerService = ((PackageInstallerService) ((PackageManagerService) + ServiceManager.getService("package")).getPackageInstaller()); + } + return mPackageInstallerService; + } + + /** * Register a receiver to watch for package broadcasts */ private void startWatchingPackageBroadcasts() { @@ -430,6 +471,9 @@ public class LauncherAppsService extends SystemService { if (!mVouchedSignaturesByUser.containsKey(user)) { initVouchedSignatures(user); } + if (isManagedProfileAdmin(user, appInfo.packageName)) { + return false; + } if (mVouchProviders.contains(appInfo.packageName)) { // If it's a vouching packages then we must show hidden app return true; @@ -453,6 +497,24 @@ public class LauncherAppsService extends SystemService { return true; } + private boolean isManagedProfileAdmin(UserHandle user, String packageName) { + final List<UserInfo> userInfoList = mUm.getProfiles(user.getIdentifier()); + for (int i = 0; i < userInfoList.size(); i++) { + UserInfo userInfo = userInfoList.get(i); + if (!userInfo.isManagedProfile()) { + continue; + } + ComponentName componentName = mDpm.getProfileOwnerAsUser(userInfo.getUserHandle()); + if (componentName == null) { + continue; + } + if (componentName.getPackageName().equals(packageName)) { + return true; + } + } + return false; + } + @VisibleForTesting static String computePackageCertDigest(Signature signature) { MessageDigest messageDigest; @@ -848,6 +910,29 @@ public class LauncherAppsService extends SystemService { } @Override + public void startSessionDetailsActivityAsUser(IApplicationThread caller, + String callingPackage, SessionInfo sessionInfo, Rect sourceBounds, + Bundle opts, UserHandle userHandle) throws RemoteException { + int userId = userHandle.getIdentifier(); + if (!canAccessProfile(userId, "Cannot start details activity")) { + return; + } + + Intent i = new Intent(Intent.ACTION_VIEW) + .setData(new Uri.Builder() + .scheme("market") + .authority("details") + .appendQueryParameter("id", sessionInfo.appPackageName) + .build()) + .putExtra(Intent.EXTRA_REFERRER, new Uri.Builder().scheme("android-app") + .authority(callingPackage).build()); + i.setSourceBounds(sourceBounds); + + mActivityTaskManagerInternal.startActivityAsUser(caller, callingPackage, i, opts, + userId); + } + + @Override public void startActivityAsUser(IApplicationThread caller, String callingPackage, ComponentName component, Rect sourceBounds, Bundle opts, UserHandle user) throws RemoteException { diff --git a/services/core/java/com/android/server/pm/OWNERS b/services/core/java/com/android/server/pm/OWNERS index 60d792530101..33b8641c145e 100644 --- a/services/core/java/com/android/server/pm/OWNERS +++ b/services/core/java/com/android/server/pm/OWNERS @@ -51,6 +51,8 @@ per-file UserManagerService.java = omakoto@google.com per-file UserManagerService.java = yamasani@google.com per-file UserRestrictionsUtils.java = omakoto@google.com per-file UserRestrictionsUtils.java = yamasani@google.com +per-file UserRestrictionsUtils.java = rubinxu@google.com +per-file UserRestrictionsUtils.java = sandness@google.com # security per-file KeySetHandle.java = cbrubaker@google.com diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 146a2f3d8433..a3e0d8db8ad5 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -59,7 +59,6 @@ import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.SELinux; -import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; import android.system.ErrnoException; @@ -107,6 +106,7 @@ import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Random; +import java.util.function.IntPredicate; /** The service responsible for installing packages. */ public class PackageInstallerService extends IPackageInstaller.Stub implements @@ -804,7 +804,14 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements public void registerCallback(IPackageInstallerCallback callback, int userId) { mPermissionManager.enforceCrossUserPermission( Binder.getCallingUid(), userId, true, false, "registerCallback"); - mCallbacks.register(callback, userId); + registerCallback(callback, eventUserId -> userId == eventUserId); + } + + /** + * Assume permissions already checked and caller's identity cleared + */ + public void registerCallback(IPackageInstallerCallback callback, IntPredicate userCheck) { + mCallbacks.register(callback, userCheck); } @Override @@ -1026,8 +1033,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements super(looper); } - public void register(IPackageInstallerCallback callback, int userId) { - mCallbacks.register(callback, new UserHandle(userId)); + public void register(IPackageInstallerCallback callback, IntPredicate userCheck) { + mCallbacks.register(callback, userCheck); } public void unregister(IPackageInstallerCallback callback) { @@ -1040,9 +1047,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements final int n = mCallbacks.beginBroadcast(); for (int i = 0; i < n; i++) { final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i); - final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i); - // TODO: dispatch notifications for slave profiles - if (userId == user.getIdentifier()) { + final IntPredicate userCheck = (IntPredicate) mCallbacks.getBroadcastCookie(i); + if (userCheck.test(userId)) { try { invokeCallback(callback, msg); } catch (RemoteException ignored) { diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 494ec3ff67aa..de0849fa9951 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -473,6 +473,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { final SessionInfo info = new SessionInfo(); synchronized (mLock) { info.sessionId = sessionId; + info.userId = userId; info.installerPackageName = mInstallerPackageName; info.resolvedBaseCodePath = (mResolvedBaseFile != null) ? mResolvedBaseFile.getAbsolutePath() : null; diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 6f1eeeb7de7a..dc18dfcf8613 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -61,6 +61,10 @@ import android.content.pm.dex.DexMetadataHelper; import android.content.pm.dex.ISnapshotRuntimeProfileCallback; import android.content.res.AssetManager; import android.content.res.Resources; +import android.content.rollback.IRollbackManager; +import android.content.rollback.PackageRollbackInfo; +import android.content.rollback.RollbackInfo; +import android.content.rollback.RollbackManager; import android.net.Uri; import android.os.Binder; import android.os.Build; @@ -263,6 +267,8 @@ class PackageManagerShellCommand extends ShellCommand { return getStagedSessions(); case "uninstall-system-updates": return uninstallSystemUpdates(); + case "rollback-app": + return runRollbackApp(); default: { String nextArg = getNextArg(); if (nextArg == null) { @@ -348,6 +354,55 @@ class PackageManagerShellCommand extends ShellCommand { return 1; } + private int runRollbackApp() { + final PrintWriter pw = getOutPrintWriter(); + + final String packageName = getNextArgRequired(); + if (packageName == null) { + pw.println("Error: package name not specified"); + return 1; + } + + final LocalIntentReceiver receiver = new LocalIntentReceiver(); + try { + IRollbackManager rm = IRollbackManager.Stub.asInterface( + ServiceManager.getService(Context.ROLLBACK_SERVICE)); + + RollbackInfo rollback = null; + for (RollbackInfo r : (List<RollbackInfo>) rm.getAvailableRollbacks().getList()) { + for (PackageRollbackInfo info : r.getPackages()) { + if (packageName.equals(info.getPackageName())) { + rollback = r; + break; + } + } + } + + if (rollback == null) { + pw.println("No available rollbacks for: " + packageName); + return 1; + } + + rm.commitRollback(rollback.getRollbackId(), + ParceledListSlice.<VersionedPackage>emptyList(), + "com.android.shell", receiver.getIntentSender()); + } catch (RemoteException re) { + // Cannot happen. + } + + final Intent result = receiver.getResult(); + final int status = result.getIntExtra(RollbackManager.EXTRA_STATUS, + RollbackManager.STATUS_FAILURE); + if (status == RollbackManager.STATUS_SUCCESS) { + pw.println("Success"); + return 0; + } else { + pw.println("Failure [" + + result.getStringExtra(RollbackManager.EXTRA_STATUS_MESSAGE) + "]"); + return 1; + } + } + private void setParamsSize(InstallParams params, String inPath) { if (params.sessionParams.sizeBytes == -1 && !STDIN_PATH.equals(inPath)) { final ParcelFileDescriptor fd = openFileForSystem(inPath, "r"); diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 4f20590a47ff..d0f192d597c6 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1109,14 +1109,7 @@ public class UserManagerService extends IUserManager.Stub { @Override public int getManagedProfileBadge(@UserIdInt int userId) { - int callingUserId = UserHandle.getCallingUserId(); - if (callingUserId != userId && !hasManageUsersPermission()) { - if (!isSameProfileGroupNoChecks(callingUserId, userId)) { - throw new SecurityException( - "You need MANAGE_USERS permission to: check if specified user a " + - "managed profile outside your profile group"); - } - } + checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "getManagedProfileBadge"); synchronized (mUsersLock) { UserInfo userInfo = getUserInfoLU(userId); return userInfo != null ? userInfo.profileBadge : 0; @@ -1125,14 +1118,7 @@ public class UserManagerService extends IUserManager.Stub { @Override public boolean isManagedProfile(int userId) { - int callingUserId = UserHandle.getCallingUserId(); - if (callingUserId != userId && !hasManageUsersPermission()) { - if (!isSameProfileGroupNoChecks(callingUserId, userId)) { - throw new SecurityException( - "You need MANAGE_USERS permission to: check if specified user a " + - "managed profile outside your profile group"); - } - } + checkManageOrInteractPermIfCallerInOtherProfileGroup(userId, "isManagedProfile"); synchronized (mUsersLock) { UserInfo userInfo = getUserInfoLU(userId); return userInfo != null && userInfo.isManagedProfile(); diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java index 7ac7395e1f99..abbddf380e57 100644 --- a/services/core/java/com/android/server/pm/dex/DexManager.java +++ b/services/core/java/com/android/server/pm/dex/DexManager.java @@ -16,7 +16,7 @@ package com.android.server.pm.dex; -import static android.provider.DeviceConfig.FsiBoot; +import static android.provider.DeviceConfig.DexBoot; import static com.android.server.pm.InstructionSets.getAppDexInstructionSets; import static com.android.server.pm.dex.PackageDexUsage.DexUseInfo; @@ -710,8 +710,8 @@ public class DexManager { return isPackageSelectedToRunOobInternal( SystemProperties.getBoolean(PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB, false), SystemProperties.get(PROPERTY_NAME_PM_DEXOPT_PRIV_APPS_OOB_LIST, "ALL"), - DeviceConfig.getProperty(FsiBoot.NAMESPACE, FsiBoot.OOB_ENABLED), - DeviceConfig.getProperty(FsiBoot.NAMESPACE, FsiBoot.OOB_WHITELIST), + DeviceConfig.getProperty(DexBoot.NAMESPACE, DexBoot.PRIV_APPS_OOB_ENABLED), + DeviceConfig.getProperty(DexBoot.NAMESPACE, DexBoot.PRIV_APPS_OOB_WHITELIST), packageNamesInSameProcess); } diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java index 03ec57b45acf..d72270e3f36d 100644 --- a/services/core/java/com/android/server/role/RoleManagerService.java +++ b/services/core/java/com/android/server/role/RoleManagerService.java @@ -52,6 +52,7 @@ import android.os.UserManagerInternal; import android.service.sms.FinancialSmsService; import android.telephony.IFinancialSmsCallback; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.ArraySet; import android.util.PackageUtils; import android.util.Slog; @@ -145,6 +146,9 @@ public class RoleManagerService extends SystemService implements RoleUserState.C mUserManagerInternal = LocalServices.getService(UserManagerInternal.class); mAppOpsManager = context.getSystemService(AppOpsManager.class); + LocalServices.addService(RoleManagerServiceInternal.class, + new RoleManagerServiceInternalImpl()); + registerUserRemovedReceiver(); } @@ -382,6 +386,19 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } } + /** + * Get all roles and packages hold them. + * + * @param user The user to query to roles for + * + * @return The roles and their holders + */ + @NonNull + private ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(@NonNull UserHandle user) { + RoleUserState userState = getOrCreateUserState(user.getIdentifier()); + return userState.getRoleHolders(); + } + private class Stub extends IRoleManager.Stub { @Override @@ -676,4 +693,16 @@ public class RoleManagerService extends SystemService implements RoleUserState.C } } } + + /** + * Entry point for internal calls into role manager + */ + private final class RoleManagerServiceInternalImpl extends RoleManagerServiceInternal { + + @NonNull + @Override + public ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser(@NonNull UserHandle user) { + return RoleManagerService.this.getRoleHoldersAsUser(user); + } + } } diff --git a/services/core/java/com/android/server/role/RoleManagerServiceInternal.java b/services/core/java/com/android/server/role/RoleManagerServiceInternal.java new file mode 100644 index 000000000000..3afc3f731eb9 --- /dev/null +++ b/services/core/java/com/android/server/role/RoleManagerServiceInternal.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.role; + +import android.annotation.NonNull; +import android.os.UserHandle; +import android.util.ArrayMap; +import android.util.ArraySet; + +/** + * Internal calls into {@link RoleManagerService} + */ +public abstract class RoleManagerServiceInternal { + /** + * Get all roles and packages hold them. + * + * @param user The user to query to roles for + * + * @return The roles and their holders + */ + @NonNull + public abstract ArrayMap<String, ArraySet<String>> getRoleHoldersAsUser( + @NonNull UserHandle user); +} diff --git a/services/core/java/com/android/server/role/RoleUserState.java b/services/core/java/com/android/server/role/RoleUserState.java index 02dcc4945664..bc68dded2dfe 100644 --- a/services/core/java/com/android/server/role/RoleUserState.java +++ b/services/core/java/com/android/server/role/RoleUserState.java @@ -376,7 +376,7 @@ public class RoleUserState { version = mVersion; packagesHash = mPackagesHash; - roles = snapshotRolesLocked(); + roles = getRoleHolders(); } AtomicFile atomicFile = new AtomicFile(getFile(mUserId), "roles-" + mUserId); @@ -541,7 +541,7 @@ public class RoleUserState { version = mVersion; packagesHash = mPackagesHash; - roles = snapshotRolesLocked(); + roles = getRoleHolders(); } long fieldToken = dumpOutputStream.start(fieldName, fieldId); @@ -570,17 +570,24 @@ public class RoleUserState { dumpOutputStream.end(fieldToken); } - @GuardedBy("mLock") - private ArrayMap<String, ArraySet<String>> snapshotRolesLocked() { - ArrayMap<String, ArraySet<String>> roles = new ArrayMap<>(); - for (int i = 0, size = CollectionUtils.size(mRoles); i < size; ++i) { - String roleName = mRoles.keyAt(i); - ArraySet<String> roleHolders = mRoles.valueAt(i); - - roleHolders = new ArraySet<>(roleHolders); - roles.put(roleName, roleHolders); + /** + * Get the roles and their holders. + * + * @return A copy of the roles and their holders + */ + @NonNull + public ArrayMap<String, ArraySet<String>> getRoleHolders() { + synchronized (mLock) { + ArrayMap<String, ArraySet<String>> roles = new ArrayMap<>(); + for (int i = 0, size = CollectionUtils.size(mRoles); i < size; ++i) { + String roleName = mRoles.keyAt(i); + ArraySet<String> roleHolders = mRoles.valueAt(i); + + roleHolders = new ArraySet<>(roleHolders); + roles.put(roleName, roleHolders); + } + return roles; } - return roles; } /** diff --git a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java new file mode 100644 index 000000000000..8dd076028b43 --- /dev/null +++ b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java @@ -0,0 +1,236 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.rollback; + +import android.content.rollback.PackageRollbackInfo; +import android.content.rollback.PackageRollbackInfo.RestoreInfo; +import android.content.rollback.RollbackInfo; +import android.os.storage.StorageManager; +import android.util.IntArray; +import android.util.Log; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.server.pm.Installer; +import com.android.server.pm.Installer.InstallerException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Encapsulates the logic for initiating userdata snapshots and rollbacks via installd. + */ +@VisibleForTesting +// TODO(narayan): Reason about the failure scenarios that involve one or more IPCs to installd +// failing. We need to decide what course of action to take if calls to snapshotAppData or +// restoreAppDataSnapshot fail. +public class AppDataRollbackHelper { + private static final String TAG = "RollbackManager"; + + private final Installer mInstaller; + + public AppDataRollbackHelper(Installer installer) { + mInstaller = installer; + } + + /** + * Creates an app data snapshot for a specified {@code packageName} for {@code installedUsers}, + * a specified set of users for whom the package is installed. + * + * @return a list of users for which the snapshot is pending, usually because data for one or + * more users is still credential locked. + */ + public IntArray snapshotAppData(String packageName, int[] installedUsers) { + final IntArray pendingBackups = new IntArray(); + for (int user : installedUsers) { + final int storageFlags; + if (isUserCredentialLocked(user)) { + // We've encountered a user that hasn't unlocked on a FBE device, so we can't copy + // across app user data until the user unlocks their device. + Log.v(TAG, "User: " + user + " isn't unlocked, skipping CE userdata backup."); + storageFlags = Installer.FLAG_STORAGE_DE; + pendingBackups.add(user); + } else { + storageFlags = Installer.FLAG_STORAGE_CE | Installer.FLAG_STORAGE_DE; + } + + try { + mInstaller.snapshotAppData(packageName, user, storageFlags); + } catch (InstallerException ie) { + Log.e(TAG, "Unable to create app data snapshot for: " + packageName + + ", userId: " + user, ie); + } + } + + return pendingBackups; + } + + /** + * Restores an app data snapshot for a specified package ({@code packageName}, + * {@code rollbackData}) for a specified {@code userId}. + * + * @return {@code true} iff. a change to the {@code rollbackData} has been made. Changes to + * {@code rollbackData} are restricted to the removal or addition of {@code userId} to + * the list of pending backups or restores. + */ + public boolean restoreAppData(String packageName, RollbackData rollbackData, + int userId, int appId, long ceDataInode, String seInfo) { + if (rollbackData == null) { + return false; + } + + if (!rollbackData.inProgress) { + Log.e(TAG, "Request to restore userData for: " + packageName + + ", but no rollback in progress."); + return false; + } + + PackageRollbackInfo packageInfo = RollbackManagerServiceImpl.getPackageRollbackInfo( + rollbackData, packageName); + int storageFlags = Installer.FLAG_STORAGE_DE; + + final IntArray pendingBackups = packageInfo.getPendingBackups(); + final List<RestoreInfo> pendingRestores = packageInfo.getPendingRestores(); + boolean changedRollbackData = false; + + // If we still have a userdata backup pending for this user, it implies that the user + // hasn't unlocked their device between the point of backup and the point of restore, + // so the data cannot have changed. We simply skip restoring CE data in this case. + if (pendingBackups != null && pendingBackups.indexOf(userId) != -1) { + pendingBackups.remove(pendingBackups.indexOf(userId)); + changedRollbackData = true; + } else { + // There's no pending CE backup for this user, which means that we successfully + // managed to backup data for the user, which means we seek to restore it + if (isUserCredentialLocked(userId)) { + // We've encountered a user that hasn't unlocked on a FBE device, so we can't + // copy across app user data until the user unlocks their device. + pendingRestores.add(new RestoreInfo(userId, appId, seInfo)); + changedRollbackData = true; + } else { + // This user has unlocked, we can proceed to restore both CE and DE data. + storageFlags = storageFlags | Installer.FLAG_STORAGE_CE; + } + } + + try { + mInstaller.restoreAppDataSnapshot(packageName, appId, ceDataInode, + seInfo, userId, storageFlags); + } catch (InstallerException ie) { + Log.e(TAG, "Unable to restore app data snapshot: " + packageName, ie); + } + + return changedRollbackData; + } + + /** + * Computes the list of pending backups and restores for {@code userId} given lists of + * available and recent rollbacks. Packages pending backup for the given user are added + * to {@code pendingBackups} and packages pending restore are added to {@code pendingRestores} + * along with their corresponding {@code RestoreInfo}. + * + * @return the list of {@code RollbackData} that have been modified during this computation. + */ + public List<RollbackData> computePendingBackupsAndRestores(int userId, + ArrayList<String> pendingBackupPackages, Map<String, RestoreInfo> pendingRestores, + List<RollbackData> availableRollbacks, List<RollbackInfo> recentRollbacks) { + List<RollbackData> rd = new ArrayList<>(); + // First check with the list of available rollbacks to see whether there are any + // pending backup operations that we've not managed to execute. + for (RollbackData data : availableRollbacks) { + for (PackageRollbackInfo info : data.packages) { + final IntArray pendingBackupUsers = info.getPendingBackups(); + if (pendingBackupUsers != null) { + final int idx = pendingBackupUsers.indexOf(userId); + if (idx != -1) { + pendingBackupPackages.add(info.getPackageName()); + pendingBackupUsers.remove(idx); + if (rd.indexOf(data) == -1) { + rd.add(data); + } + } + } + } + } + + // Then check with the list of recently executed rollbacks to see whether there are + // any rollback operations + for (RollbackInfo data : recentRollbacks) { + for (PackageRollbackInfo info : data.getPackages()) { + final RestoreInfo ri = info.getRestoreInfo(userId); + if (ri != null) { + if (pendingBackupPackages.contains(info.getPackageName())) { + // This implies that the user hasn't unlocked their device between + // the request to backup data for this user and the request to restore + // it, so we do nothing here. + pendingBackupPackages.remove(info.getPackageName()); + } else { + pendingRestores.put(info.getPackageName(), ri); + } + + info.removeRestoreInfo(ri); + } + } + } + + return rd; + } + + /** + * Commits the list of pending backups and restores for a given {@code userId}. + */ + public void commitPendingBackupAndRestoreForUser(int userId, + ArrayList<String> pendingBackups, Map<String, RestoreInfo> pendingRestores) { + if (!pendingBackups.isEmpty()) { + for (String packageName : pendingBackups) { + try { + mInstaller.snapshotAppData(packageName, userId, Installer.FLAG_STORAGE_CE); + } catch (InstallerException ie) { + Log.e(TAG, "Unable to create app data snapshot for: " + packageName, ie); + } + } + } + + // TODO(narayan): Should we perform the restore before the backup for packages that have + // both backups and restores pending ? We could get into this case if we have a pending + // restore from a rollback + a snapshot request from a new restore. + if (!pendingRestores.isEmpty()) { + for (String packageName : pendingRestores.keySet()) { + try { + final RestoreInfo ri = pendingRestores.get(packageName); + + // TODO(narayan): Verify that the user of "0" for ceDataInode is accurate + // here. We know that the user has unlocked (and that their CE data is + // available) so we shouldn't need to resort to the fallback path. + mInstaller.restoreAppDataSnapshot(packageName, ri.appId, + 0 /* ceDataInode */, ri.seInfo, userId, Installer.FLAG_STORAGE_CE); + } catch (InstallerException ie) { + Log.e(TAG, "Unable to restore app data snapshot for: " + packageName, ie); + } + } + } + } + + /** + * @return {@code true} iff. {@code userId} is locked on an FBE device. + */ + @VisibleForTesting + public boolean isUserCredentialLocked(int userId) { + return StorageManager.isFileEncryptedNativeOrEmulated() + && !StorageManager.isUserKeyUnlocked(userId); + } +} diff --git a/services/core/java/com/android/server/rollback/RollbackManagerService.java b/services/core/java/com/android/server/rollback/RollbackManagerService.java index 4b5e76497f62..ba6cdddb4cc8 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerService.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerService.java @@ -39,4 +39,9 @@ public final class RollbackManagerService extends SystemService { mService = new RollbackManagerServiceImpl(getContext()); publishBinderService(Context.ROLLBACK_SERVICE, mService); } + + @Override + public void onUnlockUser(int user) { + mService.onUnlockUser(user); + } } diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index 289618eb133c..5eb137b4c50c 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -31,6 +31,7 @@ import android.content.pm.ParceledListSlice; import android.content.pm.VersionedPackage; import android.content.rollback.IRollbackManager; import android.content.rollback.PackageRollbackInfo; +import android.content.rollback.PackageRollbackInfo.RestoreInfo; import android.content.rollback.RollbackInfo; import android.content.rollback.RollbackManager; import android.os.Binder; @@ -39,14 +40,13 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.ParcelFileDescriptor; import android.os.Process; -import android.os.storage.StorageManager; +import android.util.IntArray; import android.util.Log; import android.util.SparseBooleanArray; import com.android.internal.annotations.GuardedBy; import com.android.server.LocalServices; import com.android.server.pm.Installer; -import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.PackageManagerServiceUtils; import java.io.File; @@ -111,6 +111,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { private final HandlerThread mHandlerThread; private final Installer mInstaller; private final RollbackPackageHealthObserver mPackageHealthObserver; + private final AppDataRollbackHelper mUserdataHelper; RollbackManagerServiceImpl(Context context) { mContext = context; @@ -124,6 +125,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { mRollbackStore = new RollbackStore(new File(Environment.getDataDirectory(), "rollback")); mPackageHealthObserver = new RollbackPackageHealthObserver(mContext); + mUserdataHelper = new AppDataRollbackHelper(mInstaller); // Kick off loading of the rollback data from strorage in a background // thread. @@ -424,6 +426,35 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } } + void onUnlockUser(int userId) { + getHandler().post(() -> { + final ArrayList<String> pendingBackupPackages = new ArrayList<>(); + final Map<String, RestoreInfo> pendingRestorePackages = new HashMap<>(); + final List<RollbackData> changed; + synchronized (mLock) { + ensureRollbackDataLoadedLocked(); + changed = mUserdataHelper.computePendingBackupsAndRestores(userId, + pendingBackupPackages, pendingRestorePackages, mAvailableRollbacks, + mRecentlyExecutedRollbacks); + } + + mUserdataHelper.commitPendingBackupAndRestoreForUser(userId, + pendingBackupPackages, pendingRestorePackages); + + for (RollbackData rd : changed) { + try { + mRollbackStore.saveAvailableRollback(rd); + } catch (IOException ioe) { + Log.e(TAG, "Unable to save rollback info for : " + rd.rollbackId, ioe); + } + } + + synchronized (mLock) { + mRollbackStore.saveRecentlyExecutedRollbacks(mRecentlyExecutedRollbacks); + } + }); + } + /** * Load rollback data from storage if it has not already been loaded. * After calling this funciton, mAvailableRollbacks and @@ -533,6 +564,20 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { // that are necessary to keep track of. synchronized (mLock) { ensureRollbackDataLoadedLocked(); + + // This should never happen because we can't have any pending backups left after + // a rollback has been executed. See AppDataRollbackHelper#restoreAppData where we + // clear all pending backups at the point of restore because they're guaranteed to be + // no-ops. + // + // We may, however, have one or more pending restores left to handle. + for (PackageRollbackInfo target : rollback.getPackages()) { + if (target.getPendingBackups().size() > 0) { + Log.e(TAG, "No backups allowed to be pending for: " + target); + target.getPendingBackups().clear(); + } + } + mRecentlyExecutedRollbacks.add(rollback); mRollbackStore.saveRecentlyExecutedRollbacks(mRecentlyExecutedRollbacks); } @@ -701,27 +746,12 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { VersionedPackage installedVersion = new VersionedPackage(packageName, installedPackage.getLongVersionCode()); - for (int user : installedUsers) { - final int storageFlags; - if (StorageManager.isFileEncryptedNativeOrEmulated() - && !StorageManager.isUserKeyUnlocked(user)) { - // We've encountered a user that hasn't unlocked on a FBE device, so we can't copy - // across app user data until the user unlocks their device. - Log.e(TAG, "User: " + user + " isn't unlocked, skipping CE userdata backup."); - storageFlags = Installer.FLAG_STORAGE_DE; - } else { - storageFlags = Installer.FLAG_STORAGE_CE | Installer.FLAG_STORAGE_DE; - } - - try { - mInstaller.snapshotAppData(packageName, user, storageFlags); - } catch (InstallerException ie) { - Log.e(TAG, "Unable to create app data snapshot for: " + packageName, ie); - } - } - PackageRollbackInfo info = new PackageRollbackInfo(newVersion, installedVersion); + final IntArray pendingBackups = mUserdataHelper.snapshotAppData(packageName, + installedUsers); + PackageRollbackInfo info = new PackageRollbackInfo(newVersion, installedVersion, + pendingBackups, new ArrayList<>()); RollbackData data; try { synchronized (mLock) { @@ -760,40 +790,24 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } getHandler().post(() -> { - PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class); final RollbackData rollbackData = getRollbackForPackage(packageName); - if (rollbackData == null) { - pmi.finishPackageInstall(token, false); - return; - } - - if (!rollbackData.inProgress) { - Log.e(TAG, "Request to restore userData for: " + packageName - + ", but no rollback in progress."); - pmi.finishPackageInstall(token, false); - return; - } - - final int storageFlags; - if (StorageManager.isFileEncryptedNativeOrEmulated() - && !StorageManager.isUserKeyUnlocked(userId)) { - // We've encountered a user that hasn't unlocked on a FBE device, so we can't copy - // across app user data until the user unlocks their device. - Log.e(TAG, "User: " + userId + " isn't unlocked, skipping CE userdata restore."); - - storageFlags = Installer.FLAG_STORAGE_DE; - } else { - storageFlags = Installer.FLAG_STORAGE_CE | Installer.FLAG_STORAGE_DE; - } + final boolean changedRollbackData = mUserdataHelper.restoreAppData(packageName, + rollbackData, userId, appId, ceDataInode, seInfo); + final PackageManagerInternal pmi = LocalServices.getService( + PackageManagerInternal.class); + pmi.finishPackageInstall(token, false); - try { - mInstaller.restoreAppDataSnapshot(packageName, appId, ceDataInode, - seInfo, userId, storageFlags); - } catch (InstallerException ie) { - Log.e(TAG, "Unable to restore app data snapshot: " + packageName, ie); + // We've updated metadata about this rollback, so save it to flash. + if (changedRollbackData) { + try { + mRollbackStore.saveAvailableRollback(rollbackData); + } catch (IOException ioe) { + // TODO(narayan): What is the right thing to do here ? This isn't a fatal error, + // since it will only result in us trying to restore data again, which will be + // a no-op if there's no data available. + Log.e(TAG, "Unable to save available rollback: " + packageName, ioe); + } } - - pmi.finishPackageInstall(token, false); }); } @@ -900,10 +914,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { ensureRollbackDataLoadedLocked(); for (int i = 0; i < mAvailableRollbacks.size(); ++i) { RollbackData data = mAvailableRollbacks.get(i); - for (PackageRollbackInfo info : data.packages) { - if (info.getPackageName().equals(packageName)) { - return data; - } + if (getPackageRollbackInfo(data, packageName) != null) { + return data; } } } @@ -926,6 +938,22 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } } } + + return null; + } + + /** + * Returns the {@code PackageRollbackInfo} associated with {@code packageName} from + * a specified {@code RollbackData}. + */ + static PackageRollbackInfo getPackageRollbackInfo(RollbackData data, + String packageName) { + for (PackageRollbackInfo info : data.packages) { + if (info.getPackageName().equals(packageName)) { + return info; + } + } + return null; } diff --git a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java index 28801038ebd1..b3cc6deb2810 100644 --- a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java +++ b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java @@ -19,6 +19,7 @@ package com.android.server.rollback; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInstaller; +import android.content.pm.VersionedPackage; import android.content.rollback.PackageRollbackInfo; import android.content.rollback.RollbackInfo; import android.content.rollback.RollbackManager; @@ -41,12 +42,10 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve private static final String TAG = "RollbackPackageHealthObserver"; private static final String NAME = "rollback-observer"; private Context mContext; - private RollbackManager mRollbackManager; private Handler mHandler; RollbackPackageHealthObserver(Context context) { mContext = context; - mRollbackManager = mContext.getSystemService(RollbackManager.class); HandlerThread handlerThread = new HandlerThread("RollbackPackageHealthObserver"); handlerThread.start(); mHandler = handlerThread.getThreadHandler(); @@ -54,8 +53,10 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve } @Override - public int onHealthCheckFailed(String packageName) { - RollbackInfo rollback = getAvailableRollback(packageName); + public int onHealthCheckFailed(String packageName, long versionCode) { + RollbackInfo rollback = + getAvailableRollback(mContext.getSystemService(RollbackManager.class), + packageName, versionCode); if (rollback == null) { // Don't handle the notification, no rollbacks available for the package return PackageHealthObserverImpact.USER_IMPACT_NONE; @@ -65,8 +66,9 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve } @Override - public boolean execute(String packageName) { - RollbackInfo rollback = getAvailableRollback(packageName); + public boolean execute(String packageName, long versionCode) { + RollbackManager rollbackManager = mContext.getSystemService(RollbackManager.class); + RollbackInfo rollback = getAvailableRollback(rollbackManager, packageName, versionCode); if (rollback == null) { // Expected a rollback to be available, what happened? return false; @@ -86,12 +88,9 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve }); // TODO(zezeozue): Log initiated metrics - // TODO: Pass the package as a cause package instead of using - // Collections.emptyList once the version of the failing package is - // easily available. mHandler.post(() -> - mRollbackManager.commitRollback(rollback.getRollbackId(), - Collections.emptyList(), + rollbackManager.commitRollback(rollback.getRollbackId(), + Collections.singletonList(new VersionedPackage(packageName, versionCode)), rollbackReceiver.getIntentSender())); // Assume rollback executed successfully return true; @@ -110,11 +109,13 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve PackageWatchdog.getInstance(mContext).startObservingHealth(this, packages, durationMs); } - private RollbackInfo getAvailableRollback(String packageName) { - for (RollbackInfo rollback : mRollbackManager.getAvailableRollbacks()) { + private RollbackInfo getAvailableRollback(RollbackManager rollbackManager, + String packageName, long versionCode) { + for (RollbackInfo rollback : rollbackManager.getAvailableRollbacks()) { for (PackageRollbackInfo packageRollback : rollback.getPackages()) { - if (packageName.equals(packageRollback.getPackageName())) { - // TODO(zezeozue): Only rollback if rollback version == failed package version + if (packageName.equals(packageRollback.getPackageName()) + && packageRollback.getVersionRolledBackFrom().getVersionCode() + == versionCode) { return rollback; } } diff --git a/services/core/java/com/android/server/rollback/RollbackStore.java b/services/core/java/com/android/server/rollback/RollbackStore.java index 98ebb0943f43..c70f47dc5ed3 100644 --- a/services/core/java/com/android/server/rollback/RollbackStore.java +++ b/services/core/java/com/android/server/rollback/RollbackStore.java @@ -16,9 +16,12 @@ package com.android.server.rollback; +import android.annotation.NonNull; import android.content.pm.VersionedPackage; import android.content.rollback.PackageRollbackInfo; +import android.content.rollback.PackageRollbackInfo.RestoreInfo; import android.content.rollback.RollbackInfo; +import android.util.IntArray; import android.util.Log; import libcore.io.IoUtils; @@ -99,6 +102,64 @@ class RollbackStore { } /** + * Converts an {@code JSONArray} of integers to an {@code IntArray}. + */ + private static @NonNull IntArray convertToIntArray(@NonNull JSONArray jsonArray) + throws JSONException { + if (jsonArray.length() == 0) { + return new IntArray(); + } + + final int[] ret = new int[jsonArray.length()]; + for (int i = 0; i < ret.length; ++i) { + ret[i] = jsonArray.getInt(i); + } + + return IntArray.wrap(ret); + } + + /** + * Converts an {@code IntArray} into an {@code JSONArray} of integers. + */ + private static @NonNull JSONArray convertToJsonArray(@NonNull IntArray intArray) { + JSONArray jsonArray = new JSONArray(); + for (int i = 0; i < intArray.size(); ++i) { + jsonArray.put(intArray.get(i)); + } + + return jsonArray; + } + + private static @NonNull JSONArray convertToJsonArray(@NonNull List<RestoreInfo> list) + throws JSONException { + JSONArray jsonArray = new JSONArray(); + for (RestoreInfo ri : list) { + JSONObject jo = new JSONObject(); + jo.put("userId", ri.userId); + jo.put("appId", ri.appId); + jo.put("seInfo", ri.seInfo); + jsonArray.put(jo); + } + + return jsonArray; + } + + private static @NonNull ArrayList<RestoreInfo> convertToRestoreInfoArray( + @NonNull JSONArray array) throws JSONException { + ArrayList<RestoreInfo> restoreInfos = new ArrayList<>(); + + for (int i = 0; i < array.length(); ++i) { + JSONObject jo = array.getJSONObject(i); + restoreInfos.add(new RestoreInfo( + jo.getInt("userId"), + jo.getInt("appId"), + jo.getString("seInfo"))); + } + + return restoreInfos; + } + + /** * Reads the list of recently executed rollbacks from persistent storage. */ List<RollbackInfo> loadRecentlyExecutedRollbacks() { @@ -239,6 +300,12 @@ class RollbackStore { JSONObject json = new JSONObject(); json.put("versionRolledBackFrom", toJson(info.getVersionRolledBackFrom())); json.put("versionRolledBackTo", toJson(info.getVersionRolledBackTo())); + + IntArray pendingBackups = info.getPendingBackups(); + List<RestoreInfo> pendingRestores = info.getPendingRestores(); + json.put("pendingBackups", convertToJsonArray(pendingBackups)); + json.put("pendingRestores", convertToJsonArray(pendingRestores)); + return json; } @@ -247,7 +314,14 @@ class RollbackStore { json.getJSONObject("versionRolledBackFrom")); VersionedPackage versionRolledBackTo = versionedPackageFromJson( json.getJSONObject("versionRolledBackTo")); - return new PackageRollbackInfo(versionRolledBackFrom, versionRolledBackTo); + + final IntArray pendingBackups = convertToIntArray( + json.getJSONArray("pendingBackups")); + final ArrayList<RestoreInfo> pendingRestores = convertToRestoreInfoArray( + json.getJSONArray("pendingRestores")); + + return new PackageRollbackInfo(versionRolledBackFrom, versionRolledBackTo, + pendingBackups, pendingRestores); } private JSONArray versionedPackagesToJson(List<VersionedPackage> packages) diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java index c6d2870a24c9..2be78fe32f68 100644 --- a/services/core/java/com/android/server/stats/StatsCompanionService.java +++ b/services/core/java/com/android/server/stats/StatsCompanionService.java @@ -23,6 +23,7 @@ import static com.android.server.am.MemoryStatUtil.readCmdlineFromProcfs; import static com.android.server.am.MemoryStatUtil.readMemoryStatFromProcfs; import static com.android.server.am.MemoryStatUtil.readRssHighWaterMarkFromProcfs; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManagerInternal; import android.app.AlarmManager; @@ -83,6 +84,7 @@ import android.os.storage.StorageManager; import android.telephony.ModemActivityInfo; import android.telephony.TelephonyManager; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Log; import android.util.Slog; import android.util.StatsLog; @@ -112,6 +114,7 @@ import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.SystemServiceManager; import com.android.server.am.MemoryStatUtil.MemoryStat; +import com.android.server.role.RoleManagerServiceInternal; import com.android.server.storage.DiskStatsFileLogger; import com.android.server.storage.DiskStatsLoggingService; @@ -1781,6 +1784,60 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } /** + * Add a RoleHolder atom for each package that holds a role. + * + * @param elapsedNanos the time since boot + * @param wallClockNanos the time on the clock + * @param pulledData the data sink to write to + */ + private void pullRoleHolders(long elapsedNanos, final long wallClockNanos, + @NonNull List<StatsLogEventWrapper> pulledData) { + long callingToken = Binder.clearCallingIdentity(); + try { + PackageManager pm = mContext.getPackageManager(); + RoleManagerServiceInternal rm = + LocalServices.getService(RoleManagerServiceInternal.class); + + List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers(); + + int numUsers = users.size(); + for (int userNum = 0; userNum < numUsers; userNum++) { + UserHandle user = users.get(userNum).getUserHandle(); + + ArrayMap<String, ArraySet<String>> roles = rm.getRoleHoldersAsUser(user); + + int numRoles = roles.size(); + for (int roleNum = 0; roleNum < numRoles; roleNum++) { + String roleName = roles.keyAt(roleNum); + ArraySet<String> holders = roles.valueAt(roleNum); + + int numHolders = holders.size(); + for (int holderNum = 0; holderNum < numHolders; holderNum++) { + String holderName = holders.valueAt(holderNum); + + PackageInfo pkg; + try { + pkg = pm.getPackageInfoAsUser(holderName, 0, user.getIdentifier()); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "Role holder " + holderName + " not found"); + return; + } + + StatsLogEventWrapper e = new StatsLogEventWrapper(StatsLog.ROLE_HOLDER, + elapsedNanos, wallClockNanos); + e.writeInt(pkg.applicationInfo.uid); + e.writeString(holderName); + e.writeString(roleName); + pulledData.add(e); + } + } + } + } finally { + Binder.restoreCallingIdentity(callingToken); + } + } + + /** * Pulls various data. */ @Override // Binder call @@ -1954,6 +2011,10 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pullDebugFailingElapsedClock(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.ROLE_HOLDER: { + pullRoleHolders(elapsedNanos, wallClockNanos, ret); + break; + } default: Slog.w(TAG, "No such tagId data as " + tagId); return null; diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index b0ef8a0d4209..071dde74f103 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -2243,12 +2243,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub synchronized (mLock) { mInAmbientMode = inAmbientMode; final WallpaperData data = mWallpaperMap.get(mCurrentUserId); - final boolean hasConnection = data != null && data.connection != null; - final WallpaperInfo info = hasConnection ? data.connection.mInfo : null; - // The wallpaper info is null for image wallpaper, also use the engine in this case. - if (hasConnection && (info == null && isAodImageWallpaperEnabled() - || info != null && info.supportsAmbientMode())) { + if (data != null && data.connection != null && (data.connection.mInfo == null + || data.connection.mInfo.supportsAmbientMode())) { // TODO(multi-display) Extends this method with specific display. engine = data.connection.getDisplayConnectorOrCreate(DEFAULT_DISPLAY).mEngine; } else { diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index b23dcb33720f..16c44aa3220f 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -148,7 +148,6 @@ import android.util.EventLog; import android.util.IntArray; import android.util.Log; import android.util.Slog; -import android.util.SparseArray; import android.util.proto.ProtoOutputStream; import android.view.Display; @@ -377,8 +376,6 @@ class ActivityStack extends ConfigurationContainer { /** Stores the override windowing-mode from before a transient mode change (eg. split) */ private int mRestoreOverrideWindowingMode = WINDOWING_MODE_UNDEFINED; - private final SparseArray<Rect> mTmpBounds = new SparseArray<>(); - private final SparseArray<Rect> mTmpInsetBounds = new SparseArray<>(); private final Rect mTmpRect = new Rect(); private final Rect mTmpRect2 = new Rect(); private final Rect mTmpRect3 = new Rect(); @@ -4668,6 +4665,14 @@ class ActivityStack extends ConfigurationContainer { removeHistoryRecordsForAppLocked(mStackSupervisor.mFinishingActivities, app, "mFinishingActivities"); + final boolean isProcessRemoved = app.isRemoved(); + if (isProcessRemoved) { + // The package of the died process should be force-stopped, so make its activities as + // finishing to prevent the process from being started again if the next top (or being + // visible) activity also resides in the same process. + app.makeFinishingForProcessRemoved(); + } + boolean hasVisibleActivities = false; // Clean out the history list. @@ -4720,7 +4725,7 @@ class ActivityStack extends ConfigurationContainer { + " stateNotNeeded=" + r.stateNotNeeded + " finishing=" + r.finishing + " state=" + r.getState() + " callers=" + Debug.getCallers(5)); - if (!r.finishing) { + if (!r.finishing || isProcessRemoved) { Slog.w(TAG, "Force removing " + r + ": app died, no saved state"); EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY, r.mUserId, System.identityHashCode(r), @@ -4992,22 +4997,11 @@ class ActivityStack extends ConfigurationContainer { // Update override configurations of all tasks in the stack. final Rect taskBounds = tempTaskBounds != null ? tempTaskBounds : bounds; - mTmpBounds.clear(); - mTmpInsetBounds.clear(); - for (int i = mTaskHistory.size() - 1; i >= 0; i--) { final TaskRecord task = mTaskHistory.get(i); if (task.isResizeable()) { task.updateOverrideConfiguration(taskBounds, tempTaskInsetBounds); } - - if (task.hasDisplayedBounds()) { - mTmpBounds.put(task.taskId, task.getDisplayedBounds()); - mTmpInsetBounds.put(task.taskId, task.getRequestedOverrideBounds()); - } else { - mTmpBounds.put(task.taskId, task.getRequestedOverrideBounds()); - mTmpInsetBounds.put(task.taskId, null); - } } setBounds(bounds); @@ -5125,12 +5119,6 @@ class ActivityStack extends ConfigurationContainer { } didSomething = true; Slog.i(TAG, " Force finishing activity " + r); - if (sameComponent) { - if (r.hasProcess()) { - r.app.setRemoved(true); - } - r.app = null; - } lastTask = r.getTaskRecord(); finishActivityLocked(r, Activity.RESULT_CANCELED, null, "force-stop", true); diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 95a6f71fc44b..d1cd1dbe18bc 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -926,6 +926,10 @@ class ActivityStarter { if (callerApp != null && callerApp.hasForegroundActivities()) { return false; } + // don't abort if the callerApp is instrumenting with background activity starts privileges + if (callerApp != null && callerApp.isInstrumentingWithBackgroundActivityStartPrivileges()) { + return false; + } // don't abort if the callingUid is in the foreground or is a persistent system process final int callingUidProcState = mService.getUidStateLocked(callingUid); final boolean callingUidHasAnyVisibleWindow = diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 5fabde45db55..09ef4b95e66b 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -349,6 +349,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { /* Global service lock used by the package the owns this service. */ final WindowManagerGlobalLock mGlobalLock = new WindowManagerGlobalLock(); + /** + * It is the same instance as {@link mGlobalLock}, just declared as a type that the + * locked-region-code-injection does't recognize it. It is used to skip wrapping priority + * booster for places that are already in the scope of another booster (e.g. computing oom-adj). + * + * @see WindowManagerThreadPriorityBooster + */ + final Object mGlobalLockWithoutBoost = mGlobalLock; ActivityStackSupervisor mStackSupervisor; RootActivityContainer mRootActivityContainer; WindowManagerService mWindowManager; @@ -6837,7 +6845,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public WindowProcessController getTopApp() { - synchronized (mGlobalLock) { + synchronized (mGlobalLockWithoutBoost) { final ActivityRecord top = mRootActivityContainer.getTopResumedActivity(); return top != null ? top.app : null; } @@ -6845,7 +6853,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public void rankTaskLayersIfNeeded() { - synchronized (mGlobalLock) { + synchronized (mGlobalLockWithoutBoost) { if (mRootActivityContainer != null) { mRootActivityContainer.rankTaskLayersIfNeeded(); } @@ -6889,28 +6897,28 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public void onUidActive(int uid, int procState) { - synchronized (mGlobalLock) { + synchronized (mGlobalLockWithoutBoost) { mActiveUids.put(uid, procState); } } @Override public void onUidInactive(int uid) { - synchronized (mGlobalLock) { + synchronized (mGlobalLockWithoutBoost) { mActiveUids.remove(uid); } } @Override public void onActiveUidsCleared() { - synchronized (mGlobalLock) { + synchronized (mGlobalLockWithoutBoost) { mActiveUids.clear(); } } @Override public void onUidProcStateChanged(int uid, int procState) { - synchronized (mGlobalLock) { + synchronized (mGlobalLockWithoutBoost) { if (mActiveUids.get(uid) != null) { mActiveUids.put(uid, procState); } @@ -6919,14 +6927,14 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public void onUidAddedToPendingTempWhitelist(int uid, String tag) { - synchronized (mGlobalLock) { + synchronized (mGlobalLockWithoutBoost) { mPendingTempWhitelist.put(uid, tag); } } @Override public void onUidRemovedFromPendingTempWhitelist(int uid) { - synchronized (mGlobalLock) { + synchronized (mGlobalLockWithoutBoost) { mPendingTempWhitelist.remove(uid); } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 3426ba611c86..080f9651f86b 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -29,6 +29,7 @@ import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.FLAG_PRIVATE; +import static android.view.Display.INVALID_DISPLAY; import static android.view.InsetsState.TYPE_IME; import static android.view.Surface.ROTATION_0; import static android.view.Surface.ROTATION_180; @@ -43,6 +44,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; +import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH; import static android.view.WindowManager.LayoutParams.NEEDS_MENU_SET_TRUE; import static android.view.WindowManager.LayoutParams.NEEDS_MENU_UNSET; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; @@ -140,9 +142,11 @@ import android.graphics.RectF; import android.graphics.Region; import android.graphics.Region.Op; import android.hardware.display.DisplayManagerInternal; +import android.os.Binder; import android.os.Debug; import android.os.Handler; import android.os.IBinder; +import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.os.Trace; @@ -157,6 +161,7 @@ import android.view.DisplayInfo; import android.view.Gravity; import android.view.InputChannel; import android.view.InputDevice; +import android.view.InputWindowHandle; import android.view.InsetsState.InternalInsetType; import android.view.MagnificationSpec; import android.view.RemoteAnimationDefinition; @@ -515,6 +520,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo private final InsetsStateController mInsetsStateController; + private SurfaceControl mParentSurfaceControl; + private InputWindowHandle mPortalWindowHandle; + // Last systemUiVisibility we received from status bar. private int mLastStatusBarVisibility = 0; // Last systemUiVisibility we dispatched to windows. @@ -1657,35 +1665,42 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo final int len = devices != null ? devices.length : 0; for (int i = 0; i < len; i++) { InputDevice device = devices[i]; - if (!device.isVirtual()) { - final int sources = device.getSources(); - final int presenceFlag = device.isExternal() ? - WindowManagerPolicy.PRESENCE_EXTERNAL : - WindowManagerPolicy.PRESENCE_INTERNAL; - - // TODO(multi-display): Configure on per-display basis. - if (mWmService.mIsTouchDevice) { - if ((sources & InputDevice.SOURCE_TOUCHSCREEN) == - InputDevice.SOURCE_TOUCHSCREEN) { - config.touchscreen = Configuration.TOUCHSCREEN_FINGER; - } - } else { - config.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH; - } + // Ignore virtual input device. + if (device.isVirtual()) { + continue; + } - if ((sources & InputDevice.SOURCE_TRACKBALL) == InputDevice.SOURCE_TRACKBALL) { - config.navigation = Configuration.NAVIGATION_TRACKBALL; - navigationPresence |= presenceFlag; - } else if ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD - && config.navigation == Configuration.NAVIGATION_NONAV) { - config.navigation = Configuration.NAVIGATION_DPAD; - navigationPresence |= presenceFlag; - } + // Check if input device can dispatch events to current display. + // If display type is virtual, will follow the default display. + if (!mWmService.mInputManager.canDispatchToDisplay(device.getId(), + displayInfo.type == Display.TYPE_VIRTUAL ? DEFAULT_DISPLAY : mDisplayId)) { + continue; + } - if (device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) { - config.keyboard = Configuration.KEYBOARD_QWERTY; - keyboardPresence |= presenceFlag; + final int sources = device.getSources(); + final int presenceFlag = device.isExternal() + ? WindowManagerPolicy.PRESENCE_EXTERNAL : WindowManagerPolicy.PRESENCE_INTERNAL; + + if (mWmService.mIsTouchDevice) { + if ((sources & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) { + config.touchscreen = Configuration.TOUCHSCREEN_FINGER; } + } else { + config.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH; + } + + if ((sources & InputDevice.SOURCE_TRACKBALL) == InputDevice.SOURCE_TRACKBALL) { + config.navigation = Configuration.NAVIGATION_TRACKBALL; + navigationPresence |= presenceFlag; + } else if ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD + && config.navigation == Configuration.NAVIGATION_NONAV) { + config.navigation = Configuration.NAVIGATION_DPAD; + navigationPresence |= presenceFlag; + } + + if (device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) { + config.keyboard = Configuration.KEYBOARD_QWERTY; + keyboardPresence |= presenceFlag; } } @@ -2410,10 +2425,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo win.getTouchableRegion(mTmpRegion); mTouchExcludeRegion.op(mTmpRegion, Region.Op.UNION); } - for (int i = mTapExcludeProvidingWindows.size() - 1; i >= 0; i--) { - final WindowState win = mTapExcludeProvidingWindows.valueAt(i); - win.amendTapExcludeRegion(mTouchExcludeRegion); - } + amendWindowTapExcludeRegion(mTouchExcludeRegion); // TODO(multi-display): Support docked stacks on secondary displays. if (mDisplayId == DEFAULT_DISPLAY && getSplitScreenPrimaryStack() != null) { mDividerControllerLocked.getTouchRegion(mTmpRect); @@ -2425,6 +2437,18 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } } + /** + * Union the region with all the tap exclude region provided by windows on this display. + * + * @param inOutRegion The region to be amended. + */ + void amendWindowTapExcludeRegion(Region inOutRegion) { + for (int i = mTapExcludeProvidingWindows.size() - 1; i >= 0; i--) { + final WindowState win = mTapExcludeProvidingWindows.valueAt(i); + win.amendTapExcludeRegion(inOutRegion); + } + } + @Override void switchUser() { super.switchUser(); @@ -3586,6 +3610,13 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo private void updateBounds() { calculateBounds(mDisplayInfo, mTmpBounds); setBounds(mTmpBounds); + if (mPortalWindowHandle != null && mParentSurfaceControl != null) { + mPortalWindowHandle.touchableRegion.getBounds(mTmpRect); + if (!mTmpBounds.equals(mTmpRect)) { + mPortalWindowHandle.touchableRegion.set(mTmpBounds); + mPendingTransaction.setInputWindowInfo(mParentSurfaceControl, mPortalWindowHandle); + } + } } // Determines the current display bounds based on the current state @@ -4830,15 +4861,43 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo || mWmService.mForceDesktopModeOnExternalDisplays; } - /** + /** * Re-parent the DisplayContent's top surfaces, {@link #mWindowingLayer} and * {@link #mOverlayLayer} to the specified surfaceControl. * - * @param surfaceControlHandle The new SurfaceControl, where the DisplayContent's - * surfaces will be re-parented to. + * @param sc The new SurfaceControl, where the DisplayContent's surfaces will be re-parented to. */ void reparentDisplayContent(SurfaceControl sc) { - mPendingTransaction.reparent(mWindowingLayer, sc) - .reparent(mOverlayLayer, sc); + mParentSurfaceControl = sc; + if (mPortalWindowHandle == null) { + mPortalWindowHandle = createPortalWindowHandle(sc.toString()); + } + mPendingTransaction.setInputWindowInfo(sc, mPortalWindowHandle) + .reparent(mWindowingLayer, sc).reparent(mOverlayLayer, sc); + } + + /** + * Create a portal window handle for input. This window transports any touch to the display + * indicated by {@link InputWindowHandle#portalToDisplayId} if the touch hits this window. + * + * @param name The name of the portal window handle. + * @return the new portal window handle. + */ + private InputWindowHandle createPortalWindowHandle(String name) { + // Let surface flinger to set the display ID of this input window handle because we don't + // know which display the parent surface control is on. + final InputWindowHandle portalWindowHandle = new InputWindowHandle( + null /* inputApplicationHandle */, null /* clientWindow */, INVALID_DISPLAY); + portalWindowHandle.name = name; + portalWindowHandle.token = new Binder(); + portalWindowHandle.layoutParamsFlags = + FLAG_SPLIT_TOUCH | FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL; + getBounds(mTmpBounds); + portalWindowHandle.touchableRegion.set(mTmpBounds); + portalWindowHandle.scaleFactor = 1f; + portalWindowHandle.ownerPid = Process.myPid(); + portalWindowHandle.ownerUid = Process.myUid(); + portalWindowHandle.portalToDisplayId = mDisplayId; + return portalWindowHandle; } } diff --git a/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java b/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java index cbc936f2f1d7..0a4ab67f033d 100644 --- a/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java +++ b/services/core/java/com/android/server/wm/TapExcludeRegionHolder.java @@ -49,7 +49,9 @@ class TapExcludeRegionHolder { void amendRegion(Region region, Rect boundingRegion) { for (int i = mTapExcludeRects.size() - 1; i>= 0 ; --i) { final Rect rect = mTapExcludeRects.valueAt(i); - rect.intersect(boundingRegion); + if (boundingRegion != null) { + rect.intersect(boundingRegion); + } region.union(rect); } } diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index c88b0e50218a..59549e02db8f 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -66,7 +66,6 @@ import android.os.RemoteException; import android.util.DisplayMetrics; import android.util.EventLog; import android.util.Slog; -import android.util.SparseArray; import android.util.proto.ProtoOutputStream; import android.view.DisplayCutout; import android.view.DisplayInfo; @@ -186,33 +185,6 @@ public class TaskStack extends WindowContainer<Task> implements return mChildren.get(mChildren.size() - 1); } - /** - * Set the bounds of the stack and its containing tasks. - * @param stackBounds New stack bounds. Passing in null sets the bounds to fullscreen. - * @param taskBounds Bounds for individual tasks, keyed by task id. - * @param taskTempInsetBounds Inset bounds for individual tasks, keyed by task id. - * @return True if the stack bounds was changed. - * */ - boolean setBounds( - Rect stackBounds, SparseArray<Rect> taskBounds, SparseArray<Rect> taskTempInsetBounds) { - setBounds(stackBounds); - - // Update bounds of containing tasks. - for (int taskNdx = mChildren.size() - 1; taskNdx >= 0; --taskNdx) { - final Task task = mChildren.get(taskNdx); - final Rect insetBounds = - taskTempInsetBounds != null ? taskTempInsetBounds.get(task.mTaskId) : null; - if (insetBounds != null) { - task.setBounds(insetBounds); - task.setOverrideDisplayedBounds(taskBounds.get(task.mTaskId)); - } else { - task.setBounds(taskBounds.get(task.mTaskId)); - task.setOverrideDisplayedBounds(null); - } - } - return true; - } - void prepareFreezingTaskBounds() { for (int taskNdx = mChildren.size() - 1; taskNdx >= 0; --taskNdx) { final Task task = mChildren.get(taskNdx); @@ -799,23 +771,6 @@ public class TaskStack extends WindowContainer<Task> implements } /** - * Re-sizes a stack and its containing tasks. - * - * @param bounds New stack bounds. Passing in null sets the bounds to fullscreen. - * @param taskBounds Bounds for tasks in the resized stack, keyed by task id. - * @param taskTempInsetBounds Inset bounds for individual tasks, keyed by task id. - */ - void resize(Rect bounds, SparseArray<Rect> taskBounds, - SparseArray<Rect> taskTempInsetBounds) { - // We might trigger a configuration change. Save the current task bounds for freezing. - prepareFreezingTaskBounds(); - if (setBounds(bounds, taskBounds, taskTempInsetBounds) && isVisible()) { - getDisplayContent().setLayoutNeeded(); - mWmService.mWindowPlacerLocked.performSurfacePlacement(); - } - } - - /** * Calculate an amount by which to expand the stack bounds in each direction. * Used to make room for shadows in the pinned windowing mode. */ diff --git a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java index 2e5df45f9080..dd94af657039 100644 --- a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java +++ b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java @@ -70,6 +70,18 @@ public class TaskTapPointerEventListener implements PointerEventListener { // method target window will lose the focus. return; } + final Region windowTapExcludeRegion = Region.obtain(); + mDisplayContent.amendWindowTapExcludeRegion(windowTapExcludeRegion); + if (windowTapExcludeRegion.contains(x, y)) { + windowTapExcludeRegion.recycle(); + // The user is tapping on the window tap exclude region. We don't move this + // display to top. A window tap exclude region, for example, may be set by an + // ActivityView, and the region would match the bounds of both the ActivityView + // and the virtual display in it. In this case, we would take the tap that is on + // the embedded virtual display instead of this display. + return; + } + windowTapExcludeRegion.recycle(); WindowContainer parent = mDisplayContent.getParent(); if (parent != null && parent.getTopChild() != mDisplayContent) { parent.positionChildAt(WindowContainer.POSITION_TOP, mDisplayContent, @@ -81,9 +93,6 @@ public class TaskTapPointerEventListener implements PointerEventListener { @Override public void onPointerEvent(MotionEvent motionEvent) { - if (motionEvent.getDisplayId() != getDisplayId()) { - return; - } switch (motionEvent.getActionMasked()) { case MotionEvent.ACTION_DOWN: { final int x = (int) motionEvent.getX(); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 752c24e7edb6..975e62a44b0a 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -6532,8 +6532,13 @@ public class WindowManagerService extends IWindowManager.Stub /** * Update a tap exclude region with a rectangular area in the window identified by the provided - * id. Touches on this region will not switch focus to this window. Passing an empty rect will - * remove the area from the exclude region of this window. + * id. Touches down on this region will not: + * <ol> + * <li>Switch focus to this window.</li> + * <li>Move the display of this window to top.</li> + * <li>Send the touch events to this window.</li> + * </ol> + * Passing an empty rect will remove the area from the exclude region of this window. */ void updateTapExcludeRegion(IWindow client, int regionId, int left, int top, int width, int height) { diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 07f26b4c70bb..8da39b60150a 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -138,6 +138,8 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio private volatile boolean mDebugging; // Active instrumentation running in process? private volatile boolean mInstrumenting; + // Active instrumentation with background activity starts privilege running in process? + private volatile boolean mInstrumentingWithBackgroundActivityStartPrivileges; // This process it perceptible by the user. private volatile boolean mPerceptible; // Set to true when process was launched with a wrapper attached @@ -370,6 +372,23 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio return mInstrumenting; } + /** + * {@see isInstrumentingWithBackgroundActivityStartPrivileges} + */ + public void setInstrumentingWithBackgroundActivityStartPrivileges( + boolean instrumentingWithBackgroundActivityStartPrivileges) { + mInstrumentingWithBackgroundActivityStartPrivileges = + instrumentingWithBackgroundActivityStartPrivileges; + } + + /** + * @return true if the instrumentation was started by a holder of + * START_ACTIVITIES_FROM_BACKGROUND permission + */ + boolean isInstrumentingWithBackgroundActivityStartPrivileges() { + return mInstrumentingWithBackgroundActivityStartPrivileges; + } + public void setPerceptible(boolean perceptible) { mPerceptible = perceptible; } @@ -394,13 +413,13 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } public void addPackage(String packageName) { - synchronized (mAtm.mGlobalLock) { + synchronized (mAtm.mGlobalLockWithoutBoost) { mPkgList.add(packageName); } } public void clearPackageList() { - synchronized (mAtm.mGlobalLock) { + synchronized (mAtm.mGlobalLockWithoutBoost) { mPkgList.clear(); } } @@ -416,20 +435,24 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio mActivities.remove(r); } - public void clearActivities() { - synchronized (mAtm.mGlobalLock) { - mActivities.clear(); + void makeFinishingForProcessRemoved() { + for (int i = mActivities.size() - 1; i >= 0; --i) { + mActivities.get(i).makeFinishingLocked(); } } + void clearActivities() { + mActivities.clear(); + } + public boolean hasActivities() { - synchronized (mAtm.mGlobalLock) { + synchronized (mAtm.mGlobalLockWithoutBoost) { return !mActivities.isEmpty(); } } public boolean hasVisibleActivities() { - synchronized (mAtm.mGlobalLock) { + synchronized (mAtm.mGlobalLockWithoutBoost) { for (int i = mActivities.size() - 1; i >= 0; --i) { final ActivityRecord r = mActivities.get(i); if (r.visible) { @@ -441,7 +464,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } public boolean hasActivitiesOrRecentTasks() { - synchronized (mAtm.mGlobalLock) { + synchronized (mAtm.mGlobalLockWithoutBoost) { return !mActivities.isEmpty() || !mRecentTasks.isEmpty(); } } @@ -456,15 +479,13 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } } - public void finishActivities() { - synchronized (mAtm.mGlobalLock) { - ArrayList<ActivityRecord> activities = new ArrayList<>(mActivities); - for (int i = 0; i < activities.size(); i++) { - final ActivityRecord r = activities.get(i); - if (!r.finishing && r.isInStackLocked()) { - r.getActivityStack().finishActivityLocked(r, Activity.RESULT_CANCELED, - null, "finish-heavy", true); - } + void finishActivities() { + ArrayList<ActivityRecord> activities = new ArrayList<>(mActivities); + for (int i = 0; i < activities.size(); i++) { + final ActivityRecord r = activities.get(i); + if (!r.finishing && r.isInStackLocked()) { + r.getActivityStack().finishActivityLocked(r, Activity.RESULT_CANCELED, + null, "finish-heavy", true); } } } @@ -525,15 +546,13 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } - public void updateIntentForHeavyWeightActivity(Intent intent) { - synchronized (mAtm.mGlobalLock) { - if (mActivities.isEmpty()) { - return; - } - ActivityRecord hist = mActivities.get(0); - intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, hist.packageName); - intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, hist.getTaskRecord().taskId); + void updateIntentForHeavyWeightActivity(Intent intent) { + if (mActivities.isEmpty()) { + return; } + ActivityRecord hist = mActivities.get(0); + intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, hist.packageName); + intent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, hist.getTaskRecord().taskId); } boolean shouldKillProcessForRemovedTask(TaskRecord tr) { @@ -603,7 +622,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } public int computeOomAdjFromActivities(int minTaskLayer, ComputeOomAdjCallback callback) { - synchronized (mAtm.mGlobalLock) { + synchronized (mAtm.mGlobalLockWithoutBoost) { final int activitiesSize = mActivities.size(); for (int j = 0; j < activitiesSize; j++) { final ActivityRecord r = mActivities.get(j); @@ -693,12 +712,8 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio mAtm.mH.sendMessage(m); } - void setRemoved(boolean removed) { - if (mListener == null) return; - // Posting on handler so WM lock isn't held when we call into AM. - final Message m = PooledLambda.obtainMessage( - WindowProcessListener::setRemoved, mListener, removed); - mAtm.mH.sendMessage(m); + boolean isRemoved() { + return mListener == null ? false : mListener.isRemoved(); } void clearWaitingToKill() { @@ -840,18 +855,16 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } public boolean hasRecentTasks() { - synchronized (mAtm.mGlobalLock) { + synchronized (mAtm.mGlobalLockWithoutBoost) { return !mRecentTasks.isEmpty(); } } - public void clearRecentTasks() { - synchronized (mAtm.mGlobalLock) { - for (int i = mRecentTasks.size() - 1; i >= 0; i--) { - mRecentTasks.get(i).clearRootProcess(); - } - mRecentTasks.clear(); + void clearRecentTasks() { + for (int i = mRecentTasks.size() - 1; i >= 0; i--) { + mRecentTasks.get(i).clearRootProcess(); } + mRecentTasks.clear(); } public void appEarlyNotResponding(String annotation, Runnable killAppCallback) { @@ -905,19 +918,19 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio } public void onTopProcChanged() { - synchronized (mAtm.mGlobalLock) { + synchronized (mAtm.mGlobalLockWithoutBoost) { mAtm.mVrController.onTopProcChangedLocked(this); } } public boolean isHomeProcess() { - synchronized (mAtm.mGlobalLock) { + synchronized (mAtm.mGlobalLockWithoutBoost) { return this == mAtm.mHomeProcess; } } public boolean isPreviousProcess() { - synchronized (mAtm.mGlobalLock) { + synchronized (mAtm.mGlobalLockWithoutBoost) { return this == mAtm.mPreviousProcess; } } diff --git a/services/core/java/com/android/server/wm/WindowProcessListener.java b/services/core/java/com/android/server/wm/WindowProcessListener.java index bce5e2dfeb44..d732e4e8f341 100644 --- a/services/core/java/com/android/server/wm/WindowProcessListener.java +++ b/services/core/java/com/android/server/wm/WindowProcessListener.java @@ -44,8 +44,11 @@ public interface WindowProcessListener { void updateProcessInfo(boolean updateServiceConnectionActivities, boolean updateLru, boolean activityChange, boolean updateOomAdj); - /** Set process package been removed from device. */ - void setRemoved(boolean removed); + /** + * Returns true if the process is removed and we should completely clean up the related records + * belonging to this process. + */ + boolean isRemoved(); /** Returns the total time (in milliseconds) spent executing in both user and system code. */ long getCpuTime(); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 4f120100693a..62e7200ef112 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -536,7 +536,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP private final Point mSurfacePosition = new Point(); /** - * A region inside of this window to be excluded from touch-related focus switches. + * A region inside of this window to be excluded from touch. */ private TapExcludeRegionHolder mTapExcludeRegionHolder; @@ -2168,6 +2168,24 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } region.set(mTmpRect); cropRegionToStackBoundsIfNeeded(region); + subtractTouchExcludeRegionIfNeeded(region); + } else if (modal && mTapExcludeRegionHolder != null) { + final Region touchExcludeRegion = Region.obtain(); + amendTapExcludeRegion(touchExcludeRegion); + if (!touchExcludeRegion.isEmpty()) { + // Remove touch modal because there are some areas that cannot be touched. + flags |= FLAG_NOT_TOUCH_MODAL; + // Give it a large touchable region at first because it was touch modal. The window + // might be moved on the display, so the touchable region should be large enough to + // ensure it covers the whole display, no matter where it is moved. + getDisplayContent().getBounds(mTmpRect); + final int dw = mTmpRect.width(); + final int dh = mTmpRect.height(); + region.set(-dw, -dh, dw + dw, dh + dh); + // Subtract the area that cannot be touched. + region.op(touchExcludeRegion, Region.Op.DIFFERENCE); + } + touchExcludeRegion.recycle(); } else { // Not modal or full screen modal getTouchableRegion(region); @@ -2837,6 +2855,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } cropRegionToStackBoundsIfNeeded(outRegion); + subtractTouchExcludeRegionIfNeeded(outRegion); } private void cropRegionToStackBoundsIfNeeded(Region region) { @@ -2855,6 +2874,22 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } /** + * If this window has areas that cannot be touched, we subtract those areas from its touchable + * region. + */ + private void subtractTouchExcludeRegionIfNeeded(Region touchableRegion) { + if (mTapExcludeRegionHolder == null) { + return; + } + final Region touchExcludeRegion = Region.obtain(); + amendTapExcludeRegion(touchExcludeRegion); + if (!touchExcludeRegion.isEmpty()) { + touchableRegion.op(touchExcludeRegion, Region.Op.DIFFERENCE); + } + touchExcludeRegion.recycle(); + } + + /** * Report a focus change. Must be called with no locks held, and consistently * from the same serialized thread (such as dispatched from a handler). */ @@ -4728,11 +4763,25 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mTapExcludeRegionHolder.updateRegion(regionId, left, top, width, height); // Trigger touch exclude region update on current display. currentDisplay.updateTouchExcludeRegion(); + // Trigger touchable region update for this window. + currentDisplay.getInputMonitor().updateInputWindowsLw(true /* force */); } - /** Union the region with current tap exclude region that this window provides. */ + /** + * Union the region with current tap exclude region that this window provides. + * + * @param region The region to be amended. It is on the screen coordinates. + */ void amendTapExcludeRegion(Region region) { - mTapExcludeRegionHolder.amendRegion(region, getBounds()); + final Region tempRegion = Region.obtain(); + mTmpRect.set(mWindowFrames.mFrame); + mTmpRect.offsetTo(0, 0); + mTapExcludeRegionHolder.amendRegion(tempRegion, mTmpRect); + // The region held by the holder is on the window coordinates. We need to translate it to + // the screen coordinates. + tempRegion.translate(mWindowFrames.mFrame.left, mWindowFrames.mFrame.top); + region.op(tempRegion, Region.Op.UNION); + tempRegion.recycle(); } @Override diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index ff0b0d6f6eaf..33317b554988 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -1652,6 +1652,13 @@ static void nativeSetCustomPointerIcon(JNIEnv* env, jclass /* clazz */, im->setCustomPointerIcon(spriteIcon); } +static jboolean nativeCanDispatchToDisplay(JNIEnv* env, jclass /* clazz */, jlong ptr, + jint deviceId, jint displayId) { + + NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); + return im->getInputManager()->getReader()->canDispatchToDisplay(deviceId, displayId); +} + // ---------------------------------------------------------------------------- static const JNINativeMethod gInputManagerMethods[] = { @@ -1726,6 +1733,8 @@ static const JNINativeMethod gInputManagerMethods[] = { (void*) nativeReloadPointerIcons }, { "nativeSetCustomPointerIcon", "(JLandroid/view/PointerIcon;)V", (void*) nativeSetCustomPointerIcon }, + { "nativeCanDispatchToDisplay", "(JII)Z", + (void*) nativeCanDispatchToDisplay }, }; #define FIND_CLASS(var, className) \ diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index f3c19d099851..cbc3791264bf 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -73,6 +73,8 @@ static jmethodID method_reportGnssServiceDied; static jmethodID method_correctionsGetLatitudeDegrees; static jmethodID method_correctionsGetLongitudeDegrees; static jmethodID method_correctionsGetAltitudeMeters; +static jmethodID method_correctionsGetHorPosUncMeters; +static jmethodID method_correctionsGetVerPosUncMeters; static jmethodID method_correctionsGetToaGpsNanosecondsOfWeek; static jmethodID method_correctionsGetSingleSatCorrectionList; static jmethodID method_listSize; @@ -2233,6 +2235,12 @@ static jboolean android_location_GnssMeasurementsProvider_inject_gnss_measuremen method_correctionsGetAltitudeMeters = env->GetMethodID( measCorrClass, "getAltitudeMeters", "()D"); + method_correctionsGetHorPosUncMeters = env->GetMethodID( + measCorrClass, "getHorizontalPositionUncertaintyMeters", "()D"); + + method_correctionsGetVerPosUncMeters = env->GetMethodID( + measCorrClass, "getVerticalPositionUncertaintyMeters", "()D"); + method_correctionsGetToaGpsNanosecondsOfWeek = env->GetMethodID( measCorrClass, "getToaGpsNanosecondsOfWeek", "()J"); @@ -2246,6 +2254,10 @@ static jboolean android_location_GnssMeasurementsProvider_inject_gnss_measuremen correctionsObj, method_correctionsGetLongitudeDegrees); jdouble altitudeDegreesCorr = env->CallDoubleMethod( correctionsObj, method_correctionsGetAltitudeMeters); + jdouble horizontalPositionUncertaintyMeters = env->CallDoubleMethod( + correctionsObj, method_correctionsGetHorPosUncMeters); + jdouble verticalPositionUncertaintyMeters = env->CallDoubleMethod( + correctionsObj, method_correctionsGetVerPosUncMeters); jlong toaGpsNanosOfWeek = env->CallLongMethod( correctionsObj, method_correctionsGetToaGpsNanosecondsOfWeek); jobject singleSatCorrectionList = env->CallObjectMethod(correctionsObj, @@ -2348,6 +2360,8 @@ static jboolean android_location_GnssMeasurementsProvider_inject_gnss_measuremen .latitudeDegrees = latitudeDegreesCorr, .longitudeDegrees = longitudeDegreesCorr, .altitudeMeters = altitudeDegreesCorr, + .horizontalPositionUncertaintyMeters = horizontalPositionUncertaintyMeters, + .verticalPositionUncertaintyMeters = verticalPositionUncertaintyMeters, .toaGpsNanosecondsOfWeek = static_cast<uint64_t>(toaGpsNanosOfWeek), .satCorrections = list, }; diff --git a/services/core/jni/com_android_server_security_VerityUtils.cpp b/services/core/jni/com_android_server_security_VerityUtils.cpp index 0d888dc41719..988d75cfb984 100644 --- a/services/core/jni/com_android_server_security_VerityUtils.cpp +++ b/services/core/jni/com_android_server_security_VerityUtils.cpp @@ -32,9 +32,67 @@ // TODO(112037636): Always include once fsverity.h is upstreamed. #if __has_include(<linux/fsverity.h>) #include <linux/fsverity.h> -const int kSha256Bytes = 32; +#else + +// Before fs-verity is upstreamed, use the current snapshot for development. +// https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git/tree/include/uapi/linux/fsverity.h?h=fsverity + +#include <linux/limits.h> +#include <linux/ioctl.h> +#include <linux/types.h> + +struct fsverity_digest { + __u16 digest_algorithm; + __u16 digest_size; /* input/output */ + __u8 digest[]; +}; + +#define FS_IOC_ENABLE_VERITY _IO('f', 133) +#define FS_IOC_MEASURE_VERITY _IOWR('f', 134, struct fsverity_digest) + +#define FS_VERITY_MAGIC "FSVerity" + +#define FS_VERITY_ALG_SHA256 1 + +struct fsverity_descriptor { + __u8 magic[8]; /* must be FS_VERITY_MAGIC */ + __u8 major_version; /* must be 1 */ + __u8 minor_version; /* must be 0 */ + __u8 log_data_blocksize;/* log2(data-bytes-per-hash), e.g. 12 for 4KB */ + __u8 log_tree_blocksize;/* log2(tree-bytes-per-hash), e.g. 12 for 4KB */ + __le16 data_algorithm; /* hash algorithm for data blocks */ + __le16 tree_algorithm; /* hash algorithm for tree blocks */ + __le32 flags; /* flags */ + __le32 __reserved1; /* must be 0 */ + __le64 orig_file_size; /* size of the original file data */ + __le16 auth_ext_count; /* number of authenticated extensions */ + __u8 __reserved2[30]; /* must be 0 */ +}; + +#define FS_VERITY_EXT_ROOT_HASH 1 +#define FS_VERITY_EXT_PKCS7_SIGNATURE 3 + +struct fsverity_extension { + __le32 length; + __le16 type; /* Type of this extension (see codes above) */ + __le16 __reserved; /* Reserved, must be 0 */ +}; + +struct fsverity_digest_disk { + __le16 digest_algorithm; + __le16 digest_size; + __u8 digest[]; +}; + +struct fsverity_footer { + __le32 desc_reverse_offset; /* distance to fsverity_descriptor */ + __u8 magic[8]; /* FS_VERITY_MAGIC */ +} __packed; + #endif +const int kSha256Bytes = 32; + namespace android { namespace { @@ -73,7 +131,6 @@ class JavaByteArrayHolder { }; int enableFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) { -#if __has_include(<linux/fsverity.h>) const char* path = env->GetStringUTFChars(filePath, nullptr); ::android::base::unique_fd rfd(open(path, O_RDONLY | O_CLOEXEC)); if (rfd.get() < 0) { @@ -83,14 +140,9 @@ int enableFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) { return errno; } return 0; -#else - LOG_ALWAYS_FATAL("fs-verity is used while not enabled"); - return ENOSYS; -#endif } int measureFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) { -#if __has_include(<linux/fsverity.h>) auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_digest) + kSha256Bytes); fsverity_digest* data = reinterpret_cast<fsverity_digest*>(raii->getRaw()); data->digest_size = kSha256Bytes; // the only input/output parameter @@ -104,14 +156,9 @@ int measureFsverity(JNIEnv* env, jobject /* clazz */, jstring filePath) { return errno; } return 0; -#else - LOG_ALWAYS_FATAL("fs-verity is used while not enabled"); - return ENOSYS; -#endif } jbyteArray constructFsveritySignedData(JNIEnv* env, jobject /* clazz */, jbyteArray digest) { -#if __has_include(<linux/fsverity.h>) auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_digest_disk) + kSha256Bytes); fsverity_digest_disk* data = reinterpret_cast<fsverity_digest_disk*>(raii->getRaw()); @@ -126,15 +173,10 @@ jbyteArray constructFsveritySignedData(JNIEnv* env, jobject /* clazz */, jbyteAr memcpy(data->digest, src, kSha256Bytes); return raii->release(); -#else - LOG_ALWAYS_FATAL("fs-verity is used while not enabled"); - return 0; -#endif } jbyteArray constructFsverityDescriptor(JNIEnv* env, jobject /* clazz */, jlong fileSize) { -#if __has_include(<linux/fsverity.h>) auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_descriptor)); fsverity_descriptor* desc = reinterpret_cast<fsverity_descriptor*>(raii->getRaw()); @@ -150,15 +192,10 @@ jbyteArray constructFsverityDescriptor(JNIEnv* env, jobject /* clazz */, jlong f desc->auth_ext_count = 1; return raii->release(); -#else - LOG_ALWAYS_FATAL("fs-verity is used while not enabled"); - return 0; -#endif } jbyteArray constructFsverityExtension(JNIEnv* env, jobject /* clazz */, jshort extensionId, jint extensionDataSize) { -#if __has_include(<linux/fsverity.h>) auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_extension)); fsverity_extension* ext = reinterpret_cast<fsverity_extension*>(raii->getRaw()); @@ -166,15 +203,10 @@ jbyteArray constructFsverityExtension(JNIEnv* env, jobject /* clazz */, jshort e ext->type = extensionId; return raii->release(); -#else - LOG_ALWAYS_FATAL("fs-verity is used while not enabled"); - return 0; -#endif } jbyteArray constructFsverityFooter(JNIEnv* env, jobject /* clazz */, jint offsetToDescriptorHead) { -#if __has_include(<linux/fsverity.h>) auto raii = JavaByteArrayHolder::newArray(env, sizeof(fsverity_footer)); fsverity_footer* footer = reinterpret_cast<fsverity_footer*>(raii->getRaw()); @@ -182,10 +214,6 @@ jbyteArray constructFsverityFooter(JNIEnv* env, jobject /* clazz */, memcpy(footer->magic, FS_VERITY_MAGIC, sizeof(footer->magic)); return raii->release(); -#else - LOG_ALWAYS_FATAL("fs-verity is used while not enabled"); - return 0; -#endif } const JNINativeMethod sMethods[] = { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 51bdbb38d582..a01a02625de2 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -74,20 +74,14 @@ import static android.app.admin.DevicePolicyManager.WIPE_SILENTLY; import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES; import static android.provider.Settings.Global.PRIVATE_DNS_MODE; import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER; - import static android.provider.Telephony.Carriers.DPC_URI; import static android.provider.Telephony.Carriers.ENFORCE_KEY; import static android.provider.Telephony.Carriers.ENFORCE_MANAGED_URI; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent - .PROVISIONING_ENTRY_POINT_ADB; -import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker - .STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW; - +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PROVISIONING_ENTRY_POINT_ADB; +import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW; import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.ADMIN_TYPE_DEVICE_OWNER; import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.ADMIN_TYPE_PROFILE_OWNER; - - import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; @@ -240,11 +234,11 @@ import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.FunctionalUtils.ThrowingRunnable; import com.android.internal.util.JournaledFile; import com.android.internal.util.Preconditions; +import com.android.internal.util.StatLogger; import com.android.internal.util.XmlUtils; import com.android.internal.widget.LockPatternUtils; import com.android.server.LocalServices; import com.android.server.LockGuard; -import com.android.internal.util.StatLogger; import com.android.server.SystemServerInitThreadPool; import com.android.server.SystemService; import com.android.server.devicepolicy.DevicePolicyManagerService.ActiveAdmin.TrustAgentInfo; @@ -7716,18 +7710,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } // Shutting down backup manager service permanently. - long ident = mInjector.binderClearCallingIdentity(); - try { - if (mInjector.getIBackupManager() != null) { - mInjector.getIBackupManager() - .setBackupServiceActive(UserHandle.USER_SYSTEM, false); - } - } catch (RemoteException e) { - throw new IllegalStateException("Failed deactivating backup service.", e); - } finally { - mInjector.binderRestoreCallingIdentity(ident); - } - + toggleBackupServiceActive(UserHandle.USER_SYSTEM, /* makeActive= */ false); if (isAdb()) { // Log device owner provisioning was started using adb. MetricsLogger.action(mContext, PROVISIONING_ENTRY_POINT_ADB, LOG_TAG_DEVICE_OWNER); @@ -7755,7 +7738,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { saveUserRestrictionsLocked(userId); } - ident = mInjector.binderClearCallingIdentity(); + long ident = mInjector.binderClearCallingIdentity(); try { // TODO Send to system too? sendOwnerChangedBroadcast(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED, userId); @@ -8012,6 +7995,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { .write(); } + // Shutting down backup manager service permanently. + toggleBackupServiceActive(userHandle, /* makeActive= */ false); + mOwners.setProfileOwner(who, ownerName, userHandle); mOwners.writeProfileOwner(userHandle); Slog.i(LOG_TAG, "Profile owner set: " + who + " on user " + userHandle); @@ -8035,6 +8021,22 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } } + + private void toggleBackupServiceActive(int userId, boolean makeActive) { + long ident = mInjector.binderClearCallingIdentity(); + try { + if (mInjector.getIBackupManager() != null) { + mInjector.getIBackupManager() + .setBackupServiceActive(userId, makeActive); + } + } catch (RemoteException e) { + throw new IllegalStateException("Failed deactivating backup service.", e); + } finally { + mInjector.binderRestoreCallingIdentity(ident); + } + + } + @Override public void clearProfileOwner(ComponentName who) { if (!mHasFeature) { @@ -12787,22 +12789,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return; } Preconditions.checkNotNull(admin); - synchronized (getLockObject()) { - getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER); - } - - final long ident = mInjector.binderClearCallingIdentity(); - try { - IBackupManager ibm = mInjector.getIBackupManager(); - if (ibm != null) { - ibm.setBackupServiceActive(UserHandle.USER_SYSTEM, enabled); - } - } catch (RemoteException e) { - throw new IllegalStateException( - "Failed " + (enabled ? "" : "de") + "activating backup service.", e); - } finally { - mInjector.binderRestoreCallingIdentity(ident); - } + enforceProfileOrDeviceOwner(admin); + int userId = mInjector.userHandleGetCallingUserId(); + toggleBackupServiceActive(userId, enabled); } @Override @@ -12811,11 +12800,13 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { if (!mHasFeature) { return true; } + + enforceProfileOrDeviceOwner(admin); synchronized (getLockObject()) { try { - getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER); IBackupManager ibm = mInjector.getIBackupManager(); - return ibm != null && ibm.isBackupServiceActive(UserHandle.USER_SYSTEM); + return ibm != null && ibm.isBackupServiceActive( + mInjector.userHandleGetCallingUserId()); } catch (RemoteException e) { throw new IllegalStateException("Failed requesting backup service state.", e); } @@ -14207,7 +14198,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { + "calendar APIs", packageName)); return false; } - final Intent intent = new Intent(CalendarContract.ACTION_VIEW_WORK_CALENDAR_EVENT); + final Intent intent = new Intent( + CalendarContract.ACTION_VIEW_MANAGED_PROFILE_CALENDAR_EVENT); intent.setPackage(packageName); intent.putExtra(CalendarContract.EXTRA_EVENT_ID, eventId); intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, start); diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index e378dd67bc1f..d030fa543991 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -91,6 +91,7 @@ import com.android.server.display.ColorDisplayService; import com.android.server.display.DisplayManagerService; import com.android.server.dreams.DreamManagerService; import com.android.server.emergency.EmergencyAffordanceService; +import com.android.server.gpu.GpuService; import com.android.server.hdmi.HdmiControlService; import com.android.server.incident.IncidentCompanionService; import com.android.server.input.InputManagerService; @@ -813,6 +814,11 @@ public final class SystemServer { traceBeginAndSlog("StartBugreportManagerService"); mSystemServiceManager.startService(BugreportManagerService.class); traceEnd(); + + // Serivce for GPU and GPU driver. + traceBeginAndSlog("GpuService"); + mSystemServiceManager.startService(GpuService.class); + traceEnd(); } /** diff --git a/services/net/Android.bp b/services/net/Android.bp index 30c7de57b73e..638ec95ec544 100644 --- a/services/net/Android.bp +++ b/services/net/Android.bp @@ -9,12 +9,6 @@ filegroup { "java/android/net/ip/InterfaceController.java", // TODO: move to NetworkStack with tethering "java/android/net/util/InterfaceParams.java", // TODO: move to NetworkStack with IpServer "java/android/net/shared/*.java", - ], -} - -java_library { - name: "services-netlink-lib", - srcs: [ "java/android/net/netlink/*.java", - ] + ], } diff --git a/services/net/java/android/net/ip/InterfaceController.java b/services/net/java/android/net/ip/InterfaceController.java index b3af67cdbdc3..970bc9cf667b 100644 --- a/services/net/java/android/net/ip/InterfaceController.java +++ b/services/net/java/android/net/ip/InterfaceController.java @@ -17,7 +17,6 @@ package android.net.ip; import android.net.INetd; -import android.net.InterfaceConfiguration; import android.net.InterfaceConfigurationParcel; import android.net.LinkAddress; import android.net.util.SharedLog; @@ -49,14 +48,18 @@ public class InterfaceController { mLog = log; } - private boolean setInterfaceConfig(InterfaceConfiguration config) { - final InterfaceConfigurationParcel cfgParcel = config.toParcel(mIfName); - + private boolean setInterfaceAddress(LinkAddress addr) { + final InterfaceConfigurationParcel ifConfig = new InterfaceConfigurationParcel(); + ifConfig.ifName = mIfName; + ifConfig.ipv4Addr = addr.getAddress().getHostAddress(); + ifConfig.prefixLength = addr.getPrefixLength(); + ifConfig.hwAddr = ""; + ifConfig.flags = new String[0]; try { - mNetd.interfaceSetCfg(cfgParcel); + mNetd.interfaceSetCfg(ifConfig); } catch (RemoteException | ServiceSpecificException e) { logError("Setting IPv4 address to %s/%d failed: %s", - cfgParcel.ipv4Addr, cfgParcel.prefixLength, e); + ifConfig.ipv4Addr, ifConfig.prefixLength, e); return false; } return true; @@ -69,18 +72,14 @@ public class InterfaceController { if (!(address.getAddress() instanceof Inet4Address)) { return false; } - final InterfaceConfiguration ifConfig = new InterfaceConfiguration(); - ifConfig.setLinkAddress(address); - return setInterfaceConfig(ifConfig); + return setInterfaceAddress(address); } /** * Clear the IPv4Address of the interface. */ public boolean clearIPv4Address() { - final InterfaceConfiguration ifConfig = new InterfaceConfiguration(); - ifConfig.setLinkAddress(new LinkAddress("0.0.0.0/0")); - return setInterfaceConfig(ifConfig); + return setInterfaceAddress(new LinkAddress("0.0.0.0/0")); } private boolean setEnableIPv6(boolean enabled) { diff --git a/services/net/java/android/net/ip/IpServer.java b/services/net/java/android/net/ip/IpServer.java index f7360f52225f..7910c9a69310 100644 --- a/services/net/java/android/net/ip/IpServer.java +++ b/services/net/java/android/net/ip/IpServer.java @@ -40,7 +40,7 @@ import android.net.dhcp.IDhcpServer; import android.net.ip.RouterAdvertisementDaemon.RaParams; import android.net.util.InterfaceParams; import android.net.util.InterfaceSet; -import android.net.shared.NetdService; +import android.net.util.NetdService; import android.net.util.SharedLog; import android.os.INetworkManagementService; import android.os.Looper; diff --git a/services/net/java/android/net/netlink/NetlinkSocket.java b/services/net/java/android/net/netlink/NetlinkSocket.java index 2a98d90e5577..16f72bd53e15 100644 --- a/services/net/java/android/net/netlink/NetlinkSocket.java +++ b/services/net/java/android/net/netlink/NetlinkSocket.java @@ -27,14 +27,13 @@ import static android.system.OsConstants.SO_RCVBUF; import static android.system.OsConstants.SO_RCVTIMEO; import static android.system.OsConstants.SO_SNDTIMEO; +import android.net.util.SocketUtils; import android.system.ErrnoException; import android.system.Os; -import android.system.StructTimeval; import android.util.Log; -import libcore.io.IoUtils; - import java.io.FileDescriptor; +import java.io.IOException; import java.io.InterruptedIOException; import java.net.SocketException; import java.nio.ByteBuffer; @@ -95,7 +94,11 @@ public class NetlinkSocket { Log.e(TAG, errPrefix, e); throw new ErrnoException(errPrefix, EIO, e); } finally { - IoUtils.closeQuietly(fd); + try { + SocketUtils.closeSocket(fd); + } catch (IOException e) { + // Nothing we can do here + } } } @@ -106,7 +109,7 @@ public class NetlinkSocket { } public static void connectToKernel(FileDescriptor fd) throws ErrnoException, SocketException { - Os.connect(fd, makeNetlinkSocketAddress(0, 0)); + SocketUtils.connectSocket(fd, makeNetlinkSocketAddress(0, 0)); } private static void checkTimeout(long timeoutMs) { @@ -125,7 +128,7 @@ public class NetlinkSocket { throws ErrnoException, IllegalArgumentException, InterruptedIOException { checkTimeout(timeoutMs); - Os.setsockoptTimeval(fd, SOL_SOCKET, SO_RCVTIMEO, StructTimeval.fromMillis(timeoutMs)); + SocketUtils.setSocketTimeValueOption(fd, SOL_SOCKET, SO_RCVTIMEO, timeoutMs); ByteBuffer byteBuffer = ByteBuffer.allocate(bufsize); int length = Os.read(fd, byteBuffer); @@ -148,7 +151,7 @@ public class NetlinkSocket { FileDescriptor fd, byte[] bytes, int offset, int count, long timeoutMs) throws ErrnoException, IllegalArgumentException, InterruptedIOException { checkTimeout(timeoutMs); - Os.setsockoptTimeval(fd, SOL_SOCKET, SO_SNDTIMEO, StructTimeval.fromMillis(timeoutMs)); + SocketUtils.setSocketTimeValueOption(fd, SOL_SOCKET, SO_SNDTIMEO, timeoutMs); return Os.write(fd, bytes, offset, count); } } diff --git a/services/net/java/android/net/shared/InitialConfiguration.java b/services/net/java/android/net/shared/InitialConfiguration.java index bc2373f4aabc..4ad71381da04 100644 --- a/services/net/java/android/net/shared/InitialConfiguration.java +++ b/services/net/java/android/net/shared/InitialConfiguration.java @@ -20,6 +20,7 @@ import static android.net.shared.ParcelableUtil.fromParcelableArray; import static android.net.shared.ParcelableUtil.toParcelableArray; import static android.text.TextUtils.join; +import android.net.InetAddresses; import android.net.InitialConfigurationParcelable; import android.net.IpPrefix; import android.net.IpPrefixParcelable; @@ -27,7 +28,7 @@ import android.net.LinkAddress; import android.net.LinkAddressParcelable; import android.net.RouteInfo; -import java.net.Inet6Address; +import java.net.Inet4Address; import java.net.InetAddress; import java.util.HashSet; import java.util.List; @@ -43,6 +44,8 @@ public class InitialConfiguration { private static final int RFC6177_MIN_PREFIX_LENGTH = 48; private static final int RFC7421_PREFIX_LENGTH = 64; + public static final InetAddress INET6_ANY = InetAddresses.parseNumericAddress("::"); + /** * Create a InitialConfiguration that is a copy of the specified configuration. */ @@ -102,7 +105,7 @@ public class InitialConfiguration { return false; } // There no more than one IPv4 address - if (ipAddresses.stream().filter(LinkAddress::isIPv4).count() > 1) { + if (ipAddresses.stream().filter(InitialConfiguration::isIPv4).count() > 1) { return false; } @@ -184,11 +187,11 @@ public class InitialConfiguration { } private static boolean isPrefixLengthCompliant(LinkAddress addr) { - return addr.isIPv4() || isCompliantIPv6PrefixLength(addr.getPrefixLength()); + return isIPv4(addr) || isCompliantIPv6PrefixLength(addr.getPrefixLength()); } private static boolean isPrefixLengthCompliant(IpPrefix prefix) { - return prefix.isIPv4() || isCompliantIPv6PrefixLength(prefix.getPrefixLength()); + return isIPv4(prefix) || isCompliantIPv6PrefixLength(prefix.getPrefixLength()); } private static boolean isCompliantIPv6PrefixLength(int prefixLength) { @@ -196,8 +199,16 @@ public class InitialConfiguration { && (prefixLength <= RFC7421_PREFIX_LENGTH); } + private static boolean isIPv4(IpPrefix prefix) { + return prefix.getAddress() instanceof Inet4Address; + } + + private static boolean isIPv4(LinkAddress addr) { + return addr.getAddress() instanceof Inet4Address; + } + private static boolean isIPv6DefaultRoute(IpPrefix prefix) { - return prefix.getAddress().equals(Inet6Address.ANY); + return prefix.getAddress().equals(INET6_ANY); } private static boolean isIPv6GUA(LinkAddress addr) { diff --git a/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java b/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java index 00073503886a..1f0525e4da88 100644 --- a/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java +++ b/services/net/java/android/net/shared/IpConfigurationParcelableUtil.java @@ -44,11 +44,11 @@ public final class IpConfigurationParcelableUtil { @Nullable StaticIpConfiguration config) { if (config == null) return null; final StaticIpConfigurationParcelable p = new StaticIpConfigurationParcelable(); - p.ipAddress = LinkPropertiesParcelableUtil.toStableParcelable(config.ipAddress); - p.gateway = parcelAddress(config.gateway); + p.ipAddress = LinkPropertiesParcelableUtil.toStableParcelable(config.getIpAddress()); + p.gateway = parcelAddress(config.getGateway()); p.dnsServers = toParcelableArray( - config.dnsServers, IpConfigurationParcelableUtil::parcelAddress, String.class); - p.domains = config.domains; + config.getDnsServers(), IpConfigurationParcelableUtil::parcelAddress, String.class); + p.domains = config.getDomains(); return p; } @@ -59,11 +59,13 @@ public final class IpConfigurationParcelableUtil { @Nullable StaticIpConfigurationParcelable p) { if (p == null) return null; final StaticIpConfiguration config = new StaticIpConfiguration(); - config.ipAddress = LinkPropertiesParcelableUtil.fromStableParcelable(p.ipAddress); - config.gateway = unparcelAddress(p.gateway); - config.dnsServers.addAll(fromParcelableArray( - p.dnsServers, IpConfigurationParcelableUtil::unparcelAddress)); - config.domains = p.domains; + config.setIpAddress(LinkPropertiesParcelableUtil.fromStableParcelable(p.ipAddress)); + config.setGateway(unparcelAddress(p.gateway)); + for (InetAddress addr : fromParcelableArray( + p.dnsServers, IpConfigurationParcelableUtil::unparcelAddress)) { + config.addDnsServer(addr); + } + config.setDomains(p.domains); return config; } diff --git a/services/net/java/android/net/shared/NetdService.java b/services/net/java/android/net/util/NetdService.java index f5ae72587294..d4cd5bd7ba18 100644 --- a/services/net/java/android/net/shared/NetdService.java +++ b/services/net/java/android/net/util/NetdService.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.net.shared; +package android.net.util; import android.content.Context; import android.net.INetd; diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java index 00a60b91ec5c..5dafe077d32e 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerInternalTest.java @@ -122,7 +122,7 @@ public class ActivityManagerInternalTest { private UidRecord addActiveUidRecord(int uid, long curProcStateSeq, long lastNetworkUpdatedProcStateSeq) { - final UidRecord record = new UidRecord(uid, null /* atmInternal */); + final UidRecord record = new UidRecord(uid); record.lastNetworkUpdatedProcStateSeq = lastNetworkUpdatedProcStateSeq; record.curProcStateSeq = curProcStateSeq; record.waitingForNetwork = true; diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java index 419c73611cb9..4e21fd0cd0de 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityManagerServiceTest.java @@ -250,7 +250,7 @@ public class ActivityManagerServiceTest { } private UidRecord addUidRecord(int uid) { - final UidRecord uidRec = new UidRecord(uid, null /* atmInternal */); + final UidRecord uidRec = new UidRecord(uid); uidRec.waitingForNetwork = true; uidRec.hasInternetPermission = true; mAms.mProcessList.mActiveUids.put(uid, uidRec); @@ -405,7 +405,7 @@ public class ActivityManagerServiceTest { @Test public void testBlockStateForUid() { - final UidRecord uidRec = new UidRecord(TEST_UID, null /* atmInternal */); + final UidRecord uidRec = new UidRecord(TEST_UID); int expectedBlockState; final String errorTemplate = "Block state should be %s, prevState: %s, curState: %s"; @@ -732,7 +732,7 @@ public class ActivityManagerServiceTest { @Test public void testEnqueueUidChangeLocked_procStateSeqUpdated() { - final UidRecord uidRecord = new UidRecord(TEST_UID, null /* atmInternal */); + final UidRecord uidRecord = new UidRecord(TEST_UID); uidRecord.curProcStateSeq = TEST_PROC_STATE_SEQ1; // Verify with no pending changes for TEST_UID. @@ -778,7 +778,7 @@ public class ActivityManagerServiceTest { @MediumTest @Test public void testEnqueueUidChangeLocked_dispatchUidsChanged() { - final UidRecord uidRecord = new UidRecord(TEST_UID, null /* atmInternal */); + final UidRecord uidRecord = new UidRecord(TEST_UID); final int expectedProcState = PROCESS_STATE_SERVICE; uidRecord.setProcState = expectedProcState; uidRecord.curProcStateSeq = TEST_PROC_STATE_SEQ1; @@ -850,7 +850,7 @@ public class ActivityManagerServiceTest { private void verifyWaitingForNetworkStateUpdate(long curProcStateSeq, long lastDispatchedProcStateSeq, long lastNetworkUpdatedProcStateSeq, final long procStateSeqToWait, boolean expectWait) throws Exception { - final UidRecord record = new UidRecord(Process.myUid(), null /* atmInternal */); + final UidRecord record = new UidRecord(Process.myUid()); record.curProcStateSeq = curProcStateSeq; record.lastDispatchedProcStateSeq = lastDispatchedProcStateSeq; record.lastNetworkUpdatedProcStateSeq = lastNetworkUpdatedProcStateSeq; diff --git a/services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java b/services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java index 1a231cf56921..2f8e5456a695 100644 --- a/services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java +++ b/services/tests/servicestests/src/com/android/server/am/AppCompactorTest.java @@ -18,6 +18,7 @@ package com.android.server.am; import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_1; import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_ACTION_2; +import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_STATSD_SAMPLE_RATE; import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_1; import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_2; import static android.provider.DeviceConfig.ActivityManager.KEY_COMPACT_THROTTLE_3; @@ -61,6 +62,9 @@ import java.util.concurrent.TimeUnit; @RunWith(AndroidJUnit4.class) public final class AppCompactorTest { + private static final String CLEAR_DEVICE_CONFIG_KEY_CMD = + "device_config delete activity_manager"; + @Mock private AppOpsService mAppOpsService; private AppCompactor mCompactorUnderTest; private HandlerThread mHandlerThread; @@ -70,19 +74,21 @@ public final class AppCompactorTest { private static void clearDeviceConfig() throws IOException { UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); uiDevice.executeShellCommand( - "device_config delete activity_manager " + KEY_USE_COMPACTION); + CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_USE_COMPACTION); + uiDevice.executeShellCommand( + CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_ACTION_1); uiDevice.executeShellCommand( - "device_config delete activity_manager " + KEY_COMPACT_ACTION_1); + CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_ACTION_2); uiDevice.executeShellCommand( - "device_config delete activity_manager " + KEY_COMPACT_ACTION_2); + CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_THROTTLE_1); uiDevice.executeShellCommand( - "device_config delete activity_manager " + KEY_COMPACT_THROTTLE_1); + CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_THROTTLE_2); uiDevice.executeShellCommand( - "device_config delete activity_manager " + KEY_COMPACT_THROTTLE_2); + CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_THROTTLE_3); uiDevice.executeShellCommand( - "device_config delete activity_manager " + KEY_COMPACT_THROTTLE_3); + CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_THROTTLE_4); uiDevice.executeShellCommand( - "device_config delete activity_manager " + KEY_COMPACT_THROTTLE_4); + CLEAR_DEVICE_CONFIG_KEY_CMD + " " + KEY_COMPACT_STATSD_SAMPLE_RATE); } @Before @@ -128,6 +134,8 @@ public final class AppCompactorTest { is(AppCompactor.DEFAULT_COMPACT_THROTTLE_3)); assertThat(mCompactorUnderTest.mCompactThrottleFullFull, is(AppCompactor.DEFAULT_COMPACT_THROTTLE_4)); + assertThat(mCompactorUnderTest.mStatsdSampleRate, + is(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE)); } @Test @@ -155,6 +163,9 @@ public final class AppCompactorTest { DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, KEY_COMPACT_THROTTLE_4, Long.toString(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1), false); + DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, + KEY_COMPACT_STATSD_SAMPLE_RATE, + Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false); // Then calling init will read and set that flag. mCompactorUnderTest.init(); @@ -173,6 +184,8 @@ public final class AppCompactorTest { is(AppCompactor.DEFAULT_COMPACT_THROTTLE_3 + 1)); assertThat(mCompactorUnderTest.mCompactThrottleFullFull, is(AppCompactor.DEFAULT_COMPACT_THROTTLE_4 + 1)); + assertThat(mCompactorUnderTest.mStatsdSampleRate, + is(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f)); } @Test @@ -365,6 +378,63 @@ public final class AppCompactorTest { is(AppCompactor.DEFAULT_COMPACT_THROTTLE_4)); } + @Test + public void statsdSampleRate_listensToDeviceConfigChanges() throws InterruptedException { + mCompactorUnderTest.init(); + + // When we override mStatsdSampleRate with a reasonable values ... + mCountDown = new CountDownLatch(1); + DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, + KEY_COMPACT_STATSD_SAMPLE_RATE, + Float.toString(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f), false); + assertThat(mCountDown.await(5, TimeUnit.SECONDS), is(true)); + + // Then that override is reflected in the compactor. + assertThat(mCompactorUnderTest.mStatsdSampleRate, + is(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE + 0.1f)); + } + + @Test + public void statsdSanokeRate_listensToDeviceConfigChangesBadValues() + throws InterruptedException { + mCompactorUnderTest.init(); + + // When we override mStatsdSampleRate with a reasonable values ... + mCountDown = new CountDownLatch(1); + DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, + KEY_COMPACT_STATSD_SAMPLE_RATE, "foo", false); + assertThat(mCountDown.await(5, TimeUnit.SECONDS), is(true)); + + // Then that override is reflected in the compactor. + assertThat(mCompactorUnderTest.mStatsdSampleRate, + is(AppCompactor.DEFAULT_STATSD_SAMPLE_RATE)); + } + + @Test + public void statsdSanokeRate_listensToDeviceConfigChangesOutOfRangeValues() + throws InterruptedException { + mCompactorUnderTest.init(); + + // When we override mStatsdSampleRate with an value outside of [0..1]... + mCountDown = new CountDownLatch(1); + DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, + KEY_COMPACT_STATSD_SAMPLE_RATE, + Float.toString(-1.0f), false); + assertThat(mCountDown.await(5, TimeUnit.SECONDS), is(true)); + + // Then the values is capped in the range. + assertThat(mCompactorUnderTest.mStatsdSampleRate, is(0.0f)); + + mCountDown = new CountDownLatch(1); + DeviceConfig.setProperty(DeviceConfig.ActivityManager.NAMESPACE, + KEY_COMPACT_STATSD_SAMPLE_RATE, + Float.toString(1.01f), false); + assertThat(mCountDown.await(5, TimeUnit.SECONDS), is(true)); + + // Then the values is capped in the range. + assertThat(mCompactorUnderTest.mStatsdSampleRate, is(1.0f)); + } + private class TestInjector extends Injector { @Override public AppOpsService getAppOpsService(File file, Handler handler) { diff --git a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java new file mode 100644 index 000000000000..33cbf7ae8ba6 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java @@ -0,0 +1,176 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.rollback; + +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verifyZeroInteractions; + +import android.content.pm.VersionedPackage; +import android.content.rollback.PackageRollbackInfo; +import android.content.rollback.PackageRollbackInfo.RestoreInfo; +import android.util.IntArray; + +import com.android.server.pm.Installer; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.InOrder; +import org.mockito.Mockito; + +import java.io.File; +import java.util.ArrayList; + +@RunWith(JUnit4.class) +public class AppDataRollbackHelperTest { + + @Test + public void testSnapshotAppData() throws Exception { + Installer installer = mock(Installer.class); + AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer)); + + // All users are unlocked so we should snapshot data for them. + doReturn(true).when(helper).isUserCredentialLocked(eq(10)); + doReturn(true).when(helper).isUserCredentialLocked(eq(11)); + IntArray pending = helper.snapshotAppData("com.foo.bar", new int[]{10, 11}); + assertEquals(2, pending.size()); + assertEquals(10, pending.get(0)); + assertEquals(11, pending.get(1)); + + InOrder inOrder = Mockito.inOrder(installer); + inOrder.verify(installer).snapshotAppData( + eq("com.foo.bar"), eq(10), eq(Installer.FLAG_STORAGE_DE)); + inOrder.verify(installer).snapshotAppData( + eq("com.foo.bar"), eq(11), eq(Installer.FLAG_STORAGE_DE)); + inOrder.verifyNoMoreInteractions(); + + // One of the users is unlocked but the other isn't + doReturn(false).when(helper).isUserCredentialLocked(eq(10)); + doReturn(true).when(helper).isUserCredentialLocked(eq(11)); + + pending = helper.snapshotAppData("com.foo.bar", new int[]{10, 11}); + assertEquals(1, pending.size()); + assertEquals(11, pending.get(0)); + + inOrder = Mockito.inOrder(installer); + inOrder.verify(installer).snapshotAppData( + eq("com.foo.bar"), eq(10), + eq(Installer.FLAG_STORAGE_CE | Installer.FLAG_STORAGE_DE)); + inOrder.verify(installer).snapshotAppData( + eq("com.foo.bar"), eq(11), eq(Installer.FLAG_STORAGE_DE)); + inOrder.verifyNoMoreInteractions(); + } + + private static RollbackData createInProgressRollbackData(String packageName) { + RollbackData data = new RollbackData(1, new File("/does/not/exist")); + data.packages.add(new PackageRollbackInfo( + new VersionedPackage(packageName, 1), new VersionedPackage(packageName, 1), + new IntArray(), new ArrayList<>())); + data.inProgress = true; + + return data; + } + + @Test + public void testRestoreAppDataSnapshot_noRollbackData() throws Exception { + Installer installer = mock(Installer.class); + AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer)); + + assertFalse(helper.restoreAppData("com.foo", null, 0, 0, 0, "seinfo")); + verifyZeroInteractions(installer); + } + + @Test + public void testRestoreAppDataSnapshot_noRollbackInProgress() throws Exception { + Installer installer = mock(Installer.class); + AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer)); + + RollbackData rd = createInProgressRollbackData("com.foo"); + // Override the in progress flag. + rd.inProgress = false; + assertFalse(helper.restoreAppData("com.foo", rd, 0, 0, 0, "seinfo")); + verifyZeroInteractions(installer); + } + + @Test + public void testRestoreAppDataSnapshot_pendingBackupForUser() throws Exception { + Installer installer = mock(Installer.class); + AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer)); + + RollbackData rd = createInProgressRollbackData("com.foo"); + IntArray pendingBackups = rd.packages.get(0).getPendingBackups(); + pendingBackups.add(10); + pendingBackups.add(11); + + assertTrue(helper.restoreAppData("com.foo", rd, 10 /* userId */, 1, 2, "seinfo")); + + // Should only require FLAG_STORAGE_DE here because we have a pending backup that we + // didn't manage to execute. + InOrder inOrder = Mockito.inOrder(installer); + inOrder.verify(installer).restoreAppDataSnapshot( + eq("com.foo"), eq(1), eq(2L), eq("seinfo"), eq(10), eq(Installer.FLAG_STORAGE_DE)); + inOrder.verifyNoMoreInteractions(); + + assertEquals(1, pendingBackups.size()); + assertEquals(11, pendingBackups.get(0)); + } + + @Test + public void testRestoreAppDataSnapshot_availableBackupForLockedUser() throws Exception { + Installer installer = mock(Installer.class); + AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer)); + doReturn(true).when(helper).isUserCredentialLocked(eq(10)); + + RollbackData rd = createInProgressRollbackData("com.foo"); + + assertTrue(helper.restoreAppData("com.foo", rd, 10 /* userId */, 1, 2, "seinfo")); + + InOrder inOrder = Mockito.inOrder(installer); + inOrder.verify(installer).restoreAppDataSnapshot( + eq("com.foo"), eq(1), eq(2L), eq("seinfo"), eq(10), eq(Installer.FLAG_STORAGE_DE)); + inOrder.verifyNoMoreInteractions(); + + ArrayList<RestoreInfo> pendingRestores = rd.packages.get(0).getPendingRestores(); + assertEquals(1, pendingRestores.size()); + assertEquals(10, pendingRestores.get(0).userId); + assertEquals(1, pendingRestores.get(0).appId); + assertEquals("seinfo", pendingRestores.get(0).seInfo); + } + + @Test + public void testRestoreAppDataSnapshot_availableBackupForUnockedUser() throws Exception { + Installer installer = mock(Installer.class); + AppDataRollbackHelper helper = spy(new AppDataRollbackHelper(installer)); + doReturn(false).when(helper).isUserCredentialLocked(eq(10)); + + RollbackData rd = createInProgressRollbackData("com.foo"); + assertFalse(helper.restoreAppData("com.foo", rd, 10 /* userId */, 1, 2, "seinfo")); + + InOrder inOrder = Mockito.inOrder(installer); + inOrder.verify(installer).restoreAppDataSnapshot( + eq("com.foo"), eq(1), eq(2L), eq("seinfo"), eq(10), + eq(Installer.FLAG_STORAGE_DE | Installer.FLAG_STORAGE_CE)); + inOrder.verifyNoMoreInteractions(); + + ArrayList<RestoreInfo> pendingRestores = rd.packages.get(0).getPendingRestores(); + assertEquals(0, pendingRestores.size()); + } +} diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java index 1de1e4ef8b9f..0b488c09b45a 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAssistantsTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.INotificationManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.IPackageManager; @@ -36,22 +37,17 @@ import android.os.UserManager; import android.util.IntArray; import android.util.Xml; -import com.android.internal.util.FastXmlSerializer; import com.android.server.UiServiceTestCase; import com.android.server.notification.NotificationManagerService.NotificationAssistants; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlSerializer; import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.List; @@ -65,6 +61,8 @@ public class NotificationAssistantsTest extends UiServiceTestCase { private UserManager mUm; @Mock NotificationManagerService mNm; + @Mock + private INotificationManager mINm; NotificationAssistants mAssistants; @@ -83,6 +81,7 @@ public class NotificationAssistantsTest extends UiServiceTestCase { getContext().setMockPackageManager(mPm); getContext().addMockSystemService(Context.USER_SERVICE, mUm); mAssistants = spy(mNm.new NotificationAssistants(getContext(), mLock, mUserProfiles, miPm)); + when(mNm.getBinderService()).thenReturn(mINm); List<ResolveInfo> approved = new ArrayList<>(); ResolveInfo resolve = new ResolveInfo(); @@ -136,4 +135,30 @@ public class NotificationAssistantsTest extends UiServiceTestCase { verify(mAssistants, times(1)).addApprovedList( new ComponentName("b", "b").flattenToString(),10, true); } + + @Test + public void testSetPackageOrComponentEnabled_onlyOnePackage() throws Exception { + ComponentName component1 = ComponentName.unflattenFromString("package/Component1"); + ComponentName component2 = ComponentName.unflattenFromString("package/Component2"); + mAssistants.setPackageOrComponentEnabled(component1.flattenToString(), mZero.id, true, + true); + verify(mINm, never()).setNotificationAssistantAccessGrantedForUser(any(ComponentName.class), + eq(mZero.id), anyBoolean()); + + mAssistants.setPackageOrComponentEnabled(component2.flattenToString(), mZero.id, true, + true); + verify(mINm, times(1)).setNotificationAssistantAccessGrantedForUser(component1, mZero.id, + false); + } + + @Test + public void testSetPackageOrComponentEnabled_samePackage() throws Exception { + ComponentName component1 = ComponentName.unflattenFromString("package/Component1"); + mAssistants.setPackageOrComponentEnabled(component1.flattenToString(), mZero.id, true, + true); + mAssistants.setPackageOrComponentEnabled(component1.flattenToString(), mZero.id, true, + true); + verify(mINm, never()).setNotificationAssistantAccessGrantedForUser(any(ComponentName.class), + eq(mZero.id), anyBoolean()); + } } 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 5d46f0fe7538..4cae3b3f9ae7 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -2029,6 +2029,31 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test + public void testGetAssistantAllowedForUser() throws Exception { + UserHandle user = UserHandle.of(10); + try { + mBinderService.getAllowedNotificationAssistantForUser(user.getIdentifier()); + } catch (IllegalStateException e) { + if (!e.getMessage().contains("At most one NotificationAssistant")) { + throw e; + } + } + verify(mAssistants, times(1)).getAllowedComponents(user.getIdentifier()); + } + + @Test + public void testGetAssistantAllowed() throws Exception { + try { + mBinderService.getAllowedNotificationAssistant(); + } catch (IllegalStateException e) { + if (!e.getMessage().contains("At most one NotificationAssistant")) { + throw e; + } + } + verify(mAssistants, times(1)).getAllowedComponents(0); + } + + @Test public void testSetDndAccessForUser() throws Exception { UserHandle user = UserHandle.of(10); ComponentName c = ComponentName.unflattenFromString("package/Component"); @@ -2089,6 +2114,54 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test + public void testSetAssistantAccess_nullWithAllowedAssistant() throws Exception { + ArrayList<ComponentName> componentList = new ArrayList<>(); + ComponentName c = ComponentName.unflattenFromString("package/Component"); + componentList.add(c); + when(mAssistants.getAllowedComponents(anyInt())).thenReturn(componentList); + + try { + mBinderService.setNotificationAssistantAccessGranted(null, true); + } catch (SecurityException e) { + if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) { + throw e; + } + } + + verify(mAssistants, times(1)).setPackageOrComponentEnabled( + c.flattenToString(), 0, true, false); + verify(mConditionProviders, times(1)).setPackageOrComponentEnabled( + c.flattenToString(), 0, false, false); + verify(mListeners, never()).setPackageOrComponentEnabled( + any(), anyInt(), anyBoolean(), anyBoolean()); + } + + @Test + public void testSetAssistantAccessForUser_nullWithAllowedAssistant() throws Exception { + UserHandle user = UserHandle.of(10); + ArrayList<ComponentName> componentList = new ArrayList<>(); + ComponentName c = ComponentName.unflattenFromString("package/Component"); + componentList.add(c); + when(mAssistants.getAllowedComponents(anyInt())).thenReturn(componentList); + + try { + mBinderService.setNotificationAssistantAccessGrantedForUser( + null, user.getIdentifier(), true); + } catch (SecurityException e) { + if (!e.getMessage().contains("Permission Denial: not allowed to send broadcast")) { + throw e; + } + } + + verify(mAssistants, times(1)).setPackageOrComponentEnabled( + c.flattenToString(), user.getIdentifier(), true, false); + verify(mConditionProviders, times(1)).setPackageOrComponentEnabled( + c.flattenToString(), user.getIdentifier(), false, false); + verify(mListeners, never()).setPackageOrComponentEnabled( + any(), anyInt(), anyBoolean(), anyBoolean()); + } + + @Test public void testSetDndAccess() throws Exception { ComponentName c = ComponentName.unflattenFromString("package/Component"); try { 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 bde9dde52c2f..47ec390d6b01 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -2006,6 +2006,28 @@ public class PreferencesHelperTest extends UiServiceTestCase { } @Test + public void testXml_statusBarIcons_default() throws Exception { + ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false); + mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper); + loadStreamXml(baos, false); + + assertEquals(PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS, + mHelper.shouldHideSilentStatusIcons()); + } + + @Test + public void testXml_statusBarIcons() throws Exception { + mHelper.setHideSilentStatusIcons(!PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS); + + ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false); + mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper); + loadStreamXml(baos, false); + + assertEquals(!PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS, + mHelper.shouldHideSilentStatusIcons()); + } + + @Test public void testSetNotificationDelegate() { mHelper.setNotificationDelegate(PKG_O, UID_O, "other", 53); assertEquals("other", mHelper.getNotificationDelegate(PKG_O, UID_O)); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java index 35c1edeace2d..986943aaf146 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java @@ -34,6 +34,7 @@ import static com.android.server.wm.ActivityStack.ActivityState.DESTROYING; import static com.android.server.wm.ActivityStack.ActivityState.PAUSED; import static com.android.server.wm.ActivityStack.ActivityState.PAUSING; import static com.android.server.wm.ActivityStack.ActivityState.RESUMED; +import static com.android.server.wm.ActivityStack.ActivityState.STOPPED; import static com.android.server.wm.ActivityStack.ActivityState.STOPPING; import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING; import static com.android.server.wm.ActivityTaskManagerService.RELAUNCH_REASON_FREE_RESIZE; @@ -51,6 +52,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import android.content.ComponentName; import android.content.pm.ActivityInfo; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; @@ -647,20 +649,50 @@ public class ActivityStackTests extends ActivityTestsBase { } @Test - public void testFinishDisabledPackageActivities() { + public void testFinishDisabledPackageActivities_FinishAliveActivities() { final ActivityRecord firstActivity = new ActivityBuilder(mService).setTask(mTask).build(); final ActivityRecord secondActivity = new ActivityBuilder(mService).setTask(mTask).build(); + firstActivity.setState(STOPPED, "testFinishDisabledPackageActivities"); + secondActivity.setState(RESUMED, "testFinishDisabledPackageActivities"); + mStack.mResumedActivity = secondActivity; - // Making the second activity a task overlay without an app means it will be removed from - // the task's activities as well once first activity is removed. - secondActivity.mTaskOverlay = true; - secondActivity.app = null; + // Note the activities have non-null ActivityRecord.app, so it won't remove directly. + mStack.finishDisabledPackageActivitiesLocked(firstActivity.packageName, + null /* filterByClasses */, true /* doit */, true /* evenPersistent */, + UserHandle.USER_ALL); + + // If the activity is disabled with {@link android.content.pm.PackageManager#DONT_KILL_APP} + // the activity should still follow the normal flow to finish and destroy. + assertThat(firstActivity.getState()).isEqualTo(DESTROYING); + assertThat(secondActivity.getState()).isEqualTo(PAUSING); + assertTrue(secondActivity.finishing); + } + + @Test + public void testFinishDisabledPackageActivities_RemoveNonAliveActivities() { + final ActivityRecord activity = new ActivityBuilder(mService).setTask(mTask).build(); + + // The overlay activity is not in the disabled package but it is in the same task. + final ActivityRecord overlayActivity = new ActivityBuilder(mService).setTask(mTask) + .setComponent(new ComponentName("package.overlay", ".OverlayActivity")).build(); + // If the task only remains overlay activity, the task should also be removed. + // See {@link ActivityStack#removeActivityFromHistoryLocked}. + overlayActivity.mTaskOverlay = true; + + // The activity without an app means it will be removed immediately. + // See {@link ActivityStack#destroyActivityLocked}. + activity.app = null; + overlayActivity.app = null; assertEquals(2, mTask.mActivities.size()); - mStack.finishDisabledPackageActivitiesLocked(firstActivity.packageName, null, - true /* doit */, true /* evenPersistent */, UserHandle.USER_ALL); + mStack.finishDisabledPackageActivitiesLocked(activity.packageName, + null /* filterByClasses */, true /* doit */, true /* evenPersistent */, + UserHandle.USER_ALL); + // Although the overlay activity is in another package, the non-overlay activities are + // removed from the task. Since the overlay activity should be removed as well, the task + // should be empty. assertThat(mTask.mActivities).isEmpty(); assertThat(mStack.getAllTasks()).isEmpty(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index ace965b8b42c..62ec838c047f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -561,7 +561,7 @@ public class ActivityStarterTests extends ActivityTestsBase { runAndVerifyBackgroundActivityStartsSubtest("allowed_noStartsAborted", false, UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1, UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, - false, false, false); + false, false, false, false); } /** @@ -576,7 +576,7 @@ public class ActivityStarterTests extends ActivityTestsBase { "disallowed_unsupportedUsecase_aborted", true, UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1, UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, - false, false, false); + false, false, false, false); } /** @@ -591,57 +591,64 @@ public class ActivityStarterTests extends ActivityTestsBase { runAndVerifyBackgroundActivityStartsSubtest("disallowed_rootUid_notAborted", false, Process.ROOT_UID, false, PROCESS_STATE_TOP + 1, UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, - false, false, false); + false, false, false, false); runAndVerifyBackgroundActivityStartsSubtest("disallowed_systemUid_notAborted", false, Process.SYSTEM_UID, false, PROCESS_STATE_TOP + 1, UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, - false, false, false); + false, false, false, false); runAndVerifyBackgroundActivityStartsSubtest("disallowed_nfcUid_notAborted", false, Process.NFC_UID, false, PROCESS_STATE_TOP + 1, UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, - false, false, false); + false, false, false, false); runAndVerifyBackgroundActivityStartsSubtest( "disallowed_callingUidHasVisibleWindow_notAborted", false, UNIMPORTANT_UID, true, PROCESS_STATE_TOP + 1, UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, - false, false, false); + false, false, false, false); runAndVerifyBackgroundActivityStartsSubtest( "disallowed_callingUidProcessStateTop_notAborted", false, UNIMPORTANT_UID, false, PROCESS_STATE_TOP, UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, - false, false, false); + false, false, false, false); runAndVerifyBackgroundActivityStartsSubtest( "disallowed_realCallingUidHasVisibleWindow_notAborted", false, UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1, UNIMPORTANT_UID2, true, PROCESS_STATE_TOP + 1, - false, false, false); + false, false, false, false); runAndVerifyBackgroundActivityStartsSubtest( "disallowed_realCallingUidProcessStateTop_notAborted", false, UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1, UNIMPORTANT_UID2, false, PROCESS_STATE_TOP, - false, false, false); + false, false, false, false); runAndVerifyBackgroundActivityStartsSubtest( "disallowed_hasForegroundActivities_notAborted", false, UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1, UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, - true, false, false); + true, false, false, false); runAndVerifyBackgroundActivityStartsSubtest( "disallowed_callerIsRecents_notAborted", false, UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1, UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, - false, true, false); + false, true, false, false); runAndVerifyBackgroundActivityStartsSubtest( "disallowed_callerIsWhitelisted_notAborted", false, UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1, UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, - false, false, true); + false, false, true, false); + runAndVerifyBackgroundActivityStartsSubtest( + "disallowed_callerIsInstrumentingWithBackgroundActivityStartPrivileges_notAborted", + false, + UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1, + UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, + false, false, false, true); } private void runAndVerifyBackgroundActivityStartsSubtest(String name, boolean shouldHaveAborted, int callingUid, boolean callingUidHasVisibleWindow, int callingUidProcState, int realCallingUid, boolean realCallingUidHasVisibleWindow, int realCallingUidProcState, boolean hasForegroundActivities, boolean callerIsRecents, - boolean callerIsTempWhitelisted) { + boolean callerIsTempWhitelisted, + boolean callerIsInstrumentingWithBackgroundActivityStartPrivileges) { // window visibility doReturn(callingUidHasVisibleWindow).when(mService.mWindowManager.mRoot) .isAnyNonToastWindowVisibleForUid(callingUid); @@ -664,6 +671,9 @@ public class ActivityStarterTests extends ActivityTestsBase { doReturn(callerIsRecents).when(recentTasks).isCallerRecents(callingUid); // caller is temp whitelisted callerApp.setAllowBackgroundActivityStarts(callerIsTempWhitelisted); + // caller is instrumenting with background activity starts privileges + callerApp.setInstrumentingWithBackgroundActivityStartPrivileges( + callerIsInstrumentingWithBackgroundActivityStartPrivileges); final ActivityOptions options = spy(ActivityOptions.makeBasic()); ActivityStarter starter = prepareStarter(FLAG_ACTIVITY_NEW_TASK) diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java index ea8f33f0c630..3b399ffc708c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTestsBase.java @@ -474,6 +474,10 @@ class ActivityTestsBase { } @Override + void updateCpuStats() { + } + + @Override void updateBatteryStats(ActivityRecord component, boolean resumed) { } diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java index 50e4faab76e3..ae05750eed9f 100644 --- a/services/usb/java/com/android/server/usb/UsbPortManager.java +++ b/services/usb/java/com/android/server/usb/UsbPortManager.java @@ -41,11 +41,11 @@ import android.hardware.usb.ParcelableUsbPort; import android.hardware.usb.UsbManager; import android.hardware.usb.UsbPort; import android.hardware.usb.UsbPortStatus; +import android.hardware.usb.V1_0.IUsb; import android.hardware.usb.V1_0.PortRole; import android.hardware.usb.V1_0.PortRoleType; import android.hardware.usb.V1_0.Status; import android.hardware.usb.V1_1.PortStatus_1_1; -import android.hardware.usb.V1_2.IUsb; import android.hardware.usb.V1_2.IUsbCallback; import android.hardware.usb.V1_2.PortStatus; import android.hidl.manager.V1_0.IServiceManager; @@ -320,9 +320,12 @@ public class UsbPortManager { try { // Oneway call into the hal - mProxy.enableContaminantPresenceDetection(portId, enable); + android.hardware.usb.V1_2.IUsb proxy = (android.hardware.usb.V1_2.IUsb) mProxy; + proxy.enableContaminantPresenceDetection(portId, enable); } catch (RemoteException e) { - logAndPrintException(null, "Failed to set contaminant detection", e); + logAndPrintException(pw, "Failed to set contaminant detection", e); + } catch (ClassCastException e) { + logAndPrintException(pw, "Method only applicable to V1.2 or above implementation", e); } } diff --git a/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java b/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java index 9a30b35f02a2..22fc15985b05 100644 --- a/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java +++ b/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java @@ -50,8 +50,8 @@ public class IorapForwardingService extends SystemService { public static final String TAG = "IorapForwardingService"; /** $> adb shell 'setprop log.tag.IorapdForwardingService VERBOSE' */ public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - /** $> adb shell 'setprop iorapd.enable true' */ - private static boolean IS_ENABLED = SystemProperties.getBoolean("iorapd.enable", true); + /** $> adb shell 'setprop ro.iorapd.enable true' */ + private static boolean IS_ENABLED = SystemProperties.getBoolean("ro.iorapd.enable", true); /** $> adb shell 'setprop iorapd.forwarding_service.wtf_crash true' */ private static boolean WTF_CRASH = SystemProperties.getBoolean( "iorapd.forwarding_service.wtf_crash", false); diff --git a/startop/iorap/tests/Android.mk b/startop/iorap/tests/Android.mk index 1b2aa46a6418..fa8c8b5fba89 100644 --- a/startop/iorap/tests/Android.mk +++ b/startop/iorap/tests/Android.mk @@ -43,4 +43,7 @@ LOCAL_JAVA_LIBRARIES := \ LOCAL_CERTIFICATE := platform LOCAL_PRIVATE_PLATFORM_APIS := true +# Disable presubmit test until it works with disabled iorap by default. +LOCAL_PRESUBMIT_DISABLED := true + include $(BUILD_PACKAGE) diff --git a/telephony/java/android/telephony/NetworkService.java b/telephony/java/android/telephony/NetworkService.java index 4bca404d9444..6c45cc4ef3b8 100644 --- a/telephony/java/android/telephony/NetworkService.java +++ b/telephony/java/android/telephony/NetworkService.java @@ -16,6 +16,7 @@ package android.telephony; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.app.Service; import android.content.Intent; @@ -112,13 +113,13 @@ public abstract class NetworkService extends Service { mSlotId, 0, null).sendToTarget(); } - private void registerForStateChanged(INetworkServiceCallback callback) { + private void registerForStateChanged(@NonNull INetworkServiceCallback callback) { synchronized (mNetworkRegistrationStateChangedCallbacks) { mNetworkRegistrationStateChangedCallbacks.add(callback); } } - private void unregisterForStateChanged(INetworkServiceCallback callback) { + private void unregisterForStateChanged(@NonNull INetworkServiceCallback callback) { synchronized (mNetworkRegistrationStateChangedCallbacks) { mNetworkRegistrationStateChangedCallbacks.remove(callback); } diff --git a/telephony/java/android/telephony/RadioAccessFamily.java b/telephony/java/android/telephony/RadioAccessFamily.java index 0d94c4dd3686..c1786befb096 100644 --- a/telephony/java/android/telephony/RadioAccessFamily.java +++ b/telephony/java/android/telephony/RadioAccessFamily.java @@ -17,12 +17,15 @@ package android.telephony; import android.annotation.UnsupportedAppUsage; +import android.hardware.radio.V1_0.RadioTechnology; +import android.hardware.radio.V1_4.CellInfo.Info; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import com.android.internal.telephony.RILConstants; + /** * Object to indicate the phone radio type and access technology. * @@ -33,32 +36,34 @@ public class RadioAccessFamily implements Parcelable { /** * TODO: get rid of RAF definition in RadioAccessFamily and * use {@link TelephonyManager.NetworkTypeBitMask} + * TODO: public definition {@link TelephonyManager.NetworkTypeBitMask} is long. + * TODO: Convert from int to long everywhere including HAL definitions. */ // 2G - public static final int RAF_UNKNOWN = TelephonyManager.NETWORK_TYPE_BITMASK_UNKNOWN; - public static final int RAF_GSM = TelephonyManager.NETWORK_TYPE_BITMASK_GSM; - public static final int RAF_GPRS = TelephonyManager.NETWORK_TYPE_BITMASK_GPRS; - public static final int RAF_EDGE = TelephonyManager.NETWORK_TYPE_BITMASK_EDGE; - public static final int RAF_IS95A = TelephonyManager.NETWORK_TYPE_BITMASK_CDMA; - public static final int RAF_IS95B = TelephonyManager.NETWORK_TYPE_BITMASK_CDMA; - public static final int RAF_1xRTT = TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT; + public static final int RAF_UNKNOWN = (int) TelephonyManager.NETWORK_TYPE_BITMASK_UNKNOWN; + public static final int RAF_GSM = (int) TelephonyManager.NETWORK_TYPE_BITMASK_GSM; + public static final int RAF_GPRS = (int) TelephonyManager.NETWORK_TYPE_BITMASK_GPRS; + public static final int RAF_EDGE = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EDGE; + public static final int RAF_IS95A = (int) TelephonyManager.NETWORK_TYPE_BITMASK_CDMA; + public static final int RAF_IS95B = (int) TelephonyManager.NETWORK_TYPE_BITMASK_CDMA; + public static final int RAF_1xRTT = (int) TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT; // 3G - public static final int RAF_EVDO_0 = TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0; - public static final int RAF_EVDO_A = TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A; - public static final int RAF_EVDO_B = TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B; - public static final int RAF_EHRPD = TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD; - public static final int RAF_HSUPA = TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA; - public static final int RAF_HSDPA = TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA; - public static final int RAF_HSPA = TelephonyManager.NETWORK_TYPE_BITMASK_HSPA; - public static final int RAF_HSPAP = TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP; - public static final int RAF_UMTS = TelephonyManager.NETWORK_TYPE_BITMASK_UMTS; - public static final int RAF_TD_SCDMA = TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA; + public static final int RAF_EVDO_0 = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0; + public static final int RAF_EVDO_A = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A; + public static final int RAF_EVDO_B = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B; + public static final int RAF_EHRPD = (int) TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD; + public static final int RAF_HSUPA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA; + public static final int RAF_HSDPA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA; + public static final int RAF_HSPA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_HSPA; + public static final int RAF_HSPAP = (int) TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP; + public static final int RAF_UMTS = (int) TelephonyManager.NETWORK_TYPE_BITMASK_UMTS; + public static final int RAF_TD_SCDMA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA; // 4G - public static final int RAF_LTE = TelephonyManager.NETWORK_TYPE_BITMASK_LTE; - public static final int RAF_LTE_CA = TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA; + public static final int RAF_LTE = (int) TelephonyManager.NETWORK_TYPE_BITMASK_LTE; + public static final int RAF_LTE_CA = (int) TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA; // 5G - public static final int RAF_NR = TelephonyManager.NETWORK_TYPE_BITMASK_NR; + public static final int RAF_NR = (int) TelephonyManager.NETWORK_TYPE_BITMASK_NR; // Grouping of RAFs // 2G @@ -147,20 +152,20 @@ public class RadioAccessFamily implements Parcelable { /** * Implement the Parcelable interface. */ - public static final Creator<RadioAccessFamily> CREATOR = - new Creator<RadioAccessFamily>() { + public static final Creator<android.telephony.RadioAccessFamily> CREATOR = + new Creator<android.telephony.RadioAccessFamily>() { @Override - public RadioAccessFamily createFromParcel(Parcel in) { + public android.telephony.RadioAccessFamily createFromParcel(Parcel in) { int phoneId = in.readInt(); int radioAccessFamily = in.readInt(); - return new RadioAccessFamily(phoneId, radioAccessFamily); + return new android.telephony.RadioAccessFamily(phoneId, radioAccessFamily); } @Override - public RadioAccessFamily[] newArray(int size) { - return new RadioAccessFamily[size]; + public android.telephony.RadioAccessFamily[] newArray(int size) { + return new android.telephony.RadioAccessFamily[size]; } }; @@ -391,76 +396,78 @@ public class RadioAccessFamily implements Parcelable { } /** - * convert RAF from {@link ServiceState.RilRadioTechnology} bitmask to + * convert RAF from {@link android.hardware.radio.V1_0.RadioAccessFamily} to * {@link TelephonyManager.NetworkTypeBitMask}, the bitmask represented by - * {@link TelephonyManager.NetworkType}. Reasons are {@link TelephonyManager.NetworkType} are - * public while {@link ServiceState.RilRadioTechnology} are hidden. We - * don't want to expose two sets of definition to public. + * {@link TelephonyManager.NetworkType}. * - * @param raf bitmask represented by {@link ServiceState.RilRadioTechnology} + * @param raf {@link android.hardware.radio.V1_0.RadioAccessFamily} * @return {@link TelephonyManager.NetworkTypeBitMask} */ public static int convertToNetworkTypeBitMask(int raf) { int networkTypeRaf = 0; - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GSM)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GSM) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GSM; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GPRS)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.GPRS) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_GPRS; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EDGE)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EDGE) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EDGE; } // convert both IS95A/IS95B to CDMA as network mode doesn't support CDMA - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95A)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95A) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IS95B)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.IS95B) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_CDMA; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.ONE_X_RTT) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_1xRTT; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_0) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_0; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_A) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_A; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EVDO_B) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EVDO_B; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.EHRPD) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_EHRPD; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSUPA) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSUPA; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSDPA) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSDPA; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPA)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPA) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPA; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.HSPAP) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_HSPAP; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_UMTS)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.UMTS) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_UMTS; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.TD_SCDMA) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_TD_SCDMA; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA)) != 0) { + if ((raf & android.hardware.radio.V1_0.RadioAccessFamily.LTE_CA) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_LTE_CA; } - if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_NR)) != 0) { + if ((raf & android.hardware.radio.V1_4.RadioAccessFamily.NR) != 0) { networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_NR; } + // TODO: need hal definition + if ((raf & (1 << ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN)) != 0) { + networkTypeRaf |= TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN; + } return (networkTypeRaf == 0) ? TelephonyManager.NETWORK_TYPE_UNKNOWN : networkTypeRaf; } diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 44756307a4b3..33178766f3a3 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -540,7 +540,7 @@ public class ServiceState implements Parcelable { * * @hide */ - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) + @UnsupportedAppUsage public int getDataRegState() { return mDataRegState; } diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 869cf1cf9e14..dfe36efcd5d1 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -2577,8 +2577,14 @@ public class SubscriptionManager { @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPreferredDataSubscriptionId(int subId) { if (VDBG) logd("[setPreferredDataSubscriptionId]+ subId:" + subId); - setSubscriptionPropertyHelper(DEFAULT_SUBSCRIPTION_ID, "setPreferredDataSubscriptionId", - (iSub)-> iSub.setPreferredDataSubscriptionId(subId)); + try { + ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); + if (iSub != null) { + iSub.setPreferredDataSubscriptionId(subId); + } + } catch (RemoteException ex) { + // ignore it + } } /** diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 36450579c57b..0e63b2b4db4d 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -23,6 +23,7 @@ import static com.android.internal.util.Preconditions.checkNotNull; import android.Manifest; import android.annotation.CallbackExecutor; import android.annotation.IntDef; +import android.annotation.LongDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; @@ -349,41 +350,30 @@ public class TelephonyManager { * Returns 0 if none of voice, sms, data is not supported * Returns 1 for Single standby mode (Single SIM functionality) * Returns 2 for Dual standby mode.(Dual SIM functionality) + * Returns 3 for Tri standby mode.(Tri SIM functionality) */ public int getPhoneCount() { - int phoneCount = 1; - switch (getMultiSimConfiguration()) { - case UNKNOWN: - // if voice or sms or data is supported, return 1 otherwise 0 - if (isVoiceCapable() || isSmsCapable()) { - phoneCount = 1; - } else { - // todo: try to clean this up further by getting rid of the nested conditions - if (mContext == null) { - phoneCount = 1; - } else { - // check for data support - ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService( - Context.CONNECTIVITY_SERVICE); - if (cm == null) { - phoneCount = 1; - } else { - if (cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)) { - phoneCount = 1; - } else { - phoneCount = 0; - } - } - } + int phoneCount = 0; + + // check for voice and data support, 0 if not supported + if (!isVoiceCapable() && !isSmsCapable()) { + ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService( + Context.CONNECTIVITY_SERVICE); + if (cm != null) { + if (!cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)) { + return phoneCount; } - break; - case DSDS: - case DSDA: - phoneCount = PhoneConstants.MAX_PHONE_COUNT_DUAL_SIM; - break; - case TSTS: - phoneCount = PhoneConstants.MAX_PHONE_COUNT_TRI_SIM; - break; + } + } + + phoneCount = 1; + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + phoneCount = telephony.getNumOfActiveSims(); + } + } catch (RemoteException ex) { + Rlog.e(TAG, "getNumOfActiveSims RemoteException", ex); } return phoneCount; } @@ -6539,17 +6529,17 @@ public class TelephonyManager { * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE READ_PRIVILEGED_PHONE_STATE} * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}). * - * @return a 32-bit bitmap. + * @return The bitmap of preferred network types. * * @hide */ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @SystemApi - public @NetworkTypeBitMask int getPreferredNetworkTypeBitmap() { + public @NetworkTypeBitMask long getPreferredNetworkTypeBitmap() { try { ITelephony telephony = getITelephony(); if (telephony != null) { - return RadioAccessFamily.getRafFromNetworkType( + return (long) RadioAccessFamily.getRafFromNetworkType( telephony.getPreferredNetworkType(getSubId())); } } catch (RemoteException ex) { @@ -6784,18 +6774,19 @@ public class TelephonyManager { * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the calling * app has carrier privileges (see {@link #hasCarrierPrivileges}). * - * @param networkTypeBitmap a 32-bit bitmap. + * @param networkTypeBitmap The bitmap of preferred network types. * @return true on success; false on any failure. * @hide */ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @SystemApi - public boolean setPreferredNetworkTypeBitmap(@NetworkTypeBitMask int networkTypeBitmap) { + public boolean setPreferredNetworkTypeBitmap(@NetworkTypeBitMask long networkTypeBitmap) { try { ITelephony telephony = getITelephony(); if (telephony != null) { return telephony.setPreferredNetworkType( - getSubId(), RadioAccessFamily.getNetworkTypeFromRaf(networkTypeBitmap)); + getSubId(), RadioAccessFamily.getNetworkTypeFromRaf( + (int) networkTypeBitmap)); } } catch (RemoteException ex) { Rlog.e(TAG, "setPreferredNetworkType RemoteException", ex); @@ -9704,7 +9695,7 @@ public class TelephonyManager { /** @hide */ @Retention(RetentionPolicy.SOURCE) - @IntDef(flag = true, prefix = {"NETWORK_TYPE_BITMASK_"}, + @LongDef(flag = true, prefix = {"NETWORK_TYPE_BITMASK_"}, value = {NETWORK_TYPE_BITMASK_UNKNOWN, NETWORK_TYPE_BITMASK_GSM, NETWORK_TYPE_BITMASK_GPRS, @@ -9733,118 +9724,125 @@ public class TelephonyManager { * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_UNKNOWN = (1 << NETWORK_TYPE_UNKNOWN); + public static final long NETWORK_TYPE_BITMASK_UNKNOWN = 0L; /** * network type bitmask indicating the support of radio tech GSM. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_GSM = (1 << NETWORK_TYPE_GSM); + public static final long NETWORK_TYPE_BITMASK_GSM = (1 << (NETWORK_TYPE_GSM -1)); /** * network type bitmask indicating the support of radio tech GPRS. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_GPRS = (1 << NETWORK_TYPE_GPRS); + public static final long NETWORK_TYPE_BITMASK_GPRS = (1 << (NETWORK_TYPE_GPRS -1)); /** * network type bitmask indicating the support of radio tech EDGE. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_EDGE = (1 << NETWORK_TYPE_EDGE); + public static final long NETWORK_TYPE_BITMASK_EDGE = (1 << (NETWORK_TYPE_EDGE -1)); /** * network type bitmask indicating the support of radio tech CDMA(IS95A/IS95B). * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_CDMA = (1 << NETWORK_TYPE_CDMA); + public static final long NETWORK_TYPE_BITMASK_CDMA = (1 << (NETWORK_TYPE_CDMA -1)); /** * network type bitmask indicating the support of radio tech 1xRTT. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_1xRTT = (1 << NETWORK_TYPE_1xRTT); + public static final long NETWORK_TYPE_BITMASK_1xRTT = (1 << (NETWORK_TYPE_1xRTT - 1)); // 3G /** * network type bitmask indicating the support of radio tech EVDO 0. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_EVDO_0 = (1 << NETWORK_TYPE_EVDO_0); + public static final long NETWORK_TYPE_BITMASK_EVDO_0 = (1 << (NETWORK_TYPE_EVDO_0 -1)); /** * network type bitmask indicating the support of radio tech EVDO A. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_EVDO_A = (1 << NETWORK_TYPE_EVDO_A); + public static final long NETWORK_TYPE_BITMASK_EVDO_A = (1 << (NETWORK_TYPE_EVDO_A - 1)); /** * network type bitmask indicating the support of radio tech EVDO B. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_EVDO_B = (1 << NETWORK_TYPE_EVDO_B); + public static final long NETWORK_TYPE_BITMASK_EVDO_B = (1 << (NETWORK_TYPE_EVDO_B -1)); /** * network type bitmask indicating the support of radio tech EHRPD. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_EHRPD = (1 << NETWORK_TYPE_EHRPD); + public static final long NETWORK_TYPE_BITMASK_EHRPD = (1 << (NETWORK_TYPE_EHRPD -1)); /** * network type bitmask indicating the support of radio tech HSUPA. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_HSUPA = (1 << NETWORK_TYPE_HSUPA); + public static final long NETWORK_TYPE_BITMASK_HSUPA = (1 << (NETWORK_TYPE_HSUPA -1)); /** * network type bitmask indicating the support of radio tech HSDPA. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_HSDPA = (1 << NETWORK_TYPE_HSDPA); + public static final long NETWORK_TYPE_BITMASK_HSDPA = (1 << (NETWORK_TYPE_HSDPA -1)); /** * network type bitmask indicating the support of radio tech HSPA. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_HSPA = (1 << NETWORK_TYPE_HSPA); + public static final long NETWORK_TYPE_BITMASK_HSPA = (1 << (NETWORK_TYPE_HSPA -1)); /** * network type bitmask indicating the support of radio tech HSPAP. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_HSPAP = (1 << NETWORK_TYPE_HSPAP); + public static final long NETWORK_TYPE_BITMASK_HSPAP = (1 << (NETWORK_TYPE_HSPAP -1)); /** * network type bitmask indicating the support of radio tech UMTS. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_UMTS = (1 << NETWORK_TYPE_UMTS); + public static final long NETWORK_TYPE_BITMASK_UMTS = (1 << (NETWORK_TYPE_UMTS -1)); /** * network type bitmask indicating the support of radio tech TD_SCDMA. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_TD_SCDMA = (1 << NETWORK_TYPE_TD_SCDMA); + public static final long NETWORK_TYPE_BITMASK_TD_SCDMA = (1 << (NETWORK_TYPE_TD_SCDMA -1)); // 4G /** * network type bitmask indicating the support of radio tech LTE. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_LTE = (1 << NETWORK_TYPE_LTE); + public static final long NETWORK_TYPE_BITMASK_LTE = (1 << (NETWORK_TYPE_LTE -1)); /** * network type bitmask indicating the support of radio tech LTE CA (carrier aggregation). * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_LTE_CA = (1 << NETWORK_TYPE_LTE_CA); + public static final long NETWORK_TYPE_BITMASK_LTE_CA = (1 << (NETWORK_TYPE_LTE_CA -1)); /** * network type bitmask indicating the support of radio tech NR(New Radio) 5G. * @hide */ @SystemApi - public static final int NETWORK_TYPE_BITMASK_NR = (1 << NETWORK_TYPE_NR); + public static final long NETWORK_TYPE_BITMASK_NR = (1 << (NETWORK_TYPE_NR -1)); + + /** + * network type bitmask indicating the support of radio tech IWLAN. + * @hide + */ + @SystemApi + public static final long NETWORK_TYPE_BITMASK_IWLAN = (1 << (NETWORK_TYPE_IWLAN -1)); /** * @return Modem supported radio access family bitmask @@ -9855,11 +9853,11 @@ public class TelephonyManager { */ @SystemApi @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) - public @NetworkTypeBitMask int getSupportedRadioAccessFamily() { + public @NetworkTypeBitMask long getSupportedRadioAccessFamily() { try { ITelephony telephony = getITelephony(); if (telephony != null) { - return telephony.getRadioAccessFamily(getSlotIndex(), getOpPackageName()); + return (long) telephony.getRadioAccessFamily(getSlotIndex(), getOpPackageName()); } else { // This can happen when the ITelephony interface is not up yet. return NETWORK_TYPE_BITMASK_UNKNOWN; @@ -10214,4 +10212,51 @@ public class TelephonyManager { } return true; } + + /** + * Switch configs to enable multi-sim or switch back to single-sim + * <p>Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE} or that the + * calling app has carrier privileges (see {@link #hasCarrierPrivileges}). + * @param numOfSims number of live SIMs we want to switch to + * @throws android.os.RemoteException + */ + @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges + @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) + public void switchMultiSimConfig(int numOfSims) { + //only proceed if multi-sim is not restricted + if (isMultisimCarrierRestricted()) { + Rlog.e(TAG, "switchMultiSimConfig not possible. It is restricted."); + return; + } + + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + telephony.switchMultiSimConfig(numOfSims); + } + } catch (RemoteException ex) { + Rlog.e(TAG, "switchMultiSimConfig RemoteException", ex); + } + } + + /** + * Get whether reboot is required or not after making changes to modem configurations. + * @Return {@code True} if reboot is required after making changes to modem configurations, + * otherwise return {@code False}. + * + * @hide + */ + @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) + public boolean isRebootRequiredForModemConfigChange() { + try { + ITelephony service = getITelephony(); + if (service != null) { + return service.isRebootRequiredForModemConfigChange(); + } + } catch (RemoteException e) { + Log.e(TAG, "isRebootRequiredForModemConfigChange RemoteException", e); + } + return false; + } } diff --git a/telephony/java/android/telephony/data/DataService.java b/telephony/java/android/telephony/data/DataService.java index 74d1e838f186..79572b9706a9 100644 --- a/telephony/java/android/telephony/data/DataService.java +++ b/telephony/java/android/telephony/data/DataService.java @@ -157,7 +157,10 @@ public abstract class DataService extends Service { @Nullable LinkProperties linkProperties, @Nullable DataServiceCallback callback) { // The default implementation is to return unsupported. - callback.onSetupDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED, null); + if (callback != null) { + callback.onSetupDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED, + null); + } } /** @@ -176,7 +179,9 @@ public abstract class DataService extends Service { public void deactivateDataCall(int cid, @DeactivateDataReason int reason, @Nullable DataServiceCallback callback) { // The default implementation is to return unsupported. - callback.onDeactivateDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED); + if (callback != null) { + callback.onDeactivateDataCallComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED); + } } /** @@ -190,7 +195,10 @@ public abstract class DataService extends Service { public void setInitialAttachApn(DataProfile dataProfile, boolean isRoaming, @Nullable DataServiceCallback callback) { // The default implementation is to return unsupported. - callback.onSetInitialAttachApnComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED); + if (callback != null) { + callback.onSetInitialAttachApnComplete( + DataServiceCallback.RESULT_ERROR_UNSUPPORTED); + } } /** @@ -206,7 +214,9 @@ public abstract class DataService extends Service { public void setDataProfile(List<DataProfile> dps, boolean isRoaming, @Nullable DataServiceCallback callback) { // The default implementation is to return unsupported. - callback.onSetDataProfileComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED); + if (callback != null) { + callback.onSetDataProfileComplete(DataServiceCallback.RESULT_ERROR_UNSUPPORTED); + } } /** diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl index a49d2d976d16..6ce9de4ca677 100755 --- a/telephony/java/com/android/internal/telephony/ISub.aidl +++ b/telephony/java/com/android/internal/telephony/ISub.aidl @@ -220,7 +220,7 @@ interface ISub { * @hide * */ - int setPreferredDataSubscriptionId(int subId); + void setPreferredDataSubscriptionId(int subId); /** * Get which subscription is preferred for cellular data. diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index c8fadae442a5..62f9999bc924 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -1837,4 +1837,19 @@ interface ITelephony { * @hide */ boolean isMultisimCarrierRestricted(); + + /** + * Switch configs to enable multi-sim or switch back to single-sim + * @hide + */ + void switchMultiSimConfig(int numOfSims); + /** + * Get how many modems have been activated on the phone + * @hide + */ + int getNumOfActiveSims(); + /** + * Get if reboot is required upon altering modems configurations + */ + boolean isRebootRequiredForModemConfigChange(); } diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java index d9b206f49dd5..77b797956cf5 100644 --- a/telephony/java/com/android/internal/telephony/RILConstants.java +++ b/telephony/java/com/android/internal/telephony/RILConstants.java @@ -480,6 +480,7 @@ public interface RILConstants { int RIL_REQUEST_SET_PREFERRED_DATA_MODEM = 204; int RIL_REQUEST_EMERGENCY_DIAL = 205; int RIL_REQUEST_GET_PHONE_CAPABILITY = 206; + int RIL_REQUEST_SWITCH_DUAL_SIM_CONFIG = 207; /* Responses begin */ int RIL_RESPONSE_ACKNOWLEDGEMENT = 800; diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java index 6567ea764b50..603c4c2870d7 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java +++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java @@ -194,6 +194,13 @@ public interface TelephonyProperties */ static final String PROPERTY_MULTI_SIM_CONFIG = "persist.radio.multisim.config"; + /** + * Property to indicate if reboot is required when changing modems configurations + * Type: String(true, false) default is false; most devices don't need reboot + */ + String PROPERTY_REBOOT_REQUIRED_ON_MODEM_CHANGE = + "persist.radio.reboot_on_modem_change"; + /** * Property to store default subscription. */ diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java index 86af6422dad3..c1c598d52676 100644 --- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java +++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import android.content.pm.VersionedPackage; import android.os.test.TestLooper; import android.support.test.InstrumentationRegistry; @@ -47,6 +48,7 @@ public class PackageWatchdogTest { private static final String APP_B = "com.package.b"; private static final String APP_C = "com.package.c"; private static final String APP_D = "com.package.d"; + private static final long VERSION_CODE = 1L; private static final String OBSERVER_NAME_1 = "observer1"; private static final String OBSERVER_NAME_2 = "observer2"; private static final String OBSERVER_NAME_3 = "observer3"; @@ -193,7 +195,7 @@ public class PackageWatchdogTest { // Then fail APP_A below the threshold for (int i = 0; i < TRIGGER_FAILURE_COUNT - 1; i++) { - watchdog.onPackageFailure(new String[]{APP_A}); + watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); } // Run handler so package failures are dispatched to observers @@ -209,12 +211,10 @@ public class PackageWatchdogTest { * the failed packages. */ @Test - public void testPackageFailureNotifyNone() throws Exception { + public void testPackageFailureDifferentPackageNotifyNone() throws Exception { PackageWatchdog watchdog = createWatchdog(); - TestObserver observer1 = new TestObserver(OBSERVER_NAME_1, - PackageHealthObserverImpact.USER_IMPACT_HIGH); - TestObserver observer2 = new TestObserver(OBSERVER_NAME_2, - PackageHealthObserverImpact.USER_IMPACT_HIGH); + TestObserver observer1 = new TestObserver(OBSERVER_NAME_1); + TestObserver observer2 = new TestObserver(OBSERVER_NAME_2); watchdog.startObservingHealth(observer2, Arrays.asList(APP_A), SHORT_DURATION); @@ -222,7 +222,7 @@ public class PackageWatchdogTest { // Then fail APP_C (not observed) above the threshold for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) { - watchdog.onPackageFailure(new String[]{APP_C}); + watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_C, VERSION_CODE))); } // Run handler so package failures are dispatched to observers @@ -234,6 +234,40 @@ public class PackageWatchdogTest { } /** + * Test package failure and does not notify any observer because the failed package version + * does not match the available rollback-from-version. + */ + @Test + public void testPackageFailureDifferentVersionNotifyNone() throws Exception { + PackageWatchdog watchdog = createWatchdog(); + long differentVersionCode = 2L; + TestObserver observer = new TestObserver(OBSERVER_NAME_1) { + public int onHealthCheckFailed(String packageName, long versionCode) { + if (versionCode == VERSION_CODE) { + // Only rollback for specific versionCode + return PackageHealthObserverImpact.USER_IMPACT_MEDIUM; + } + return PackageHealthObserverImpact.USER_IMPACT_NONE; + } + }; + + watchdog.startObservingHealth(observer, Arrays.asList(APP_A), SHORT_DURATION); + + // Then fail APP_A (different version) above the threshold + for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) { + watchdog.onPackageFailure(Arrays.asList( + new VersionedPackage(APP_A, differentVersionCode))); + } + + // Run handler so package failures are dispatched to observers + mTestLooper.dispatchAll(); + + // Verify that observers are not notified + assertEquals(0, observer.mFailedPackages.size()); + } + + + /** * Test package failure and notifies only least impact observers. */ @Test @@ -260,7 +294,10 @@ public class PackageWatchdogTest { // Then fail all apps above the threshold for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) { - watchdog.onPackageFailure(new String[]{APP_A, APP_B, APP_C, APP_D}); + watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE), + new VersionedPackage(APP_B, VERSION_CODE), + new VersionedPackage(APP_C, VERSION_CODE), + new VersionedPackage(APP_D, VERSION_CODE))); } // Run handler so package failures are dispatched to observers @@ -297,7 +334,7 @@ public class PackageWatchdogTest { * <ul> */ @Test - public void testPackageFailureNotifyLeastSuccessively() throws Exception { + public void testPackageFailureNotifyLeastImpactSuccessively() throws Exception { PackageWatchdog watchdog = createWatchdog(); TestObserver observerFirst = new TestObserver(OBSERVER_NAME_1, PackageHealthObserverImpact.USER_IMPACT_LOW); @@ -310,7 +347,7 @@ public class PackageWatchdogTest { // Then fail APP_A above the threshold for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) { - watchdog.onPackageFailure(new String[]{APP_A}); + watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); } // Run handler so package failures are dispatched to observers mTestLooper.dispatchAll(); @@ -327,7 +364,7 @@ public class PackageWatchdogTest { // Then fail APP_A again above the threshold for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) { - watchdog.onPackageFailure(new String[]{APP_A}); + watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); } // Run handler so package failures are dispatched to observers mTestLooper.dispatchAll(); @@ -344,7 +381,7 @@ public class PackageWatchdogTest { // Then fail APP_A again above the threshold for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) { - watchdog.onPackageFailure(new String[]{APP_A}); + watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); } // Run handler so package failures are dispatched to observers mTestLooper.dispatchAll(); @@ -361,7 +398,7 @@ public class PackageWatchdogTest { // Then fail APP_A again above the threshold for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) { - watchdog.onPackageFailure(new String[]{APP_A}); + watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); } // Run handler so package failures are dispatched to observers mTestLooper.dispatchAll(); @@ -388,7 +425,7 @@ public class PackageWatchdogTest { // Then fail APP_A above the threshold for (int i = 0; i < TRIGGER_FAILURE_COUNT; i++) { - watchdog.onPackageFailure(new String[]{APP_A}); + watchdog.onPackageFailure(Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); } // Run handler so package failures are dispatched to observers @@ -420,11 +457,11 @@ public class PackageWatchdogTest { mImpact = impact; } - public int onHealthCheckFailed(String packageName) { + public int onHealthCheckFailed(String packageName, long versionCode) { return mImpact; } - public boolean execute(String packageName) { + public boolean execute(String packageName, long versionCode) { mFailedPackages.add(packageName); return true; } diff --git a/tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java b/tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java index 02a439b5dd69..2310c829347e 100644 --- a/tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java +++ b/tests/RollbackTest/TestApp/src/com/android/tests/rollback/testapp/CrashingMainActivity.java @@ -17,17 +17,30 @@ package com.android.tests.rollback.testapp; import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; import android.os.Bundle; /** * A crashing test app for testing apk rollback support. */ public class CrashingMainActivity extends Activity { - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + incrementCountAndBroadcast(); throw new RuntimeException("Intended force crash"); } + + public void incrementCountAndBroadcast() { + SharedPreferences preferences = getSharedPreferences("prefs", Context.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + int count = preferences.getInt("crash_count", 0); + editor.putInt("crash_count", ++count).commit(); + + Intent intent = new Intent("com.android.tests.rollback.CRASH"); + intent.putExtra("count", count); + sendBroadcast(intent); + } } diff --git a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java index e128a6ce9f7c..4b277ae850c5 100644 --- a/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java +++ b/tests/RollbackTest/src/com/android/tests/rollback/RollbackTest.java @@ -17,6 +17,7 @@ package com.android.tests.rollback; import android.Manifest; +import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -36,7 +37,6 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -45,6 +45,7 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.SynchronousQueue; import java.util.concurrent.TimeUnit; /** @@ -413,7 +414,6 @@ public class RollbackTest { /** * Test that app user data is rolled back. - * TODO: Stop ignoring this test once user data rollback is supported. */ @Test public void testUserDataRollback() throws Exception { @@ -568,9 +568,7 @@ public class RollbackTest { } /** - * Test rollback of multi-package installs. - * TODO: Stop ignoring this test once support for multi-package rollback - * is implemented. + * Test rollback of multi-package installs is implemented. */ @Test public void testMultiPackage() throws Exception { @@ -630,18 +628,20 @@ public class RollbackTest { assertEquals(versionRolledBackTo, info.getVersionRolledBackTo().getLongVersionCode()); } - // TODO(zezeozue): Stop ignoring after fixing race between rolling back and testing version /** * Test bad update automatic rollback. */ - @Ignore("Flaky") @Test public void testBadUpdateRollback() throws Exception { + BroadcastReceiver crashCountReceiver = null; + Context context = InstrumentationRegistry.getContext(); try { RollbackTestUtils.adoptShellPermissionIdentity( Manifest.permission.INSTALL_PACKAGES, Manifest.permission.DELETE_PACKAGES, - Manifest.permission.MANAGE_ROLLBACKS); + Manifest.permission.MANAGE_ROLLBACKS, + Manifest.permission.KILL_BACKGROUND_PROCESSES, + Manifest.permission.RESTART_PACKAGES); RollbackManager rm = RollbackTestUtils.getRollbackManager(); // Prep installation of the test apps. @@ -669,23 +669,52 @@ public class RollbackTest { rm.getAvailableRollbacks(), TEST_APP_B); assertRollbackInfoEquals(TEST_APP_B, 2, 1, rollbackB); + BlockingQueue<Integer> crashQueue = new SynchronousQueue<>(); + + IntentFilter crashCountFilter = new IntentFilter(); + crashCountFilter.addAction("com.android.tests.rollback.CRASH"); + crashCountFilter.addCategory(Intent.CATEGORY_DEFAULT); + + crashCountReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + try { + // Sleep long enough for packagewatchdog to be notified of crash + Thread.sleep(1000); + // Kill app and close AppErrorDialog + ActivityManager am = context.getSystemService(ActivityManager.class); + am.killBackgroundProcesses(TEST_APP_A); + // Allow another package launch + crashQueue.offer(intent.getIntExtra("count", 0), 5, TimeUnit.SECONDS); + } catch (InterruptedException e) { + fail("Failed to communicate with test app"); + } + } + }; + context.registerReceiver(crashCountReceiver, crashCountFilter); + // Start apps PackageWatchdog#TRIGGER_FAILURE_COUNT times so TEST_APP_A crashes - for (int i = 0; i < 5; i++) { + Integer crashCount = null; + do { RollbackTestUtils.launchPackage(TEST_APP_A); - Thread.sleep(1000); - } - Thread.sleep(1000); + crashCount = crashQueue.poll(5, TimeUnit.SECONDS); + if (crashCount == null) { + fail("Timed out waiting for crash signal from test app"); + } + } while(crashCount < 5); // TEST_APP_A is automatically rolled back by the RollbackPackageHealthObserver assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A)); // Instrumented app is still the package installer - Context context = InstrumentationRegistry.getContext(); String installer = context.getPackageManager().getInstallerPackageName(TEST_APP_A); assertEquals(INSTRUMENTED_APP, installer); // TEST_APP_B is untouched assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_B)); } finally { RollbackTestUtils.dropShellPermissionIdentity(); + if (crashCountReceiver != null) { + context.unregisterReceiver(crashCountReceiver); + } } } diff --git a/tests/net/java/android/net/ip/InterfaceControllerTest.java b/tests/net/java/android/net/ip/InterfaceControllerTest.java new file mode 100644 index 000000000000..d27a4f99cfd9 --- /dev/null +++ b/tests/net/java/android/net/ip/InterfaceControllerTest.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.ip; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.net.INetd; +import android.net.InetAddresses; +import android.net.InterfaceConfigurationParcel; +import android.net.LinkAddress; +import android.net.util.SharedLog; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class InterfaceControllerTest { + private static final String TEST_IFACE = "testif"; + private static final String TEST_IPV4_ADDR = "192.168.123.28"; + private static final int TEST_PREFIXLENGTH = 31; + + @Mock private INetd mNetd; + @Mock private SharedLog mLog; + @Captor private ArgumentCaptor<InterfaceConfigurationParcel> mConfigCaptor; + + private InterfaceController mController; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + mController = new InterfaceController(TEST_IFACE, mNetd, mLog); + + doNothing().when(mNetd).interfaceSetCfg(mConfigCaptor.capture()); + } + + @Test + public void testSetIPv4Address() throws Exception { + mController.setIPv4Address( + new LinkAddress(InetAddresses.parseNumericAddress(TEST_IPV4_ADDR), + TEST_PREFIXLENGTH)); + verify(mNetd, times(1)).interfaceSetCfg(any()); + final InterfaceConfigurationParcel parcel = mConfigCaptor.getValue(); + assertEquals(TEST_IFACE, parcel.ifName); + assertEquals(TEST_IPV4_ADDR, parcel.ipv4Addr); + assertEquals(TEST_PREFIXLENGTH, parcel.prefixLength); + assertEquals("", parcel.hwAddr); + assertArrayEquals(new String[0], parcel.flags); + } + + @Test + public void testClearIPv4Address() throws Exception { + mController.clearIPv4Address(); + verify(mNetd, times(1)).interfaceSetCfg(any()); + final InterfaceConfigurationParcel parcel = mConfigCaptor.getValue(); + assertEquals(TEST_IFACE, parcel.ifName); + assertEquals("0.0.0.0", parcel.ipv4Addr); + assertEquals(0, parcel.prefixLength); + assertEquals("", parcel.hwAddr); + assertArrayEquals(new String[0], parcel.flags); + } +} diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 923c7dd5fb94..3127d745b55d 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -57,6 +57,7 @@ import static android.net.NetworkPolicyManager.RULE_ALLOW_METERED; import static android.net.NetworkPolicyManager.RULE_NONE; import static android.net.NetworkPolicyManager.RULE_REJECT_ALL; import static android.net.NetworkPolicyManager.RULE_REJECT_METERED; +import static android.net.shared.NetworkParcelableUtil.fromStableParcelable; import static com.android.internal.util.TestUtils.waitForIdleHandler; import static com.android.internal.util.TestUtils.waitForIdleLooper; @@ -119,6 +120,7 @@ import android.net.NetworkFactory; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; import android.net.NetworkMisc; +import android.net.NetworkParcelable; import android.net.NetworkRequest; import android.net.NetworkSpecifier; import android.net.NetworkStack; @@ -482,8 +484,8 @@ public class ConnectivityServiceTest { fail(e.getMessage()); } - final ArgumentCaptor<Network> nmNetworkCaptor = - ArgumentCaptor.forClass(Network.class); + final ArgumentCaptor<NetworkParcelable> nmNetworkCaptor = + ArgumentCaptor.forClass(NetworkParcelable.class); final ArgumentCaptor<INetworkMonitorCallbacks> nmCbCaptor = ArgumentCaptor.forClass(INetworkMonitorCallbacks.class); doNothing().when(mNetworkStack).makeNetworkMonitor( @@ -493,7 +495,7 @@ public class ConnectivityServiceTest { mNetworkAgent = new NetworkAgent(mHandlerThread.getLooper(), mServiceContext, "Mock-" + typeName, mNetworkInfo, mNetworkCapabilities, - linkProperties, mScore, new NetworkMisc()) { + linkProperties, mScore, new NetworkMisc(), NetworkFactory.SerialNumber.NONE) { @Override public void unwanted() { mDisconnected.open(); } @@ -523,7 +525,8 @@ public class ConnectivityServiceTest { } }; - assertEquals(mNetworkAgent.netId, nmNetworkCaptor.getValue().netId); + assertEquals( + mNetworkAgent.netId, fromStableParcelable(nmNetworkCaptor.getValue()).netId); mNmCallbacks = nmCbCaptor.getValue(); try { @@ -722,7 +725,7 @@ public class ConnectivityServiceTest { /** * A NetworkFactory that allows tests to wait until any in-flight NetworkRequest add or remove * operations have been processed. Before ConnectivityService can add or remove any requests, - * the factory must be told to expect those operations by calling expectAddRequests or + * the factory must be told to expect those operations by calling expectAddRequestsWithScores or * expectRemoveRequests. */ private static class MockNetworkFactory extends NetworkFactory { @@ -731,19 +734,22 @@ public class ConnectivityServiceTest { private final AtomicBoolean mNetworkStarted = new AtomicBoolean(false); // Used to expect that requests be removed or added on a separate thread, without sleeping. - // Callers can call either expectAddRequests() or expectRemoveRequests() exactly once, then - // cause some other thread to add or remove requests, then call waitForRequests(). We can - // either expect requests to be added or removed, but not both, because CountDownLatch can - // only count in one direction. - private CountDownLatch mExpectations; + // Callers can call either expectAddRequestsWithScores() or expectRemoveRequests() exactly + // once, then cause some other thread to add or remove requests, then call + // waitForRequests(). + // It is not possible to wait for both add and remove requests. When adding, the queue + // contains the expected score. When removing, the value is unused, all matters is the + // number of objects in the queue. + private final LinkedBlockingQueue<Integer> mExpectations; // Whether we are currently expecting requests to be added or removed. Valid only if - // mExpectations is non-null. + // mExpectations is non-empty. private boolean mExpectingAdditions; public MockNetworkFactory(Looper looper, Context context, String logTag, NetworkCapabilities filter) { super(looper, context, logTag, filter); + mExpectations = new LinkedBlockingQueue<>(); } public int getMyRequestCount() { @@ -775,69 +781,82 @@ public class ConnectivityServiceTest { } @Override - protected void handleAddRequest(NetworkRequest request, int score) { - // If we're expecting anything, we must be expecting additions. - if (mExpectations != null && !mExpectingAdditions) { - fail("Can't add requests while expecting requests to be removed"); - } - - // Add the request. - super.handleAddRequest(request, score); + protected void handleAddRequest(NetworkRequest request, int score, + int factorySerialNumber) { + synchronized (mExpectations) { + final Integer expectedScore = mExpectations.poll(); // null if the queue is empty + + assertNotNull("Added more requests than expected (" + request + " score : " + + score + ")", expectedScore); + // If we're expecting anything, we must be expecting additions. + if (!mExpectingAdditions) { + fail("Can't add requests while expecting requests to be removed"); + } + if (expectedScore != score) { + fail("Expected score was " + expectedScore + " but actual was " + score + + " in added request"); + } - // Reduce the number of request additions we're waiting for. - if (mExpectingAdditions) { - assertTrue("Added more requests than expected", mExpectations.getCount() > 0); - mExpectations.countDown(); + // Add the request. + super.handleAddRequest(request, score, factorySerialNumber); + mExpectations.notify(); } } @Override protected void handleRemoveRequest(NetworkRequest request) { - // If we're expecting anything, we must be expecting removals. - if (mExpectations != null && mExpectingAdditions) { - fail("Can't remove requests while expecting requests to be added"); - } + synchronized (mExpectations) { + final Integer expectedScore = mExpectations.poll(); // null if the queue is empty - // Remove the request. - super.handleRemoveRequest(request); + assertTrue("Removed more requests than expected", expectedScore != null); + // If we're expecting anything, we must be expecting removals. + if (mExpectingAdditions) { + fail("Can't remove requests while expecting requests to be added"); + } - // Reduce the number of request removals we're waiting for. - if (!mExpectingAdditions) { - assertTrue("Removed more requests than expected", mExpectations.getCount() > 0); - mExpectations.countDown(); + // Remove the request. + super.handleRemoveRequest(request); + mExpectations.notify(); } } private void assertNoExpectations() { - if (mExpectations != null) { - fail("Can't add expectation, " + mExpectations.getCount() + " already pending"); + if (mExpectations.size() != 0) { + fail("Can't add expectation, " + mExpectations.size() + " already pending"); } } - // Expects that count requests will be added. - public void expectAddRequests(final int count) { + // Expects that requests with the specified scores will be added. + public void expectAddRequestsWithScores(final int... scores) { assertNoExpectations(); mExpectingAdditions = true; - mExpectations = new CountDownLatch(count); + for (int score : scores) { + mExpectations.add(score); + } } // Expects that count requests will be removed. public void expectRemoveRequests(final int count) { assertNoExpectations(); mExpectingAdditions = false; - mExpectations = new CountDownLatch(count); + for (int i = 0; i < count; ++i) { + mExpectations.add(0); // For removals the score is ignored so any value will do. + } } // Waits for the expected request additions or removals to happen within a timeout. public void waitForRequests() throws InterruptedException { - assertNotNull("Nothing to wait for", mExpectations); - mExpectations.await(TIMEOUT_MS, TimeUnit.MILLISECONDS); - final long count = mExpectations.getCount(); + final long deadline = SystemClock.elapsedRealtime() + TIMEOUT_MS; + synchronized (mExpectations) { + while (mExpectations.size() > 0 && SystemClock.elapsedRealtime() < deadline) { + mExpectations.wait(deadline - SystemClock.elapsedRealtime()); + } + } + final long count = mExpectations.size(); final String msg = count + " requests still not " + (mExpectingAdditions ? "added" : "removed") + " after " + TIMEOUT_MS + " ms"; assertEquals(msg, 0, count); - mExpectations = null; } public void waitForNetworkRequests(final int count) throws InterruptedException { @@ -2268,6 +2287,12 @@ public class ConnectivityServiceTest { callback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); } + private int[] makeIntArray(final int size, final int value) { + final int[] array = new int[size]; + Arrays.fill(array, value); + return array; + } + private void tryNetworkFactoryRequests(int capability) throws Exception { // Verify NOT_RESTRICTED is set appropriately final NetworkCapabilities nc = new NetworkRequest.Builder().addCapability(capability) @@ -2289,7 +2314,7 @@ public class ConnectivityServiceTest { mServiceContext, "testFactory", filter); testFactory.setScoreFilter(40); ConditionVariable cv = testFactory.getNetworkStartedCV(); - testFactory.expectAddRequests(1); + testFactory.expectAddRequestsWithScores(0); testFactory.register(); testFactory.waitForNetworkRequests(1); int expectedRequestCount = 1; @@ -2300,7 +2325,7 @@ public class ConnectivityServiceTest { assertFalse(testFactory.getMyStartRequested()); NetworkRequest request = new NetworkRequest.Builder().addCapability(capability).build(); networkCallback = new NetworkCallback(); - testFactory.expectAddRequests(1); + testFactory.expectAddRequestsWithScores(0); // New request mCm.requestNetwork(request, networkCallback); expectedRequestCount++; testFactory.waitForNetworkRequests(expectedRequestCount); @@ -2320,7 +2345,7 @@ public class ConnectivityServiceTest { // When testAgent connects, ConnectivityService will re-send us all current requests with // the new score. There are expectedRequestCount such requests, and we must wait for all of // them. - testFactory.expectAddRequests(expectedRequestCount); + testFactory.expectAddRequestsWithScores(makeIntArray(expectedRequestCount, 50)); testAgent.connect(false); testAgent.addCapability(capability); waitFor(cv); @@ -2328,7 +2353,7 @@ public class ConnectivityServiceTest { assertFalse(testFactory.getMyStartRequested()); // Bring in a bunch of requests. - testFactory.expectAddRequests(10); + testFactory.expectAddRequestsWithScores(makeIntArray(10, 50)); assertEquals(expectedRequestCount, testFactory.getMyRequestCount()); ConnectivityManager.NetworkCallback[] networkCallbacks = new ConnectivityManager.NetworkCallback[10]; @@ -2351,8 +2376,11 @@ public class ConnectivityServiceTest { // Drop the higher scored network. cv = testFactory.getNetworkStartedCV(); + // With the default network disconnecting, the requests are sent with score 0 to factories. + testFactory.expectAddRequestsWithScores(makeIntArray(expectedRequestCount, 0)); testAgent.disconnect(); waitFor(cv); + testFactory.waitForNetworkRequests(expectedRequestCount); assertEquals(expectedRequestCount, testFactory.getMyRequestCount()); assertTrue(testFactory.getMyStartRequested()); @@ -3174,22 +3202,23 @@ public class ConnectivityServiceTest { testFactory.setScoreFilter(40); // Register the factory and expect it to start looking for a network. - testFactory.expectAddRequests(1); + testFactory.expectAddRequestsWithScores(0); // Score 0 as the request is not served yet. testFactory.register(); testFactory.waitForNetworkRequests(1); assertTrue(testFactory.getMyStartRequested()); // Bring up wifi. The factory stops looking for a network. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); - testFactory.expectAddRequests(2); // Because the default request changes score twice. + // Score 60 - 40 penalty for not validated yet, then 60 when it validates + testFactory.expectAddRequestsWithScores(20, 60); mWiFiNetworkAgent.connect(true); - testFactory.waitForNetworkRequests(1); + testFactory.waitForRequests(); assertFalse(testFactory.getMyStartRequested()); ContentResolver cr = mServiceContext.getContentResolver(); // Turn on mobile data always on. The factory starts looking again. - testFactory.expectAddRequests(1); + testFactory.expectAddRequestsWithScores(0); // Always on requests comes up with score 0 setAlwaysOnNetworks(true); testFactory.waitForNetworkRequests(2); assertTrue(testFactory.getMyStartRequested()); @@ -3197,7 +3226,7 @@ public class ConnectivityServiceTest { // Bring up cell data and check that the factory stops looking. assertLength(1, mCm.getAllNetworks()); mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); - testFactory.expectAddRequests(2); // Because the cell request changes score twice. + testFactory.expectAddRequestsWithScores(10, 50); // Unvalidated, then validated mCellNetworkAgent.connect(true); cellNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); testFactory.waitForNetworkRequests(2); diff --git a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java index 9578ded1a089..e877a8f7e6c1 100644 --- a/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java +++ b/tests/net/java/com/android/server/connectivity/LingerMonitorTest.java @@ -35,6 +35,7 @@ import android.net.ConnectivityManager; import android.net.INetd; import android.net.Network; import android.net.NetworkCapabilities; +import android.net.NetworkFactory; import android.net.NetworkInfo; import android.net.NetworkMisc; import android.net.NetworkStack; @@ -356,7 +357,8 @@ public class LingerMonitorTest { caps.addCapability(0); caps.addTransportType(transport); NetworkAgentInfo nai = new NetworkAgentInfo(null, null, new Network(netId), info, null, - caps, 50, mCtx, null, mMisc, mConnService, mNetd, mNMS); + caps, 50, mCtx, null, mMisc, mConnService, mNetd, mNMS, + NetworkFactory.SerialNumber.NONE); nai.everValidated = true; return nai; } diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp index 3c3edda85e4f..672731cc2939 100644 --- a/tools/aapt/AaptAssets.cpp +++ b/tools/aapt/AaptAssets.cpp @@ -301,6 +301,7 @@ int AaptLocaleValue::initFromDirName(const Vector<String8>& parts, const int sta break; } // This is not alphabetical, so we fall through to variant + [[fallthrough]]; case 5: case 6: case 7: diff --git a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java index 17847eaa0ca5..145e26923341 100644 --- a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java +++ b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java @@ -23,17 +23,9 @@ import android.security.Credentials; import android.text.TextUtils; import android.util.Log; -import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; -import java.security.cert.CertificateEncodingException; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.PKCS8EncodedKeySpec; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -1126,6 +1118,12 @@ public class WifiEnterpriseConfig implements Parcelable { String value = PASSWORD_KEY.equals(key) ? "<removed>" : mFields.get(key); sb.append(key).append(" ").append(value).append("\n"); } + if (mEapMethod >= 0 && mEapMethod < Eap.strings.length) { + sb.append("eap_method: ").append(Eap.strings[mEapMethod]).append("\n"); + } + if (mPhase2Method > 0 && mPhase2Method < Phase2.strings.length) { + sb.append("phase2_method: ").append(Phase2.strings[mPhase2Method]).append("\n"); + } return sb.toString(); } diff --git a/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java b/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java index c796e29e4e1a..c43818da359c 100644 --- a/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java +++ b/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java @@ -16,10 +16,14 @@ package android.net.wifi; +import android.annotation.IntDef; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + /** * This class makes a subset of * com.android.server.wifi.nano.WifiMetricsProto.WifiUsabilityStatsEntry parcelable. @@ -28,6 +32,24 @@ import android.os.Parcelable; */ @SystemApi public final class WifiUsabilityStatsEntry implements Parcelable { + /** {@hide} */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = {"PROBE_STATUS_"}, value = { + PROBE_STATUS_UNKNOWN, + PROBE_STATUS_NO_PROBE, + PROBE_STATUS_SUCCESS, + PROBE_STATUS_FAILURE}) + public @interface ProbeStatus {} + + /** Link probe status is unknown */ + public static final int PROBE_STATUS_UNKNOWN = 0; + /** Link probe is not triggered */ + public static final int PROBE_STATUS_NO_PROBE = 1; + /** Link probe is triggered and the result is success */ + public static final int PROBE_STATUS_SUCCESS = 2; + /** Link probe is triggered and the result is failure */ + public static final int PROBE_STATUS_FAILURE = 3; + /** Absolute milliseconds from device boot when these stats were sampled */ public final long timeStampMs; /** The RSSI (in dBm) at the sample time */ @@ -68,6 +90,14 @@ public final class WifiUsabilityStatsEntry implements Parcelable { public final long totalRadioOnFreqTimeMs; /** The total number of beacons received from the last radio chip reset */ public final long totalBeaconRx; + /** The status of link probe since last stats update */ + public final int probeStatusSinceLastUpdate; + /** The elapsed time of the most recent link probe since last stats update */ + public final int probeElapsedTimeMsSinceLastUpdate; + /** The MCS rate of the most recent link probe since last stats update */ + public final int probeMcsRateSinceLastUpdate; + /** Rx link speed at the sample time in Mbps */ + public final int rxLinkSpeedMbps; /** Constructor function {@hide} */ public WifiUsabilityStatsEntry(long timeStampMs, int rssi, @@ -76,7 +106,9 @@ public final class WifiUsabilityStatsEntry implements Parcelable { long totalRadioTxTimeMs, long totalRadioRxTimeMs, long totalScanTimeMs, long totalNanScanTimeMs, long totalBackgroundScanTimeMs, long totalRoamScanTimeMs, long totalPnoScanTimeMs, long totalHotspot2ScanTimeMs, long totalCcaBusyFreqTimeMs, - long totalRadioOnFreqTimeMs, long totalBeaconRx) { + long totalRadioOnFreqTimeMs, long totalBeaconRx, + @ProbeStatus int probeStatusSinceLastUpdate, int probeElapsedTimeMsSinceLastUpdate, + int probeMcsRateSinceLastUpdate, int rxLinkSpeedMbps) { this.timeStampMs = timeStampMs; this.rssi = rssi; this.linkSpeedMbps = linkSpeedMbps; @@ -96,6 +128,10 @@ public final class WifiUsabilityStatsEntry implements Parcelable { this.totalCcaBusyFreqTimeMs = totalCcaBusyFreqTimeMs; this.totalRadioOnFreqTimeMs = totalRadioOnFreqTimeMs; this.totalBeaconRx = totalBeaconRx; + this.probeStatusSinceLastUpdate = probeStatusSinceLastUpdate; + this.probeElapsedTimeMsSinceLastUpdate = probeElapsedTimeMsSinceLastUpdate; + this.probeMcsRateSinceLastUpdate = probeMcsRateSinceLastUpdate; + this.rxLinkSpeedMbps = rxLinkSpeedMbps; } /** Implement the Parcelable interface */ @@ -124,6 +160,10 @@ public final class WifiUsabilityStatsEntry implements Parcelable { dest.writeLong(totalCcaBusyFreqTimeMs); dest.writeLong(totalRadioOnFreqTimeMs); dest.writeLong(totalBeaconRx); + dest.writeInt(probeStatusSinceLastUpdate); + dest.writeInt(probeElapsedTimeMsSinceLastUpdate); + dest.writeInt(probeMcsRateSinceLastUpdate); + dest.writeInt(rxLinkSpeedMbps); } /** Implement the Parcelable interface */ @@ -137,7 +177,8 @@ public final class WifiUsabilityStatsEntry implements Parcelable { in.readLong(), in.readLong(), in.readLong(), in.readLong(), in.readLong(), in.readLong(), in.readLong(), in.readLong(), in.readLong(), - in.readLong(), in.readLong() + in.readLong(), in.readLong(), in.readInt(), + in.readInt(), in.readInt(), in.readInt() ); } diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java index 052ab99da905..63f47e7a7fea 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java @@ -190,6 +190,10 @@ public class WifiP2pManager { * the network info in the form of a {@link android.net.NetworkInfo}. A third extra provides * the details of the group. * + * All of these permissions are required to receive this broadcast: + * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and + * {@link android.Manifest.permission#ACCESS_WIFI_STATE} + * * @see #EXTRA_WIFI_P2P_INFO * @see #EXTRA_NETWORK_INFO * @see #EXTRA_WIFI_P2P_GROUP @@ -222,6 +226,10 @@ public class WifiP2pManager { * Broadcast intent action indicating that the available peer list has changed. This * can be sent as a result of peers being found, lost or updated. * + * All of these permissions are required to receive this broadcast: + * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and + * {@link android.Manifest.permission#ACCESS_WIFI_STATE} + * * <p> An extra {@link #EXTRA_P2P_DEVICE_LIST} provides the full list of * current peers. The full list of peers can also be obtained any time with * {@link #requestPeers}. @@ -238,7 +246,7 @@ public class WifiP2pManager { * * <p>Retrieve with {@link android.content.Intent#getParcelableExtra(String)}. */ - public static final String EXTRA_P2P_DEVICE_LIST = "wifiP2pDeviceList"; + public static final String EXTRA_P2P_DEVICE_LIST = "wifiP2pDeviceList"; /** * Broadcast intent action indicating that peer discovery has either started or stopped. @@ -285,6 +293,18 @@ public class WifiP2pManager { /** * Broadcast intent action indicating that this device details have changed. + * + * <p> An extra {@link #EXTRA_WIFI_P2P_DEVICE} provides this device details. + * The valid device details can also be obtained with + * {@link #requestDeviceInfo(Channel, DeviceInfoListener)} when p2p is enabled. + * To get information notifications on P2P getting enabled refers + * {@link #WIFI_P2P_STATE_ENABLED}. + * + * All of these permissions are required to receive this broadcast: + * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and + * {@link android.Manifest.permission#ACCESS_WIFI_STATE} + * + * @see #EXTRA_WIFI_P2P_DEVICE */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String WIFI_P2P_THIS_DEVICE_CHANGED_ACTION = @@ -546,6 +566,11 @@ public class WifiP2pManager { /** @hide */ public static final int UPDATE_CHANNEL_INFO = BASE + 96; + /** @hide */ + public static final int REQUEST_DEVICE_INFO = BASE + 97; + /** @hide */ + public static final int RESPONSE_DEVICE_INFO = BASE + 98; + /** * Create a new WifiP2pManager instance. Applications use * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve @@ -783,6 +808,17 @@ public class WifiP2pManager { void onOngoingPeerAvailable(WifiP2pConfig peerConfig); } + /** Interface for callback invocation when {@link android.net.wifi.p2p.WifiP2pDevice} + * is available in response to {@link #requestDeviceInfo(Channel, DeviceInfoListener)}. + */ + public interface DeviceInfoListener { + /** + * The requested {@link android.net.wifi.p2p.WifiP2pDevice} is available. + * @param wifiP2pDevice Wi-Fi p2p {@link android.net.wifi.p2p.WifiP2pDevice} + */ + void onDeviceInfoAvailable(WifiP2pDevice wifiP2pDevice); + } + /** * A channel that connects the application to the Wifi p2p framework. * Most p2p operations require a Channel as an argument. An instance of Channel is obtained @@ -988,6 +1024,12 @@ public class WifiP2pManager { .onNetworkInfoAvailable((NetworkInfo) message.obj); } break; + case RESPONSE_DEVICE_INFO: + if (listener != null) { + ((DeviceInfoListener) listener) + .onDeviceInfoAvailable((WifiP2pDevice) message.obj); + } + break; default: Log.d(TAG, "Ignored " + message); break; @@ -1826,4 +1868,29 @@ public class WifiP2pManager { if (listener == null) throw new IllegalArgumentException("This listener cannot be null."); c.mAsyncChannel.sendMessage(REQUEST_NETWORK_INFO, 0, c.putListener(listener)); } + + /** + * Request Device Info + * + * <p> This method provides the device info + * in the form of a {@link android.net.wifi.p2p.WifiP2pDevice}. + * Valid {@link android.net.wifi.p2p.WifiP2pDevice} is returned when p2p is enabled. + * To get information notifications on P2P getting enabled refers + * {@link #WIFI_P2P_STATE_ENABLED}. + * + * <p> This {@link android.net.wifi.p2p.WifiP2pDevice} is returned using the + * {@link DeviceInfoListener} listener. + * + * <p> This information is also included in the {@link #WIFI_P2P_THIS_DEVICE_CHANGED_ACTION} + * broadcast event with extra {@link #EXTRA_WIFI_P2P_DEVICE}. + * + * @param c is the channel created at {@link #initialize(Context, Looper, ChannelListener)}. + * @param listener for callback when network info is available. + */ + @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) + public void requestDeviceInfo(@NonNull Channel c, @NonNull DeviceInfoListener listener) { + checkChannel(c); + if (listener == null) throw new IllegalArgumentException("This listener cannot be null."); + c.mAsyncChannel.sendMessage(REQUEST_DEVICE_INFO, 0, c.putListener(listener)); + } } diff --git a/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java b/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java index a947b5568a16..a22f8ce853bf 100644 --- a/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java +++ b/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java @@ -74,7 +74,7 @@ public class WifiUsabilityStatsEntryTest { private static WifiUsabilityStatsEntry createResult() { return new WifiUsabilityStatsEntry( - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 ); } @@ -100,5 +100,10 @@ public class WifiUsabilityStatsEntryTest { assertEquals(expected.totalCcaBusyFreqTimeMs, actual.totalCcaBusyFreqTimeMs); assertEquals(expected.totalRadioOnFreqTimeMs, actual.totalRadioOnFreqTimeMs); assertEquals(expected.totalBeaconRx, actual.totalBeaconRx); + assertEquals(expected.probeStatusSinceLastUpdate, actual.probeStatusSinceLastUpdate); + assertEquals(expected.probeElapsedTimeMsSinceLastUpdate, + actual.probeElapsedTimeMsSinceLastUpdate); + assertEquals(expected.probeMcsRateSinceLastUpdate, actual.probeMcsRateSinceLastUpdate); + assertEquals(expected.rxLinkSpeedMbps, actual.rxLinkSpeedMbps); } } |